1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Image Tests Utility Classes
22 *//*--------------------------------------------------------------------*/
24 #include "vktImageTestsUtil.hpp"
25 #include "vkQueryUtil.hpp"
26 #include "vkTypeUtil.hpp"
27 #include "vkCmdUtil.hpp"
28 #include "vkObjUtil.hpp"
29 #include "tcuTextureUtil.hpp"
38 Buffer::Buffer (const DeviceInterface& vk,
39 const VkDevice device,
41 const VkBufferCreateInfo& bufferCreateInfo,
42 const MemoryRequirement memoryRequirement)
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()));
49 Image::Image (const DeviceInterface& vk,
50 const VkDevice device,
52 const VkImageCreateInfo& imageCreateInfo,
53 const MemoryRequirement memoryRequirement)
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()));
60 tcu::UVec3 getShaderGridSize (const ImageType imageType, const tcu::UVec3& imageSize)
65 case IMAGE_TYPE_BUFFER:
66 return tcu::UVec3(imageSize.x(), 1u, 1u);
68 case IMAGE_TYPE_1D_ARRAY:
69 return tcu::UVec3(imageSize.x(), imageSize.z(), 1u);
72 return tcu::UVec3(imageSize.x(), imageSize.y(), 1u);
74 case IMAGE_TYPE_2D_ARRAY:
76 return tcu::UVec3(imageSize.x(), imageSize.y(), imageSize.z());
79 return tcu::UVec3(imageSize.x(), imageSize.y(), 6u);
81 case IMAGE_TYPE_CUBE_ARRAY:
82 return tcu::UVec3(imageSize.x(), imageSize.y(), 6u * imageSize.z());
85 DE_FATAL("Unknown image type");
86 return tcu::UVec3(1u, 1u, 1u);
90 tcu::UVec3 getLayerSize (const ImageType imageType, const tcu::UVec3& imageSize)
95 case IMAGE_TYPE_1D_ARRAY:
96 case IMAGE_TYPE_BUFFER:
97 return tcu::UVec3(imageSize.x(), 1u, 1u);
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);
106 return tcu::UVec3(imageSize.x(), imageSize.y(), imageSize.z());
109 DE_FATAL("Unknown image type");
110 return tcu::UVec3(1u, 1u, 1u);
114 deUint32 getNumLayers (const ImageType imageType, const tcu::UVec3& imageSize)
121 case IMAGE_TYPE_BUFFER:
124 case IMAGE_TYPE_1D_ARRAY:
125 case IMAGE_TYPE_2D_ARRAY:
126 return imageSize.z();
128 case IMAGE_TYPE_CUBE:
131 case IMAGE_TYPE_CUBE_ARRAY:
132 return imageSize.z() * 6u;
135 DE_FATAL("Unknown image type");
140 deUint32 getNumPixels (const ImageType imageType, const tcu::UVec3& imageSize)
142 const tcu::UVec3 gridSize = getShaderGridSize(imageType, imageSize);
144 return gridSize.x() * gridSize.y() * gridSize.z();
147 deUint32 getDimensions (const ImageType imageType)
152 case IMAGE_TYPE_BUFFER:
155 case IMAGE_TYPE_1D_ARRAY:
159 case IMAGE_TYPE_2D_ARRAY:
160 case IMAGE_TYPE_CUBE:
161 case IMAGE_TYPE_CUBE_ARRAY:
166 DE_FATAL("Unknown image type");
171 deUint32 getLayerDimensions (const ImageType imageType)
176 case IMAGE_TYPE_BUFFER:
177 case IMAGE_TYPE_1D_ARRAY:
181 case IMAGE_TYPE_2D_ARRAY:
182 case IMAGE_TYPE_CUBE:
183 case IMAGE_TYPE_CUBE_ARRAY:
190 DE_FATAL("Unknown image type");
195 VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
196 const deUint32 arraySize)
198 const VkBufferImageCopy copyParams =
200 0ull, // VkDeviceSize bufferOffset;
201 0u, // deUint32 bufferRowLength;
202 0u, // deUint32 bufferImageHeight;
203 makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, arraySize), // VkImageSubresourceLayers imageSubresource;
204 makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
205 extent, // VkExtent3D imageExtent;
210 Move<VkPipeline> makeComputePipeline (const DeviceInterface& vk,
211 const VkDevice device,
212 const VkPipelineLayout pipelineLayout,
213 const VkShaderModule shaderModule)
215 const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
217 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
218 DE_NULL, // const void* pNext;
219 0u, // VkPipelineShaderStageCreateFlags flags;
220 VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
221 shaderModule, // VkShaderModule module;
222 "main", // const char* pName;
223 DE_NULL, // const VkSpecializationInfo* pSpecializationInfo;
225 const VkComputePipelineCreateInfo pipelineCreateInfo =
227 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
228 DE_NULL, // const void* pNext;
229 0u, // VkPipelineCreateFlags flags;
230 pipelineShaderStageParams, // VkPipelineShaderStageCreateInfo stage;
231 pipelineLayout, // VkPipelineLayout layout;
232 DE_NULL, // VkPipeline basePipelineHandle;
233 0, // deInt32 basePipelineIndex;
235 return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo);
238 Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk,
239 const VkDevice device,
240 const VkPipelineLayout pipelineLayout,
241 const VkRenderPass renderPass,
242 const VkShaderModule vertexModule,
243 const VkShaderModule fragmentModule,
244 const VkExtent2D renderSize,
245 const deUint32 colorAttachmentCount,
246 const bool dynamicSize)
248 std::vector<VkViewport> viewports;
249 std::vector<VkRect2D> scissors;
251 const VkViewport viewport = makeViewport(renderSize);
252 const VkRect2D scissor = makeRect2D(renderSize);
254 const VkFormat vertexFormatPosition = VK_FORMAT_R32G32B32A32_SFLOAT;
255 const deUint32 vertexSizePosition = tcu::getPixelSize(mapVkFormat(vertexFormatPosition));
256 const deUint32 vertexBufferOffsetPosition = 0u;
257 const deUint32 vertexDataStride = vertexSizePosition;
261 viewports.push_back(viewport);
262 scissors.push_back(scissor);
265 const VkVertexInputBindingDescription vertexInputBindingDescription =
267 0u, // deUint32 binding;
268 vertexDataStride, // deUint32 stride;
269 VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputRate inputRate;
272 const VkVertexInputAttributeDescription vertexInputAttributeDescription =
274 0u, // deUint32 location;
275 0u, // deUint32 binding;
276 vertexFormatPosition, // VkFormat format;
277 vertexBufferOffsetPosition, // deUint32 offset;
280 const VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo =
282 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
283 DE_NULL, // const void* pNext;
284 (VkPipelineVertexInputStateCreateFlags)0, // VkPipelineVertexInputStateCreateFlags flags;
285 1u, // deUint32 vertexBindingDescriptionCount;
286 &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
287 1u, // deUint32 vertexAttributeDescriptionCount;
288 &vertexInputAttributeDescription // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
291 const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
292 const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
294 VK_FALSE, // VkBool32 blendEnable;
295 VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor;
296 VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor;
297 VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp;
298 VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor;
299 VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor;
300 VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp;
301 colorComponentsAll // VkColorComponentFlags colorWriteMask;
304 std::vector<VkPipelineColorBlendAttachmentState> colorAttachments (colorAttachmentCount, colorBlendAttachmentState);
306 const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
308 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType;
309 DE_NULL, // const void* pNext;
310 (VkPipelineColorBlendStateCreateFlags)0, // VkPipelineColorBlendStateCreateFlags flags;
311 VK_FALSE, // VkBool32 logicOpEnable;
312 VK_LOGIC_OP_COPY, // VkLogicOp logicOp;
313 (deUint32)colorAttachments.size(), // deUint32 attachmentCount;
314 colorAttachments.size() != 0 ? &colorAttachments[0] : DE_NULL, // const VkPipelineColorBlendAttachmentState* pAttachments;
315 { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4];
318 return vk::makeGraphicsPipeline(vk, // const DeviceInterface& vk
319 device, // const VkDevice device
320 pipelineLayout, // const VkPipelineLayout pipelineLayout
321 vertexModule, // const VkShaderModule vertexShaderModule
322 DE_NULL, // const VkShaderModule tessellationControlModule
323 DE_NULL, // const VkShaderModule tessellationEvalModule
324 DE_NULL, // const VkShaderModule geometryShaderModule
325 fragmentModule, // const VkShaderModule fragmentShaderModule
326 renderPass, // const VkRenderPass renderPass
327 viewports, // const std::vector<VkViewport>& viewports
328 scissors, // const std::vector<VkRect2D>& scissors
329 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // const VkPrimitiveTopology topology
330 0u, // const deUint32 subpass
331 0u, // const deUint32 patchControlPoints
332 &vertexInputStateCreateInfo, // const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo
333 DE_NULL, // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo
334 DE_NULL, // const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo
335 DE_NULL, // const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo
336 &pipelineColorBlendStateInfo); // const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo
339 //! A single-subpass render pass.
340 Move<VkRenderPass> makeRenderPass (const DeviceInterface& vk,
341 const VkDevice device,
342 const VkFormat inputFormat,
343 const VkFormat colorFormat)
345 const VkAttachmentReference inputAttachmentRef =
347 0u, // deUint32 attachment;
348 VK_IMAGE_LAYOUT_GENERAL // VkImageLayout layout;
351 const VkAttachmentReference colorAttachmentRef =
353 1u, // deUint32 attachment;
354 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout;
357 const VkSubpassDescription subpassDescription =
359 (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags;
360 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
361 1u, // deUint32 inputAttachmentCount;
362 &inputAttachmentRef, // const VkAttachmentReference* pInputAttachments;
363 1u, // deUint32 colorAttachmentCount;
364 &colorAttachmentRef, // const VkAttachmentReference* pColorAttachments;
365 DE_NULL, // const VkAttachmentReference* pResolveAttachments;
366 DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment;
367 0u, // deUint32 preserveAttachmentCount;
368 DE_NULL // const deUint32* pPreserveAttachments;
371 const VkAttachmentDescription attachmentsDescriptions[] =
373 //inputAttachmentDescription,
375 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
376 inputFormat, // VkFormat format;
377 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
378 VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp;
379 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp storeOp;
380 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
381 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
382 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout initialLayout;
383 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout finalLayout;
385 //colorAttachmentDescription
387 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
388 colorFormat, // VkFormat format;
389 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
390 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
391 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
392 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
393 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
394 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
395 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout finalLayout;
399 const VkRenderPassCreateInfo renderPassInfo =
401 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
402 DE_NULL, // const void* pNext;
403 (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags;
404 DE_LENGTH_OF_ARRAY(attachmentsDescriptions), // deUint32 attachmentCount;
405 attachmentsDescriptions, // const VkAttachmentDescription* pAttachments;
406 1u, // deUint32 subpassCount;
407 &subpassDescription, // const VkSubpassDescription* pSubpasses;
408 0u, // deUint32 dependencyCount;
409 DE_NULL // const VkSubpassDependency* pDependencies;
412 return createRenderPass(vk, device, &renderPassInfo);
415 VkImageViewUsageCreateInfo makeImageViewUsageCreateInfo (const VkImageUsageFlags imageUsageFlags)
417 VkImageViewUsageCreateInfo imageViewUsageCreateInfo =
419 VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, //VkStructureType sType;
420 DE_NULL, //const void* pNext;
421 imageUsageFlags, //VkImageUsageFlags usage;
424 return imageViewUsageCreateInfo;
427 VkSamplerCreateInfo makeSamplerCreateInfo ()
429 const VkSamplerCreateInfo defaultSamplerParams =
431 VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType;
432 DE_NULL, // const void* pNext;
433 0u, // VkSamplerCreateFlags flags;
434 VK_FILTER_NEAREST, // VkFilter magFilter;
435 VK_FILTER_NEAREST, // VkFilter minFilter;
436 VK_SAMPLER_MIPMAP_MODE_NEAREST, // VkSamplerMipmapMode mipmapMode;
437 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeU;
438 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeV;
439 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeW;
440 0.0f, // float mipLodBias;
441 VK_FALSE, // VkBool32 anisotropyEnable;
442 1.0f, // float maxAnisotropy;
443 VK_FALSE, // VkBool32 compareEnable;
444 VK_COMPARE_OP_NEVER, // VkCompareOp compareOp;
445 0.0f, // float minLod;
446 0.25f, // float maxLod;
447 VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, // VkBorderColor borderColor;
448 VK_FALSE // VkBool32 unnormalizedCoordinates;
451 return defaultSamplerParams;
454 tcu::UVec3 getCompressedImageResolutionInBlocks (const vk::VkFormat format, const tcu::UVec3& size)
456 deUint32 blockWidth = getBlockWidth(format);
457 deUint32 blockHeight = getBlockHeight(format);
459 DE_ASSERT(size[2] == 1);
460 DE_ASSERT(blockWidth != 0 && blockHeight != 0);
462 deUint32 widthInBlocks = (size[0] + blockWidth - 1) / blockWidth;
463 deUint32 heightInBlocks = (size[1] + blockHeight - 1) / blockHeight;
465 return tcu::UVec3(widthInBlocks, heightInBlocks, 1);
468 tcu::UVec3 getCompressedImageResolutionBlockCeil (const vk::VkFormat format, const tcu::UVec3& size)
470 deUint32 blockWidth = getBlockWidth(format);
471 deUint32 blockHeight = getBlockHeight(format);
473 DE_ASSERT(size[2] == 1);
474 DE_ASSERT(blockWidth != 0 && blockHeight != 0);
476 deUint32 widthInBlocks = (size[0] + blockWidth - 1) / blockWidth;
477 deUint32 heightInBlocks = (size[1] + blockHeight - 1) / blockHeight;
479 return tcu::UVec3(blockWidth * widthInBlocks, blockHeight * heightInBlocks, 1);
482 VkDeviceSize getCompressedImageSizeInBytes (const vk::VkFormat format, const tcu::UVec3& size)
484 tcu::UVec3 sizeInBlocks = getCompressedImageResolutionInBlocks(format, size);
485 deUint32 blockBytes = getBlockSizeInBytes(format);
486 VkDeviceSize sizeBytes = sizeInBlocks[0] * sizeInBlocks[1] * sizeInBlocks[2] * blockBytes;
491 VkDeviceSize getUncompressedImageSizeInBytes (const vk::VkFormat format, const tcu::UVec3& size)
493 const tcu::IVec3 sizeAsIVec3 = tcu::IVec3((int)size.x(), (int)size.y(), (int)size.z());
494 const VkDeviceSize sizeBytes = getImageSizeBytes(sizeAsIVec3, format);
499 VkImageType mapImageType (const ImageType imageType)
504 case IMAGE_TYPE_1D_ARRAY:
505 case IMAGE_TYPE_BUFFER:
506 return VK_IMAGE_TYPE_1D;
509 case IMAGE_TYPE_2D_ARRAY:
510 case IMAGE_TYPE_CUBE:
511 case IMAGE_TYPE_CUBE_ARRAY:
512 return VK_IMAGE_TYPE_2D;
515 return VK_IMAGE_TYPE_3D;
519 return VK_IMAGE_TYPE_LAST;
523 VkImageViewType mapImageViewType (const ImageType imageType)
527 case IMAGE_TYPE_1D: return VK_IMAGE_VIEW_TYPE_1D;
528 case IMAGE_TYPE_1D_ARRAY: return VK_IMAGE_VIEW_TYPE_1D_ARRAY;
529 case IMAGE_TYPE_2D: return VK_IMAGE_VIEW_TYPE_2D;
530 case IMAGE_TYPE_2D_ARRAY: return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
531 case IMAGE_TYPE_3D: return VK_IMAGE_VIEW_TYPE_3D;
532 case IMAGE_TYPE_CUBE: return VK_IMAGE_VIEW_TYPE_CUBE;
533 case IMAGE_TYPE_CUBE_ARRAY: return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
537 return VK_IMAGE_VIEW_TYPE_LAST;
541 std::string getImageTypeName (const ImageType imageType)
545 case IMAGE_TYPE_1D: return "1d";
546 case IMAGE_TYPE_1D_ARRAY: return "1d_array";
547 case IMAGE_TYPE_2D: return "2d";
548 case IMAGE_TYPE_2D_ARRAY: return "2d_array";
549 case IMAGE_TYPE_3D: return "3d";
550 case IMAGE_TYPE_CUBE: return "cube";
551 case IMAGE_TYPE_CUBE_ARRAY: return "cube_array";
552 case IMAGE_TYPE_BUFFER: return "buffer";
560 std::string getShaderImageType (const tcu::TextureFormat& format, const ImageType imageType, const bool multisample)
562 std::string formatPart = tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER ? "u" :
563 tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER ? "i" : "";
565 std::string imageTypePart;
570 case IMAGE_TYPE_2D: imageTypePart = "2DMS"; break;
571 case IMAGE_TYPE_2D_ARRAY: imageTypePart = "2DMSArray"; break;
581 case IMAGE_TYPE_1D: imageTypePart = "1D"; break;
582 case IMAGE_TYPE_1D_ARRAY: imageTypePart = "1DArray"; break;
583 case IMAGE_TYPE_2D: imageTypePart = "2D"; break;
584 case IMAGE_TYPE_2D_ARRAY: imageTypePart = "2DArray"; break;
585 case IMAGE_TYPE_3D: imageTypePart = "3D"; break;
586 case IMAGE_TYPE_CUBE: imageTypePart = "Cube"; break;
587 case IMAGE_TYPE_CUBE_ARRAY: imageTypePart = "CubeArray"; break;
588 case IMAGE_TYPE_BUFFER: imageTypePart = "Buffer"; break;
595 return formatPart + "image" + imageTypePart;
598 std::string getShaderImageFormatQualifier (const tcu::TextureFormat& format)
600 if (!isPackedType(mapTextureFormat(format)))
602 const char* orderPart;
603 const char* typePart;
605 switch (format.order)
607 case tcu::TextureFormat::R: orderPart = "r"; break;
608 case tcu::TextureFormat::RG: orderPart = "rg"; break;
609 case tcu::TextureFormat::RGB: orderPart = "rgb"; break;
610 case tcu::TextureFormat::RGBA: orderPart = "rgba"; break;
611 case tcu::TextureFormat::sRGBA: orderPart = "rgba"; break;
614 DE_FATAL("Order not found");
620 case tcu::TextureFormat::FLOAT: typePart = "32f"; break;
621 case tcu::TextureFormat::HALF_FLOAT: typePart = "16f"; break;
623 case tcu::TextureFormat::UNSIGNED_INT32: typePart = "32ui"; break;
624 case tcu::TextureFormat::UNSIGNED_INT16: typePart = "16ui"; break;
625 case tcu::TextureFormat::UNSIGNED_INT8: typePart = "8ui"; break;
627 case tcu::TextureFormat::SIGNED_INT32: typePart = "32i"; break;
628 case tcu::TextureFormat::SIGNED_INT16: typePart = "16i"; break;
629 case tcu::TextureFormat::SIGNED_INT8: typePart = "8i"; break;
631 case tcu::TextureFormat::UNORM_INT16: typePart = "16"; break;
632 case tcu::TextureFormat::UNORM_INT8: typePart = "8"; break;
634 case tcu::TextureFormat::SNORM_INT16: typePart = "16_snorm"; break;
635 case tcu::TextureFormat::SNORM_INT8: typePart = "8_snorm"; break;
638 DE_FATAL("Type not found");
642 return std::string() + orderPart + typePart;
646 switch (mapTextureFormat(format))
648 case VK_FORMAT_B10G11R11_UFLOAT_PACK32: return "r11f_g11f_b10f";
649 case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return "rgb10_a2";
650 case VK_FORMAT_A2B10G10R10_UINT_PACK32: return "rgb10_a2ui";
653 DE_FATAL("Qualifier not found");
659 std::string getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type)
661 const char* typePart = DE_NULL;
662 const char* formatPart = tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER ? "u" :
663 tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER ? "i" : "";
667 case VK_IMAGE_VIEW_TYPE_1D: typePart = "sampler1D"; break;
668 case VK_IMAGE_VIEW_TYPE_1D_ARRAY: typePart = "sampler1DArray"; break;
669 case VK_IMAGE_VIEW_TYPE_2D: typePart = "sampler2D"; break;
670 case VK_IMAGE_VIEW_TYPE_2D_ARRAY: typePart = "sampler2DArray"; break;
671 case VK_IMAGE_VIEW_TYPE_3D: typePart = "sampler3D"; break;
672 case VK_IMAGE_VIEW_TYPE_CUBE: typePart = "samplerCube"; break;
673 case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: typePart = "samplerCubeArray"; break;
676 DE_FATAL("Unknown image view type");
680 return std::string(formatPart) + typePart;
684 const char* getGlslInputFormatType (const vk::VkFormat format)
689 case VK_FORMAT_R16G16B16A16_UNORM: return "subpassInput";
690 case VK_FORMAT_R16G16B16A16_SNORM: return "subpassInput";
691 case VK_FORMAT_R16G16B16A16_USCALED: return "subpassInput";
692 case VK_FORMAT_R16G16B16A16_SSCALED: return "subpassInput";
693 case VK_FORMAT_R16G16B16A16_UINT: return "usubpassInput";
694 case VK_FORMAT_R16G16B16A16_SINT: return "isubpassInput";
695 case VK_FORMAT_R16G16B16A16_SFLOAT: return "subpassInput";
696 case VK_FORMAT_R32G32_UINT: return "usubpassInput";
697 case VK_FORMAT_R32G32_SINT: return "isubpassInput";
698 case VK_FORMAT_R32G32_SFLOAT: return "subpassInput";
699 // TODO: case VK_FORMAT_R64_UINT: return "usubpassInput";
700 // TODO: case VK_FORMAT_R64_SINT: return "isubpassInput";
701 // TODO: case VK_FORMAT_R64_SFLOAT: return "subpassInput";
704 case VK_FORMAT_R32G32B32A32_UINT: return "usubpassInput";
705 case VK_FORMAT_R32G32B32A32_SINT: return "isubpassInput";
706 case VK_FORMAT_R32G32B32A32_SFLOAT: return "subpassInput";
707 // TODO: case VK_FORMAT_R64G64_UINT: return "usubpassInput";
708 // TODO: case VK_FORMAT_R64G64_SINT: return "isubpassInput";
709 // TODO: case VK_FORMAT_R64G64_SFLOAT: return "subpassInput";
711 default: TCU_THROW(InternalError, "Unknown format");
715 const char* getGlslFormatType (const vk::VkFormat format)
720 case VK_FORMAT_R16G16B16A16_UNORM: return "vec4";
721 case VK_FORMAT_R16G16B16A16_SNORM: return "vec4";
722 case VK_FORMAT_R16G16B16A16_USCALED: return "vec4";
723 case VK_FORMAT_R16G16B16A16_SSCALED: return "vec4";
724 case VK_FORMAT_R16G16B16A16_UINT: return "uvec4";
725 case VK_FORMAT_R16G16B16A16_SINT: return "ivec4";
726 case VK_FORMAT_R16G16B16A16_SFLOAT: return "vec4";
727 case VK_FORMAT_R32G32_UINT: return "uvec2";
728 case VK_FORMAT_R32G32_SINT: return "ivec2";
729 case VK_FORMAT_R32G32_SFLOAT: return "vec2";
730 // TODO: case VK_FORMAT_R64_UINT: return "uint64";
731 // TODO: case VK_FORMAT_R64_SINT: return "int64";
732 // TODO: case VK_FORMAT_R64_SFLOAT: return "double";
735 case VK_FORMAT_R32G32B32A32_UINT: return "uvec4";
736 case VK_FORMAT_R32G32B32A32_SINT: return "ivec4";
737 case VK_FORMAT_R32G32B32A32_SFLOAT: return "vec4";
738 // TODO: case VK_FORMAT_R64G64_UINT: return "ulvec2";
739 // TODO: case VK_FORMAT_R64G64_SINT: return "ilvec2";
740 // TODO: case VK_FORMAT_R64G64_SFLOAT: return "dvec2";
742 default: TCU_THROW(InternalError, "Unknown format");
746 const char* getGlslAttachmentType (const vk::VkFormat format)
748 const tcu::TextureFormat textureFormat = mapVkFormat(format);
749 const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(textureFormat.type);
751 switch (channelClass)
753 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
756 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
759 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
760 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
761 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
765 DE_FATAL("Unknown channel class");
770 const char* getGlslInputAttachmentType (const vk::VkFormat format)
772 const tcu::TextureFormat textureFormat = mapVkFormat(format);
773 const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(textureFormat.type);
775 switch (channelClass)
777 case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
778 return "isubpassInput";
780 case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
781 return "usubpassInput";
783 case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
784 case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
785 case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
786 return "subpassInput";
789 DE_FATAL("Unknown channel class");
794 bool isPackedType (const vk::VkFormat format)
796 const tcu::TextureFormat textureFormat = mapVkFormat(format);
798 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELTYPE_LAST == 42);
800 switch (textureFormat.type)
802 case tcu::TextureFormat::UNORM_BYTE_44:
803 case tcu::TextureFormat::UNORM_SHORT_565:
804 case tcu::TextureFormat::UNORM_SHORT_555:
805 case tcu::TextureFormat::UNORM_SHORT_4444:
806 case tcu::TextureFormat::UNORM_SHORT_5551:
807 case tcu::TextureFormat::UNORM_SHORT_1555:
808 case tcu::TextureFormat::UNORM_INT_101010:
809 case tcu::TextureFormat::SNORM_INT_1010102_REV:
810 case tcu::TextureFormat::UNORM_INT_1010102_REV:
811 case tcu::TextureFormat::UNSIGNED_BYTE_44:
812 case tcu::TextureFormat::UNSIGNED_SHORT_565:
813 case tcu::TextureFormat::UNSIGNED_SHORT_4444:
814 case tcu::TextureFormat::UNSIGNED_SHORT_5551:
815 case tcu::TextureFormat::SIGNED_INT_1010102_REV:
816 case tcu::TextureFormat::UNSIGNED_INT_1010102_REV:
817 case tcu::TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:
818 case tcu::TextureFormat::UNSIGNED_INT_999_E5_REV:
819 case tcu::TextureFormat::UNSIGNED_INT_16_8_8:
820 case tcu::TextureFormat::UNSIGNED_INT_24_8:
821 case tcu::TextureFormat::UNSIGNED_INT_24_8_REV:
829 bool isComponentSwizzled (const vk::VkFormat format)
831 const tcu::TextureFormat textureFormat = mapVkFormat(format);
833 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
835 switch (textureFormat.order)
837 case tcu::TextureFormat::ARGB:
838 case tcu::TextureFormat::BGR:
839 case tcu::TextureFormat::BGRA:
840 case tcu::TextureFormat::sBGR:
841 case tcu::TextureFormat::sBGRA:
849 int getNumUsedChannels (const vk::VkFormat format)
851 // make sure this function will be checked if type table is updated
852 DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21);
854 const tcu::TextureFormat textureFormat = mapVkFormat(format);
856 return getNumUsedChannels(textureFormat.order);
859 bool isFormatImageLoadStoreCapable (const vk::VkFormat format)
861 // These come from https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#spirvenv-image-formats
864 case VK_FORMAT_R32G32B32A32_SFLOAT:
865 case VK_FORMAT_R16G16B16A16_SFLOAT:
866 case VK_FORMAT_R32_SFLOAT:
867 case VK_FORMAT_R8G8B8A8_UNORM:
868 case VK_FORMAT_R8G8B8A8_SNORM:
869 case VK_FORMAT_R32G32_SFLOAT:
870 case VK_FORMAT_R16G16_SFLOAT:
871 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
872 case VK_FORMAT_R16_SFLOAT:
873 case VK_FORMAT_R16G16B16A16_UNORM:
874 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
875 case VK_FORMAT_R16G16_UNORM:
876 case VK_FORMAT_R8G8_UNORM:
877 case VK_FORMAT_R16_UNORM:
878 case VK_FORMAT_R8_UNORM:
879 case VK_FORMAT_R16G16B16A16_SNORM:
880 case VK_FORMAT_R16G16_SNORM:
881 case VK_FORMAT_R8G8_SNORM:
882 case VK_FORMAT_R16_SNORM:
883 case VK_FORMAT_R8_SNORM:
884 case VK_FORMAT_R32G32B32A32_SINT:
885 case VK_FORMAT_R16G16B16A16_SINT:
886 case VK_FORMAT_R8G8B8A8_SINT:
887 case VK_FORMAT_R32_SINT:
888 case VK_FORMAT_R32G32_SINT:
889 case VK_FORMAT_R16G16_SINT:
890 case VK_FORMAT_R8G8_SINT:
891 case VK_FORMAT_R16_SINT:
892 case VK_FORMAT_R8_SINT:
893 case VK_FORMAT_R32G32B32A32_UINT:
894 case VK_FORMAT_R16G16B16A16_UINT:
895 case VK_FORMAT_R8G8B8A8_UINT:
896 case VK_FORMAT_R32_UINT:
897 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
898 case VK_FORMAT_R32G32_UINT:
899 case VK_FORMAT_R16G16_UINT:
900 case VK_FORMAT_R8G8_UINT:
901 case VK_FORMAT_R16_UINT:
902 case VK_FORMAT_R8_UINT:
910 std::string getFormatShortString (const VkFormat format)
912 const std::string fullName = getFormatName(format);
914 DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_"));
916 return de::toLower(fullName.substr(10));
919 std::vector<tcu::Vec4> createFullscreenQuad (void)
921 const tcu::Vec4 lowerLeftVertex (-1.0f, -1.0f, 0.0f, 1.0f);
922 const tcu::Vec4 upperLeftVertex (-1.0f, 1.0f, 0.0f, 1.0f);
923 const tcu::Vec4 lowerRightVertex (1.0f, -1.0f, 0.0f, 1.0f);
924 const tcu::Vec4 upperRightVertex (1.0f, 1.0f, 0.0f, 1.0f);
926 const tcu::Vec4 vertices[6] =
937 return std::vector<tcu::Vec4>(vertices, vertices + DE_LENGTH_OF_ARRAY(vertices));
940 vk::VkBufferImageCopy makeBufferImageCopy (const deUint32 imageWidth, const deUint32 imageHeight, const deUint32 mipLevel, const deUint32 layer)
942 const VkBufferImageCopy copyParams =
944 (VkDeviceSize)0u, // bufferOffset
945 imageWidth, // bufferRowLength
946 imageHeight, // bufferImageHeight
948 VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
949 mipLevel, // mipLevel
950 layer, // baseArrayLayer
952 }, // imageSubresource
953 { 0u, 0u, 0u }, // imageOffset
964 vk::VkBufferImageCopy makeBufferImageCopy (const deUint32 imageWidth, const deUint32 imageHeight, const deUint32 mipLevel, const deUint32 layer, const deUint32 bufferRowLength, const deUint32 bufferImageHeight)
966 const VkBufferImageCopy copyParams =
968 (VkDeviceSize)0u, // bufferOffset
969 bufferRowLength, // bufferRowLength
970 bufferImageHeight, // bufferImageHeight
972 VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
973 mipLevel, // mipLevel
974 layer, // baseArrayLayer
976 }, // imageSubresource
977 { 0u, 0u, 0u }, // imageOffset
988 void beginRenderPass (const DeviceInterface& vk,
989 const VkCommandBuffer commandBuffer,
990 const VkRenderPass renderPass,
991 const VkFramebuffer framebuffer,
992 const VkExtent2D& renderSize)
994 const VkRect2D renderArea =
996 {0, 0}, // VkOffset2D offset;
997 renderSize, // VkExtent2D extent;
1000 beginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, tcu::Vec4(0.0f), 0.0f, 0u);