1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
6 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and/or associated documentation files (the
10 * "Materials"), to deal in the Materials without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sublicense, and/or sell copies of the Materials, and to
13 * permit persons to whom the Materials are furnished to do so, subject to
14 * the following conditions:
16 * The above copyright notice(s) and this permission notice shall be included
17 * in all copies or substantial portions of the Materials.
19 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
29 * \brief Vulkan Image Clearing Tests
30 *//*--------------------------------------------------------------------*/
32 #include "vktApiImageClearingTests.hpp"
34 #include "deRandom.hpp"
36 #include "deStringUtil.hpp"
37 #include "deUniquePtr.hpp"
38 #include "deArrayUtil.hpp"
39 #include "vkImageUtil.hpp"
40 #include "vkMemUtil.hpp"
41 #include "vktTestCase.hpp"
42 #include "vktTestCaseUtil.hpp"
43 #include "vkQueryUtil.hpp"
44 #include "vkRefUtil.hpp"
45 #include "vkTypeUtil.hpp"
46 #include "tcuImageCompare.hpp"
47 #include "tcuTexture.hpp"
48 #include "tcuTextureUtil.hpp"
49 #include "tcuVectorType.hpp"
50 #include "tcuTexture.hpp"
51 #include "tcuFloat.hpp"
52 #include "tcuTestLog.hpp"
53 #include "tcuVectorUtil.hpp"
68 // This method is copied from the vktRenderPassTests.cpp. It should be moved to a common place.
69 int calcFloatDiff (float a, float b)
71 const int asign = Float32(a).sign();
72 const int bsign = Float32(a).sign();
74 const deUint32 avalue = (Float32(a).bits() & ((0x1u << 31u) - 1u));
75 const deUint32 bvalue = (Float32(b).bits() & ((0x1u << 31u) - 1u));
78 return avalue + bvalue + 1u;
79 else if (avalue < bvalue)
80 return bvalue - avalue;
82 return avalue - bvalue;
85 // This method is copied from the vktRenderPassTests.cpp and extended with the stringResult parameter.
86 bool comparePixelToDepthClearValue (const ConstPixelBufferAccess& access,
90 std::string& stringResult)
92 const TextureFormat format = getEffectiveDepthStencilTextureFormat(access.getFormat(), Sampler::MODE_DEPTH);
93 const TextureChannelClass channelClass = getTextureChannelClass(format.type);
97 case TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
98 case TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
100 const int bitDepth = getTextureFormatBitDepth(format).x();
101 const float depth = access.getPixDepth(x, y);
102 const float threshold = 2.0f / (float)((1 << bitDepth) - 1);
103 const bool result = deFloatAbs(depth - ref) <= threshold;
108 s << "Ref:" << ref << " Threshold:" << threshold << " Depth:" << depth;
109 stringResult = s.str();
115 case TEXTURECHANNELCLASS_FLOATING_POINT:
117 const float depth = access.getPixDepth(x, y);
118 const int mantissaBits = getTextureFormatMantissaBitDepth(format).x();
119 const int threshold = 10 * 1 << (23 - mantissaBits);
121 DE_ASSERT(mantissaBits <= 23);
123 const bool result = calcFloatDiff(depth, ref) <= threshold;
127 float floatThreshold = Float32((deUint32)threshold).asFloat();
130 s << "Ref:" << ref << " Threshold:" << floatThreshold << " Depth:" << depth;
131 stringResult = s.str();
138 DE_FATAL("Invalid channel class");
143 // This method is copied from the vktRenderPassTests.cpp and extended with the stringResult parameter.
144 bool comparePixelToStencilClearValue (const ConstPixelBufferAccess& access,
148 std::string& stringResult)
150 const deUint32 stencil = access.getPixStencil(x, y);
151 const bool result = stencil == ref;
156 s << "Ref:" << ref << " Threshold:0" << " Stencil:" << stencil;
157 stringResult = s.str();
163 // This method is copied from the vktRenderPassTests.cpp and extended with the stringResult parameter.
164 bool comparePixelToColorClearValue (const ConstPixelBufferAccess& access,
168 const VkClearColorValue& ref,
169 std::string& stringResult)
171 const TextureFormat format = access.getFormat();
172 const TextureChannelClass channelClass = getTextureChannelClass(format.type);
173 const BVec4 channelMask = getTextureFormatChannelMask(format);
175 switch (channelClass)
177 case TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
178 case TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
180 const IVec4 bitDepth (getTextureFormatBitDepth(format));
181 const Vec4 resColor (access.getPixel(x, y, z));
182 Vec4 refColor (ref.float32[0],
186 const Vec4 threshold (bitDepth[0] > 0 ? 20.0f / (float)((1 << bitDepth[0]) - 1) : 1.0f,
187 bitDepth[1] > 0 ? 20.0f / (float)((1 << bitDepth[1]) - 1) : 1.0f,
188 bitDepth[2] > 0 ? 20.0f / (float)((1 << bitDepth[2]) - 1) : 1.0f,
189 bitDepth[3] > 0 ? 20.0f / (float)((1 << bitDepth[3]) - 1) : 1.0f);
191 if (isSRGB(access.getFormat()))
192 refColor = linearToSRGB(refColor);
194 const bool result = !(anyNotEqual(logicalAnd(lessThanEqual(absDiff(resColor, refColor), threshold), channelMask), channelMask));
199 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << threshold << " Color:" << resColor;
200 stringResult = s.str();
206 case TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
208 const UVec4 resColor (access.getPixelUint(x, y, z));
209 const UVec4 refColor (ref.uint32[0],
213 const UVec4 threshold (1);
215 const bool result = !(anyNotEqual(logicalAnd(lessThanEqual(absDiff(resColor, refColor), threshold), channelMask), channelMask));
220 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << threshold << " Color:" << resColor;
221 stringResult = s.str();
227 case TEXTURECHANNELCLASS_SIGNED_INTEGER:
229 const IVec4 resColor (access.getPixelInt(x, y, z));
230 const IVec4 refColor (ref.int32[0],
234 const IVec4 threshold (1);
236 const bool result = !(anyNotEqual(logicalAnd(lessThanEqual(absDiff(resColor, refColor), threshold), channelMask), channelMask));
241 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << threshold << " Color:" << resColor;
242 stringResult = s.str();
248 case TEXTURECHANNELCLASS_FLOATING_POINT:
250 const Vec4 resColor (access.getPixel(x, y, z));
251 const Vec4 refColor (ref.float32[0],
255 const IVec4 mantissaBits (getTextureFormatMantissaBitDepth(format));
256 const IVec4 threshold (10 * IVec4(1) << (23 - mantissaBits));
258 DE_ASSERT(allEqual(greaterThanEqual(threshold, IVec4(0)), BVec4(true)));
260 for (int ndx = 0; ndx < 4; ndx++)
262 const bool result = !(calcFloatDiff(resColor[ndx], refColor[ndx]) > threshold[ndx] && channelMask[ndx]);
266 float floatThreshold = Float32((deUint32)(threshold)[0]).asFloat();
267 Vec4 thresholdVec4 (floatThreshold,
272 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << thresholdVec4 << " Color:" << resColor;
273 stringResult = s.str();
283 DE_FATAL("Invalid channel class");
290 VkImageType imageType;
291 VkFormat imageFormat;
292 VkExtent3D imageExtent;
293 VkClearValue initValue;
294 VkClearValue clearValue;
297 class ImageClearingTestInstance : public vkt::TestInstance
300 ImageClearingTestInstance (Context& context,
301 const TestParams& testParams);
303 Move<VkCommandPool> createCommandPool (VkCommandPoolCreateFlags commandPoolCreateFlags) const;
304 Move<VkCommandBuffer> allocatePrimaryCommandBuffer (VkCommandPool commandPool) const;
305 Move<VkImage> createImage (VkImageType imageType, VkFormat format, VkExtent3D extent, VkImageUsageFlags usage) const;
306 Move<VkImageView> createImageView (VkImage image, VkImageViewType viewType, VkFormat format, VkImageAspectFlags aspectMask) const;
307 Move<VkRenderPass> createRenderPass (VkFormat format) const;
308 Move<VkFramebuffer> createFrameBuffer (VkImageView imageView, VkRenderPass renderPass, deUint32 imageWidth, deUint32 imageHeight) const;
310 void beginCommandBuffer (VkCommandBufferUsageFlags usageFlags) const;
311 void endCommandBuffer (void) const;
312 void submitCommandBuffer (void) const;
313 void beginRenderPass (VkSubpassContents content, VkClearValue clearValue) const;
315 void pipelineImageBarrier (VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout) const;
316 de::MovePtr<TextureLevel> readImage (VkImageAspectFlags aspectMask) const;
319 VkImageViewType getCorrespondingImageViewType (VkImageType imageType) const;
320 VkImageUsageFlags getImageUsageFlags (VkFormat format) const;
321 VkImageAspectFlags getImageAspectFlags (VkFormat format) const;
322 bool getIsStencilFormat (VkFormat format) const;
323 bool getIsDepthFormat (VkFormat format) const;
324 de::MovePtr<Allocation> allocateAndBindImageMemory (VkImage image) const;
326 const TestParams& m_params;
327 const VkDevice m_device;
328 const DeviceInterface& m_vkd;
329 const VkQueue m_queue;
330 const deUint32 m_queueFamilyIndex;
331 Allocator& m_allocator;
333 const VkImageUsageFlags m_imageUsageFlags;
334 const VkImageAspectFlags m_imageAspectFlags;
336 Unique<VkCommandPool> m_commandPool;
337 Unique<VkCommandBuffer> m_commandBuffer;
339 Unique<VkImage> m_image;
340 de::MovePtr<Allocation> m_imageMemory;
341 Unique<VkImageView> m_imageView;
342 Unique<VkRenderPass> m_renderPass;
343 Unique<VkFramebuffer> m_frameBuffer;
346 ImageClearingTestInstance::ImageClearingTestInstance (Context& context, const TestParams& params)
347 : TestInstance (context)
349 , m_device (context.getDevice())
350 , m_vkd (context.getDeviceInterface())
351 , m_queue (context.getUniversalQueue())
352 , m_queueFamilyIndex (context.getUniversalQueueFamilyIndex())
353 , m_allocator (context.getDefaultAllocator())
354 , m_imageUsageFlags (getImageUsageFlags(params.imageFormat))
355 , m_imageAspectFlags (getImageAspectFlags(params.imageFormat))
356 , m_commandPool (createCommandPool(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT))
357 , m_commandBuffer (allocatePrimaryCommandBuffer(*m_commandPool))
359 , m_image (createImage(params.imageType,
364 , m_imageMemory (allocateAndBindImageMemory(*m_image))
365 , m_imageView (createImageView(*m_image,
366 getCorrespondingImageViewType(params.imageType),
370 , m_renderPass (createRenderPass(params.imageFormat))
371 , m_frameBuffer (createFrameBuffer(*m_imageView, *m_renderPass, params.imageExtent.width, params.imageExtent.height))
375 VkImageViewType ImageClearingTestInstance::getCorrespondingImageViewType (VkImageType imageType) const
379 case VK_IMAGE_TYPE_1D:
380 return VK_IMAGE_VIEW_TYPE_1D;
381 case VK_IMAGE_TYPE_2D:
382 return VK_IMAGE_VIEW_TYPE_2D;
383 case VK_IMAGE_TYPE_3D:
384 return VK_IMAGE_VIEW_TYPE_3D;
386 DE_FATAL("Unknown image type!");
389 return VK_IMAGE_VIEW_TYPE_2D;
392 VkImageUsageFlags ImageClearingTestInstance::getImageUsageFlags (VkFormat format) const
394 VkImageUsageFlags commonFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
396 if (isDepthStencilFormat(format))
397 return commonFlags | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
399 return commonFlags | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
402 VkImageAspectFlags ImageClearingTestInstance::getImageAspectFlags (VkFormat format) const
404 VkImageAspectFlags imageAspectFlags = 0;
406 if (getIsDepthFormat(format))
407 imageAspectFlags |= VK_IMAGE_ASPECT_DEPTH_BIT;
409 if (getIsStencilFormat(format))
410 imageAspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT;
412 if (imageAspectFlags == 0)
413 imageAspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
415 return imageAspectFlags;
418 bool ImageClearingTestInstance::getIsStencilFormat (VkFormat format) const
420 const TextureFormat tcuFormat = mapVkFormat(format);
422 if (tcuFormat.order == TextureFormat::S || tcuFormat.order == TextureFormat::DS)
428 bool ImageClearingTestInstance::getIsDepthFormat (VkFormat format) const
430 const TextureFormat tcuFormat = mapVkFormat(format);
432 if (tcuFormat.order == TextureFormat::D || tcuFormat.order == TextureFormat::DS)
438 de::MovePtr<Allocation> ImageClearingTestInstance::allocateAndBindImageMemory (VkImage image) const
440 de::MovePtr<Allocation> imageMemory (m_allocator.allocate(getImageMemoryRequirements(m_vkd, m_device, image), MemoryRequirement::Any));
441 VK_CHECK(m_vkd.bindImageMemory(m_device, image, imageMemory->getMemory(), imageMemory->getOffset()));
445 Move<VkCommandPool> ImageClearingTestInstance::createCommandPool (VkCommandPoolCreateFlags commandPoolCreateFlags) const
447 const VkCommandPoolCreateInfo cmdPoolCreateInfo =
449 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
450 DE_NULL, // const void* pNext;
451 commandPoolCreateFlags, // VkCommandPoolCreateFlags flags;
452 m_queueFamilyIndex // deUint32 queueFamilyIndex;
455 return vk::createCommandPool(m_vkd, m_device, &cmdPoolCreateInfo, DE_NULL);
458 Move<VkCommandBuffer> ImageClearingTestInstance::allocatePrimaryCommandBuffer (VkCommandPool commandPool) const
460 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
462 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
463 DE_NULL, // const void* pNext;
464 commandPool, // VkCommandPool commandPool;
465 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
466 1 // deUint32 commandBufferCount;
469 return vk::allocateCommandBuffer(m_vkd, m_device, &cmdBufferAllocateInfo);
472 Move<VkImage> ImageClearingTestInstance::createImage (VkImageType imageType, VkFormat format, VkExtent3D extent, VkImageUsageFlags usage) const
474 VkImageFormatProperties properties;
475 if ((m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(),
478 VK_IMAGE_TILING_OPTIMAL,
480 &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
482 TCU_THROW(NotSupportedError, "Format not supported");
485 const VkImageCreateInfo imageCreateInfo =
487 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
488 DE_NULL, // const void* pNext;
489 0u, // VkImageCreateFlags flags;
490 imageType, // VkImageType imageType;
491 format, // VkFormat format;
492 extent, // VkExtent3D extent;
493 1, // deUint32 mipLevels;
494 1, // deUint32 arrayLayers;
495 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
496 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
497 usage, // VkImageUsageFlags usage;
498 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
499 1, // deUint32 queueFamilyIndexCount;
500 &m_queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
501 VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
504 return vk::createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL);
507 Move<VkImageView> ImageClearingTestInstance::createImageView (VkImage image, VkImageViewType viewType, VkFormat format, VkImageAspectFlags aspectMask) const
509 const VkImageViewCreateInfo imageViewCreateInfo =
511 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
512 DE_NULL, // const void* pNext;
513 0u, // VkImageViewCreateFlags flags;
514 image, // VkImage image;
515 viewType, // VkImageViewType viewType;
516 format, // VkFormat format;
518 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle r;
519 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle g;
520 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle b;
521 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle a;
522 }, // VkComponentMapping components;
524 aspectMask, // VkImageAspectFlags aspectMask;
525 0u, // deUint32 baseMipLevel;
526 1u, // deUint32 mipLevels;
527 0u, // deUint32 baseArrayLayer;
528 1u, // deUint32 arraySize;
529 }, // VkImageSubresourceRange subresourceRange;
532 return vk::createImageView(m_vkd, m_device, &imageViewCreateInfo, DE_NULL);
535 Move<VkRenderPass> ImageClearingTestInstance::createRenderPass (VkFormat format) const
537 VkImageLayout imageLayout;
539 if (isDepthStencilFormat(format))
540 imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
542 imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
544 const VkAttachmentDescription attachmentDesc =
546 0u, // VkAttachmentDescriptionFlags flags;
547 format, // VkFormat format;
548 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
549 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
550 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
551 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
552 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
553 imageLayout, // VkImageLayout initialLayout;
554 imageLayout, // VkImageLayout finalLayout;
557 const VkAttachmentDescription attachments[1] =
562 const VkAttachmentReference attachmentRef =
564 0u, // deUint32 attachment;
565 imageLayout, // VkImageLayout layout;
568 const VkAttachmentReference* pColorAttachments = DE_NULL;
569 const VkAttachmentReference* pDepthStencilAttachment = DE_NULL;
570 deUint32 colorAttachmentCount = 1;
572 if (isDepthStencilFormat(format))
574 colorAttachmentCount = 0;
575 pDepthStencilAttachment = &attachmentRef;
579 colorAttachmentCount = 1;
580 pColorAttachments = &attachmentRef;
583 const VkSubpassDescription subpassDesc[1] =
586 0u, // VkSubpassDescriptionFlags flags;
587 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
588 0u, // deUint32 inputAttachmentCount;
589 DE_NULL, // const VkAttachmentReference* pInputAttachments;
590 colorAttachmentCount, // deUint32 colorAttachmentCount;
591 pColorAttachments, // const VkAttachmentReference* pColorAttachments;
592 DE_NULL, // const VkAttachmentReference* pResolveAttachments;
593 pDepthStencilAttachment, // const VkAttachmentReference* pDepthStencilAttachment;
594 0u, // deUint32 preserveAttachmentCount;
595 DE_NULL, // const VkAttachmentReference* pPreserveAttachments;
599 const VkRenderPassCreateInfo renderPassCreateInfo =
601 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
602 DE_NULL, // const void* pNext;
603 0u, // VkRenderPassCreateFlags flags;
604 1u, // deUint32 attachmentCount;
605 attachments, // const VkAttachmentDescription* pAttachments;
606 1u, // deUint32 subpassCount;
607 subpassDesc, // const VkSubpassDescription* pSubpasses;
608 0u, // deUint32 dependencyCount;
609 DE_NULL, // const VkSubpassDependency* pDependencies;
612 return vk::createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
615 Move<VkFramebuffer> ImageClearingTestInstance::createFrameBuffer (VkImageView imageView, VkRenderPass renderPass, deUint32 imageWidth, deUint32 imageHeight) const
617 const VkImageView attachmentViews[1] =
622 const VkFramebufferCreateInfo framebufferCreateInfo =
624 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
625 DE_NULL, // const void* pNext;
626 0u, // VkFramebufferCreateFlags flags;
627 renderPass, // VkRenderPass renderPass;
628 1, // deUint32 attachmentCount;
629 attachmentViews, // const VkImageView* pAttachments;
630 imageWidth, // deUint32 width;
631 imageHeight, // deUint32 height;
632 1u, // deUint32 layers;
635 return createFramebuffer(m_vkd, m_device, &framebufferCreateInfo, DE_NULL);
638 void ImageClearingTestInstance::beginCommandBuffer (VkCommandBufferUsageFlags usageFlags) const
640 const VkCommandBufferBeginInfo commandBufferBeginInfo =
642 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
643 DE_NULL, // const void* pNext;
644 usageFlags, // VkCommandBufferUsageFlags flags;
645 DE_NULL // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
648 VK_CHECK(m_vkd.beginCommandBuffer(*m_commandBuffer, &commandBufferBeginInfo));
651 void ImageClearingTestInstance::endCommandBuffer (void) const
653 VK_CHECK(m_vkd.endCommandBuffer(*m_commandBuffer));
656 void ImageClearingTestInstance::submitCommandBuffer (void) const
658 const VkFenceCreateInfo fenceCreateInfo =
660 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
661 DE_NULL, // const void* pNext;
662 0u // VkFenceCreateFlags flags;
665 const Unique<VkFence> fence (createFence(m_vkd, m_device, &fenceCreateInfo));
667 const VkSubmitInfo submitInfo =
669 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
670 DE_NULL, // const void* pNext;
671 0u, // deUint32 waitSemaphoreCount;
672 DE_NULL, // const VkSemaphore* pWaitSemaphores;
673 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
674 1u, // deUint32 commandBufferCount;
675 &(*m_commandBuffer), // const VkCommandBuffer* pCommandBuffers;
676 0u, // deUint32 signalSemaphoreCount;
677 DE_NULL // const VkSemaphore* pSignalSemaphores;
680 VK_CHECK(m_vkd.queueSubmit(m_queue, 1, &submitInfo, *fence));
682 VK_CHECK(m_vkd.waitForFences(m_device, 1, &fence.get(), VK_TRUE, ~0ull));
686 void ImageClearingTestInstance::pipelineImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout) const
689 const VkImageSubresourceRange subResourcerange =
691 m_imageAspectFlags, // VkImageAspectFlags aspectMask;
692 0, // deUint32 baseMipLevel;
693 1, // deUint32 levelCount;
694 0, // deUint32 baseArrayLayer;
695 1 // deUint32 layerCount;
698 const VkImageMemoryBarrier imageBarrier =
700 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
701 DE_NULL, // const void* pNext;
702 srcAccessMask, // VkAccessFlags srcAccessMask;
703 dstAccessMask, // VkAccessFlags dstAccessMask;
704 oldLayout, // VkImageLayout oldLayout;
705 newLayout, // VkImageLayout newLayout;
706 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
707 VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex;
708 *m_image, // VkImage image;
709 subResourcerange // VkImageSubresourceRange subresourceRange;
712 m_vkd.cmdPipelineBarrier(*m_commandBuffer, srcStageMask, dstStageMask, 0, 0, DE_NULL, 0, DE_NULL, 1, &imageBarrier);
716 de::MovePtr<TextureLevel> ImageClearingTestInstance::readImage (VkImageAspectFlags aspectMask) const
718 Move<VkBuffer> buffer;
719 de::MovePtr<Allocation> bufferAlloc;
721 const TextureFormat tcuFormat = aspectMask == VK_IMAGE_ASPECT_COLOR_BIT ? mapVkFormat(m_params.imageFormat) :
722 aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT ? getDepthCopyFormat(m_params.imageFormat) :
723 aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT ? getStencilCopyFormat(m_params.imageFormat) :
726 const VkDeviceSize pixelDataSize = m_params.imageExtent.width * m_params.imageExtent.height * m_params.imageExtent.depth * tcuFormat.getPixelSize();
727 de::MovePtr<TextureLevel> result (new TextureLevel(tcuFormat, m_params.imageExtent.width, m_params.imageExtent.height, m_params.imageExtent.depth));
729 // Create destination buffer
731 const VkBufferCreateInfo bufferParams =
733 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
734 DE_NULL, // const void* pNext;
735 0u, // VkBufferCreateFlags flags;
736 pixelDataSize, // VkDeviceSize size;
737 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
738 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
739 0u, // deUint32 queueFamilyIndexCount;
740 DE_NULL // const deUint32* pQueueFamilyIndices;
743 buffer = createBuffer(m_vkd, m_device, &bufferParams);
744 bufferAlloc = m_allocator.allocate(getBufferMemoryRequirements(m_vkd, m_device, *buffer), MemoryRequirement::HostVisible);
745 VK_CHECK(m_vkd.bindBufferMemory(m_device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
748 // Barriers for copying image to buffer
750 const VkBufferMemoryBarrier bufferBarrier =
752 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
753 DE_NULL, // const void* pNext;
754 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
755 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
756 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
757 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
758 *buffer, // VkBuffer buffer;
759 0u, // VkDeviceSize offset;
760 pixelDataSize // VkDeviceSize size;
763 // Copy image to buffer
765 const VkBufferImageCopy copyRegion =
767 0u, // VkDeviceSize bufferOffset;
768 m_params.imageExtent.width, // deUint32 bufferRowLength;
769 m_params.imageExtent.height, // deUint32 bufferImageHeight;
770 { aspectMask, 0u, 0u, 1u }, // VkImageSubresourceLayers imageSubresource;
771 { 0, 0, 0 }, // VkOffset3D imageOffset;
772 m_params.imageExtent // VkExtent3D imageExtent;
775 beginCommandBuffer(0);
777 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
778 VK_PIPELINE_STAGE_TRANSFER_BIT,
779 VK_ACCESS_TRANSFER_WRITE_BIT |
780 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
781 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
782 VK_ACCESS_TRANSFER_READ_BIT,
783 VK_IMAGE_LAYOUT_GENERAL,
784 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
786 m_vkd.cmdCopyImageToBuffer(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, ©Region);
787 m_vkd.cmdPipelineBarrier(*m_commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
789 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
790 VK_PIPELINE_STAGE_TRANSFER_BIT,
792 VK_ACCESS_TRANSFER_READ_BIT |
793 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
794 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
796 VK_ACCESS_TRANSFER_READ_BIT |
797 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
798 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
799 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
800 VK_IMAGE_LAYOUT_GENERAL);
804 submitCommandBuffer();
806 invalidateMappedMemoryRange(m_vkd, m_device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
808 copy(*result, ConstPixelBufferAccess(result->getFormat(), result->getSize(), bufferAlloc->getHostPtr()));
813 void ImageClearingTestInstance::beginRenderPass (VkSubpassContents content, VkClearValue clearValue) const
815 const VkRenderPassBeginInfo renderPassBeginInfo =
817 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
818 DE_NULL, // const void* pNext;
819 *m_renderPass, // VkRenderPass renderPass;
820 *m_frameBuffer, // VkFramebuffer framebuffer;
822 { 0, 0 }, // VkOffset2D offset;
824 m_params.imageExtent.width, // deUint32 width;
825 m_params.imageExtent.height // deUint32 height;
826 } // VkExtent2D extent;
827 }, // VkRect2D renderArea;
828 1u, // deUint32 clearValueCount;
829 &clearValue // const VkClearValue* pClearValues;
832 m_vkd.cmdBeginRenderPass(*m_commandBuffer, &renderPassBeginInfo, content);
835 class ClearColorImageTestInstance : public ImageClearingTestInstance
838 ClearColorImageTestInstance (Context& context,
839 const TestParams& testParams)
840 : ImageClearingTestInstance(context, testParams)
843 virtual TestStatus iterate (void);
846 TestStatus ClearColorImageTestInstance::iterate (void)
848 const VkImageSubresourceRange subResourcerange =
850 m_imageAspectFlags, // VkImageAspectFlags aspectMask;
851 0, // deUint32 baseMipLevel;
852 1, // deUint32 levelCount;
853 0, // deUint32 baseArrayLayer;
854 1 // deUint32 layerCount;
857 beginCommandBuffer(0);
859 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
860 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
861 0, // VkAccessFlags srcAccessMask
862 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
863 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
864 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); // VkImageLayout newLayout;
866 beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
867 m_vkd.cmdEndRenderPass(*m_commandBuffer);
869 pipelineImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // VkPipelineStageFlags srcStageMask
870 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
871 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
872 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
873 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
874 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
876 m_vkd.cmdClearColorImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue.color, 1, &subResourcerange);
878 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
879 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
880 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
881 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
882 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
883 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
886 submitCommandBuffer();
888 de::MovePtr<TextureLevel> result = readImage(VK_IMAGE_ASPECT_COLOR_BIT);
889 std::string compareResult;
891 for (deUint32 z = 0; z < m_params.imageExtent.depth; z++)
893 for (deUint32 y = 0; y < m_params.imageExtent.height; y++)
895 for (deUint32 x = 0; x < m_params.imageExtent.width; x++)
897 if (!comparePixelToColorClearValue(result->getAccess(), x, y, z, m_params.clearValue.color, compareResult))
898 return TestStatus::fail("Color value mismatch! " + compareResult);
903 return TestStatus::pass("cmdClearColorImage passed");
906 class ClearDepthStencilImageTestInstance : public ImageClearingTestInstance
909 ClearDepthStencilImageTestInstance (Context& context,
910 const TestParams& testParams)
911 : ImageClearingTestInstance(context, testParams)
914 virtual TestStatus iterate (void);
917 TestStatus ClearDepthStencilImageTestInstance::iterate (void)
919 const VkImageSubresourceRange subResourcerange =
921 m_imageAspectFlags, // VkImageAspectFlags aspectMask;
922 0, // deUint32 baseMipLevel;
923 1, // deUint32 levelCount;
924 0, // deUint32 baseArrayLayer;
925 1 // deUint32 layerCount;
928 beginCommandBuffer(0);
930 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
931 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
932 0, // VkAccessFlags srcAccessMask
933 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
934 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
935 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); // VkImageLayout newLayout;
937 beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
938 m_vkd.cmdEndRenderPass(*m_commandBuffer);
940 pipelineImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // VkPipelineStageFlags srcStageMask
941 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
942 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
943 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
944 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
945 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
947 m_vkd.cmdClearDepthStencilImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue.depthStencil, 1, &subResourcerange);
949 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
950 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
951 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
952 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
953 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
954 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
957 submitCommandBuffer();
959 de::MovePtr<TextureLevel> depthResult;
960 de::MovePtr<TextureLevel> stencilResult;
961 bool isDepthFormat = getIsDepthFormat(m_params.imageFormat);
964 depthResult = readImage(VK_IMAGE_ASPECT_DEPTH_BIT);
966 const bool isStencilFormat = getIsStencilFormat(m_params.imageFormat);
970 stencilResult = readImage(VK_IMAGE_ASPECT_STENCIL_BIT);
973 std::string compareResult;
975 for (deUint32 y = 0; y < m_params.imageExtent.height; ++y)
977 for (deUint32 x = 0; x < m_params.imageExtent.width; ++x)
979 if (isDepthFormat && !comparePixelToDepthClearValue(depthResult->getAccess(), x, y, m_params.clearValue.depthStencil.depth, compareResult))
980 return TestStatus::fail("Depth value mismatch! " + compareResult);
982 if (isStencilFormat && !comparePixelToStencilClearValue(stencilResult->getAccess(), x, y, m_params.clearValue.depthStencil.stencil, compareResult))
983 return TestStatus::fail("Stencil value mismatch! " + compareResult);
987 return TestStatus::pass("cmdClearDepthStencilImage passed");
990 class ClearColorAttachmentTestInstance : public ImageClearingTestInstance
993 ClearColorAttachmentTestInstance (Context& context,
994 const TestParams& testParams)
995 : ImageClearingTestInstance(context, testParams)
998 virtual TestStatus iterate (void);
1001 TestStatus ClearColorAttachmentTestInstance::iterate (void)
1003 const VkClearAttachment clearAttachment =
1005 VK_IMAGE_ASPECT_COLOR_BIT, // kImageAspectFlags aspectMask;
1006 0u, // deUint32 colorAttachment;
1007 m_params.clearValue // VkClearValue clearValue;
1010 const VkClearRect clearRect =
1014 { m_params.imageExtent.width, m_params.imageExtent.height }
1015 }, // VkRect2D rect;
1016 0u, // deUint32 baseArrayLayer;
1017 1u // deUint32 layerCount;
1020 beginCommandBuffer(0);
1022 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1023 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1024 0, // VkAccessFlags srcAccessMask
1025 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
1026 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1027 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1028 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); // VkImageLayout newLayout;
1030 beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
1031 m_vkd.cmdClearAttachments(*m_commandBuffer, 1, &clearAttachment, 1, &clearRect);
1032 m_vkd.cmdEndRenderPass(*m_commandBuffer);
1034 pipelineImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // VkPipelineStageFlags srcStageMask
1035 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1036 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
1037 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1038 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1039 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
1040 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
1043 submitCommandBuffer();
1045 de::MovePtr<TextureLevel> result = readImage(VK_IMAGE_ASPECT_COLOR_BIT);
1046 std::string compareResult;
1048 for (deUint32 y = 0; y < m_params.imageExtent.height; y++)
1050 for (deUint32 x = 0; x < m_params.imageExtent.width; x++)
1052 if (!comparePixelToColorClearValue(result->getAccess(), x, y, 0, m_params.clearValue.color, compareResult))
1053 return TestStatus::fail("Color value mismatch" + compareResult);
1057 return TestStatus::pass("cmdClearAttachments passed");
1060 class ClearDepthStencilAttachmentTestInstance : public ImageClearingTestInstance
1063 ClearDepthStencilAttachmentTestInstance (Context& context,
1064 const TestParams& testParams)
1065 : ImageClearingTestInstance(context, testParams)
1068 virtual TestStatus iterate (void);
1071 TestStatus ClearDepthStencilAttachmentTestInstance::iterate (void)
1073 const VkClearAttachment clearAttachment =
1075 VK_IMAGE_ASPECT_DEPTH_BIT |
1076 VK_IMAGE_ASPECT_STENCIL_BIT, // kImageAspectFlags aspectMask;
1077 0u, // deUint32 colorAttachment;
1078 m_params.clearValue // VkClearValue clearValue;
1081 const VkClearRect clearRect =
1085 { m_params.imageExtent.width, m_params.imageExtent.height }
1086 }, // VkRect2D rect;
1087 0u, // deUint32 baseArrayLayer;
1088 1u // deUint32 layerCount;
1091 beginCommandBuffer(0);
1093 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1094 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1095 0, // VkAccessFlags srcAccessMask
1096 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1097 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1098 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1099 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); // VkImageLayout newLayout;
1101 beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
1102 m_vkd.cmdClearAttachments(*m_commandBuffer, 1, &clearAttachment, 1, &clearRect);
1103 m_vkd.cmdEndRenderPass(*m_commandBuffer);
1105 pipelineImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // VkPipelineStageFlags srcStageMask
1106 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1107 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1108 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1109 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1110 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
1111 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
1114 submitCommandBuffer();
1116 de::MovePtr<TextureLevel> depthResult;
1117 de::MovePtr<TextureLevel> stencilResult;
1118 bool isDepthFormat = getIsDepthFormat(m_params.imageFormat);
1121 depthResult = readImage(VK_IMAGE_ASPECT_DEPTH_BIT);
1123 const bool isStencilFormat = getIsStencilFormat(m_params.imageFormat);
1125 if (isStencilFormat)
1127 stencilResult = readImage(VK_IMAGE_ASPECT_STENCIL_BIT);
1131 std::string compareResult;
1133 for (deUint32 y = 0; y < m_params.imageExtent.height; y++)
1135 for (deUint32 x = 0; x < m_params.imageExtent.width; x++)
1137 if (isDepthFormat && !comparePixelToDepthClearValue(depthResult->getAccess(), x, y, m_params.clearValue.depthStencil.depth, compareResult))
1138 return TestStatus::fail("Depth value mismatch! " + compareResult);
1140 if (isStencilFormat && !comparePixelToStencilClearValue(stencilResult->getAccess(), x, y, m_params.clearValue.depthStencil.stencil, compareResult))
1141 return TestStatus::fail("Stencil value mismatch! " + compareResult);
1145 return TestStatus::pass("cmdClearAttachments passed");
1148 class PartialClearColorAttachmentTestInstance : public ImageClearingTestInstance
1151 PartialClearColorAttachmentTestInstance (Context& context,
1152 const TestParams& testParams)
1153 : ImageClearingTestInstance(context, testParams)
1156 virtual TestStatus iterate (void);
1159 TestStatus PartialClearColorAttachmentTestInstance::iterate (void)
1161 const VkClearAttachment clearAttachment =
1163 VK_IMAGE_ASPECT_COLOR_BIT, // kImageAspectFlags aspectMask;
1164 0u, // deUint32 colorAttachment;
1165 m_params.clearValue // VkClearValue clearValue;
1168 const VkClearRect clearRects[2] =
1172 { 0, (deInt32)(m_params.imageExtent.height / 4) },
1173 { m_params.imageExtent.width, m_params.imageExtent.height / 2}
1174 }, // VkRect2D rect;
1175 0u, // deUint32 baseArrayLayer;
1176 1u // deUint32 layerCount;
1180 { (deInt32)(m_params.imageExtent.width / 4), 0 },
1181 { m_params.imageExtent.width / 2, m_params.imageExtent.height}
1182 }, // VkRect2D rect;
1183 0u, // deUint32 baseArrayLayer;
1184 1u // deUint32 layerCount;
1188 beginCommandBuffer(0);
1190 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1191 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1192 0, // VkAccessFlags srcAccessMask
1193 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
1194 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1195 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); // VkImageLayout newLayout;
1197 beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
1198 m_vkd.cmdClearAttachments(*m_commandBuffer, 1, &clearAttachment, 2, clearRects);
1199 m_vkd.cmdEndRenderPass(*m_commandBuffer);
1201 pipelineImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // VkPipelineStageFlags srcStageMask
1202 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1203 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
1204 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1205 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1206 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
1207 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
1211 submitCommandBuffer();
1213 de::MovePtr<TextureLevel> result = readImage(VK_IMAGE_ASPECT_COLOR_BIT);
1214 std::string compareResult;
1216 for (deUint32 y = 0; y < m_params.imageExtent.height; y++)
1218 for (deUint32 x = 0; x < m_params.imageExtent.width; x++)
1220 if (((x < m_params.imageExtent.width / 4) && (y < m_params.imageExtent.height / 4)) ||
1221 ((x < m_params.imageExtent.width / 4) && (y >= (m_params.imageExtent.height * 3) / 4)) ||
1222 ((x >= (m_params.imageExtent.width * 3) / 4) && (y < m_params.imageExtent.height / 4)) ||
1223 ((x >= (m_params.imageExtent.width * 3) / 4) && (y >= (m_params.imageExtent.height * 3) / 4)))
1225 if (!comparePixelToColorClearValue(result->getAccess(), x, y, 0, m_params.initValue.color, compareResult))
1226 return TestStatus::fail("Color value mismatch! " + compareResult);
1228 else if (!comparePixelToColorClearValue(result->getAccess(), x, y, 0, m_params.clearValue.color, compareResult))
1229 return TestStatus::fail("Color value mismatch! " + compareResult);
1233 return TestStatus::pass("cmdClearAttachments passed");
1236 class PartialClearDepthStencilAttachmentTestInstance : public ImageClearingTestInstance
1239 PartialClearDepthStencilAttachmentTestInstance (Context& context,
1240 const TestParams& testParams)
1241 : ImageClearingTestInstance(context, testParams)
1244 virtual TestStatus iterate (void);
1247 TestStatus PartialClearDepthStencilAttachmentTestInstance::iterate (void)
1249 const VkClearAttachment clearAttachment =
1251 VK_IMAGE_ASPECT_DEPTH_BIT |
1252 VK_IMAGE_ASPECT_STENCIL_BIT, // kImageAspectFlags aspectMask;
1253 0u, // deUint32 colorAttachment;
1254 m_params.clearValue // VkClearValue clearValue;
1257 const VkClearRect clearRects[2] =
1261 { 0, (deInt32)(m_params.imageExtent.height / 4) },
1262 { m_params.imageExtent.width, m_params.imageExtent.height / 2}
1263 }, // VkRect2D rect;
1264 0u, // deUint32 baseArrayLayer;
1265 1u // deUint32 layerCount;
1269 { (deInt32)(m_params.imageExtent.width / 4), 0 },
1270 { m_params.imageExtent.width / 2, m_params.imageExtent.height}
1271 }, // VkRect2D rect;
1272 0u, // deUint32 baseArrayLayer;
1273 1u // deUint32 layerCount;
1277 beginCommandBuffer(0);
1279 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1280 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1281 0, // VkAccessFlags srcAccessMask
1282 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
1283 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1284 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); // VkImageLayout newLayout;
1286 beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
1287 m_vkd.cmdClearAttachments(*m_commandBuffer, 1, &clearAttachment, 2, clearRects);
1288 m_vkd.cmdEndRenderPass(*m_commandBuffer);
1290 pipelineImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // VkPipelineStageFlags srcStageMask
1291 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1292 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
1293 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1294 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1295 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
1296 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
1300 submitCommandBuffer();
1302 de::MovePtr<TextureLevel> depthResult;
1303 de::MovePtr<TextureLevel> stencilResult;
1304 bool isDepthFormat = getIsDepthFormat(m_params.imageFormat);
1307 depthResult = readImage(VK_IMAGE_ASPECT_DEPTH_BIT);
1309 const bool isStencilFormat = getIsStencilFormat(m_params.imageFormat);
1311 if (isStencilFormat)
1313 stencilResult = readImage(VK_IMAGE_ASPECT_STENCIL_BIT);
1316 std::string compareResult;
1318 for (deUint32 y = 0; y < m_params.imageExtent.height; y++)
1320 for (deUint32 x = 0; x < m_params.imageExtent.width; x++)
1322 if (((x < m_params.imageExtent.width / 4) && (y < m_params.imageExtent.height / 4)) ||
1323 ((x < m_params.imageExtent.width / 4) && (y >= (m_params.imageExtent.height * 3) / 4)) ||
1324 ((x >= (m_params.imageExtent.width * 3) / 4) && (y < m_params.imageExtent.height / 4)) ||
1325 ((x >= (m_params.imageExtent.width * 3) / 4) && (y >= (m_params.imageExtent.height * 3) / 4)))
1327 if (isDepthFormat && !comparePixelToDepthClearValue(depthResult->getAccess(), x, y, m_params.initValue.depthStencil.depth, compareResult))
1328 return TestStatus::fail("Depth value mismatch! " + compareResult);
1330 if (isStencilFormat && !comparePixelToStencilClearValue(stencilResult->getAccess(), x, y, m_params.initValue.depthStencil.stencil, compareResult))
1331 return TestStatus::fail("Stencil value mismatch! " + compareResult);
1335 if (isDepthFormat && !comparePixelToDepthClearValue(depthResult->getAccess(), x, y, m_params.clearValue.depthStencil.depth, compareResult))
1336 return TestStatus::fail("Depth value mismatch! " + compareResult);
1338 if (isStencilFormat && !comparePixelToStencilClearValue(stencilResult->getAccess(), x, y, m_params.clearValue.depthStencil.stencil, compareResult))
1339 return TestStatus::fail("Stencil value mismatch! " + compareResult);
1344 return TestStatus::pass("cmdClearAttachments passed");
1347 VkClearValue makeClearColorValue (VkFormat format, float r, float g, float b, float a)
1349 const TextureFormat tcuFormat = mapVkFormat(format);
1350 VkClearValue clearValue;
1352 if (getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_FLOATING_POINT
1353 || getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_SIGNED_FIXED_POINT
1354 || getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT)
1356 clearValue.color.float32[0] = r;
1357 clearValue.color.float32[1] = g;
1358 clearValue.color.float32[2] = b;
1359 clearValue.color.float32[3] = a;
1361 else if (getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
1363 UVec4 maxValues = getFormatMaxUintValue(tcuFormat);
1365 clearValue.color.uint32[0] = (deUint32)((float)maxValues[0] * r);
1366 clearValue.color.uint32[1] = (deUint32)((float)maxValues[1] * g);
1367 clearValue.color.uint32[2] = (deUint32)((float)maxValues[2] * b);
1368 clearValue.color.uint32[3] = (deUint32)((float)maxValues[3] * a);
1370 else if (getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER)
1372 IVec4 maxValues = getFormatMaxIntValue(tcuFormat);
1374 clearValue.color.int32[0] = (deUint32)((float)maxValues[0] * r);
1375 clearValue.color.int32[1] = (deUint32)((float)maxValues[1] * g);
1376 clearValue.color.int32[2] = (deUint32)((float)maxValues[2] * b);
1377 clearValue.color.int32[3] = (deUint32)((float)maxValues[3] * a);
1380 DE_FATAL("Unknown channel class");
1385 std::string getFormatCaseName (VkFormat format)
1387 return de::toLower(de::toString(getFormatStr(format)).substr(10));
1390 const char* getImageTypeCaseName (VkImageType type)
1392 const char* s_names[] =
1398 return de::getSizedArrayElement<VK_IMAGE_TYPE_LAST>(s_names, type);
1403 TestCaseGroup* createImageClearingTests (TestContext& testCtx)
1406 de::MovePtr<TestCaseGroup> imageClearingTests (new TestCaseGroup(testCtx, "image_clearing", "Image Clearing Tests"));
1408 de::MovePtr<TestCaseGroup> colorImageClearTests (new TestCaseGroup(testCtx, "clear_color_image", "Color Image Clear Tests"));
1409 de::MovePtr<TestCaseGroup> depthStencilImageClearTests (new TestCaseGroup(testCtx, "clear_depth_stencil_image", "Color Depth/Stencil Image Tests"));
1410 de::MovePtr<TestCaseGroup> colorAttachmentClearTests (new TestCaseGroup(testCtx, "clear_color_attachment", "Color Color Attachment Tests"));
1411 de::MovePtr<TestCaseGroup> depthStencilAttachmentClearTests (new TestCaseGroup(testCtx, "clear_depth_stencil_attachment", "Color Depth/Stencil Attachment Tests"));
1412 de::MovePtr<TestCaseGroup> partialColorAttachmentClearTests (new TestCaseGroup(testCtx, "partial_clear_color_attachment", "Clear Partial Color Attachment Tests"));
1413 de::MovePtr<TestCaseGroup> partialDepthStencilAttachmentClearTests (new TestCaseGroup(testCtx, "partial_clear_depth_stencil_attachment", "Clear Partial Depth/Stencil Attachment Tests"));
1415 // Some formats are commented out due to the tcu::TextureFormat does not support them yet.
1416 const VkFormat colorImageFormatsToTest[] =
1418 VK_FORMAT_R4G4_UNORM_PACK8,
1419 VK_FORMAT_R4G4B4A4_UNORM_PACK16,
1420 VK_FORMAT_B4G4R4A4_UNORM_PACK16,
1421 VK_FORMAT_R5G6B5_UNORM_PACK16,
1422 VK_FORMAT_B5G6R5_UNORM_PACK16,
1423 VK_FORMAT_R5G5B5A1_UNORM_PACK16,
1424 VK_FORMAT_B5G5R5A1_UNORM_PACK16,
1425 VK_FORMAT_A1R5G5B5_UNORM_PACK16,
1428 VK_FORMAT_R8_USCALED,
1429 VK_FORMAT_R8_SSCALED,
1433 VK_FORMAT_R8G8_UNORM,
1434 VK_FORMAT_R8G8_SNORM,
1435 VK_FORMAT_R8G8_USCALED,
1436 VK_FORMAT_R8G8_SSCALED,
1437 VK_FORMAT_R8G8_UINT,
1438 VK_FORMAT_R8G8_SINT,
1439 VK_FORMAT_R8G8_SRGB,
1440 VK_FORMAT_R8G8B8_UNORM,
1441 VK_FORMAT_R8G8B8_SNORM,
1442 VK_FORMAT_R8G8B8_USCALED,
1443 VK_FORMAT_R8G8B8_SSCALED,
1444 VK_FORMAT_R8G8B8_UINT,
1445 VK_FORMAT_R8G8B8_SINT,
1446 VK_FORMAT_R8G8B8_SRGB,
1447 VK_FORMAT_B8G8R8_UNORM,
1448 VK_FORMAT_B8G8R8_SNORM,
1449 VK_FORMAT_B8G8R8_USCALED,
1450 VK_FORMAT_B8G8R8_SSCALED,
1451 VK_FORMAT_B8G8R8_UINT,
1452 VK_FORMAT_B8G8R8_SINT,
1453 VK_FORMAT_B8G8R8_SRGB,
1454 VK_FORMAT_R8G8B8A8_UNORM,
1455 VK_FORMAT_R8G8B8A8_SNORM,
1456 VK_FORMAT_R8G8B8A8_USCALED,
1457 VK_FORMAT_R8G8B8A8_SSCALED,
1458 VK_FORMAT_R8G8B8A8_UINT,
1459 VK_FORMAT_R8G8B8A8_SINT,
1460 VK_FORMAT_R8G8B8A8_SRGB,
1461 VK_FORMAT_B8G8R8A8_UNORM,
1462 VK_FORMAT_B8G8R8A8_SNORM,
1463 VK_FORMAT_B8G8R8A8_USCALED,
1464 VK_FORMAT_B8G8R8A8_SSCALED,
1465 VK_FORMAT_B8G8R8A8_UINT,
1466 VK_FORMAT_B8G8R8A8_SINT,
1467 VK_FORMAT_B8G8R8A8_SRGB,
1468 VK_FORMAT_A8B8G8R8_UNORM_PACK32,
1469 VK_FORMAT_A8B8G8R8_SNORM_PACK32,
1470 VK_FORMAT_A8B8G8R8_USCALED_PACK32,
1471 VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
1472 VK_FORMAT_A8B8G8R8_UINT_PACK32,
1473 VK_FORMAT_A8B8G8R8_SINT_PACK32,
1474 VK_FORMAT_A8B8G8R8_SRGB_PACK32,
1475 VK_FORMAT_A2R10G10B10_UNORM_PACK32,
1476 VK_FORMAT_A2R10G10B10_SNORM_PACK32,
1477 VK_FORMAT_A2R10G10B10_USCALED_PACK32,
1478 VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
1479 VK_FORMAT_A2R10G10B10_UINT_PACK32,
1480 VK_FORMAT_A2R10G10B10_SINT_PACK32,
1481 VK_FORMAT_A2B10G10R10_UNORM_PACK32,
1482 VK_FORMAT_A2B10G10R10_SNORM_PACK32,
1483 VK_FORMAT_A2B10G10R10_USCALED_PACK32,
1484 VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
1485 VK_FORMAT_A2B10G10R10_UINT_PACK32,
1486 VK_FORMAT_A2B10G10R10_SINT_PACK32,
1487 VK_FORMAT_R16_UNORM,
1488 VK_FORMAT_R16_SNORM,
1489 VK_FORMAT_R16_USCALED,
1490 VK_FORMAT_R16_SSCALED,
1493 VK_FORMAT_R16_SFLOAT,
1494 VK_FORMAT_R16G16_UNORM,
1495 VK_FORMAT_R16G16_SNORM,
1496 VK_FORMAT_R16G16_USCALED,
1497 VK_FORMAT_R16G16_SSCALED,
1498 VK_FORMAT_R16G16_UINT,
1499 VK_FORMAT_R16G16_SINT,
1500 VK_FORMAT_R16G16_SFLOAT,
1501 VK_FORMAT_R16G16B16_UNORM,
1502 VK_FORMAT_R16G16B16_SNORM,
1503 VK_FORMAT_R16G16B16_USCALED,
1504 VK_FORMAT_R16G16B16_SSCALED,
1505 VK_FORMAT_R16G16B16_UINT,
1506 VK_FORMAT_R16G16B16_SINT,
1507 VK_FORMAT_R16G16B16_SFLOAT,
1508 VK_FORMAT_R16G16B16A16_UNORM,
1509 VK_FORMAT_R16G16B16A16_SNORM,
1510 VK_FORMAT_R16G16B16A16_USCALED,
1511 VK_FORMAT_R16G16B16A16_SSCALED,
1512 VK_FORMAT_R16G16B16A16_UINT,
1513 VK_FORMAT_R16G16B16A16_SINT,
1514 VK_FORMAT_R16G16B16A16_SFLOAT,
1517 VK_FORMAT_R32_SFLOAT,
1518 VK_FORMAT_R32G32_UINT,
1519 VK_FORMAT_R32G32_SINT,
1520 VK_FORMAT_R32G32_SFLOAT,
1521 VK_FORMAT_R32G32B32_UINT,
1522 VK_FORMAT_R32G32B32_SINT,
1523 VK_FORMAT_R32G32B32_SFLOAT,
1524 VK_FORMAT_R32G32B32A32_UINT,
1525 VK_FORMAT_R32G32B32A32_SINT,
1526 VK_FORMAT_R32G32B32A32_SFLOAT,
1527 // VK_FORMAT_R64_UINT,
1528 // VK_FORMAT_R64_SINT,
1529 // VK_FORMAT_R64_SFLOAT,
1530 // VK_FORMAT_R64G64_UINT,
1531 // VK_FORMAT_R64G64_SINT,
1532 // VK_FORMAT_R64G64_SFLOAT,
1533 // VK_FORMAT_R64G64B64_UINT,
1534 // VK_FORMAT_R64G64B64_SINT,
1535 // VK_FORMAT_R64G64B64_SFLOAT,
1536 // VK_FORMAT_R64G64B64A64_UINT,
1537 // VK_FORMAT_R64G64B64A64_SINT,
1538 // VK_FORMAT_R64G64B64A64_SFLOAT,
1539 VK_FORMAT_B10G11R11_UFLOAT_PACK32,
1540 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
1541 // VK_FORMAT_BC1_RGB_UNORM_BLOCK,
1542 // VK_FORMAT_BC1_RGB_SRGB_BLOCK,
1543 // VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
1544 // VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
1545 // VK_FORMAT_BC2_UNORM_BLOCK,
1546 // VK_FORMAT_BC2_SRGB_BLOCK,
1547 // VK_FORMAT_BC3_UNORM_BLOCK,
1548 // VK_FORMAT_BC3_SRGB_BLOCK,
1549 // VK_FORMAT_BC4_UNORM_BLOCK,
1550 // VK_FORMAT_BC4_SNORM_BLOCK,
1551 // VK_FORMAT_BC5_UNORM_BLOCK,
1552 // VK_FORMAT_BC5_SNORM_BLOCK,
1553 // VK_FORMAT_BC6H_UFLOAT_BLOCK,
1554 // VK_FORMAT_BC6H_SFLOAT_BLOCK,
1555 // VK_FORMAT_BC7_UNORM_BLOCK,
1556 // VK_FORMAT_BC7_SRGB_BLOCK,
1557 // VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
1558 // VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
1559 // VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
1560 // VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
1561 // VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
1562 // VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
1563 // VK_FORMAT_EAC_R11_UNORM_BLOCK,
1564 // VK_FORMAT_EAC_R11_SNORM_BLOCK,
1565 // VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
1566 // VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
1567 // VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
1568 // VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
1569 // VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
1570 // VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
1571 // VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
1572 // VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
1573 // VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
1574 // VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
1575 // VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
1576 // VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
1577 // VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
1578 // VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
1579 // VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
1580 // VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
1581 // VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
1582 // VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
1583 // VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
1584 // VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
1585 // VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
1586 // VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
1587 // VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
1588 // VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
1589 // VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
1590 // VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
1591 // VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
1592 // VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
1593 // VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
1594 // VK_FORMAT_ASTC_12x12_SRGB_BLOCK
1596 const size_t numOfColorImageFormatsToTest = DE_LENGTH_OF_ARRAY(colorImageFormatsToTest);
1598 const VkFormat depthStencilImageFormatsToTest[] =
1600 VK_FORMAT_D16_UNORM,
1601 VK_FORMAT_X8_D24_UNORM_PACK32,
1602 VK_FORMAT_D32_SFLOAT,
1604 VK_FORMAT_D16_UNORM_S8_UINT,
1605 VK_FORMAT_D24_UNORM_S8_UINT,
1606 VK_FORMAT_D32_SFLOAT_S8_UINT
1608 const size_t numOfDepthStencilImageFormatsToTest = DE_LENGTH_OF_ARRAY(depthStencilImageFormatsToTest);
1611 const VkImageType imageTypesToTest[] =
1617 const size_t numOfImageTypesToTest = DE_LENGTH_OF_ARRAY(imageTypesToTest);
1619 const VkExtent3D imageDimensionsByType[] =
1626 TestParams colorImageTestParams;
1628 for (size_t imageTypeIndex = 0; imageTypeIndex < numOfImageTypesToTest; ++imageTypeIndex)
1630 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfColorImageFormatsToTest; ++imageFormatIndex)
1632 colorImageTestParams.imageType = imageTypesToTest[imageTypeIndex];
1633 colorImageTestParams.imageFormat = colorImageFormatsToTest[imageFormatIndex];
1634 colorImageTestParams.imageExtent = imageDimensionsByType[imageTypeIndex];
1635 colorImageTestParams.initValue = makeClearColorValue(colorImageTestParams.imageFormat, 0.2f, 0.1f, 0.7f, 0.8f);
1636 colorImageTestParams.clearValue = makeClearColorValue(colorImageTestParams.imageFormat, 0.1f, 0.5f, 0.3f, 0.9f);
1638 std::ostringstream testCaseName;
1639 testCaseName << getImageTypeCaseName(colorImageTestParams.imageType);
1640 testCaseName << "_" << getFormatCaseName(colorImageTestParams.imageFormat);
1642 colorImageClearTests->addChild(new InstanceFactory1<ClearColorImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName.str(), "Clear Color Image", colorImageTestParams));
1646 imageClearingTests->addChild(colorImageClearTests.release());
1650 TestParams depthStencilImageTestParams =
1652 VK_IMAGE_TYPE_2D, // VkImageType imageType;
1653 depthStencilImageFormatsToTest[0], // VkFormat format;
1654 { 256, 256, 1 }, // VkExtent3D extent;
1655 makeClearValueDepthStencil(0.5f, 0x03), // VkClearValue initValue
1656 makeClearValueDepthStencil(0.1f, 0x06) // VkClearValue clearValue
1659 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfDepthStencilImageFormatsToTest; ++imageFormatIndex)
1661 depthStencilImageTestParams.imageFormat = depthStencilImageFormatsToTest[imageFormatIndex];
1663 std::ostringstream testCaseName;
1664 testCaseName << getImageTypeCaseName(depthStencilImageTestParams.imageType);
1665 testCaseName << "_" << getFormatCaseName(depthStencilImageTestParams.imageFormat);
1667 depthStencilImageClearTests->addChild(new InstanceFactory1<ClearDepthStencilImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName.str(), "Clear Depth/Stencil Image", depthStencilImageTestParams));
1670 imageClearingTests->addChild(depthStencilImageClearTests.release());
1674 TestParams colorAttachmentTestParams =
1676 VK_IMAGE_TYPE_2D, // VkImageType imageType;
1677 colorImageFormatsToTest[0], // VkFormat format;
1678 { 256, 256, 1 }, // VkExtent3D extent;
1679 makeClearValueColorU32(0, 0, 0, 0), // VkClearValue initValue
1680 makeClearValueColorU32(0, 0, 0, 0) // VkClearValue clearValue
1683 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfColorImageFormatsToTest; ++imageFormatIndex)
1685 colorAttachmentTestParams.imageFormat = colorImageFormatsToTest[imageFormatIndex];
1686 colorAttachmentTestParams.initValue = makeClearColorValue(colorAttachmentTestParams.imageFormat, 0.2f, 0.1f, 0.7f, 0.8f);
1687 colorAttachmentTestParams.clearValue = makeClearColorValue(colorAttachmentTestParams.imageFormat, 0.1f, 0.5f, 0.3f, 0.9f);
1689 std::ostringstream testCaseName;
1690 testCaseName << getImageTypeCaseName(colorAttachmentTestParams.imageType);
1691 testCaseName << "_" << getFormatCaseName(colorAttachmentTestParams.imageFormat);
1693 colorAttachmentClearTests->addChild(new InstanceFactory1<ClearColorAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName.str(), "Clear Color Attachment", colorAttachmentTestParams));
1696 imageClearingTests->addChild(colorAttachmentClearTests.release());
1700 TestParams depthStencilAttachmentTestParams =
1702 VK_IMAGE_TYPE_2D, // VkImageType imageType;
1703 depthStencilImageFormatsToTest[0], // VkFormat format;
1704 { 256, 256, 1 }, // VkExtent3D extent;
1705 makeClearValueDepthStencil(0.5f, 0x03), // VkClearValue initValue
1706 makeClearValueDepthStencil(0.1f, 0x06) // VkClearValue clearValue
1709 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfDepthStencilImageFormatsToTest; ++imageFormatIndex)
1711 depthStencilAttachmentTestParams.imageFormat = depthStencilImageFormatsToTest[imageFormatIndex];
1713 std::ostringstream testCaseName;
1714 testCaseName << getImageTypeCaseName(depthStencilAttachmentTestParams.imageType);
1715 testCaseName << "_" << getFormatCaseName(depthStencilAttachmentTestParams.imageFormat);
1717 depthStencilAttachmentClearTests->addChild(new InstanceFactory1<ClearDepthStencilAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName.str(), "Clear Depth/Stencil Attachment", depthStencilAttachmentTestParams));
1720 imageClearingTests->addChild(depthStencilAttachmentClearTests.release());
1724 TestParams colorAttachmentTestParams =
1726 VK_IMAGE_TYPE_2D, // VkImageType imageType;
1727 colorImageFormatsToTest[0], // VkFormat format;
1728 { 256, 256, 1 }, // VkExtent3D extent;
1729 makeClearValueColorU32(0, 0, 0, 0), // VkClearValue initValue
1730 makeClearValueColorU32(0, 0, 0, 0) // VkClearValue clearValue
1733 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfColorImageFormatsToTest; ++imageFormatIndex)
1735 colorAttachmentTestParams.imageFormat = colorImageFormatsToTest[imageFormatIndex];
1736 colorAttachmentTestParams.initValue = makeClearColorValue(colorAttachmentTestParams.imageFormat, 0.2f, 0.1f, 0.7f, 0.8f);
1737 colorAttachmentTestParams.clearValue = makeClearColorValue(colorAttachmentTestParams.imageFormat, 0.1f, 0.5f, 0.3f, 0.9f);
1739 std::ostringstream testCaseName;
1740 testCaseName << getImageTypeCaseName(colorAttachmentTestParams.imageType);
1741 testCaseName << "_" << getFormatCaseName(colorAttachmentTestParams.imageFormat);
1743 partialColorAttachmentClearTests->addChild(new InstanceFactory1<PartialClearColorAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName.str(), "Partial Clear Color Attachment", colorAttachmentTestParams));
1746 imageClearingTests->addChild(partialColorAttachmentClearTests.release());
1750 TestParams depthStencilAttachmentTestParams =
1752 VK_IMAGE_TYPE_2D, // VkImageType imageType;
1753 depthStencilImageFormatsToTest[0], // VkFormat format;
1754 { 256, 256, 1 }, // VkExtent3D extent;
1755 makeClearValueDepthStencil(0.5f, 0x03), // VkClearValue initValue
1756 makeClearValueDepthStencil(0.1f, 0x06) // VkClearValue clearValue
1759 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfDepthStencilImageFormatsToTest; ++imageFormatIndex)
1761 depthStencilAttachmentTestParams.imageFormat = depthStencilImageFormatsToTest[imageFormatIndex];
1763 std::ostringstream testCaseName;
1764 testCaseName << getImageTypeCaseName(depthStencilAttachmentTestParams.imageType);
1765 testCaseName << "_" << getFormatCaseName(depthStencilAttachmentTestParams.imageFormat);
1767 partialDepthStencilAttachmentClearTests->addChild(new InstanceFactory1<PartialClearDepthStencilAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName.str(), "Parital Clear Depth/Stencil Attachment", depthStencilAttachmentTestParams));
1770 imageClearingTests->addChild(partialDepthStencilAttachmentClearTests.release());
1773 return imageClearingTests.release();