1*b7893ccfSSadaf Ebrahimi /*
2*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 The Khronos Group Inc.
3*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 Valve Corporation
4*b7893ccfSSadaf Ebrahimi * Copyright (c) 2015-2019 LunarG, Inc.
5*b7893ccfSSadaf Ebrahimi *
6*b7893ccfSSadaf Ebrahimi * Licensed under the Apache License, Version 2.0 (the "License");
7*b7893ccfSSadaf Ebrahimi * you may not use this file except in compliance with the License.
8*b7893ccfSSadaf Ebrahimi * You may obtain a copy of the License at
9*b7893ccfSSadaf Ebrahimi *
10*b7893ccfSSadaf Ebrahimi * http://www.apache.org/licenses/LICENSE-2.0
11*b7893ccfSSadaf Ebrahimi *
12*b7893ccfSSadaf Ebrahimi * Unless required by applicable law or agreed to in writing, software
13*b7893ccfSSadaf Ebrahimi * distributed under the License is distributed on an "AS IS" BASIS,
14*b7893ccfSSadaf Ebrahimi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*b7893ccfSSadaf Ebrahimi * See the License for the specific language governing permissions and
16*b7893ccfSSadaf Ebrahimi * limitations under the License.
17*b7893ccfSSadaf Ebrahimi *
18*b7893ccfSSadaf Ebrahimi * Author: Courtney Goeltzenleuchter <[email protected]>
19*b7893ccfSSadaf Ebrahimi * Author: Dave Houlton <[email protected]>
20*b7893ccfSSadaf Ebrahimi */
21*b7893ccfSSadaf Ebrahimi
22*b7893ccfSSadaf Ebrahimi #ifndef VKRENDERFRAMEWORK_H
23*b7893ccfSSadaf Ebrahimi #define VKRENDERFRAMEWORK_H
24*b7893ccfSSadaf Ebrahimi
25*b7893ccfSSadaf Ebrahimi #ifdef ANDROID
26*b7893ccfSSadaf Ebrahimi #include "vktestframeworkandroid.h"
27*b7893ccfSSadaf Ebrahimi class VkImageObj;
28*b7893ccfSSadaf Ebrahimi #else
29*b7893ccfSSadaf Ebrahimi #include "vktestframework.h"
30*b7893ccfSSadaf Ebrahimi #endif
31*b7893ccfSSadaf Ebrahimi
32*b7893ccfSSadaf Ebrahimi #include <algorithm>
33*b7893ccfSSadaf Ebrahimi #include <array>
34*b7893ccfSSadaf Ebrahimi #include <map>
35*b7893ccfSSadaf Ebrahimi #include <memory>
36*b7893ccfSSadaf Ebrahimi #include <vector>
37*b7893ccfSSadaf Ebrahimi
38*b7893ccfSSadaf Ebrahimi using namespace std;
39*b7893ccfSSadaf Ebrahimi
40*b7893ccfSSadaf Ebrahimi using vk_testing::MakeVkHandles;
41*b7893ccfSSadaf Ebrahimi
42*b7893ccfSSadaf Ebrahimi template <class Dst, class Src>
MakeTestbindingHandles(const std::vector<Src * > & v)43*b7893ccfSSadaf Ebrahimi std::vector<Dst *> MakeTestbindingHandles(const std::vector<Src *> &v) {
44*b7893ccfSSadaf Ebrahimi std::vector<Dst *> handles;
45*b7893ccfSSadaf Ebrahimi handles.reserve(v.size());
46*b7893ccfSSadaf Ebrahimi std::transform(v.begin(), v.end(), std::back_inserter(handles), [](const Src *o) { return static_cast<Dst *>(o); });
47*b7893ccfSSadaf Ebrahimi return handles;
48*b7893ccfSSadaf Ebrahimi }
49*b7893ccfSSadaf Ebrahimi
50*b7893ccfSSadaf Ebrahimi typedef vk_testing::Queue VkQueueObj;
51*b7893ccfSSadaf Ebrahimi class VkDeviceObj : public vk_testing::Device {
52*b7893ccfSSadaf Ebrahimi public:
53*b7893ccfSSadaf Ebrahimi VkDeviceObj(uint32_t id, VkPhysicalDevice obj);
54*b7893ccfSSadaf Ebrahimi VkDeviceObj(uint32_t id, VkPhysicalDevice obj, std::vector<const char *> &extension_names,
55*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceFeatures *features = nullptr, void *create_device_pnext = nullptr);
56*b7893ccfSSadaf Ebrahimi
57*b7893ccfSSadaf Ebrahimi uint32_t QueueFamilyMatching(VkQueueFlags with, VkQueueFlags without, bool all_bits = true);
QueueFamilyWithoutCapabilities(VkQueueFlags capabilities)58*b7893ccfSSadaf Ebrahimi uint32_t QueueFamilyWithoutCapabilities(VkQueueFlags capabilities) {
59*b7893ccfSSadaf Ebrahimi // an all_bits match with 0 matches all
60*b7893ccfSSadaf Ebrahimi return QueueFamilyMatching(VkQueueFlags(0), capabilities, true /* all_bits with */);
61*b7893ccfSSadaf Ebrahimi }
62*b7893ccfSSadaf Ebrahimi
device()63*b7893ccfSSadaf Ebrahimi VkDevice device() { return handle(); }
64*b7893ccfSSadaf Ebrahimi void SetDeviceQueue();
65*b7893ccfSSadaf Ebrahimi VkQueueObj *GetDefaultQueue();
66*b7893ccfSSadaf Ebrahimi VkQueueObj *GetDefaultComputeQueue();
67*b7893ccfSSadaf Ebrahimi
68*b7893ccfSSadaf Ebrahimi uint32_t id;
69*b7893ccfSSadaf Ebrahimi VkPhysicalDeviceProperties props;
70*b7893ccfSSadaf Ebrahimi std::vector<VkQueueFamilyProperties> queue_props;
71*b7893ccfSSadaf Ebrahimi
72*b7893ccfSSadaf Ebrahimi VkQueue m_queue;
73*b7893ccfSSadaf Ebrahimi };
74*b7893ccfSSadaf Ebrahimi
75*b7893ccfSSadaf Ebrahimi class VkCommandPoolObj;
76*b7893ccfSSadaf Ebrahimi class VkCommandBufferObj;
77*b7893ccfSSadaf Ebrahimi class VkDepthStencilObj;
78*b7893ccfSSadaf Ebrahimi
79*b7893ccfSSadaf Ebrahimi class VkRenderFramework : public VkTestFramework {
80*b7893ccfSSadaf Ebrahimi public:
instance()81*b7893ccfSSadaf Ebrahimi VkInstance instance() { return inst; }
device()82*b7893ccfSSadaf Ebrahimi VkDevice device() { return m_device->device(); }
DeviceObj()83*b7893ccfSSadaf Ebrahimi VkDeviceObj *DeviceObj() const { return m_device; }
84*b7893ccfSSadaf Ebrahimi VkPhysicalDevice gpu();
renderPass()85*b7893ccfSSadaf Ebrahimi VkRenderPass renderPass() { return m_renderPass; }
RenderPassInfo()86*b7893ccfSSadaf Ebrahimi const VkRenderPassCreateInfo &RenderPassInfo() const { return renderPass_info_; };
framebuffer()87*b7893ccfSSadaf Ebrahimi VkFramebuffer framebuffer() { return m_framebuffer; }
88*b7893ccfSSadaf Ebrahimi void InitViewport(float width, float height);
89*b7893ccfSSadaf Ebrahimi void InitViewport();
90*b7893ccfSSadaf Ebrahimi bool InitSurface();
91*b7893ccfSSadaf Ebrahimi bool InitSurface(float width, float height);
92*b7893ccfSSadaf Ebrahimi bool InitSwapchain(VkSurfaceKHR &surface, VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
93*b7893ccfSSadaf Ebrahimi VkSurfaceTransformFlagBitsKHR preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR);
94*b7893ccfSSadaf Ebrahimi bool InitSwapchain(VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
95*b7893ccfSSadaf Ebrahimi VkSurfaceTransformFlagBitsKHR preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR);
96*b7893ccfSSadaf Ebrahimi void DestroySwapchain();
97*b7893ccfSSadaf Ebrahimi void InitRenderTarget();
98*b7893ccfSSadaf Ebrahimi void InitRenderTarget(uint32_t targets);
99*b7893ccfSSadaf Ebrahimi void InitRenderTarget(VkImageView *dsBinding);
100*b7893ccfSSadaf Ebrahimi void InitRenderTarget(uint32_t targets, VkImageView *dsBinding);
101*b7893ccfSSadaf Ebrahimi void DestroyRenderTarget();
102*b7893ccfSSadaf Ebrahimi void InitFramework(PFN_vkDebugReportCallbackEXT = NULL, void *userData = NULL, void *instance_pnext = NULL);
103*b7893ccfSSadaf Ebrahimi
104*b7893ccfSSadaf Ebrahimi void ShutdownFramework();
105*b7893ccfSSadaf Ebrahimi void GetPhysicalDeviceFeatures(VkPhysicalDeviceFeatures *features);
106*b7893ccfSSadaf Ebrahimi void GetPhysicalDeviceProperties(VkPhysicalDeviceProperties *props);
107*b7893ccfSSadaf Ebrahimi void InitState(VkPhysicalDeviceFeatures *features = nullptr, void *create_device_pnext = nullptr,
108*b7893ccfSSadaf Ebrahimi const VkCommandPoolCreateFlags flags = 0);
109*b7893ccfSSadaf Ebrahimi
renderPassBeginInfo()110*b7893ccfSSadaf Ebrahimi const VkRenderPassBeginInfo &renderPassBeginInfo() const { return m_renderPassBeginInfo; }
111*b7893ccfSSadaf Ebrahimi
112*b7893ccfSSadaf Ebrahimi bool InstanceLayerSupported(const char *name, uint32_t specVersion = 0, uint32_t implementationVersion = 0);
113*b7893ccfSSadaf Ebrahimi bool EnableDeviceProfileLayer();
114*b7893ccfSSadaf Ebrahimi bool InstanceExtensionSupported(const char *name, uint32_t specVersion = 0);
115*b7893ccfSSadaf Ebrahimi bool InstanceExtensionEnabled(const char *name);
116*b7893ccfSSadaf Ebrahimi bool DeviceExtensionSupported(VkPhysicalDevice dev, const char *layer, const char *name, uint32_t specVersion = 0);
117*b7893ccfSSadaf Ebrahimi bool DeviceExtensionEnabled(const char *name);
118*b7893ccfSSadaf Ebrahimi bool DeviceIsMockICD();
119*b7893ccfSSadaf Ebrahimi bool DeviceSimulation();
120*b7893ccfSSadaf Ebrahimi bool DeviceCanDraw();
121*b7893ccfSSadaf Ebrahimi
122*b7893ccfSSadaf Ebrahimi protected:
123*b7893ccfSSadaf Ebrahimi VkRenderFramework();
124*b7893ccfSSadaf Ebrahimi virtual ~VkRenderFramework() = 0;
125*b7893ccfSSadaf Ebrahimi
126*b7893ccfSSadaf Ebrahimi VkApplicationInfo app_info;
127*b7893ccfSSadaf Ebrahimi VkInstance inst;
128*b7893ccfSSadaf Ebrahimi VkPhysicalDevice objs[16];
129*b7893ccfSSadaf Ebrahimi uint32_t gpu_count;
130*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
131*b7893ccfSSadaf Ebrahimi VkCommandPoolObj *m_commandPool;
132*b7893ccfSSadaf Ebrahimi VkCommandBufferObj *m_commandBuffer;
133*b7893ccfSSadaf Ebrahimi VkRenderPass m_renderPass;
134*b7893ccfSSadaf Ebrahimi VkRenderPassCreateInfo renderPass_info_ = {};
135*b7893ccfSSadaf Ebrahimi VkFramebuffer m_framebuffer;
136*b7893ccfSSadaf Ebrahimi VkSurfaceKHR m_surface;
137*b7893ccfSSadaf Ebrahimi VkSwapchainKHR m_swapchain;
138*b7893ccfSSadaf Ebrahimi std::vector<VkViewport> m_viewports;
139*b7893ccfSSadaf Ebrahimi std::vector<VkRect2D> m_scissors;
140*b7893ccfSSadaf Ebrahimi float m_lineWidth;
141*b7893ccfSSadaf Ebrahimi float m_depthBiasConstantFactor;
142*b7893ccfSSadaf Ebrahimi float m_depthBiasClamp;
143*b7893ccfSSadaf Ebrahimi float m_depthBiasSlopeFactor;
144*b7893ccfSSadaf Ebrahimi float m_blendConstants[4];
145*b7893ccfSSadaf Ebrahimi float m_minDepthBounds;
146*b7893ccfSSadaf Ebrahimi float m_maxDepthBounds;
147*b7893ccfSSadaf Ebrahimi uint32_t m_compareMask;
148*b7893ccfSSadaf Ebrahimi uint32_t m_writeMask;
149*b7893ccfSSadaf Ebrahimi uint32_t m_reference;
150*b7893ccfSSadaf Ebrahimi bool m_addRenderPassSelfDependency;
151*b7893ccfSSadaf Ebrahimi std::vector<VkClearValue> m_renderPassClearValues;
152*b7893ccfSSadaf Ebrahimi VkRenderPassBeginInfo m_renderPassBeginInfo;
153*b7893ccfSSadaf Ebrahimi vector<std::unique_ptr<VkImageObj>> m_renderTargets;
154*b7893ccfSSadaf Ebrahimi float m_width, m_height;
155*b7893ccfSSadaf Ebrahimi VkFormat m_render_target_fmt;
156*b7893ccfSSadaf Ebrahimi VkFormat m_depth_stencil_fmt;
157*b7893ccfSSadaf Ebrahimi VkClearColorValue m_clear_color;
158*b7893ccfSSadaf Ebrahimi bool m_clear_via_load_op;
159*b7893ccfSSadaf Ebrahimi float m_depth_clear_color;
160*b7893ccfSSadaf Ebrahimi uint32_t m_stencil_clear_color;
161*b7893ccfSSadaf Ebrahimi VkDepthStencilObj *m_depthStencil;
162*b7893ccfSSadaf Ebrahimi PFN_vkCreateDebugReportCallbackEXT m_CreateDebugReportCallback;
163*b7893ccfSSadaf Ebrahimi PFN_vkDestroyDebugReportCallbackEXT m_DestroyDebugReportCallback;
164*b7893ccfSSadaf Ebrahimi PFN_vkDebugReportMessageEXT m_DebugReportMessage;
165*b7893ccfSSadaf Ebrahimi VkDebugReportCallbackEXT m_globalMsgCallback;
166*b7893ccfSSadaf Ebrahimi VkDebugReportCallbackEXT m_devMsgCallback;
167*b7893ccfSSadaf Ebrahimi
168*b7893ccfSSadaf Ebrahimi std::vector<const char *> m_instance_layer_names;
169*b7893ccfSSadaf Ebrahimi std::vector<const char *> m_instance_extension_names;
170*b7893ccfSSadaf Ebrahimi std::vector<const char *> m_device_extension_names;
171*b7893ccfSSadaf Ebrahimi };
172*b7893ccfSSadaf Ebrahimi
173*b7893ccfSSadaf Ebrahimi class VkDescriptorSetObj;
174*b7893ccfSSadaf Ebrahimi class VkConstantBufferObj;
175*b7893ccfSSadaf Ebrahimi class VkPipelineObj;
176*b7893ccfSSadaf Ebrahimi class VkDescriptorSetObj;
177*b7893ccfSSadaf Ebrahimi typedef vk_testing::Fence VkFenceObj;
178*b7893ccfSSadaf Ebrahimi typedef vk_testing::Buffer VkBufferObj;
179*b7893ccfSSadaf Ebrahimi typedef vk_testing::AccelerationStructure VkAccelerationStructureObj;
180*b7893ccfSSadaf Ebrahimi
181*b7893ccfSSadaf Ebrahimi class VkCommandPoolObj : public vk_testing::CommandPool {
182*b7893ccfSSadaf Ebrahimi public:
183*b7893ccfSSadaf Ebrahimi VkCommandPoolObj(VkDeviceObj *device, uint32_t queue_family_index, VkCommandPoolCreateFlags flags = 0);
184*b7893ccfSSadaf Ebrahimi };
185*b7893ccfSSadaf Ebrahimi
186*b7893ccfSSadaf Ebrahimi class VkCommandBufferObj : public vk_testing::CommandBuffer {
187*b7893ccfSSadaf Ebrahimi public:
188*b7893ccfSSadaf Ebrahimi VkCommandBufferObj(VkDeviceObj *device, VkCommandPoolObj *pool, VkCommandBufferLevel level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
189*b7893ccfSSadaf Ebrahimi VkQueueObj *queue = nullptr);
190*b7893ccfSSadaf Ebrahimi void PipelineBarrier(VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages, VkDependencyFlags dependencyFlags,
191*b7893ccfSSadaf Ebrahimi uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
192*b7893ccfSSadaf Ebrahimi const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
193*b7893ccfSSadaf Ebrahimi const VkImageMemoryBarrier *pImageMemoryBarriers);
194*b7893ccfSSadaf Ebrahimi void ClearAllBuffers(const vector<std::unique_ptr<VkImageObj>> &color_objs, VkClearColorValue clear_color,
195*b7893ccfSSadaf Ebrahimi VkDepthStencilObj *depth_stencil_obj, float depth_clear_value, uint32_t stencil_clear_value);
196*b7893ccfSSadaf Ebrahimi void PrepareAttachments(const vector<std::unique_ptr<VkImageObj>> &color_atts, VkDepthStencilObj *depth_stencil_att);
197*b7893ccfSSadaf Ebrahimi void BindDescriptorSet(VkDescriptorSetObj &descriptorSet);
198*b7893ccfSSadaf Ebrahimi void BindIndexBuffer(VkBufferObj *indexBuffer, VkDeviceSize offset, VkIndexType indexType);
199*b7893ccfSSadaf Ebrahimi void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding);
200*b7893ccfSSadaf Ebrahimi void BeginRenderPass(const VkRenderPassBeginInfo &info);
201*b7893ccfSSadaf Ebrahimi void EndRenderPass();
202*b7893ccfSSadaf Ebrahimi void FillBuffer(VkBuffer buffer, VkDeviceSize offset, VkDeviceSize fill_size, uint32_t data);
203*b7893ccfSSadaf Ebrahimi void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance);
204*b7893ccfSSadaf Ebrahimi void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
205*b7893ccfSSadaf Ebrahimi uint32_t firstInstance);
206*b7893ccfSSadaf Ebrahimi void QueueCommandBuffer(bool checkSuccess = true);
207*b7893ccfSSadaf Ebrahimi void QueueCommandBuffer(const VkFenceObj &fence, bool checkSuccess = true);
208*b7893ccfSSadaf Ebrahimi void SetViewport(uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports);
209*b7893ccfSSadaf Ebrahimi void SetStencilReference(VkStencilFaceFlags faceMask, uint32_t reference);
210*b7893ccfSSadaf Ebrahimi void UpdateBuffer(VkBuffer buffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData);
211*b7893ccfSSadaf Ebrahimi void CopyImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
212*b7893ccfSSadaf Ebrahimi uint32_t regionCount, const VkImageCopy *pRegions);
213*b7893ccfSSadaf Ebrahimi void ResolveImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
214*b7893ccfSSadaf Ebrahimi uint32_t regionCount, const VkImageResolve *pRegions);
215*b7893ccfSSadaf Ebrahimi void ClearColorImage(VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor, uint32_t rangeCount,
216*b7893ccfSSadaf Ebrahimi const VkImageSubresourceRange *pRanges);
217*b7893ccfSSadaf Ebrahimi void ClearDepthStencilImage(VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue *pColor,
218*b7893ccfSSadaf Ebrahimi uint32_t rangeCount, const VkImageSubresourceRange *pRanges);
219*b7893ccfSSadaf Ebrahimi void BuildAccelerationStructure(VkAccelerationStructureObj *as, VkBuffer scratchBuffer);
220*b7893ccfSSadaf Ebrahimi void BuildAccelerationStructure(VkAccelerationStructureObj *as, VkBuffer scratchBuffer, VkBuffer instanceData);
221*b7893ccfSSadaf Ebrahimi
222*b7893ccfSSadaf Ebrahimi protected:
223*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
224*b7893ccfSSadaf Ebrahimi VkQueueObj *m_queue;
225*b7893ccfSSadaf Ebrahimi };
226*b7893ccfSSadaf Ebrahimi
227*b7893ccfSSadaf Ebrahimi class VkConstantBufferObj : public VkBufferObj {
228*b7893ccfSSadaf Ebrahimi public:
229*b7893ccfSSadaf Ebrahimi VkConstantBufferObj(VkDeviceObj *device,
230*b7893ccfSSadaf Ebrahimi VkBufferUsageFlags usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
231*b7893ccfSSadaf Ebrahimi VkConstantBufferObj(VkDeviceObj *device, VkDeviceSize size, const void *data,
232*b7893ccfSSadaf Ebrahimi VkBufferUsageFlags usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
233*b7893ccfSSadaf Ebrahimi
234*b7893ccfSSadaf Ebrahimi VkDescriptorBufferInfo m_descriptorBufferInfo;
235*b7893ccfSSadaf Ebrahimi
236*b7893ccfSSadaf Ebrahimi protected:
237*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
238*b7893ccfSSadaf Ebrahimi };
239*b7893ccfSSadaf Ebrahimi
240*b7893ccfSSadaf Ebrahimi class VkRenderpassObj {
241*b7893ccfSSadaf Ebrahimi public:
242*b7893ccfSSadaf Ebrahimi VkRenderpassObj(VkDeviceObj *device);
243*b7893ccfSSadaf Ebrahimi ~VkRenderpassObj();
handle()244*b7893ccfSSadaf Ebrahimi VkRenderPass handle() { return m_renderpass; }
245*b7893ccfSSadaf Ebrahimi
246*b7893ccfSSadaf Ebrahimi protected:
247*b7893ccfSSadaf Ebrahimi VkRenderPass m_renderpass;
248*b7893ccfSSadaf Ebrahimi VkDevice device;
249*b7893ccfSSadaf Ebrahimi };
250*b7893ccfSSadaf Ebrahimi
251*b7893ccfSSadaf Ebrahimi class VkImageObj : public vk_testing::Image {
252*b7893ccfSSadaf Ebrahimi public:
253*b7893ccfSSadaf Ebrahimi VkImageObj(VkDeviceObj *dev);
254*b7893ccfSSadaf Ebrahimi bool IsCompatible(VkImageUsageFlags usages, VkFormatFeatureFlags features);
255*b7893ccfSSadaf Ebrahimi
256*b7893ccfSSadaf Ebrahimi public:
257*b7893ccfSSadaf Ebrahimi void Init(uint32_t const width, uint32_t const height, uint32_t const mipLevels, VkFormat const format, VkFlags const usage,
258*b7893ccfSSadaf Ebrahimi VkImageTiling const tiling = VK_IMAGE_TILING_LINEAR, VkMemoryPropertyFlags const reqs = 0,
259*b7893ccfSSadaf Ebrahimi const std::vector<uint32_t> *queue_families = nullptr, bool memory = true);
260*b7893ccfSSadaf Ebrahimi void init(const VkImageCreateInfo *create_info);
261*b7893ccfSSadaf Ebrahimi
262*b7893ccfSSadaf Ebrahimi void InitNoLayout(uint32_t const width, uint32_t const height, uint32_t const mipLevels, VkFormat const format,
263*b7893ccfSSadaf Ebrahimi VkFlags const usage, VkImageTiling tiling = VK_IMAGE_TILING_LINEAR, VkMemoryPropertyFlags reqs = 0,
264*b7893ccfSSadaf Ebrahimi const std::vector<uint32_t> *queue_families = nullptr, bool memory = true);
265*b7893ccfSSadaf Ebrahimi
266*b7893ccfSSadaf Ebrahimi // void clear( CommandBuffer*, uint32_t[4] );
267*b7893ccfSSadaf Ebrahimi
Layout(VkImageLayout const layout)268*b7893ccfSSadaf Ebrahimi void Layout(VkImageLayout const layout) { m_descriptorImageInfo.imageLayout = layout; }
269*b7893ccfSSadaf Ebrahimi
memory()270*b7893ccfSSadaf Ebrahimi VkDeviceMemory memory() const { return Image::memory().handle(); }
271*b7893ccfSSadaf Ebrahimi
MapMemory()272*b7893ccfSSadaf Ebrahimi void *MapMemory() { return Image::memory().map(); }
273*b7893ccfSSadaf Ebrahimi
UnmapMemory()274*b7893ccfSSadaf Ebrahimi void UnmapMemory() { Image::memory().unmap(); }
275*b7893ccfSSadaf Ebrahimi
276*b7893ccfSSadaf Ebrahimi void ImageMemoryBarrier(VkCommandBufferObj *cmd, VkImageAspectFlags aspect, VkFlags output_mask, VkFlags input_mask,
277*b7893ccfSSadaf Ebrahimi VkImageLayout image_layout, VkPipelineStageFlags src_stages = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
278*b7893ccfSSadaf Ebrahimi VkPipelineStageFlags dest_stages = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
279*b7893ccfSSadaf Ebrahimi uint32_t srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
280*b7893ccfSSadaf Ebrahimi uint32_t dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED);
281*b7893ccfSSadaf Ebrahimi
282*b7893ccfSSadaf Ebrahimi VkResult CopyImage(VkImageObj &src_image);
283*b7893ccfSSadaf Ebrahimi
284*b7893ccfSSadaf Ebrahimi VkResult CopyImageOut(VkImageObj &dst_image);
285*b7893ccfSSadaf Ebrahimi
286*b7893ccfSSadaf Ebrahimi std::array<std::array<uint32_t, 16>, 16> Read();
287*b7893ccfSSadaf Ebrahimi
image()288*b7893ccfSSadaf Ebrahimi VkImage image() const { return handle(); }
289*b7893ccfSSadaf Ebrahimi
290*b7893ccfSSadaf Ebrahimi VkImageView targetView(VkFormat format, VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT) {
291*b7893ccfSSadaf Ebrahimi if (!m_targetView.initialized()) {
292*b7893ccfSSadaf Ebrahimi VkImageViewCreateInfo createView = {};
293*b7893ccfSSadaf Ebrahimi createView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
294*b7893ccfSSadaf Ebrahimi createView.image = handle();
295*b7893ccfSSadaf Ebrahimi createView.viewType = VK_IMAGE_VIEW_TYPE_2D;
296*b7893ccfSSadaf Ebrahimi createView.format = format;
297*b7893ccfSSadaf Ebrahimi createView.components.r = VK_COMPONENT_SWIZZLE_R;
298*b7893ccfSSadaf Ebrahimi createView.components.g = VK_COMPONENT_SWIZZLE_G;
299*b7893ccfSSadaf Ebrahimi createView.components.b = VK_COMPONENT_SWIZZLE_B;
300*b7893ccfSSadaf Ebrahimi createView.components.a = VK_COMPONENT_SWIZZLE_A;
301*b7893ccfSSadaf Ebrahimi createView.subresourceRange = {aspect, 0, 1, 0, 1};
302*b7893ccfSSadaf Ebrahimi createView.flags = 0;
303*b7893ccfSSadaf Ebrahimi m_targetView.init(*m_device, createView);
304*b7893ccfSSadaf Ebrahimi }
305*b7893ccfSSadaf Ebrahimi return m_targetView.handle();
306*b7893ccfSSadaf Ebrahimi }
307*b7893ccfSSadaf Ebrahimi
308*b7893ccfSSadaf Ebrahimi void SetLayout(VkCommandBufferObj *cmd_buf, VkImageAspectFlags aspect, VkImageLayout image_layout);
309*b7893ccfSSadaf Ebrahimi void SetLayout(VkImageAspectFlags aspect, VkImageLayout image_layout);
310*b7893ccfSSadaf Ebrahimi
Layout()311*b7893ccfSSadaf Ebrahimi VkImageLayout Layout() const { return m_descriptorImageInfo.imageLayout; }
width()312*b7893ccfSSadaf Ebrahimi uint32_t width() const { return extent().width; }
height()313*b7893ccfSSadaf Ebrahimi uint32_t height() const { return extent().height; }
device()314*b7893ccfSSadaf Ebrahimi VkDeviceObj *device() const { return m_device; }
315*b7893ccfSSadaf Ebrahimi
316*b7893ccfSSadaf Ebrahimi protected:
317*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
318*b7893ccfSSadaf Ebrahimi
319*b7893ccfSSadaf Ebrahimi vk_testing::ImageView m_targetView;
320*b7893ccfSSadaf Ebrahimi VkDescriptorImageInfo m_descriptorImageInfo;
321*b7893ccfSSadaf Ebrahimi };
322*b7893ccfSSadaf Ebrahimi
323*b7893ccfSSadaf Ebrahimi class VkTextureObj : public VkImageObj {
324*b7893ccfSSadaf Ebrahimi public:
325*b7893ccfSSadaf Ebrahimi VkTextureObj(VkDeviceObj *device, uint32_t *colors = NULL);
326*b7893ccfSSadaf Ebrahimi
DescriptorImageInfo()327*b7893ccfSSadaf Ebrahimi const VkDescriptorImageInfo &DescriptorImageInfo() const { return m_descriptorImageInfo; }
328*b7893ccfSSadaf Ebrahimi
329*b7893ccfSSadaf Ebrahimi protected:
330*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
331*b7893ccfSSadaf Ebrahimi vk_testing::ImageView m_textureView;
332*b7893ccfSSadaf Ebrahimi };
333*b7893ccfSSadaf Ebrahimi
334*b7893ccfSSadaf Ebrahimi class VkDepthStencilObj : public VkImageObj {
335*b7893ccfSSadaf Ebrahimi public:
336*b7893ccfSSadaf Ebrahimi VkDepthStencilObj(VkDeviceObj *device);
337*b7893ccfSSadaf Ebrahimi void Init(VkDeviceObj *device, int32_t width, int32_t height, VkFormat format,
338*b7893ccfSSadaf Ebrahimi VkImageUsageFlags usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
339*b7893ccfSSadaf Ebrahimi bool Initialized();
340*b7893ccfSSadaf Ebrahimi VkImageView *BindInfo();
341*b7893ccfSSadaf Ebrahimi
342*b7893ccfSSadaf Ebrahimi VkFormat Format() const;
343*b7893ccfSSadaf Ebrahimi
344*b7893ccfSSadaf Ebrahimi protected:
345*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
346*b7893ccfSSadaf Ebrahimi bool m_initialized;
347*b7893ccfSSadaf Ebrahimi vk_testing::ImageView m_imageView;
348*b7893ccfSSadaf Ebrahimi VkFormat m_depth_stencil_fmt;
349*b7893ccfSSadaf Ebrahimi VkImageView m_attachmentBindInfo;
350*b7893ccfSSadaf Ebrahimi };
351*b7893ccfSSadaf Ebrahimi
352*b7893ccfSSadaf Ebrahimi class VkSamplerObj : public vk_testing::Sampler {
353*b7893ccfSSadaf Ebrahimi public:
354*b7893ccfSSadaf Ebrahimi VkSamplerObj(VkDeviceObj *device);
355*b7893ccfSSadaf Ebrahimi
356*b7893ccfSSadaf Ebrahimi protected:
357*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
358*b7893ccfSSadaf Ebrahimi };
359*b7893ccfSSadaf Ebrahimi
360*b7893ccfSSadaf Ebrahimi class VkDescriptorSetLayoutObj : public vk_testing::DescriptorSetLayout {
361*b7893ccfSSadaf Ebrahimi public:
362*b7893ccfSSadaf Ebrahimi VkDescriptorSetLayoutObj() = default;
363*b7893ccfSSadaf Ebrahimi VkDescriptorSetLayoutObj(const VkDeviceObj *device,
364*b7893ccfSSadaf Ebrahimi const std::vector<VkDescriptorSetLayoutBinding> &descriptor_set_bindings = {},
365*b7893ccfSSadaf Ebrahimi VkDescriptorSetLayoutCreateFlags flags = 0, void *pNext = NULL);
366*b7893ccfSSadaf Ebrahimi
367*b7893ccfSSadaf Ebrahimi // Move constructor and move assignment operator for Visual Studio 2013
VkDescriptorSetLayoutObj(VkDescriptorSetLayoutObj && src)368*b7893ccfSSadaf Ebrahimi VkDescriptorSetLayoutObj(VkDescriptorSetLayoutObj &&src) : DescriptorSetLayout(std::move(src)){};
369*b7893ccfSSadaf Ebrahimi VkDescriptorSetLayoutObj &operator=(VkDescriptorSetLayoutObj &&src) {
370*b7893ccfSSadaf Ebrahimi DescriptorSetLayout::operator=(std::move(src));
371*b7893ccfSSadaf Ebrahimi return *this;
372*b7893ccfSSadaf Ebrahimi }
373*b7893ccfSSadaf Ebrahimi };
374*b7893ccfSSadaf Ebrahimi
375*b7893ccfSSadaf Ebrahimi class VkDescriptorSetObj : public vk_testing::DescriptorPool {
376*b7893ccfSSadaf Ebrahimi public:
377*b7893ccfSSadaf Ebrahimi VkDescriptorSetObj(VkDeviceObj *device);
378*b7893ccfSSadaf Ebrahimi ~VkDescriptorSetObj();
379*b7893ccfSSadaf Ebrahimi
380*b7893ccfSSadaf Ebrahimi int AppendDummy();
381*b7893ccfSSadaf Ebrahimi int AppendBuffer(VkDescriptorType type, VkConstantBufferObj &constantBuffer);
382*b7893ccfSSadaf Ebrahimi int AppendSamplerTexture(VkSamplerObj *sampler, VkTextureObj *texture);
383*b7893ccfSSadaf Ebrahimi void CreateVKDescriptorSet(VkCommandBufferObj *commandBuffer);
384*b7893ccfSSadaf Ebrahimi
385*b7893ccfSSadaf Ebrahimi VkDescriptorSet GetDescriptorSetHandle() const;
386*b7893ccfSSadaf Ebrahimi VkPipelineLayout GetPipelineLayout() const;
387*b7893ccfSSadaf Ebrahimi
388*b7893ccfSSadaf Ebrahimi protected:
389*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
390*b7893ccfSSadaf Ebrahimi std::vector<VkDescriptorSetLayoutBinding> m_layout_bindings;
391*b7893ccfSSadaf Ebrahimi std::map<VkDescriptorType, int> m_type_counts;
392*b7893ccfSSadaf Ebrahimi int m_nextSlot;
393*b7893ccfSSadaf Ebrahimi
394*b7893ccfSSadaf Ebrahimi vector<VkDescriptorImageInfo> m_imageSamplerDescriptors;
395*b7893ccfSSadaf Ebrahimi vector<VkWriteDescriptorSet> m_writes;
396*b7893ccfSSadaf Ebrahimi
397*b7893ccfSSadaf Ebrahimi vk_testing::DescriptorSetLayout m_layout;
398*b7893ccfSSadaf Ebrahimi vk_testing::PipelineLayout m_pipeline_layout;
399*b7893ccfSSadaf Ebrahimi vk_testing::DescriptorSet *m_set = NULL;
400*b7893ccfSSadaf Ebrahimi };
401*b7893ccfSSadaf Ebrahimi
402*b7893ccfSSadaf Ebrahimi class VkShaderObj : public vk_testing::ShaderModule {
403*b7893ccfSSadaf Ebrahimi public:
404*b7893ccfSSadaf Ebrahimi VkShaderObj(VkDeviceObj *device, const char *shaderText, VkShaderStageFlagBits stage, VkRenderFramework *framework,
405*b7893ccfSSadaf Ebrahimi char const *name = "main", bool debug = false, VkSpecializationInfo *specInfo = nullptr);
406*b7893ccfSSadaf Ebrahimi VkShaderObj(VkDeviceObj *device, const std::string spv_source, VkShaderStageFlagBits stage, VkRenderFramework *framework,
407*b7893ccfSSadaf Ebrahimi char const *name = "main", VkSpecializationInfo *specInfo = nullptr);
408*b7893ccfSSadaf Ebrahimi VkPipelineShaderStageCreateInfo const &GetStageCreateInfo() const;
409*b7893ccfSSadaf Ebrahimi
410*b7893ccfSSadaf Ebrahimi protected:
411*b7893ccfSSadaf Ebrahimi VkPipelineShaderStageCreateInfo m_stage_info;
412*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
413*b7893ccfSSadaf Ebrahimi };
414*b7893ccfSSadaf Ebrahimi
415*b7893ccfSSadaf Ebrahimi class VkPipelineLayoutObj : public vk_testing::PipelineLayout {
416*b7893ccfSSadaf Ebrahimi public:
417*b7893ccfSSadaf Ebrahimi VkPipelineLayoutObj() = default;
418*b7893ccfSSadaf Ebrahimi VkPipelineLayoutObj(VkDeviceObj *device, const std::vector<const VkDescriptorSetLayoutObj *> &descriptor_layouts = {},
419*b7893ccfSSadaf Ebrahimi const std::vector<VkPushConstantRange> &push_constant_ranges = {});
420*b7893ccfSSadaf Ebrahimi
421*b7893ccfSSadaf Ebrahimi // Move constructor and move assignment operator for Visual Studio 2013
VkPipelineLayoutObj(VkPipelineLayoutObj && src)422*b7893ccfSSadaf Ebrahimi VkPipelineLayoutObj(VkPipelineLayoutObj &&src) : PipelineLayout(std::move(src)) {}
423*b7893ccfSSadaf Ebrahimi VkPipelineLayoutObj &operator=(VkPipelineLayoutObj &&src) {
424*b7893ccfSSadaf Ebrahimi PipelineLayout::operator=(std::move(src));
425*b7893ccfSSadaf Ebrahimi return *this;
426*b7893ccfSSadaf Ebrahimi }
427*b7893ccfSSadaf Ebrahimi
428*b7893ccfSSadaf Ebrahimi void Reset();
429*b7893ccfSSadaf Ebrahimi };
430*b7893ccfSSadaf Ebrahimi
431*b7893ccfSSadaf Ebrahimi class VkPipelineObj : public vk_testing::Pipeline {
432*b7893ccfSSadaf Ebrahimi public:
433*b7893ccfSSadaf Ebrahimi VkPipelineObj(VkDeviceObj *device);
434*b7893ccfSSadaf Ebrahimi void AddShader(VkShaderObj *shaderObj);
435*b7893ccfSSadaf Ebrahimi void AddShader(VkPipelineShaderStageCreateInfo const &createInfo);
436*b7893ccfSSadaf Ebrahimi void AddVertexInputAttribs(VkVertexInputAttributeDescription *vi_attrib, uint32_t count);
437*b7893ccfSSadaf Ebrahimi void AddVertexInputBindings(VkVertexInputBindingDescription *vi_binding, uint32_t count);
438*b7893ccfSSadaf Ebrahimi void AddColorAttachment(uint32_t binding, const VkPipelineColorBlendAttachmentState &att);
439*b7893ccfSSadaf Ebrahimi void MakeDynamic(VkDynamicState state);
440*b7893ccfSSadaf Ebrahimi
441*b7893ccfSSadaf Ebrahimi void AddDefaultColorAttachment(VkColorComponentFlags writeMask = 0xf /*=R|G|B|A*/) {
442*b7893ccfSSadaf Ebrahimi VkPipelineColorBlendAttachmentState att = {};
443*b7893ccfSSadaf Ebrahimi att.blendEnable = VK_FALSE;
444*b7893ccfSSadaf Ebrahimi att.colorWriteMask = writeMask;
445*b7893ccfSSadaf Ebrahimi AddColorAttachment(0, att);
446*b7893ccfSSadaf Ebrahimi }
447*b7893ccfSSadaf Ebrahimi
448*b7893ccfSSadaf Ebrahimi void SetDepthStencil(const VkPipelineDepthStencilStateCreateInfo *);
449*b7893ccfSSadaf Ebrahimi void SetMSAA(const VkPipelineMultisampleStateCreateInfo *ms_state);
450*b7893ccfSSadaf Ebrahimi void SetInputAssembly(const VkPipelineInputAssemblyStateCreateInfo *ia_state);
451*b7893ccfSSadaf Ebrahimi void SetRasterization(const VkPipelineRasterizationStateCreateInfo *rs_state);
452*b7893ccfSSadaf Ebrahimi void SetTessellation(const VkPipelineTessellationStateCreateInfo *te_state);
453*b7893ccfSSadaf Ebrahimi void SetViewport(const vector<VkViewport> viewports);
454*b7893ccfSSadaf Ebrahimi void SetScissor(const vector<VkRect2D> scissors);
455*b7893ccfSSadaf Ebrahimi void SetLineState(const VkPipelineRasterizationLineStateCreateInfoEXT *line_state);
456*b7893ccfSSadaf Ebrahimi
457*b7893ccfSSadaf Ebrahimi void InitGraphicsPipelineCreateInfo(VkGraphicsPipelineCreateInfo *gp_ci);
458*b7893ccfSSadaf Ebrahimi
459*b7893ccfSSadaf Ebrahimi VkResult CreateVKPipeline(VkPipelineLayout layout, VkRenderPass render_pass, VkGraphicsPipelineCreateInfo *gp_ci = nullptr);
460*b7893ccfSSadaf Ebrahimi
461*b7893ccfSSadaf Ebrahimi protected:
462*b7893ccfSSadaf Ebrahimi VkPipelineVertexInputStateCreateInfo m_vi_state;
463*b7893ccfSSadaf Ebrahimi VkPipelineInputAssemblyStateCreateInfo m_ia_state;
464*b7893ccfSSadaf Ebrahimi VkPipelineRasterizationStateCreateInfo m_rs_state;
465*b7893ccfSSadaf Ebrahimi VkPipelineColorBlendStateCreateInfo m_cb_state;
466*b7893ccfSSadaf Ebrahimi VkPipelineDepthStencilStateCreateInfo const *m_ds_state;
467*b7893ccfSSadaf Ebrahimi VkPipelineViewportStateCreateInfo m_vp_state;
468*b7893ccfSSadaf Ebrahimi VkPipelineMultisampleStateCreateInfo m_ms_state;
469*b7893ccfSSadaf Ebrahimi VkPipelineTessellationStateCreateInfo const *m_te_state;
470*b7893ccfSSadaf Ebrahimi VkPipelineDynamicStateCreateInfo m_pd_state;
471*b7893ccfSSadaf Ebrahimi VkPipelineRasterizationLineStateCreateInfoEXT m_line_state;
472*b7893ccfSSadaf Ebrahimi vector<VkDynamicState> m_dynamic_state_enables;
473*b7893ccfSSadaf Ebrahimi vector<VkViewport> m_viewports;
474*b7893ccfSSadaf Ebrahimi vector<VkRect2D> m_scissors;
475*b7893ccfSSadaf Ebrahimi VkDeviceObj *m_device;
476*b7893ccfSSadaf Ebrahimi vector<VkPipelineShaderStageCreateInfo> m_shaderStages;
477*b7893ccfSSadaf Ebrahimi vector<VkPipelineColorBlendAttachmentState> m_colorAttachments;
478*b7893ccfSSadaf Ebrahimi };
479*b7893ccfSSadaf Ebrahimi
480*b7893ccfSSadaf Ebrahimi #endif // VKRENDERFRAMEWORK_H
481