1 /*------------------------------------------------------------------------ 2 * Vulkan Conformance Tests 3 * ------------------------ 4 * 5 * Copyright (c) 2016 The Khronos Group Inc. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Image Tests Utility Classes 22 *//*--------------------------------------------------------------------*/ 23 24 #include "vktImageTestsUtil.hpp" 25 #include "vkQueryUtil.hpp" 26 #include "vkTypeUtil.hpp" 27 #include "vkCmdUtil.hpp" 28 #include "vkObjUtil.hpp" 29 #include "tcuTextureUtil.hpp" 30 31 using namespace vk; 32 33 namespace vkt 34 { 35 namespace image 36 { 37 38 Buffer::Buffer (const DeviceInterface& vk, 39 const VkDevice device, 40 Allocator& allocator, 41 const VkBufferCreateInfo& bufferCreateInfo, 42 const MemoryRequirement memoryRequirement) 43 { 44 m_buffer = createBuffer(vk, device, &bufferCreateInfo); 45 m_allocation = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), memoryRequirement); 46 VK_CHECK(vk.bindBufferMemory(device, *m_buffer, m_allocation->getMemory(), m_allocation->getOffset())); 47 } 48 49 Image::Image (const DeviceInterface& vk, 50 const VkDevice device, 51 Allocator& allocator, 52 const VkImageCreateInfo& imageCreateInfo, 53 const MemoryRequirement memoryRequirement) 54 { 55 m_image = createImage(vk, device, &imageCreateInfo); 56 m_allocation = allocator.allocate(getImageMemoryRequirements(vk, device, *m_image), memoryRequirement); 57 VK_CHECK(vk.bindImageMemory(device, *m_image, m_allocation->getMemory(), m_allocation->getOffset())); 58 } 59 60 tcu::UVec3 getShaderGridSize (const ImageType imageType, const tcu::UVec3& imageSize) 61 { 62 switch (imageType) 63 { 64 case IMAGE_TYPE_1D: 65 case IMAGE_TYPE_BUFFER: 66 return tcu::UVec3(imageSize.x(), 1u, 1u); 67 68 case IMAGE_TYPE_1D_ARRAY: 69 return tcu::UVec3(imageSize.x(), imageSize.z(), 1u); 70 71 case IMAGE_TYPE_2D: 72 return tcu::UVec3(imageSize.x(), imageSize.y(), 1u); 73 74 case IMAGE_TYPE_2D_ARRAY: 75 case IMAGE_TYPE_3D: 76 return tcu::UVec3(imageSize.x(), imageSize.y(), imageSize.z()); 77 78 case IMAGE_TYPE_CUBE: 79 return tcu::UVec3(imageSize.x(), imageSize.y(), 6u); 80 81 case IMAGE_TYPE_CUBE_ARRAY: 82 return tcu::UVec3(imageSize.x(), imageSize.y(), 6u * imageSize.z()); 83 84 default: 85 DE_FATAL("Unknown image type"); 86 return tcu::UVec3(1u, 1u, 1u); 87 } 88 } 89 90 tcu::UVec3 getLayerSize (const ImageType imageType, const tcu::UVec3& imageSize) 91 { 92 switch (imageType) 93 { 94 case IMAGE_TYPE_1D: 95 case IMAGE_TYPE_1D_ARRAY: 96 case IMAGE_TYPE_BUFFER: 97 return tcu::UVec3(imageSize.x(), 1u, 1u); 98 99 case IMAGE_TYPE_2D: 100 case IMAGE_TYPE_2D_ARRAY: 101 case IMAGE_TYPE_CUBE: 102 case IMAGE_TYPE_CUBE_ARRAY: 103 return tcu::UVec3(imageSize.x(), imageSize.y(), 1u); 104 105 case IMAGE_TYPE_3D: 106 return tcu::UVec3(imageSize.x(), imageSize.y(), imageSize.z()); 107 108 default: 109 DE_FATAL("Unknown image type"); 110 return tcu::UVec3(1u, 1u, 1u); 111 } 112 } 113 114 deUint32 getNumLayers (const ImageType imageType, const tcu::UVec3& imageSize) 115 { 116 switch (imageType) 117 { 118 case IMAGE_TYPE_1D: 119 case IMAGE_TYPE_2D: 120 case IMAGE_TYPE_3D: 121 case IMAGE_TYPE_BUFFER: 122 return 1u; 123 124 case IMAGE_TYPE_1D_ARRAY: 125 case IMAGE_TYPE_2D_ARRAY: 126 return imageSize.z(); 127 128 case IMAGE_TYPE_CUBE: 129 return 6u; 130 131 case IMAGE_TYPE_CUBE_ARRAY: 132 return imageSize.z() * 6u; 133 134 default: 135 DE_FATAL("Unknown image type"); 136 return 0u; 137 } 138 } 139 140 deUint32 getNumPixels (const ImageType imageType, const tcu::UVec3& imageSize) 141 { 142 const tcu::UVec3 gridSize = getShaderGridSize(imageType, imageSize); 143 144 return gridSize.x() * gridSize.y() * gridSize.z(); 145 } 146 147 deUint32 getDimensions (const ImageType imageType) 148 { 149 switch (imageType) 150 { 151 case IMAGE_TYPE_1D: 152 case IMAGE_TYPE_BUFFER: 153 return 1u; 154 155 case IMAGE_TYPE_1D_ARRAY: 156 case IMAGE_TYPE_2D: 157 return 2u; 158 159 case IMAGE_TYPE_2D_ARRAY: 160 case IMAGE_TYPE_CUBE: 161 case IMAGE_TYPE_CUBE_ARRAY: 162 case IMAGE_TYPE_3D: 163 return 3u; 164 165 default: 166 DE_FATAL("Unknown image type"); 167 return 0u; 168 } 169 } 170 171 deUint32 getLayerDimensions (const ImageType imageType) 172 { 173 switch (imageType) 174 { 175 case IMAGE_TYPE_1D: 176 case IMAGE_TYPE_BUFFER: 177 case IMAGE_TYPE_1D_ARRAY: 178 return 1u; 179 180 case IMAGE_TYPE_2D: 181 case IMAGE_TYPE_2D_ARRAY: 182 case IMAGE_TYPE_CUBE: 183 case IMAGE_TYPE_CUBE_ARRAY: 184 return 2u; 185 186 case IMAGE_TYPE_3D: 187 return 3u; 188 189 default: 190 DE_FATAL("Unknown image type"); 191 return 0u; 192 } 193 } 194 195 VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize bufferSize, 196 const VkBufferUsageFlags usage) 197 { 198 const VkBufferCreateInfo bufferCreateInfo = 199 { 200 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 201 DE_NULL, // const void* pNext; 202 0u, // VkBufferCreateFlags flags; 203 bufferSize, // VkDeviceSize size; 204 usage, // VkBufferUsageFlags usage; 205 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 206 0u, // deUint32 queueFamilyIndexCount; 207 DE_NULL, // const deUint32* pQueueFamilyIndices; 208 }; 209 return bufferCreateInfo; 210 } 211 212 VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent, 213 const deUint32 arraySize) 214 { 215 const VkBufferImageCopy copyParams = 216 { 217 0ull, // VkDeviceSize bufferOffset; 218 0u, // deUint32 bufferRowLength; 219 0u, // deUint32 bufferImageHeight; 220 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, arraySize), // VkImageSubresourceLayers imageSubresource; 221 makeOffset3D(0, 0, 0), // VkOffset3D imageOffset; 222 extent, // VkExtent3D imageExtent; 223 }; 224 return copyParams; 225 } 226 227 Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk, 228 const VkDevice device, 229 const VkDescriptorSetLayout descriptorSetLayout) 230 { 231 const VkPipelineLayoutCreateInfo pipelineLayoutParams = 232 { 233 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType; 234 DE_NULL, // const void* pNext; 235 0u, // VkPipelineLayoutCreateFlags flags; 236 1u, // deUint32 setLayoutCount; 237 &descriptorSetLayout, // const VkDescriptorSetLayout* pSetLayouts; 238 0u, // deUint32 pushConstantRangeCount; 239 DE_NULL, // const VkPushConstantRange* pPushConstantRanges; 240 }; 241 return createPipelineLayout(vk, device, &pipelineLayoutParams); 242 } 243 244 Move<VkPipeline> makeComputePipeline (const DeviceInterface& vk, 245 const VkDevice device, 246 const VkPipelineLayout pipelineLayout, 247 const VkShaderModule shaderModule) 248 { 249 const VkPipelineShaderStageCreateInfo pipelineShaderStageParams = 250 { 251 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 252 DE_NULL, // const void* pNext; 253 0u, // VkPipelineShaderStageCreateFlags flags; 254 VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage; 255 shaderModule, // VkShaderModule module; 256 "main", // const char* pName; 257 DE_NULL, // const VkSpecializationInfo* pSpecializationInfo; 258 }; 259 const VkComputePipelineCreateInfo pipelineCreateInfo = 260 { 261 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType; 262 DE_NULL, // const void* pNext; 263 0u, // VkPipelineCreateFlags flags; 264 pipelineShaderStageParams, // VkPipelineShaderStageCreateInfo stage; 265 pipelineLayout, // VkPipelineLayout layout; 266 DE_NULL, // VkPipeline basePipelineHandle; 267 0, // deInt32 basePipelineIndex; 268 }; 269 return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo); 270 } 271 272 Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk, 273 const VkDevice device, 274 const VkPipelineLayout pipelineLayout, 275 const VkRenderPass renderPass, 276 const VkShaderModule vertexModule, 277 const VkShaderModule fragmentModule, 278 const VkExtent2D renderSize, 279 const deUint32 colorAttachmentCount, 280 const bool dynamicSize) 281 { 282 std::vector<VkViewport> viewports; 283 std::vector<VkRect2D> scissors; 284 285 const VkViewport viewport = makeViewport(renderSize); 286 const VkRect2D scissor = makeRect2D(renderSize); 287 288 const VkFormat vertexFormatPosition = VK_FORMAT_R32G32B32A32_SFLOAT; 289 const deUint32 vertexSizePosition = tcu::getPixelSize(mapVkFormat(vertexFormatPosition)); 290 const deUint32 vertexBufferOffsetPosition = 0u; 291 const deUint32 vertexDataStride = vertexSizePosition; 292 293 if (!dynamicSize) 294 { 295 viewports.push_back(viewport); 296 scissors.push_back(scissor); 297 } 298 299 const VkVertexInputBindingDescription vertexInputBindingDescription = 300 { 301 0u, // deUint32 binding; 302 vertexDataStride, // deUint32 stride; 303 VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputRate inputRate; 304 }; 305 306 const VkVertexInputAttributeDescription vertexInputAttributeDescription = 307 { 308 0u, // deUint32 location; 309 0u, // deUint32 binding; 310 vertexFormatPosition, // VkFormat format; 311 vertexBufferOffsetPosition, // deUint32 offset; 312 }; 313 314 const VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo = 315 { 316 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 317 DE_NULL, // const void* pNext; 318 (VkPipelineVertexInputStateCreateFlags)0, // VkPipelineVertexInputStateCreateFlags flags; 319 1u, // deUint32 vertexBindingDescriptionCount; 320 &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 321 1u, // deUint32 vertexAttributeDescriptionCount; 322 &vertexInputAttributeDescription // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 323 }; 324 325 const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; 326 const VkPipelineColorBlendAttachmentState colorBlendAttachmentState = 327 { 328 VK_FALSE, // VkBool32 blendEnable; 329 VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor; 330 VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor; 331 VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp; 332 VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor; 333 VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor; 334 VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp; 335 colorComponentsAll // VkColorComponentFlags colorWriteMask; 336 }; 337 338 std::vector<VkPipelineColorBlendAttachmentState> colorAttachments (colorAttachmentCount, colorBlendAttachmentState); 339 340 const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo = 341 { 342 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 343 DE_NULL, // const void* pNext; 344 (VkPipelineColorBlendStateCreateFlags)0, // VkPipelineColorBlendStateCreateFlags flags; 345 VK_FALSE, // VkBool32 logicOpEnable; 346 VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 347 (deUint32)colorAttachments.size(), // deUint32 attachmentCount; 348 colorAttachments.size() != 0 ? &colorAttachments[0] : DE_NULL, // const VkPipelineColorBlendAttachmentState* pAttachments; 349 { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]; 350 }; 351 352 return vk::makeGraphicsPipeline(vk, // const DeviceInterface& vk 353 device, // const VkDevice device 354 pipelineLayout, // const VkPipelineLayout pipelineLayout 355 vertexModule, // const VkShaderModule vertexShaderModule 356 DE_NULL, // const VkShaderModule tessellationControlModule 357 DE_NULL, // const VkShaderModule tessellationEvalModule 358 DE_NULL, // const VkShaderModule geometryShaderModule 359 fragmentModule, // const VkShaderModule fragmentShaderModule 360 renderPass, // const VkRenderPass renderPass 361 viewports, // const std::vector<VkViewport>& viewports 362 scissors, // const std::vector<VkRect2D>& scissors 363 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // const VkPrimitiveTopology topology 364 0u, // const deUint32 subpass 365 0u, // const deUint32 patchControlPoints 366 &vertexInputStateCreateInfo, // const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo 367 DE_NULL, // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo 368 DE_NULL, // const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo 369 DE_NULL, // const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo 370 &pipelineColorBlendStateInfo); // const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo 371 } 372 373 //! A single-subpass render pass. 374 Move<VkRenderPass> makeRenderPass (const DeviceInterface& vk, 375 const VkDevice device, 376 const VkFormat inputFormat, 377 const VkFormat colorFormat) 378 { 379 const VkAttachmentReference inputAttachmentRef = 380 { 381 0u, // deUint32 attachment; 382 VK_IMAGE_LAYOUT_GENERAL // VkImageLayout layout; 383 }; 384 385 const VkAttachmentReference colorAttachmentRef = 386 { 387 1u, // deUint32 attachment; 388 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout; 389 }; 390 391 const VkSubpassDescription subpassDescription = 392 { 393 (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; 394 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 395 1u, // deUint32 inputAttachmentCount; 396 &inputAttachmentRef, // const VkAttachmentReference* pInputAttachments; 397 1u, // deUint32 colorAttachmentCount; 398 &colorAttachmentRef, // const VkAttachmentReference* pColorAttachments; 399 DE_NULL, // const VkAttachmentReference* pResolveAttachments; 400 DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment; 401 0u, // deUint32 preserveAttachmentCount; 402 DE_NULL // const deUint32* pPreserveAttachments; 403 }; 404 405 const VkAttachmentDescription attachmentsDescriptions[] = 406 { 407 //inputAttachmentDescription, 408 { 409 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; 410 inputFormat, // VkFormat format; 411 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 412 VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp; 413 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp storeOp; 414 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 415 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 416 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout initialLayout; 417 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout finalLayout; 418 }, 419 //colorAttachmentDescription 420 { 421 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; 422 colorFormat, // VkFormat format; 423 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 424 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 425 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 426 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 427 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 428 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 429 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout finalLayout; 430 } 431 }; 432 433 const VkRenderPassCreateInfo renderPassInfo = 434 { 435 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 436 DE_NULL, // const void* pNext; 437 (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; 438 DE_LENGTH_OF_ARRAY(attachmentsDescriptions), // deUint32 attachmentCount; 439 attachmentsDescriptions, // const VkAttachmentDescription* pAttachments; 440 1u, // deUint32 subpassCount; 441 &subpassDescription, // const VkSubpassDescription* pSubpasses; 442 0u, // deUint32 dependencyCount; 443 DE_NULL // const VkSubpassDependency* pDependencies; 444 }; 445 446 return createRenderPass(vk, device, &renderPassInfo); 447 } 448 449 //! A single-subpass render pass. 450 Move<VkRenderPass> makeRenderPass (const DeviceInterface& vk, 451 const VkDevice device) 452 { 453 const VkSubpassDescription subpassDescription = 454 { 455 (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; 456 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 457 0u, // deUint32 inputAttachmentCount; 458 DE_NULL, // const VkAttachmentReference* pInputAttachments; 459 0u, // deUint32 colorAttachmentCount; 460 DE_NULL, // const VkAttachmentReference* pColorAttachments; 461 DE_NULL, // const VkAttachmentReference* pResolveAttachments; 462 DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment; 463 0u, // deUint32 preserveAttachmentCount; 464 DE_NULL // const deUint32* pPreserveAttachments; 465 }; 466 467 const VkRenderPassCreateInfo renderPassInfo = 468 { 469 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 470 DE_NULL, // const void* pNext; 471 (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; 472 0, // deUint32 attachmentCount; 473 DE_NULL, // const VkAttachmentDescription* pAttachments; 474 1u, // deUint32 subpassCount; 475 &subpassDescription, // const VkSubpassDescription* pSubpasses; 476 0u, // deUint32 dependencyCount; 477 DE_NULL // const VkSubpassDependency* pDependencies; 478 }; 479 480 return createRenderPass(vk, device, &renderPassInfo); 481 } 482 483 Move<VkBufferView> makeBufferView (const DeviceInterface& vk, 484 const VkDevice vkDevice, 485 const VkBuffer buffer, 486 const VkFormat format, 487 const VkDeviceSize offset, 488 const VkDeviceSize size) 489 { 490 const VkBufferViewCreateInfo bufferViewParams = 491 { 492 VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO, // VkStructureType sType; 493 DE_NULL, // const void* pNext; 494 0u, // VkBufferViewCreateFlags flags; 495 buffer, // VkBuffer buffer; 496 format, // VkFormat format; 497 offset, // VkDeviceSize offset; 498 size, // VkDeviceSize range; 499 }; 500 return createBufferView(vk, vkDevice, &bufferViewParams); 501 } 502 503 Move<VkImageView> makeImageView (const DeviceInterface& vk, 504 const VkDevice vkDevice, 505 const VkImage image, 506 const VkImageViewType imageViewType, 507 const VkFormat format, 508 const VkImageSubresourceRange subresourceRange, 509 const VkImageViewUsageCreateInfo* ImageUsageCreateInfo) 510 { 511 const VkImageViewCreateInfo imageViewParams = 512 { 513 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 514 ImageUsageCreateInfo, // const void* pNext; 515 0u, // VkImageViewCreateFlags flags; 516 image, // VkImage image; 517 imageViewType, // VkImageViewType viewType; 518 format, // VkFormat format; 519 makeComponentMappingRGBA(), // VkComponentMapping components; 520 subresourceRange, // VkImageSubresourceRange subresourceRange; 521 }; 522 return createImageView(vk, vkDevice, &imageViewParams); 523 } 524 525 Move<VkDescriptorSet> makeDescriptorSet (const DeviceInterface& vk, 526 const VkDevice device, 527 const VkDescriptorPool descriptorPool, 528 const VkDescriptorSetLayout setLayout) 529 { 530 const VkDescriptorSetAllocateInfo allocateParams = 531 { 532 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType; 533 DE_NULL, // const void* pNext; 534 descriptorPool, // VkDescriptorPool descriptorPool; 535 1u, // deUint32 setLayoutCount; 536 &setLayout, // const VkDescriptorSetLayout* pSetLayouts; 537 }; 538 return allocateDescriptorSet(vk, device, &allocateParams); 539 } 540 541 VkImageViewUsageCreateInfo makeImageViewUsageCreateInfo (const VkImageUsageFlags imageUsageFlags) 542 { 543 VkImageViewUsageCreateInfo imageViewUsageCreateInfo = 544 { 545 VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, //VkStructureType sType; 546 DE_NULL, //const void* pNext; 547 imageUsageFlags, //VkImageUsageFlags usage; 548 }; 549 550 return imageViewUsageCreateInfo; 551 } 552 553 VkSamplerCreateInfo makeSamplerCreateInfo () 554 { 555 const VkSamplerCreateInfo defaultSamplerParams = 556 { 557 VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType; 558 DE_NULL, // const void* pNext; 559 0u, // VkSamplerCreateFlags flags; 560 VK_FILTER_NEAREST, // VkFilter magFilter; 561 VK_FILTER_NEAREST, // VkFilter minFilter; 562 VK_SAMPLER_MIPMAP_MODE_NEAREST, // VkSamplerMipmapMode mipmapMode; 563 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeU; 564 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeV; 565 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeW; 566 0.0f, // float mipLodBias; 567 VK_FALSE, // VkBool32 anisotropyEnable; 568 1.0f, // float maxAnisotropy; 569 VK_FALSE, // VkBool32 compareEnable; 570 VK_COMPARE_OP_NEVER, // VkCompareOp compareOp; 571 0.0f, // float minLod; 572 0.25f, // float maxLod; 573 VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, // VkBorderColor borderColor; 574 VK_FALSE // VkBool32 unnormalizedCoordinates; 575 }; 576 577 return defaultSamplerParams; 578 } 579 580 tcu::UVec3 getCompressedImageResolutionInBlocks (const vk::VkFormat format, const tcu::UVec3& size) 581 { 582 deUint32 blockWidth = getBlockWidth(format); 583 deUint32 blockHeight = getBlockHeight(format); 584 585 DE_ASSERT(size[2] == 1); 586 DE_ASSERT(blockWidth != 0 && blockHeight != 0); 587 588 deUint32 widthInBlocks = (size[0] + blockWidth - 1) / blockWidth; 589 deUint32 heightInBlocks = (size[1] + blockHeight - 1) / blockHeight; 590 591 return tcu::UVec3(widthInBlocks, heightInBlocks, 1); 592 } 593 594 tcu::UVec3 getCompressedImageResolutionBlockCeil (const vk::VkFormat format, const tcu::UVec3& size) 595 { 596 deUint32 blockWidth = getBlockWidth(format); 597 deUint32 blockHeight = getBlockHeight(format); 598 599 DE_ASSERT(size[2] == 1); 600 DE_ASSERT(blockWidth != 0 && blockHeight != 0); 601 602 deUint32 widthInBlocks = (size[0] + blockWidth - 1) / blockWidth; 603 deUint32 heightInBlocks = (size[1] + blockHeight - 1) / blockHeight; 604 605 return tcu::UVec3(blockWidth * widthInBlocks, blockHeight * heightInBlocks, 1); 606 } 607 608 VkDeviceSize getCompressedImageSizeInBytes (const vk::VkFormat format, const tcu::UVec3& size) 609 { 610 tcu::UVec3 sizeInBlocks = getCompressedImageResolutionInBlocks(format, size); 611 deUint32 blockBytes = getBlockSizeInBytes(format); 612 VkDeviceSize sizeBytes = sizeInBlocks[0] * sizeInBlocks[1] * sizeInBlocks[2] * blockBytes; 613 614 return sizeBytes; 615 } 616 617 VkDeviceSize getUncompressedImageSizeInBytes (const vk::VkFormat format, const tcu::UVec3& size) 618 { 619 const tcu::IVec3 sizeAsIVec3 = tcu::IVec3((int)size.x(), (int)size.y(), (int)size.z()); 620 const VkDeviceSize sizeBytes = getImageSizeBytes(sizeAsIVec3, format); 621 622 return sizeBytes; 623 } 624 625 VkImageType mapImageType (const ImageType imageType) 626 { 627 switch (imageType) 628 { 629 case IMAGE_TYPE_1D: 630 case IMAGE_TYPE_1D_ARRAY: 631 case IMAGE_TYPE_BUFFER: 632 return VK_IMAGE_TYPE_1D; 633 634 case IMAGE_TYPE_2D: 635 case IMAGE_TYPE_2D_ARRAY: 636 case IMAGE_TYPE_CUBE: 637 case IMAGE_TYPE_CUBE_ARRAY: 638 return VK_IMAGE_TYPE_2D; 639 640 case IMAGE_TYPE_3D: 641 return VK_IMAGE_TYPE_3D; 642 643 default: 644 DE_ASSERT(false); 645 return VK_IMAGE_TYPE_LAST; 646 } 647 } 648 649 VkImageViewType mapImageViewType (const ImageType imageType) 650 { 651 switch (imageType) 652 { 653 case IMAGE_TYPE_1D: return VK_IMAGE_VIEW_TYPE_1D; 654 case IMAGE_TYPE_1D_ARRAY: return VK_IMAGE_VIEW_TYPE_1D_ARRAY; 655 case IMAGE_TYPE_2D: return VK_IMAGE_VIEW_TYPE_2D; 656 case IMAGE_TYPE_2D_ARRAY: return VK_IMAGE_VIEW_TYPE_2D_ARRAY; 657 case IMAGE_TYPE_3D: return VK_IMAGE_VIEW_TYPE_3D; 658 case IMAGE_TYPE_CUBE: return VK_IMAGE_VIEW_TYPE_CUBE; 659 case IMAGE_TYPE_CUBE_ARRAY: return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; 660 661 default: 662 DE_ASSERT(false); 663 return VK_IMAGE_VIEW_TYPE_LAST; 664 } 665 } 666 667 std::string getImageTypeName (const ImageType imageType) 668 { 669 switch (imageType) 670 { 671 case IMAGE_TYPE_1D: return "1d"; 672 case IMAGE_TYPE_1D_ARRAY: return "1d_array"; 673 case IMAGE_TYPE_2D: return "2d"; 674 case IMAGE_TYPE_2D_ARRAY: return "2d_array"; 675 case IMAGE_TYPE_3D: return "3d"; 676 case IMAGE_TYPE_CUBE: return "cube"; 677 case IMAGE_TYPE_CUBE_ARRAY: return "cube_array"; 678 case IMAGE_TYPE_BUFFER: return "buffer"; 679 680 default: 681 DE_ASSERT(false); 682 return ""; 683 } 684 } 685 686 std::string getShaderImageType (const tcu::TextureFormat& format, const ImageType imageType, const bool multisample) 687 { 688 std::string formatPart = tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER ? "u" : 689 tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER ? "i" : ""; 690 691 std::string imageTypePart; 692 if (multisample) 693 { 694 switch (imageType) 695 { 696 case IMAGE_TYPE_2D: imageTypePart = "2DMS"; break; 697 case IMAGE_TYPE_2D_ARRAY: imageTypePart = "2DMSArray"; break; 698 699 default: 700 DE_ASSERT(false); 701 } 702 } 703 else 704 { 705 switch (imageType) 706 { 707 case IMAGE_TYPE_1D: imageTypePart = "1D"; break; 708 case IMAGE_TYPE_1D_ARRAY: imageTypePart = "1DArray"; break; 709 case IMAGE_TYPE_2D: imageTypePart = "2D"; break; 710 case IMAGE_TYPE_2D_ARRAY: imageTypePart = "2DArray"; break; 711 case IMAGE_TYPE_3D: imageTypePart = "3D"; break; 712 case IMAGE_TYPE_CUBE: imageTypePart = "Cube"; break; 713 case IMAGE_TYPE_CUBE_ARRAY: imageTypePart = "CubeArray"; break; 714 case IMAGE_TYPE_BUFFER: imageTypePart = "Buffer"; break; 715 716 default: 717 DE_ASSERT(false); 718 } 719 } 720 721 return formatPart + "image" + imageTypePart; 722 } 723 724 std::string getShaderImageFormatQualifier (const tcu::TextureFormat& format) 725 { 726 const char* orderPart; 727 const char* typePart; 728 729 switch (format.order) 730 { 731 case tcu::TextureFormat::R: orderPart = "r"; break; 732 case tcu::TextureFormat::RG: orderPart = "rg"; break; 733 case tcu::TextureFormat::RGB: orderPart = "rgb"; break; 734 case tcu::TextureFormat::RGBA: orderPart = "rgba"; break; 735 case tcu::TextureFormat::sRGBA: orderPart = "rgba"; break; 736 737 default: 738 DE_ASSERT(false); 739 orderPart = DE_NULL; 740 } 741 742 switch (format.type) 743 { 744 case tcu::TextureFormat::FLOAT: typePart = "32f"; break; 745 case tcu::TextureFormat::HALF_FLOAT: typePart = "16f"; break; 746 747 case tcu::TextureFormat::UNSIGNED_INT32: typePart = "32ui"; break; 748 case tcu::TextureFormat::UNSIGNED_INT16: typePart = "16ui"; break; 749 case tcu::TextureFormat::UNSIGNED_INT8: typePart = "8ui"; break; 750 751 case tcu::TextureFormat::SIGNED_INT32: typePart = "32i"; break; 752 case tcu::TextureFormat::SIGNED_INT16: typePart = "16i"; break; 753 case tcu::TextureFormat::SIGNED_INT8: typePart = "8i"; break; 754 755 case tcu::TextureFormat::UNORM_INT16: typePart = "16"; break; 756 case tcu::TextureFormat::UNORM_INT8: typePart = "8"; break; 757 758 case tcu::TextureFormat::SNORM_INT16: typePart = "16_snorm"; break; 759 case tcu::TextureFormat::SNORM_INT8: typePart = "8_snorm"; break; 760 761 default: 762 DE_ASSERT(false); 763 typePart = DE_NULL; 764 } 765 766 return std::string() + orderPart + typePart; 767 } 768 769 std::string getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type) 770 { 771 const char* typePart = DE_NULL; 772 const char* formatPart = tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER ? "u" : 773 tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER ? "i" : ""; 774 775 switch (type) 776 { 777 case VK_IMAGE_VIEW_TYPE_1D: typePart = "sampler1D"; break; 778 case VK_IMAGE_VIEW_TYPE_1D_ARRAY: typePart = "sampler1DArray"; break; 779 case VK_IMAGE_VIEW_TYPE_2D: typePart = "sampler2D"; break; 780 case VK_IMAGE_VIEW_TYPE_2D_ARRAY: typePart = "sampler2DArray"; break; 781 case VK_IMAGE_VIEW_TYPE_3D: typePart = "sampler3D"; break; 782 case VK_IMAGE_VIEW_TYPE_CUBE: typePart = "samplerCube"; break; 783 case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: typePart = "samplerCubeArray"; break; 784 785 default: 786 DE_FATAL("Unknown image view type"); 787 break; 788 } 789 790 return std::string(formatPart) + typePart; 791 } 792 793 794 const char* getGlslInputFormatType (const vk::VkFormat format) 795 { 796 switch (format) 797 { 798 // 64-bit 799 case VK_FORMAT_R16G16B16A16_UNORM: return "subpassInput"; 800 case VK_FORMAT_R16G16B16A16_SNORM: return "subpassInput"; 801 case VK_FORMAT_R16G16B16A16_USCALED: return "subpassInput"; 802 case VK_FORMAT_R16G16B16A16_SSCALED: return "subpassInput"; 803 case VK_FORMAT_R16G16B16A16_UINT: return "usubpassInput"; 804 case VK_FORMAT_R16G16B16A16_SINT: return "isubpassInput"; 805 case VK_FORMAT_R16G16B16A16_SFLOAT: return "subpassInput"; 806 case VK_FORMAT_R32G32_UINT: return "usubpassInput"; 807 case VK_FORMAT_R32G32_SINT: return "isubpassInput"; 808 case VK_FORMAT_R32G32_SFLOAT: return "subpassInput"; 809 // TODO: case VK_FORMAT_R64_UINT: return "usubpassInput"; 810 // TODO: case VK_FORMAT_R64_SINT: return "isubpassInput"; 811 // TODO: case VK_FORMAT_R64_SFLOAT: return "subpassInput"; 812 813 // 128-bit 814 case VK_FORMAT_R32G32B32A32_UINT: return "usubpassInput"; 815 case VK_FORMAT_R32G32B32A32_SINT: return "isubpassInput"; 816 case VK_FORMAT_R32G32B32A32_SFLOAT: return "subpassInput"; 817 // TODO: case VK_FORMAT_R64G64_UINT: return "usubpassInput"; 818 // TODO: case VK_FORMAT_R64G64_SINT: return "isubpassInput"; 819 // TODO: case VK_FORMAT_R64G64_SFLOAT: return "subpassInput"; 820 821 default: TCU_THROW(InternalError, "Unknown format"); 822 } 823 } 824 825 const char* getGlslFormatType (const vk::VkFormat format) 826 { 827 switch (format) 828 { 829 // 64-bit 830 case VK_FORMAT_R16G16B16A16_UNORM: return "vec4"; 831 case VK_FORMAT_R16G16B16A16_SNORM: return "vec4"; 832 case VK_FORMAT_R16G16B16A16_USCALED: return "vec4"; 833 case VK_FORMAT_R16G16B16A16_SSCALED: return "vec4"; 834 case VK_FORMAT_R16G16B16A16_UINT: return "uvec4"; 835 case VK_FORMAT_R16G16B16A16_SINT: return "ivec4"; 836 case VK_FORMAT_R16G16B16A16_SFLOAT: return "vec4"; 837 case VK_FORMAT_R32G32_UINT: return "uvec2"; 838 case VK_FORMAT_R32G32_SINT: return "ivec2"; 839 case VK_FORMAT_R32G32_SFLOAT: return "vec2"; 840 // TODO: case VK_FORMAT_R64_UINT: return "uint64"; 841 // TODO: case VK_FORMAT_R64_SINT: return "int64"; 842 // TODO: case VK_FORMAT_R64_SFLOAT: return "double"; 843 844 // 128-bit 845 case VK_FORMAT_R32G32B32A32_UINT: return "uvec4"; 846 case VK_FORMAT_R32G32B32A32_SINT: return "ivec4"; 847 case VK_FORMAT_R32G32B32A32_SFLOAT: return "vec4"; 848 // TODO: case VK_FORMAT_R64G64_UINT: return "ulvec2"; 849 // TODO: case VK_FORMAT_R64G64_SINT: return "ilvec2"; 850 // TODO: case VK_FORMAT_R64G64_SFLOAT: return "dvec2"; 851 852 default: TCU_THROW(InternalError, "Unknown format"); 853 } 854 } 855 856 const char* getGlslAttachmentType (const vk::VkFormat format) 857 { 858 const tcu::TextureFormat textureFormat = mapVkFormat(format); 859 const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(textureFormat.type); 860 861 switch (channelClass) 862 { 863 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 864 return "ivec4"; 865 866 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 867 return "uvec4"; 868 869 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 870 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 871 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 872 return "vec4"; 873 874 default: 875 DE_FATAL("Unknown channel class"); 876 return ""; 877 } 878 } 879 880 const char* getGlslInputAttachmentType (const vk::VkFormat format) 881 { 882 const tcu::TextureFormat textureFormat = mapVkFormat(format); 883 const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(textureFormat.type); 884 885 switch (channelClass) 886 { 887 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 888 return "isubpassInput"; 889 890 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 891 return "usubpassInput"; 892 893 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 894 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 895 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 896 return "subpassInput"; 897 898 default: 899 DE_FATAL("Unknown channel class"); 900 return ""; 901 } 902 } 903 904 bool isPackedType (const vk::VkFormat format) 905 { 906 const tcu::TextureFormat textureFormat = mapVkFormat(format); 907 908 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST == 40); 909 910 switch (textureFormat.type) 911 { 912 case tcu::TextureFormat::UNORM_BYTE_44: 913 case tcu::TextureFormat::UNORM_SHORT_565: 914 case tcu::TextureFormat::UNORM_SHORT_555: 915 case tcu::TextureFormat::UNORM_SHORT_4444: 916 case tcu::TextureFormat::UNORM_SHORT_5551: 917 case tcu::TextureFormat::UNORM_SHORT_1555: 918 case tcu::TextureFormat::UNORM_INT_101010: 919 case tcu::TextureFormat::SNORM_INT_1010102_REV: 920 case tcu::TextureFormat::UNORM_INT_1010102_REV: 921 case tcu::TextureFormat::UNSIGNED_BYTE_44: 922 case tcu::TextureFormat::UNSIGNED_SHORT_565: 923 case tcu::TextureFormat::UNSIGNED_SHORT_4444: 924 case tcu::TextureFormat::UNSIGNED_SHORT_5551: 925 case tcu::TextureFormat::SIGNED_INT_1010102_REV: 926 case tcu::TextureFormat::UNSIGNED_INT_1010102_REV: 927 case tcu::TextureFormat::UNSIGNED_INT_11F_11F_10F_REV: 928 case tcu::TextureFormat::UNSIGNED_INT_999_E5_REV: 929 case tcu::TextureFormat::UNSIGNED_INT_16_8_8: 930 case tcu::TextureFormat::UNSIGNED_INT_24_8: 931 case tcu::TextureFormat::UNSIGNED_INT_24_8_REV: 932 return true; 933 934 default: 935 return false; 936 } 937 } 938 939 bool isComponentSwizzled (const vk::VkFormat format) 940 { 941 const tcu::TextureFormat textureFormat = mapVkFormat(format); 942 943 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 944 945 switch (textureFormat.order) 946 { 947 case tcu::TextureFormat::ARGB: 948 case tcu::TextureFormat::BGR: 949 case tcu::TextureFormat::BGRA: 950 case tcu::TextureFormat::sBGR: 951 case tcu::TextureFormat::sBGRA: 952 return true; 953 954 default: 955 return false; 956 } 957 } 958 959 int getNumUsedChannels (const vk::VkFormat format) 960 { 961 // make sure this function will be checked if type table is updated 962 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 963 964 const tcu::TextureFormat textureFormat = mapVkFormat(format); 965 966 return getNumUsedChannels(textureFormat.order); 967 } 968 969 bool isFormatImageLoadStoreCapable (const vk::VkFormat format) 970 { 971 // These come from https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#spirvenv-image-formats 972 switch (format) 973 { 974 case VK_FORMAT_R32G32B32A32_SFLOAT: 975 case VK_FORMAT_R16G16B16A16_SFLOAT: 976 case VK_FORMAT_R32_SFLOAT: 977 case VK_FORMAT_R8G8B8A8_UNORM: 978 case VK_FORMAT_R8G8B8A8_SNORM: 979 case VK_FORMAT_R32G32_SFLOAT: 980 case VK_FORMAT_R16G16_SFLOAT: 981 case VK_FORMAT_B10G11R11_UFLOAT_PACK32: 982 case VK_FORMAT_R16_SFLOAT: 983 case VK_FORMAT_R16G16B16A16_UNORM: 984 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 985 case VK_FORMAT_R16G16_UNORM: 986 case VK_FORMAT_R8G8_UNORM: 987 case VK_FORMAT_R16_UNORM: 988 case VK_FORMAT_R8_UNORM: 989 case VK_FORMAT_R16G16B16A16_SNORM: 990 case VK_FORMAT_R16G16_SNORM: 991 case VK_FORMAT_R8G8_SNORM: 992 case VK_FORMAT_R16_SNORM: 993 case VK_FORMAT_R8_SNORM: 994 case VK_FORMAT_R32G32B32A32_SINT: 995 case VK_FORMAT_R16G16B16A16_SINT: 996 case VK_FORMAT_R8G8B8A8_SINT: 997 case VK_FORMAT_R32_SINT: 998 case VK_FORMAT_R32G32_SINT: 999 case VK_FORMAT_R16G16_SINT: 1000 case VK_FORMAT_R8G8_SINT: 1001 case VK_FORMAT_R16_SINT: 1002 case VK_FORMAT_R8_SINT: 1003 case VK_FORMAT_R32G32B32A32_UINT: 1004 case VK_FORMAT_R16G16B16A16_UINT: 1005 case VK_FORMAT_R8G8B8A8_UINT: 1006 case VK_FORMAT_R32_UINT: 1007 case VK_FORMAT_A2B10G10R10_UINT_PACK32: 1008 case VK_FORMAT_R32G32_UINT: 1009 case VK_FORMAT_R16G16_UINT: 1010 case VK_FORMAT_R8G8_UINT: 1011 case VK_FORMAT_R16_UINT: 1012 case VK_FORMAT_R8_UINT: 1013 return true; 1014 1015 default: 1016 return false; 1017 } 1018 } 1019 1020 std::string getFormatShortString (const VkFormat format) 1021 { 1022 const std::string fullName = getFormatName(format); 1023 1024 DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_")); 1025 1026 return de::toLower(fullName.substr(10)); 1027 } 1028 1029 std::vector<tcu::Vec4> createFullscreenQuad (void) 1030 { 1031 const tcu::Vec4 lowerLeftVertex (-1.0f, -1.0f, 0.0f, 1.0f); 1032 const tcu::Vec4 upperLeftVertex (-1.0f, 1.0f, 0.0f, 1.0f); 1033 const tcu::Vec4 lowerRightVertex (1.0f, -1.0f, 0.0f, 1.0f); 1034 const tcu::Vec4 upperRightVertex (1.0f, 1.0f, 0.0f, 1.0f); 1035 1036 const tcu::Vec4 vertices[6] = 1037 { 1038 lowerLeftVertex, 1039 lowerRightVertex, 1040 upperLeftVertex, 1041 1042 upperLeftVertex, 1043 lowerRightVertex, 1044 upperRightVertex 1045 }; 1046 1047 return std::vector<tcu::Vec4>(vertices, vertices + DE_LENGTH_OF_ARRAY(vertices)); 1048 } 1049 1050 vk::VkBufferImageCopy makeBufferImageCopy (const deUint32 imageWidth, const deUint32 imageHeight, const deUint32 mipLevel, const deUint32 layer) 1051 { 1052 const VkBufferImageCopy copyParams = 1053 { 1054 (VkDeviceSize)0u, // bufferOffset 1055 imageWidth, // bufferRowLength 1056 imageHeight, // bufferImageHeight 1057 { 1058 VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 1059 mipLevel, // mipLevel 1060 layer, // baseArrayLayer 1061 1u, // layerCount 1062 }, // imageSubresource 1063 { 0u, 0u, 0u }, // imageOffset 1064 { 1065 imageWidth, 1066 imageHeight, 1067 1u 1068 } // imageExtent 1069 }; 1070 1071 return copyParams; 1072 } 1073 1074 vk::VkBufferImageCopy makeBufferImageCopy (const deUint32 imageWidth, const deUint32 imageHeight, const deUint32 mipLevel, const deUint32 layer, const deUint32 bufferRowLength, const deUint32 bufferImageHeight) 1075 { 1076 const VkBufferImageCopy copyParams = 1077 { 1078 (VkDeviceSize)0u, // bufferOffset 1079 bufferRowLength, // bufferRowLength 1080 bufferImageHeight, // bufferImageHeight 1081 { 1082 VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask 1083 mipLevel, // mipLevel 1084 layer, // baseArrayLayer 1085 1u, // layerCount 1086 }, // imageSubresource 1087 { 0u, 0u, 0u }, // imageOffset 1088 { 1089 imageWidth, 1090 imageHeight, 1091 1u 1092 } // imageExtent 1093 }; 1094 1095 return copyParams; 1096 } 1097 1098 void beginRenderPass (const DeviceInterface& vk, 1099 const VkCommandBuffer commandBuffer, 1100 const VkRenderPass renderPass, 1101 const VkFramebuffer framebuffer, 1102 const VkExtent2D& renderSize) 1103 { 1104 const VkRect2D renderArea = 1105 { 1106 {0, 0}, // VkOffset2D offset; 1107 renderSize, // VkExtent2D extent; 1108 }; 1109 1110 beginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, tcu::Vec4(0.0f), 0.0f, 0u); 1111 } 1112 1113 Move<VkFramebuffer> makeFramebuffer (const DeviceInterface& vk, 1114 const VkDevice device, 1115 const VkRenderPass renderPass, 1116 const deUint32 attachmentCount, 1117 const VkImageView* pAttachments, 1118 const VkExtent2D& size, 1119 const deUint32 layersCount) 1120 { 1121 const vk::VkFramebufferCreateInfo framebufferInfo = 1122 { 1123 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; 1124 DE_NULL, // const void* pNext; 1125 (VkFramebufferCreateFlags)0, // VkFramebufferCreateFlags flags; 1126 renderPass, // VkRenderPass renderPass; 1127 attachmentCount, // uint32_t attachmentCount; 1128 pAttachments, // const VkImageView* pAttachments; 1129 static_cast<deUint32>(size.width), // uint32_t width; 1130 static_cast<deUint32>(size.height), // uint32_t height; 1131 layersCount, // uint32_t layers; 1132 }; 1133 1134 return createFramebuffer(vk, device, &framebufferInfo); 1135 } 1136 1137 } // image 1138 } // vkt 1139