1 #ifndef _VKTDRAWCREATEINFOUTIL_HPP 2 #define _VKTDRAWCREATEINFOUTIL_HPP 3 /*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2015 The Khronos Group Inc. 8 * Copyright (c) 2015 Intel Corporation 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 * 22 *//*! 23 * \file 24 * \brief CreateInfo utilities 25 *//*--------------------------------------------------------------------*/ 26 27 #include "vkDefs.hpp" 28 #include "tcuVector.hpp" 29 #include "deSharedPtr.hpp" 30 #include <vector> 31 32 namespace vkt 33 { 34 namespace Draw 35 { 36 37 class ImageSubresourceRange : public vk::VkImageSubresourceRange 38 { 39 public: 40 ImageSubresourceRange (vk::VkImageAspectFlags aspectMask, 41 deUint32 baseMipLevel = 0, 42 deUint32 levelCount = 1, 43 deUint32 baseArrayLayer = 0, 44 deUint32 layerCount = 1); 45 }; 46 47 class ComponentMapping : public vk::VkComponentMapping 48 { 49 public: 50 ComponentMapping (vk::VkComponentSwizzle r = vk::VK_COMPONENT_SWIZZLE_R, 51 vk::VkComponentSwizzle g = vk::VK_COMPONENT_SWIZZLE_G, 52 vk::VkComponentSwizzle b = vk::VK_COMPONENT_SWIZZLE_B, 53 vk::VkComponentSwizzle a = vk::VK_COMPONENT_SWIZZLE_A); 54 }; 55 56 class ImageViewCreateInfo : public vk::VkImageViewCreateInfo 57 { 58 public: 59 ImageViewCreateInfo (vk::VkImage image, 60 vk::VkImageViewType viewType, 61 vk::VkFormat format, 62 const vk::VkImageSubresourceRange& subresourceRange, 63 const vk::VkComponentMapping& components = ComponentMapping(), 64 vk::VkImageViewCreateFlags flags = 0); 65 66 ImageViewCreateInfo (vk::VkImage image, 67 vk::VkImageViewType viewType, 68 vk::VkFormat format, 69 const vk::VkComponentMapping& components = ComponentMapping(), 70 vk::VkImageViewCreateFlags flags = 0); 71 }; 72 73 class BufferViewCreateInfo : public vk::VkBufferViewCreateInfo 74 { 75 public: 76 BufferViewCreateInfo (vk::VkBuffer buffer, 77 vk::VkFormat format, 78 vk::VkDeviceSize offset, 79 vk::VkDeviceSize range); 80 }; 81 82 class BufferCreateInfo : public vk::VkBufferCreateInfo 83 { 84 public: 85 BufferCreateInfo (vk::VkDeviceSize size, 86 vk::VkBufferCreateFlags usage, 87 vk::VkSharingMode sharingMode = vk::VK_SHARING_MODE_EXCLUSIVE, 88 deUint32 queueFamilyIndexCount = 0, 89 const deUint32* pQueueFamilyIndices = DE_NULL, 90 vk::VkBufferCreateFlags flags = 0); 91 92 BufferCreateInfo (const BufferCreateInfo& other); 93 BufferCreateInfo& operator= (const BufferCreateInfo& other); 94 95 private: 96 std::vector<deUint32> m_queueFamilyIndices; 97 }; 98 99 class ImageCreateInfo : public vk::VkImageCreateInfo 100 { 101 public: 102 ImageCreateInfo (vk::VkImageType imageType, 103 vk::VkFormat format, 104 vk::VkExtent3D extent, 105 deUint32 mipLevels, 106 deUint32 arrayLayers, 107 vk::VkSampleCountFlagBits samples, 108 vk::VkImageTiling tiling, 109 vk::VkImageUsageFlags usage, 110 vk::VkSharingMode sharingMode = vk::VK_SHARING_MODE_EXCLUSIVE, 111 deUint32 queueFamilyIndexCount = 0, 112 const deUint32* pQueueFamilyIndices = DE_NULL, 113 vk::VkImageCreateFlags flags = 0, 114 vk::VkImageLayout initialLayout = vk::VK_IMAGE_LAYOUT_UNDEFINED); 115 116 private: 117 ImageCreateInfo (const ImageCreateInfo& other); 118 ImageCreateInfo& operator= (const ImageCreateInfo& other); 119 120 std::vector<deUint32> m_queueFamilyIndices; 121 }; 122 123 class FramebufferCreateInfo : public vk::VkFramebufferCreateInfo 124 { 125 public: 126 FramebufferCreateInfo (vk::VkRenderPass renderPass, 127 const std::vector<vk::VkImageView>& attachments, 128 deUint32 width, 129 deUint32 height, 130 deUint32 layers); 131 }; 132 133 class AttachmentDescription : public vk::VkAttachmentDescription 134 { 135 public: 136 AttachmentDescription (vk::VkFormat format, 137 vk::VkSampleCountFlagBits samples, 138 vk::VkAttachmentLoadOp loadOp, 139 vk::VkAttachmentStoreOp storeOp, 140 vk::VkAttachmentLoadOp stencilLoadOp, 141 vk::VkAttachmentStoreOp stencilStoreOp, 142 vk::VkImageLayout initialLayout, 143 vk::VkImageLayout finalLayout); 144 145 AttachmentDescription (const vk::VkAttachmentDescription &); 146 }; 147 148 class AttachmentReference : public vk::VkAttachmentReference 149 { 150 public: 151 AttachmentReference (deUint32 attachment, vk::VkImageLayout layout); 152 AttachmentReference (void); 153 }; 154 155 class SubpassDescription : public vk::VkSubpassDescription 156 { 157 public: 158 SubpassDescription (vk::VkPipelineBindPoint pipelineBindPoint, 159 vk::VkSubpassDescriptionFlags flags, 160 deUint32 inputAttachmentCount, 161 const vk::VkAttachmentReference* inputAttachments, 162 deUint32 colorAttachmentCount, 163 const vk::VkAttachmentReference* colorAttachments, 164 const vk::VkAttachmentReference* resolveAttachments, 165 vk::VkAttachmentReference depthStencilAttachment, 166 deUint32 preserveAttachmentCount, 167 const deUint32* preserveAttachments); 168 169 SubpassDescription (const vk::VkSubpassDescription& other); 170 SubpassDescription (const SubpassDescription& other); 171 SubpassDescription& operator= (const SubpassDescription& other); 172 173 private: 174 std::vector<vk::VkAttachmentReference> m_inputAttachments; 175 std::vector<vk::VkAttachmentReference> m_colorAttachments; 176 std::vector<vk::VkAttachmentReference> m_resolveAttachments; 177 std::vector<deUint32> m_preserveAttachments; 178 179 vk::VkAttachmentReference m_depthStencilAttachment; 180 }; 181 182 class SubpassDependency : public vk::VkSubpassDependency 183 { 184 public: 185 SubpassDependency ( deUint32 srcSubpass, 186 deUint32 dstSubpass, 187 vk::VkPipelineStageFlags srcStageMask, 188 vk::VkPipelineStageFlags dstStageMask, 189 vk::VkAccessFlags srcAccessMask, 190 vk::VkAccessFlags dstAccessMask, 191 vk::VkDependencyFlags dependencyFlags); 192 193 SubpassDependency (const vk::VkSubpassDependency& other); 194 }; 195 196 class RenderPassCreateInfo : public vk::VkRenderPassCreateInfo 197 { 198 public: 199 RenderPassCreateInfo (const std::vector<vk::VkAttachmentDescription>& attachments, 200 const std::vector<vk::VkSubpassDescription>& subpasses, 201 const std::vector<vk::VkSubpassDependency>& dependiences = std::vector<vk::VkSubpassDependency>()); 202 203 RenderPassCreateInfo (deUint32 attachmentCount = 0, 204 const vk::VkAttachmentDescription* pAttachments = DE_NULL, 205 deUint32 subpassCount = 0, 206 const vk::VkSubpassDescription* pSubpasses = DE_NULL, 207 deUint32 dependencyCount = 0, 208 const vk::VkSubpassDependency* pDependiences = DE_NULL); 209 210 void addAttachment (vk::VkAttachmentDescription attachment); 211 void addSubpass (vk::VkSubpassDescription subpass); 212 void addDependency (vk::VkSubpassDependency dependency); 213 214 private: 215 std::vector<AttachmentDescription> m_attachments; 216 std::vector<SubpassDescription> m_subpasses; 217 std::vector<SubpassDependency> m_dependiences; 218 219 std::vector<vk::VkAttachmentDescription> m_attachmentsStructs; 220 std::vector<vk::VkSubpassDescription> m_subpassesStructs; 221 std::vector<vk::VkSubpassDependency> m_dependiencesStructs; 222 223 RenderPassCreateInfo (const RenderPassCreateInfo &other); //Not allowed! 224 RenderPassCreateInfo& operator= (const RenderPassCreateInfo &other); //Not allowed! 225 }; 226 227 class RenderPassBeginInfo : public vk::VkRenderPassBeginInfo 228 { 229 public: 230 RenderPassBeginInfo (vk::VkRenderPass renderPass, 231 vk::VkFramebuffer framebuffer, 232 vk::VkRect2D renderArea, 233 const std::vector<vk::VkClearValue>& clearValues = std::vector<vk::VkClearValue>()); 234 235 private: 236 std::vector<vk::VkClearValue> m_clearValues; 237 238 RenderPassBeginInfo (const RenderPassBeginInfo& other); //Not allowed! 239 RenderPassBeginInfo& operator= (const RenderPassBeginInfo& other); //Not allowed! 240 }; 241 242 class CmdPoolCreateInfo : public vk::VkCommandPoolCreateInfo 243 { 244 public: 245 CmdPoolCreateInfo (deUint32 queueFamilyIndex, 246 vk::VkCommandPoolCreateFlags flags = vk::VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); 247 }; 248 249 class CmdBufferBeginInfo : public vk::VkCommandBufferBeginInfo 250 { 251 public: 252 CmdBufferBeginInfo (vk::VkCommandBufferUsageFlags flags = 0); 253 }; 254 255 class DescriptorPoolSize : public vk::VkDescriptorPoolSize 256 { 257 public: DescriptorPoolSize(vk::VkDescriptorType _type,deUint32 _descriptorCount)258 DescriptorPoolSize (vk::VkDescriptorType _type, deUint32 _descriptorCount) 259 { 260 type = _type; 261 descriptorCount = _descriptorCount; 262 } 263 }; 264 265 class DescriptorPoolCreateInfo : public vk::VkDescriptorPoolCreateInfo 266 { 267 public: 268 DescriptorPoolCreateInfo (const std::vector<vk::VkDescriptorPoolSize>& poolSizeCounts, 269 vk::VkDescriptorPoolCreateFlags flags, 270 deUint32 maxSets); 271 272 DescriptorPoolCreateInfo& addDescriptors (vk::VkDescriptorType type, deUint32 count); 273 274 private: 275 std::vector<vk::VkDescriptorPoolSize> m_poolSizeCounts; 276 }; 277 278 class DescriptorSetLayoutCreateInfo : public vk::VkDescriptorSetLayoutCreateInfo 279 { 280 public: 281 DescriptorSetLayoutCreateInfo (deUint32 bindingCount, const vk::VkDescriptorSetLayoutBinding* pBindings); 282 }; 283 284 class PipelineLayoutCreateInfo : public vk::VkPipelineLayoutCreateInfo 285 { 286 public: 287 PipelineLayoutCreateInfo (deUint32 descriptorSetCount, 288 const vk::VkDescriptorSetLayout* pSetLayouts, 289 deUint32 pushConstantRangeCount = 0, 290 const vk::VkPushConstantRange* pPushConstantRanges = DE_NULL); 291 292 PipelineLayoutCreateInfo (const std::vector<vk::VkDescriptorSetLayout>& setLayouts = std::vector<vk::VkDescriptorSetLayout>(), 293 deUint32 pushConstantRangeCount = 0, 294 const vk::VkPushConstantRange* pPushConstantRanges = DE_NULL); 295 296 private: 297 std::vector<vk::VkDescriptorSetLayout> m_setLayouts; 298 std::vector<vk::VkPushConstantRange> m_pushConstantRanges; 299 }; 300 301 class PipelineCreateInfo : public vk::VkGraphicsPipelineCreateInfo 302 { 303 public: 304 class VertexInputState : public vk::VkPipelineVertexInputStateCreateInfo 305 { 306 public: 307 VertexInputState (deUint32 vertexBindingDescriptionCount = 0, 308 const vk::VkVertexInputBindingDescription* pVertexBindingDescriptions = NULL, 309 deUint32 vertexAttributeDescriptionCount = 0, 310 const vk::VkVertexInputAttributeDescription* pVertexAttributeDescriptions = NULL); 311 312 VertexInputState& addDivisors (deUint32 vertexBindingDivisorCount = 0, 313 const vk::VkVertexInputBindingDivisorDescriptionEXT* pVertexBindingDivisors = NULL); 314 315 vk::VkPipelineVertexInputDivisorStateCreateInfoEXT m_divisorState; 316 }; 317 318 class InputAssemblerState : public vk::VkPipelineInputAssemblyStateCreateInfo 319 { 320 public: 321 InputAssemblerState (vk::VkPrimitiveTopology topology, vk::VkBool32 primitiveRestartEnable = false); 322 }; 323 324 class TessellationState : public vk::VkPipelineTessellationStateCreateInfo 325 { 326 public: 327 TessellationState (deUint32 patchControlPoints = 0); 328 }; 329 330 class ViewportState : public vk::VkPipelineViewportStateCreateInfo 331 { 332 public: 333 ViewportState (deUint32 viewportCount, 334 std::vector<vk::VkViewport> viewports = std::vector<vk::VkViewport>(0), 335 std::vector<vk::VkRect2D> scissors = std::vector<vk::VkRect2D>(0)); 336 337 ViewportState (const ViewportState& other); 338 ViewportState& operator= (const ViewportState& other); 339 340 std::vector<vk::VkViewport> m_viewports; 341 std::vector<vk::VkRect2D> m_scissors; 342 }; 343 344 class RasterizerState : public vk::VkPipelineRasterizationStateCreateInfo 345 { 346 public: 347 RasterizerState (vk::VkBool32 depthClampEnable = false, 348 vk::VkBool32 rasterizerDiscardEnable = false, 349 vk::VkPolygonMode polygonMode = vk::VK_POLYGON_MODE_FILL, 350 vk::VkCullModeFlags cullMode = vk::VK_CULL_MODE_NONE, 351 vk::VkFrontFace frontFace = vk::VK_FRONT_FACE_CLOCKWISE, 352 vk::VkBool32 depthBiasEnable = true, 353 float depthBiasConstantFactor = 0.0f, 354 float depthBiasClamp = 0.0f, 355 float depthBiasSlopeFactor = 0.0f, 356 float lineWidth = 1.0f); 357 }; 358 359 class MultiSampleState : public vk::VkPipelineMultisampleStateCreateInfo 360 { 361 public: 362 MultiSampleState (vk::VkSampleCountFlagBits rasterizationSamples = vk::VK_SAMPLE_COUNT_1_BIT, 363 vk::VkBool32 sampleShadingEnable = false, 364 float minSampleShading = 0.0f, 365 const std::vector<vk::VkSampleMask>& sampleMask = std::vector<vk::VkSampleMask>(1, 0xffffffffu), 366 bool alphaToCoverageEnable = false, 367 bool alphaToOneEnable = false); 368 369 MultiSampleState (const MultiSampleState& other); 370 MultiSampleState& operator= (const MultiSampleState& other); 371 372 private: 373 std::vector<vk::VkSampleMask> m_sampleMask; 374 }; 375 376 class ColorBlendState : public vk::VkPipelineColorBlendStateCreateInfo 377 { 378 public: 379 class Attachment : public vk::VkPipelineColorBlendAttachmentState 380 { 381 public: 382 Attachment (vk::VkBool32 blendEnable = false, 383 vk::VkBlendFactor srcColorBlendFactor = vk::VK_BLEND_FACTOR_SRC_COLOR, 384 vk::VkBlendFactor dstColorBlendFactor = vk::VK_BLEND_FACTOR_DST_COLOR, 385 vk::VkBlendOp colorBlendOp = vk::VK_BLEND_OP_ADD, 386 vk::VkBlendFactor srcAlphaBlendFactor = vk::VK_BLEND_FACTOR_SRC_COLOR, 387 vk::VkBlendFactor dstAlphaBlendFactor = vk::VK_BLEND_FACTOR_DST_COLOR, 388 vk::VkBlendOp alphaBlendOp = vk::VK_BLEND_OP_ADD, 389 vk::VkColorComponentFlags colorWriteMask = vk::VK_COLOR_COMPONENT_R_BIT| 390 vk::VK_COLOR_COMPONENT_G_BIT| 391 vk::VK_COLOR_COMPONENT_B_BIT| 392 vk::VK_COLOR_COMPONENT_A_BIT); 393 }; 394 395 ColorBlendState (const std::vector<vk::VkPipelineColorBlendAttachmentState>& attachments, 396 vk::VkBool32 alphaToCoverageEnable = false, 397 vk::VkLogicOp logicOp = vk::VK_LOGIC_OP_COPY); 398 399 ColorBlendState (deUint32 attachmentCount, 400 const vk::VkPipelineColorBlendAttachmentState* attachments, 401 vk::VkBool32 logicOpEnable = false, 402 vk::VkLogicOp logicOp = vk::VK_LOGIC_OP_COPY); 403 404 ColorBlendState (const vk::VkPipelineColorBlendStateCreateInfo& createInfo); 405 ColorBlendState (const ColorBlendState& createInfo, 406 std::vector<float> blendConstants = std::vector<float>(4)); 407 408 private: 409 std::vector<vk::VkPipelineColorBlendAttachmentState> m_attachments; 410 }; 411 412 class DepthStencilState : public vk::VkPipelineDepthStencilStateCreateInfo 413 { 414 public: 415 class StencilOpState : public vk::VkStencilOpState 416 { 417 public: 418 StencilOpState (vk::VkStencilOp failOp = vk::VK_STENCIL_OP_REPLACE, 419 vk::VkStencilOp passOp = vk::VK_STENCIL_OP_REPLACE, 420 vk::VkStencilOp depthFailOp = vk::VK_STENCIL_OP_REPLACE, 421 vk::VkCompareOp compareOp = vk::VK_COMPARE_OP_ALWAYS, 422 deUint32 compareMask = 0xffffffffu, 423 deUint32 writeMask = 0xffffffffu, 424 deUint32 reference = 0u); 425 }; 426 427 DepthStencilState (vk::VkBool32 depthTestEnable = false, 428 vk::VkBool32 depthWriteEnable = false, 429 vk::VkCompareOp depthCompareOp = vk::VK_COMPARE_OP_ALWAYS, 430 vk::VkBool32 depthBoundsTestEnable = false, 431 vk::VkBool32 stencilTestEnable = false, 432 StencilOpState front = StencilOpState(), 433 StencilOpState back = StencilOpState(), 434 float minDepthBounds = 0.0f, 435 float maxDepthBounds = 1.0f); 436 }; 437 438 class PipelineShaderStage : public vk::VkPipelineShaderStageCreateInfo 439 { 440 public: 441 PipelineShaderStage (vk::VkShaderModule shaderModule, const char* pName, vk::VkShaderStageFlagBits stage); 442 }; 443 444 class DynamicState : public vk::VkPipelineDynamicStateCreateInfo 445 { 446 public: 447 DynamicState (const std::vector<vk::VkDynamicState>& dynamicStates = std::vector<vk::VkDynamicState>(0)); 448 449 DynamicState (const DynamicState& other); 450 DynamicState& operator= (const DynamicState& other); 451 452 std::vector<vk::VkDynamicState> m_dynamicStates; 453 }; 454 455 PipelineCreateInfo (vk::VkPipelineLayout layout, 456 vk::VkRenderPass renderPass, 457 int subpass, 458 vk::VkPipelineCreateFlags flags); 459 460 PipelineCreateInfo& addShader (const vk::VkPipelineShaderStageCreateInfo& shader); 461 462 PipelineCreateInfo& addState (const vk::VkPipelineVertexInputStateCreateInfo& state); 463 PipelineCreateInfo& addState (const vk::VkPipelineInputAssemblyStateCreateInfo& state); 464 PipelineCreateInfo& addState (const vk::VkPipelineColorBlendStateCreateInfo& state); 465 PipelineCreateInfo& addState (const vk::VkPipelineViewportStateCreateInfo& state); 466 PipelineCreateInfo& addState (const vk::VkPipelineDepthStencilStateCreateInfo& state); 467 PipelineCreateInfo& addState (const vk::VkPipelineTessellationStateCreateInfo& state); 468 PipelineCreateInfo& addState (const vk::VkPipelineRasterizationStateCreateInfo& state); 469 PipelineCreateInfo& addState (const vk::VkPipelineMultisampleStateCreateInfo& state); 470 PipelineCreateInfo& addState (const vk::VkPipelineDynamicStateCreateInfo& state); 471 472 private: 473 std::vector<vk::VkPipelineShaderStageCreateInfo> m_shaders; 474 475 vk::VkPipelineVertexInputStateCreateInfo m_vertexInputState; 476 vk::VkPipelineInputAssemblyStateCreateInfo m_inputAssemblyState; 477 std::vector<vk::VkPipelineColorBlendAttachmentState> m_colorBlendStateAttachments; 478 vk::VkPipelineColorBlendStateCreateInfo m_colorBlendState; 479 vk::VkPipelineViewportStateCreateInfo m_viewportState; 480 vk::VkPipelineDepthStencilStateCreateInfo m_dynamicDepthStencilState; 481 vk::VkPipelineTessellationStateCreateInfo m_tessState; 482 vk::VkPipelineRasterizationStateCreateInfo m_rasterState; 483 vk::VkPipelineMultisampleStateCreateInfo m_multisampleState; 484 vk::VkPipelineDynamicStateCreateInfo m_dynamicState; 485 486 std::vector<vk::VkDynamicState> m_dynamicStates; 487 std::vector<vk::VkViewport> m_viewports; 488 std::vector<vk::VkRect2D> m_scissors; 489 std::vector<vk::VkSampleMask> m_multisampleStateSampleMask; 490 }; 491 492 class SamplerCreateInfo : public vk::VkSamplerCreateInfo 493 { 494 public: 495 SamplerCreateInfo (vk::VkFilter magFilter = vk::VK_FILTER_NEAREST, 496 vk::VkFilter minFilter = vk::VK_FILTER_NEAREST, 497 vk::VkSamplerMipmapMode mipmapMode = vk::VK_SAMPLER_MIPMAP_MODE_NEAREST, 498 vk::VkSamplerAddressMode addressU = vk::VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, 499 vk::VkSamplerAddressMode addressV = vk::VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, 500 vk::VkSamplerAddressMode addressW = vk::VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, 501 float mipLodBias = 0.0f, 502 vk::VkBool32 anisotropyEnable = VK_FALSE, 503 float maxAnisotropy = 1.0f, 504 vk::VkBool32 compareEnable = false, 505 vk::VkCompareOp compareOp = vk::VK_COMPARE_OP_ALWAYS, 506 float minLod = 0.0f, 507 float maxLod = 16.0f, 508 vk::VkBorderColor borderColor = vk::VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE, 509 vk::VkBool32 unnormalizedCoordinates = false); 510 }; 511 512 } // Draw 513 } // vkt 514 515 #endif // _VKTDRAWCREATEINFOUTIL_HPP 516