blob: 3d1dcb1431905b5062508ad9b0d3300847c838a3 [file] [log] [blame]
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001/*
Karl Schultz6addd812016-02-02 17:17:23 -07002 * Copyright (c) 2015-2016 The Khronos Group Inc.
3 * Copyright (c) 2015-2016 Valve Corporation
4 * Copyright (c) 2015-2016 LunarG, Inc.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06005 *
Karl Schultz6addd812016-02-02 17:17:23 -07006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and/or associated documentation files (the "Materials"), to
8 * deal in the Materials without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Materials, and to permit persons to whom the Materials are
11 * furnished to do so, subject to the following conditions:
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060012 *
Karl Schultz6addd812016-02-02 17:17:23 -070013 * The above copyright notice(s) and this permission notice shall be included in
14 * all copies or substantial portions of the Materials.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060015 *
Karl Schultz6addd812016-02-02 17:17:23 -070016 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Karl Schultz6addd812016-02-02 17:17:23 -070018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 *
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
23 * USE OR OTHER DEALINGS IN THE MATERIALS.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060024 *
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060025 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060026 */
27
28#ifndef VKRENDERFRAMEWORK_H
29#define VKRENDERFRAMEWORK_H
30
Michael Lentine83ab3412015-11-03 16:20:30 -080031#ifdef ANDROID
32#include "vktestframeworkandroid.h"
33class VkImageObj;
34#else
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060035#include "vktestframework.h"
Michael Lentine83ab3412015-11-03 16:20:30 -080036#endif
David Pinedoabd07722015-11-24 09:00:24 -070037#include "vulkan/vk_lunarg_debug_marker.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060038
Michael Lentine83ab3412015-11-03 16:20:30 -080039#include <vector>
40
41using namespace std;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060042
Karl Schultz6addd812016-02-02 17:17:23 -070043class VkDeviceObj : public vk_testing::Device {
44 public:
Tony Barbourd1c35722015-04-16 15:59:00 -060045 VkDeviceObj(uint32_t id, VkPhysicalDevice obj);
Courtney Goeltzenleuchter5bac6092015-07-07 11:47:33 -060046 VkDeviceObj(uint32_t id, VkPhysicalDevice obj,
47 std::vector<const char *> &layers,
48 std::vector<const char *> &extension_names);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060049
Chia-I Wuf368b602015-07-03 10:41:20 +080050 VkDevice device() { return handle(); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060051 void get_device_queue();
52
Karl Schultz6addd812016-02-02 17:17:23 -070053 uint32_t id;
54 VkPhysicalDeviceProperties props;
55 const VkQueueFamilyProperties *queue_props;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060056
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -060057 VkQueue m_queue;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060058};
59
Karl Schultz6addd812016-02-02 17:17:23 -070060class VkDepthStencilObj : public vk_testing::Image {
61 public:
Tony Barbour6918cd52015-04-09 12:58:51 -060062 VkDepthStencilObj();
Karl Schultz6addd812016-02-02 17:17:23 -070063 void Init(VkDeviceObj *device, int32_t width, int32_t height,
64 VkFormat format);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060065 bool Initialized();
Karl Schultz6addd812016-02-02 17:17:23 -070066 VkImageView *BindInfo();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060067
Karl Schultz6addd812016-02-02 17:17:23 -070068 protected:
69 VkDeviceObj *m_device;
70 bool m_initialized;
71 vk_testing::ImageView m_imageView;
72 VkFormat m_depth_stencil_fmt;
73 VkImageView m_attachmentBindInfo;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060074};
75
Tony Barbourfe3351b2015-07-28 10:17:20 -060076class VkCommandBufferObj;
77
Karl Schultz6addd812016-02-02 17:17:23 -070078class VkRenderFramework : public VkTestFramework {
79 public:
Tony Barbour6918cd52015-04-09 12:58:51 -060080 VkRenderFramework();
81 ~VkRenderFramework();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060082
Karl Schultz6addd812016-02-02 17:17:23 -070083 VkDevice device() { return m_device->device(); }
84 VkPhysicalDevice gpu() { return objs[0]; }
85 VkRenderPass renderPass() { return m_renderPass; }
86 VkFramebuffer framebuffer() { return m_framebuffer; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060087 void InitViewport(float width, float height);
88 void InitViewport();
89 void InitRenderTarget();
90 void InitRenderTarget(uint32_t targets);
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -060091 void InitRenderTarget(VkImageView *dsBinding);
92 void InitRenderTarget(uint32_t targets, VkImageView *dsBinding);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060093 void InitFramework();
Karl Schultz6addd812016-02-02 17:17:23 -070094 void InitFramework(std::vector<const char *> instance_layer_names,
95 std::vector<const char *> device_layer_names,
96 std::vector<const char *> instance_extension_names,
97 std::vector<const char *> device_extension_names,
98 PFN_vkDebugReportCallbackEXT = NULL,
99 void *userData = NULL);
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600100
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600101 void ShutdownFramework();
102 void InitState();
103
Karl Schultz6addd812016-02-02 17:17:23 -0700104 const VkRenderPassBeginInfo &renderPassBeginInfo() const {
105 return m_renderPassBeginInfo;
106 }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600107
Karl Schultz6addd812016-02-02 17:17:23 -0700108 protected:
109 VkApplicationInfo app_info;
110 VkInstance inst;
111 VkPhysicalDevice objs[16];
112 uint32_t gpu_count;
113 VkDeviceObj *m_device;
114 VkCommandPool m_commandPool;
115 VkCommandBufferObj *m_commandBuffer;
116 VkRenderPass m_renderPass;
117 VkFramebuffer m_framebuffer;
118 std::vector<VkViewport> m_viewports;
119 std::vector<VkRect2D> m_scissors;
120 float m_lineWidth;
121 float m_depthBiasConstantFactor;
122 float m_depthBiasClamp;
123 float m_depthBiasSlopeFactor;
124 float m_blendConstants[4];
125 float m_minDepthBounds;
126 float m_maxDepthBounds;
127 uint32_t m_compareMask;
128 uint32_t m_writeMask;
129 uint32_t m_reference;
130 std::vector<VkClearValue> m_renderPassClearValues;
131 VkRenderPassBeginInfo m_renderPassBeginInfo;
132 vector<VkImageObj *> m_renderTargets;
133 float m_width, m_height;
134 VkFormat m_render_target_fmt;
135 VkFormat m_depth_stencil_fmt;
136 VkClearColorValue m_clear_color;
137 bool m_clear_via_load_op;
138 float m_depth_clear_color;
139 uint32_t m_stencil_clear_color;
140 VkDepthStencilObj *m_depthStencil;
141 PFN_vkCreateDebugReportCallbackEXT m_CreateDebugReportCallback;
Courtney Goeltzenleuchter011ccf82015-12-15 09:25:15 -0700142 PFN_vkDestroyDebugReportCallbackEXT m_DestroyDebugReportCallback;
Karl Schultz6addd812016-02-02 17:17:23 -0700143 PFN_vkDebugReportMessageEXT m_DebugReportMessage;
144 VkDebugReportCallbackEXT m_globalMsgCallback;
145 VkDebugReportCallbackEXT m_devMsgCallback;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600146
147 /*
148 * SetUp and TearDown are called by the Google Test framework
149 * to initialize a test framework based on this class.
150 */
151 virtual void SetUp() {
152 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
153 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800154 this->app_info.pApplicationName = "base";
155 this->app_info.applicationVersion = 1;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600156 this->app_info.pEngineName = "unittest";
157 this->app_info.engineVersion = 1;
Tony Barbouraabb3592016-02-25 13:58:50 -0700158 this->app_info.apiVersion = VK_MAKE_VERSION(1, 0, 0);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600159
160 InitFramework();
161 }
162
Karl Schultz6addd812016-02-02 17:17:23 -0700163 virtual void TearDown() { ShutdownFramework(); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600164};
165
Tony Barbour6918cd52015-04-09 12:58:51 -0600166class VkDescriptorSetObj;
167class VkIndexBufferObj;
168class VkConstantBufferObj;
169class VkPipelineObj;
170class VkDescriptorSetObj;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600171
Karl Schultz6addd812016-02-02 17:17:23 -0700172class VkCommandBufferObj : public vk_testing::CommandBuffer {
173 public:
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800174 VkCommandBufferObj(VkDeviceObj *device, VkCommandPool pool);
175 VkCommandBuffer GetBufferHandle();
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600176 VkResult BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800177 VkResult BeginCommandBuffer(VkCommandBufferBeginInfo *pInfo);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600178 VkResult EndCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -0700179 void PipelineBarrier(VkPipelineStageFlags src_stages,
180 VkPipelineStageFlags dest_stages,
181 VkDependencyFlags dependencyFlags,
182 uint32_t memoryBarrierCount,
183 const VkMemoryBarrier *pMemoryBarriers,
184 uint32_t bufferMemoryBarrierCount,
185 const VkBufferMemoryBarrier *pBufferMemoryBarriers,
186 uint32_t imageMemoryBarrierCount,
187 const VkImageMemoryBarrier *pImageMemoryBarriers);
Tony Barbour6918cd52015-04-09 12:58:51 -0600188 void AddRenderTarget(VkImageObj *renderTarget);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600189 void AddDepthStencil();
Karl Schultz6addd812016-02-02 17:17:23 -0700190 void ClearAllBuffers(VkClearColorValue clear_color, float depth_clear_color,
191 uint32_t stencil_clear_color,
192 VkDepthStencilObj *depthStencilObj);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600193 void PrepareAttachments();
Tony Barbour6918cd52015-04-09 12:58:51 -0600194 void BindPipeline(VkPipelineObj &pipeline);
195 void BindDescriptorSet(VkDescriptorSetObj &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -0700196 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer,
197 VkDeviceSize offset, uint32_t binding);
Cody Northropd2ad0342015-08-05 11:15:02 -0600198 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset);
Chia-I Wu08accc62015-07-07 11:50:03 +0800199 void BeginRenderPass(const VkRenderPassBeginInfo &info);
Chia-I Wu0b50a1c2015-06-26 15:34:39 +0800200 void EndRenderPass();
Karl Schultz6addd812016-02-02 17:17:23 -0700201 void FillBuffer(VkBuffer buffer, VkDeviceSize offset,
202 VkDeviceSize fill_size, uint32_t data);
203 void Draw(uint32_t vertexCount, uint32_t instanceCount,
204 uint32_t firstVertex, uint32_t firstInstance);
205 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
206 uint32_t firstIndex, int32_t vertexOffset,
207 uint32_t firstInstance);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600208 void QueueCommandBuffer();
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600209 void QueueCommandBuffer(VkFence fence);
Karl Schultz6addd812016-02-02 17:17:23 -0700210 void SetViewport(uint32_t firstViewport, uint32_t viewportCount,
211 const VkViewport *pViewports);
212 void SetScissor(uint32_t firstScissor, uint32_t scissorCount,
213 const VkRect2D *pScissors);
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -0600214 void SetLineWidth(float lineWidth);
Karl Schultz6addd812016-02-02 17:17:23 -0700215 void SetDepthBias(float depthBiasConstantFactor, float depthBiasClamp,
216 float depthBiasSlopeFactor);
Chia-I Wu2bfb33c2015-10-26 17:24:52 +0800217 void SetBlendConstants(const float blendConstants[4]);
Courtney Goeltzenleuchter49c73082015-09-17 15:06:17 -0600218 void SetDepthBounds(float minDepthBounds, float maxDepthBounds);
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800219 void SetStencilReadMask(VkStencilFaceFlags faceMask, uint32_t compareMask);
220 void SetStencilWriteMask(VkStencilFaceFlags faceMask, uint32_t writeMask);
221 void SetStencilReference(VkStencilFaceFlags faceMask, uint32_t reference);
Karl Schultz6addd812016-02-02 17:17:23 -0700222 void UpdateBuffer(VkBuffer buffer, VkDeviceSize dstOffset,
223 VkDeviceSize dataSize, const uint32_t *pData);
224 void CopyImage(VkImage srcImage, VkImageLayout srcImageLayout,
225 VkImage dstImage, VkImageLayout dstImageLayout,
226 uint32_t regionCount, const VkImageCopy *pRegions);
227 void ResolveImage(VkImage srcImage, VkImageLayout srcImageLayout,
228 VkImage dstImage, VkImageLayout dstImageLayout,
229 uint32_t regionCount, const VkImageResolve *pRegions);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600230
Karl Schultz6addd812016-02-02 17:17:23 -0700231 protected:
232 VkDeviceObj *m_device;
233 vector<VkImageObj *> m_renderTargets;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600234};
235
Karl Schultz6addd812016-02-02 17:17:23 -0700236class VkConstantBufferObj : public vk_testing::Buffer {
237 public:
Tony Barbour6918cd52015-04-09 12:58:51 -0600238 VkConstantBufferObj(VkDeviceObj *device);
Karl Schultz6addd812016-02-02 17:17:23 -0700239 VkConstantBufferObj(VkDeviceObj *device, int constantCount,
240 int constantSize, const void *data);
Tony Barbour6918cd52015-04-09 12:58:51 -0600241 ~VkConstantBufferObj();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600242 void BufferMemoryBarrier(
Karl Schultz6addd812016-02-02 17:17:23 -0700243 VkFlags srcAccessMask = VK_ACCESS_HOST_WRITE_BIT |
244 VK_ACCESS_SHADER_WRITE_BIT |
245 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
246 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
247 VK_ACCESS_TRANSFER_WRITE_BIT,
248 VkFlags dstAccessMask = VK_ACCESS_HOST_READ_BIT |
249 VK_ACCESS_INDIRECT_COMMAND_READ_BIT |
250 VK_ACCESS_INDEX_READ_BIT |
251 VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
252 VK_ACCESS_UNIFORM_READ_BIT |
253 VK_ACCESS_SHADER_READ_BIT |
254 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
255 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
256 VK_ACCESS_MEMORY_READ_BIT);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600257
Karl Schultz6addd812016-02-02 17:17:23 -0700258 void Bind(VkCommandBuffer commandBuffer, VkDeviceSize offset,
259 uint32_t binding);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600260
Karl Schultz6addd812016-02-02 17:17:23 -0700261 VkDescriptorBufferInfo m_descriptorBufferInfo;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600262
Karl Schultz6addd812016-02-02 17:17:23 -0700263 protected:
264 VkDeviceObj *m_device;
265 vk_testing::BufferView m_bufferView;
266 int m_numVertices;
267 int m_stride;
268 vk_testing::CommandPool *m_commandPool;
269 VkCommandBufferObj *m_commandBuffer;
270 vk_testing::Fence m_fence;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600271};
272
Karl Schultz6addd812016-02-02 17:17:23 -0700273class VkIndexBufferObj : public VkConstantBufferObj {
274 public:
Tony Barbour6918cd52015-04-09 12:58:51 -0600275 VkIndexBufferObj(VkDeviceObj *device);
Karl Schultz6addd812016-02-02 17:17:23 -0700276 void CreateAndInitBuffer(int numIndexes, VkIndexType dataFormat,
277 const void *data);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800278 void Bind(VkCommandBuffer commandBuffer, VkDeviceSize offset);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600279 VkIndexType GetIndexType();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600280
Karl Schultz6addd812016-02-02 17:17:23 -0700281 protected:
282 VkIndexType m_indexType;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600283};
284
Karl Schultz6addd812016-02-02 17:17:23 -0700285class VkImageObj : public vk_testing::Image {
286 public:
Tony Barbour6918cd52015-04-09 12:58:51 -0600287 VkImageObj(VkDeviceObj *dev);
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600288 bool IsCompatible(VkFlags usage, VkFlags features);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600289
Karl Schultz6addd812016-02-02 17:17:23 -0700290 public:
291 void init(uint32_t w, uint32_t h, VkFormat fmt, VkFlags usage,
292 VkImageTiling tiling = VK_IMAGE_TILING_LINEAR,
293 VkMemoryPropertyFlags reqs = 0);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600294
295 // void clear( CommandBuffer*, uint32_t[4] );
296
Karl Schultz6addd812016-02-02 17:17:23 -0700297 void layout(VkImageLayout layout) {
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -0600298 m_descriptorImageInfo.imageLayout = layout;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600299 }
300
Karl Schultz6addd812016-02-02 17:17:23 -0700301 VkDeviceMemory memory() const { return Image::memory().handle(); }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800302
Karl Schultz6addd812016-02-02 17:17:23 -0700303 void *MapMemory() { return Image::memory().map(); }
Chia-I Wu681d7a02015-07-03 13:44:34 +0800304
Karl Schultz6addd812016-02-02 17:17:23 -0700305 void UnmapMemory() { Image::memory().unmap(); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600306
Karl Schultz6addd812016-02-02 17:17:23 -0700307 void ImageMemoryBarrier(VkCommandBufferObj *cmd, VkImageAspectFlags aspect,
308 VkFlags output_mask, VkFlags input_mask,
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600309 VkImageLayout image_layout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600310
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600311 VkResult CopyImage(VkImageObj &src_image);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600312
Karl Schultz6addd812016-02-02 17:17:23 -0700313 VkImage image() const { return handle(); }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600314
Karl Schultz6addd812016-02-02 17:17:23 -0700315 VkImageView targetView(VkFormat format) {
316 if (!m_targetView.initialized()) {
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -0600317 VkImageViewCreateInfo createView = {};
318 createView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
319 createView.image = handle();
Karl Schultz6addd812016-02-02 17:17:23 -0700320 createView.viewType = VK_IMAGE_VIEW_TYPE_2D;
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -0600321 createView.format = format;
Chia-I Wuab83a0e2015-10-27 19:00:15 +0800322 createView.components.r = VK_COMPONENT_SWIZZLE_R;
323 createView.components.g = VK_COMPONENT_SWIZZLE_G;
324 createView.components.b = VK_COMPONENT_SWIZZLE_B;
325 createView.components.a = VK_COMPONENT_SWIZZLE_A;
Karl Schultz6addd812016-02-02 17:17:23 -0700326 createView.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0,
327 1};
Courtney Goeltzenleuchter5861a1b2015-09-01 17:30:39 -0600328 createView.flags = 0;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600329 m_targetView.init(*m_device, createView);
330 }
Chia-I Wu3158bf32015-07-03 11:49:42 +0800331 return m_targetView.handle();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600332 }
333
Karl Schultz6addd812016-02-02 17:17:23 -0700334 void SetLayout(VkCommandBufferObj *cmd_buf, VkImageAspectFlagBits aspect,
335 VkImageLayout image_layout);
Courtney Goeltzenleuchter908e7672015-10-21 17:00:51 -0600336 void SetLayout(VkImageAspectFlagBits aspect, VkImageLayout image_layout);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600337
Karl Schultz6addd812016-02-02 17:17:23 -0700338 VkImageLayout layout() const { return m_descriptorImageInfo.imageLayout; }
339 uint32_t width() const { return extent().width; }
340 uint32_t height() const { return extent().height; }
341 VkDeviceObj *device() const { return m_device; }
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600342
Karl Schultz6addd812016-02-02 17:17:23 -0700343 protected:
344 VkDeviceObj *m_device;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600345
Karl Schultz6addd812016-02-02 17:17:23 -0700346 vk_testing::ImageView m_targetView;
347 VkDescriptorImageInfo m_descriptorImageInfo;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600348};
349
Karl Schultz6addd812016-02-02 17:17:23 -0700350class VkTextureObj : public VkImageObj {
351 public:
Tony Barbour6918cd52015-04-09 12:58:51 -0600352 VkTextureObj(VkDeviceObj *device, uint32_t *colors = NULL);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600353
Karl Schultz6addd812016-02-02 17:17:23 -0700354 VkDescriptorImageInfo m_imageInfo;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600355
Karl Schultz6addd812016-02-02 17:17:23 -0700356 protected:
357 VkDeviceObj *m_device;
358 vk_testing::ImageView m_textureView;
359 VkDeviceSize m_rowPitch;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600360};
361
Karl Schultz6addd812016-02-02 17:17:23 -0700362class VkSamplerObj : public vk_testing::Sampler {
363 public:
Tony Barbour6918cd52015-04-09 12:58:51 -0600364 VkSamplerObj(VkDeviceObj *device);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600365
Karl Schultz6addd812016-02-02 17:17:23 -0700366 protected:
367 VkDeviceObj *m_device;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600368};
369
Karl Schultz6addd812016-02-02 17:17:23 -0700370class VkDescriptorSetObj : public vk_testing::DescriptorPool {
371 public:
Tony Barbour6918cd52015-04-09 12:58:51 -0600372 VkDescriptorSetObj(VkDeviceObj *device);
373 ~VkDescriptorSetObj();
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600374
375 int AppendDummy();
Karl Schultz6addd812016-02-02 17:17:23 -0700376 int AppendBuffer(VkDescriptorType type,
377 VkConstantBufferObj &constantBuffer);
378 int AppendSamplerTexture(VkSamplerObj *sampler, VkTextureObj *texture);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800379 void CreateVKDescriptorSet(VkCommandBufferObj *commandBuffer);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600380
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -0600381 VkDescriptorSet GetDescriptorSetHandle() const;
Mark Lobodzinski0fadf5f2015-04-17 14:11:39 -0500382 VkPipelineLayout GetPipelineLayout() const;
Tony Barbour26aa42b2016-03-02 15:35:27 -0700383 int GetTypeCounts() {return m_type_counts.size();}
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600384
Karl Schultz6addd812016-02-02 17:17:23 -0700385 protected:
386 VkDeviceObj *m_device;
387 vector<VkDescriptorPoolSize> m_type_counts;
388 int m_nextSlot;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600389
Karl Schultz6addd812016-02-02 17:17:23 -0700390 vector<VkDescriptorImageInfo> m_imageSamplerDescriptors;
391 vector<VkWriteDescriptorSet> m_writes;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600392
Karl Schultz6addd812016-02-02 17:17:23 -0700393 vk_testing::DescriptorSetLayout m_layout;
394 vk_testing::PipelineLayout m_pipeline_layout;
Tony Barbour26aa42b2016-03-02 15:35:27 -0700395 vk_testing::DescriptorSet *m_set = NULL;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600396};
397
Karl Schultz6addd812016-02-02 17:17:23 -0700398class VkShaderObj : public vk_testing::ShaderModule {
399 public:
400 VkShaderObj(VkDeviceObj *device, const char *shaderText,
Chris Forbes4f9b0e62015-12-30 11:49:04 +1300401 VkShaderStageFlagBits stage, VkRenderFramework *framework,
402 char const *name = "main");
Chia-I Wu28e06912015-10-31 00:31:16 +0800403 VkPipelineShaderStageCreateInfo GetStageCreateInfo() const;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600404
Karl Schultz6addd812016-02-02 17:17:23 -0700405 protected:
406 VkPipelineShaderStageCreateInfo stage_info;
407 VkShaderStageFlagBits m_stage;
Chris Forbes4f9b0e62015-12-30 11:49:04 +1300408 char const *m_name;
Karl Schultz6addd812016-02-02 17:17:23 -0700409 VkDeviceObj *m_device;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600410};
411
Karl Schultz6addd812016-02-02 17:17:23 -0700412class VkPipelineObj : public vk_testing::Pipeline {
413 public:
Tony Barbour6918cd52015-04-09 12:58:51 -0600414 VkPipelineObj(VkDeviceObj *device);
Karl Schultz6addd812016-02-02 17:17:23 -0700415 void AddShader(VkShaderObj *shaderObj);
416 void AddVertexInputAttribs(VkVertexInputAttributeDescription *vi_attrib,
417 int count);
418 void AddVertexInputBindings(VkVertexInputBindingDescription *vi_binding,
419 int count);
420 void AddColorAttachment(uint32_t binding,
421 const VkPipelineColorBlendAttachmentState *att);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600422 void MakeDynamic(VkDynamicState state);
Chia-I Wu08accc62015-07-07 11:50:03 +0800423
Karl Schultz6addd812016-02-02 17:17:23 -0700424 void AddColorAttachment() {
Tony Barbourdd6e32e2015-07-10 15:29:03 -0600425 VkPipelineColorBlendAttachmentState att = {};
Chia-I Wu08accc62015-07-07 11:50:03 +0800426 att.blendEnable = VK_FALSE;
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800427 att.colorWriteMask = 0xf;
Chia-I Wu08accc62015-07-07 11:50:03 +0800428 AddColorAttachment(0, &att);
429 }
430
Tony Barbourdd6e32e2015-07-10 15:29:03 -0600431 void SetDepthStencil(VkPipelineDepthStencilStateCreateInfo *);
Tony Barbour0ec8cd52015-08-06 09:27:11 -0600432 void SetMSAA(VkPipelineMultisampleStateCreateInfo *ms_state);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600433 void SetViewport(vector<VkViewport> viewports);
434 void SetScissor(vector<VkRect2D> scissors);
Karl Schultz6addd812016-02-02 17:17:23 -0700435 VkResult CreateVKPipeline(VkPipelineLayout layout,
436 VkRenderPass render_pass);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600437
Karl Schultz6addd812016-02-02 17:17:23 -0700438 protected:
439 VkPipelineVertexInputStateCreateInfo m_vi_state;
440 VkPipelineInputAssemblyStateCreateInfo m_ia_state;
441 VkPipelineRasterizationStateCreateInfo m_rs_state;
442 VkPipelineColorBlendStateCreateInfo m_cb_state;
443 VkPipelineDepthStencilStateCreateInfo m_ds_state;
444 VkPipelineViewportStateCreateInfo m_vp_state;
445 VkPipelineMultisampleStateCreateInfo m_ms_state;
446 vector<VkDynamicState> m_dynamic_state_enables;
447 vector<VkViewport> m_viewports;
448 vector<VkRect2D> m_scissors;
449 VkDeviceObj *m_device;
450 vector<VkShaderObj *> m_shaderObjs;
451 vector<int> m_vertexBufferBindings;
452 vector<VkPipelineColorBlendAttachmentState> m_colorAttachments;
453 int m_vertexBufferCount;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600454};
455
456#endif // VKRENDERFRAMEWORK_H