1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
6 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 * \brief Vulkan Image Clearing Tests
23 *//*--------------------------------------------------------------------*/
25 #include "vktApiImageClearingTests.hpp"
27 #include "deRandom.hpp"
29 #include "deSTLUtil.hpp"
30 #include "deStringUtil.hpp"
31 #include "deUniquePtr.hpp"
32 #include "deArrayUtil.hpp"
34 #include "vkImageUtil.hpp"
35 #include "vkMemUtil.hpp"
36 #include "vktTestCase.hpp"
37 #include "vktTestCaseUtil.hpp"
38 #include "vktTestGroupUtil.hpp"
39 #include "vkQueryUtil.hpp"
40 #include "vkRefUtil.hpp"
41 #include "vkTypeUtil.hpp"
42 #include "vkCmdUtil.hpp"
43 #include "tcuImageCompare.hpp"
44 #include "tcuTexture.hpp"
45 #include "tcuTextureUtil.hpp"
46 #include "tcuVectorType.hpp"
47 #include "tcuTexture.hpp"
48 #include "tcuFloat.hpp"
49 #include "tcuTestLog.hpp"
50 #include "tcuVectorUtil.hpp"
68 ALLOCATION_KIND_SUBALLOCATED = 0,
69 ALLOCATION_KIND_DEDICATED,
74 de::MovePtr<Allocation> allocateBuffer (const InstanceInterface& vki,
75 const DeviceInterface& vkd,
76 const VkPhysicalDevice& physDevice,
77 const VkDevice device,
78 const VkBuffer& buffer,
79 const MemoryRequirement requirement,
81 AllocationKind allocationKind)
83 switch (allocationKind)
85 case ALLOCATION_KIND_SUBALLOCATED:
87 const VkMemoryRequirements memoryRequirements = getBufferMemoryRequirements(vkd, device, buffer);
89 return allocator.allocate(memoryRequirements, requirement);
92 case ALLOCATION_KIND_DEDICATED:
94 return allocateDedicated(vki, vkd, physDevice, device, buffer, requirement);
99 TCU_THROW(InternalError, "Invalid allocation kind");
104 de::MovePtr<Allocation> allocateImage (const InstanceInterface& vki,
105 const DeviceInterface& vkd,
106 const VkPhysicalDevice& physDevice,
107 const VkDevice device,
108 const VkImage& image,
109 const MemoryRequirement requirement,
110 Allocator& allocator,
111 AllocationKind allocationKind)
113 switch (allocationKind)
115 case ALLOCATION_KIND_SUBALLOCATED:
117 const VkMemoryRequirements memoryRequirements = getImageMemoryRequirements(vkd, device, image);
119 return allocator.allocate(memoryRequirements, requirement);
122 case ALLOCATION_KIND_DEDICATED:
124 return allocateDedicated(vki, vkd, physDevice, device, image, requirement);
129 TCU_THROW(InternalError, "Invalid allocation kind");
134 VkExtent3D getMipLevelExtent (VkExtent3D baseExtent, const deUint32 mipLevel)
136 baseExtent.width = std::max(baseExtent.width >> mipLevel, 1u);
137 baseExtent.height = std::max(baseExtent.height >> mipLevel, 1u);
138 baseExtent.depth = std::max(baseExtent.depth >> mipLevel, 1u);
142 deUint32 getNumMipLevels (const VkExtent3D& baseExtent, const deUint32 maxMipLevels)
144 const deUint32 widestEdge = std::max(std::max(baseExtent.width, baseExtent.height), baseExtent.depth);
145 return std::min(static_cast<deUint32>(deFloatLog2(static_cast<float>(widestEdge))) + 1u, maxMipLevels);
148 deUint32 greatestCommonDivisor (const deUint32 a, const deUint32 b)
164 deUint32 lowestCommonMultiple (const deUint32 a, const deUint32 b)
166 return (a*b)/greatestCommonDivisor(a,b);
169 std::vector<deUint32> getImageMipLevelSizes (const deUint32 pixelSize, const VkExtent3D& baseExtent, const deUint32 numMipLevels, const deUint32 perLevelAlignment = 1u)
171 std::vector<deUint32> results(numMipLevels);
173 for (deUint32 mipLevel = 0; mipLevel < numMipLevels; ++mipLevel)
175 const VkExtent3D extent = getMipLevelExtent(baseExtent, mipLevel);
176 results[mipLevel] = static_cast<deUint32>(extent.width * extent.height * extent.depth * pixelSize);
177 results[mipLevel] = ((results[mipLevel] + perLevelAlignment-1) / perLevelAlignment) * perLevelAlignment;
185 deUint32 baseArrayLayer;
189 inline bool isInClearRange (const UVec4& clearCoords, const deUint32 x, const deUint32 y, deUint32 arrayLayer = 0, tcu::Maybe<LayerRange> imageViewLayerRange = tcu::Maybe<LayerRange>(), tcu::Maybe<LayerRange> attachmentClearLayerRange = tcu::Maybe<LayerRange>())
191 if (attachmentClearLayerRange)
193 // Only layers in range passed to clear command are cleared
195 const deUint32 clearBaseLayer = (imageViewLayerRange ? imageViewLayerRange->baseArrayLayer : 0) + attachmentClearLayerRange->baseArrayLayer;
196 const deUint32 clearLayerCount = (attachmentClearLayerRange->layerCount == VK_REMAINING_ARRAY_LAYERS) ? imageViewLayerRange->layerCount : clearBaseLayer + attachmentClearLayerRange->layerCount;
198 if ((arrayLayer < clearBaseLayer) || (arrayLayer >= (clearLayerCount)))
204 if (clearCoords == UVec4())
209 //! Check if a point lies in a cross-like area.
210 return !((x < clearCoords[0] && y < clearCoords[1]) ||
211 (x < clearCoords[0] && y >= clearCoords[3]) ||
212 (x >= clearCoords[2] && y < clearCoords[1]) ||
213 (x >= clearCoords[2] && y >= clearCoords[3]));
216 inline bool isInInitialClearRange (deUint32 mipLevel, deUint32 arrayLayer, LayerRange imageViewLayerRange)
220 // intial clear is done using FB bound to level 0 only
224 // Only layers in range bound to framebuffer are cleared to initial color
225 if ((arrayLayer < imageViewLayerRange.baseArrayLayer) || (arrayLayer >= (imageViewLayerRange.baseArrayLayer + imageViewLayerRange.layerCount)))
233 // This method is copied from the vktRenderPassTests.cpp. It should be moved to a common place.
234 int calcFloatDiff (float a, float b)
236 const int asign = Float32(a).sign();
237 const int bsign = Float32(a).sign();
239 const deUint32 avalue = (Float32(a).bits() & ((0x1u << 31u) - 1u));
240 const deUint32 bvalue = (Float32(b).bits() & ((0x1u << 31u) - 1u));
243 return avalue + bvalue + 1u;
244 else if (avalue < bvalue)
245 return bvalue - avalue;
247 return avalue - bvalue;
250 // This method is copied from the vktRenderPassTests.cpp and extended with the stringResult parameter.
251 bool comparePixelToDepthClearValue (const ConstPixelBufferAccess& access,
255 std::string& stringResult)
257 const TextureFormat format = getEffectiveDepthStencilTextureFormat(access.getFormat(), Sampler::MODE_DEPTH);
258 const TextureChannelClass channelClass = getTextureChannelClass(format.type);
260 switch (channelClass)
262 case TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
263 case TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
265 const int bitDepth = getTextureFormatBitDepth(format).x();
266 const float depth = access.getPixDepth(x, y);
267 const float threshold = 2.0f / (float)((1 << bitDepth) - 1);
268 const bool result = deFloatAbs(depth - ref) <= threshold;
273 s << "Ref:" << ref << " Threshold:" << threshold << " Depth:" << depth;
274 stringResult = s.str();
280 case TEXTURECHANNELCLASS_FLOATING_POINT:
282 const float depth = access.getPixDepth(x, y);
283 const int mantissaBits = getTextureFormatMantissaBitDepth(format).x();
284 const int threshold = (10 * 1) << (23 - mantissaBits);
286 DE_ASSERT(mantissaBits <= 23);
288 const bool result = calcFloatDiff(depth, ref) <= threshold;
292 float floatThreshold = Float32((deUint32)threshold).asFloat();
295 s << "Ref:" << ref << " Threshold:" << floatThreshold << " Depth:" << depth;
296 stringResult = s.str();
303 DE_FATAL("Invalid channel class");
308 // This method is copied from the vktRenderPassTests.cpp and extended with the stringResult parameter.
309 bool comparePixelToStencilClearValue (const ConstPixelBufferAccess& access,
313 std::string& stringResult)
315 const deUint32 stencil = access.getPixStencil(x, y);
316 const bool result = stencil == ref;
321 s << "Ref:" << ref << " Threshold:0" << " Stencil:" << stencil;
322 stringResult = s.str();
328 // This method is copied from the vktRenderPassTests.cpp and extended with the stringResult parameter.
329 bool comparePixelToColorClearValue (const ConstPixelBufferAccess& access,
333 const VkClearColorValue& ref,
334 std::string& stringResult)
336 const TextureFormat format = access.getFormat();
337 const TextureChannelClass channelClass = getTextureChannelClass(format.type);
338 const BVec4 channelMask = getTextureFormatChannelMask(format);
340 switch (channelClass)
342 case TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
343 case TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
345 const IVec4 bitDepth (getTextureFormatBitDepth(format));
346 const Vec4 resColor (access.getPixel(x, y, z));
347 Vec4 refColor (ref.float32[0],
351 const int modifier = (channelClass == TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT) ? 0 : 1;
352 const Vec4 threshold (bitDepth[0] > 0 ? 1.0f / ((float)(1 << (bitDepth[0] - modifier)) - 1.0f) : 1.0f,
353 bitDepth[1] > 0 ? 1.0f / ((float)(1 << (bitDepth[1] - modifier)) - 1.0f) : 1.0f,
354 bitDepth[2] > 0 ? 1.0f / ((float)(1 << (bitDepth[2] - modifier)) - 1.0f) : 1.0f,
355 bitDepth[3] > 0 ? 1.0f / ((float)(1 << (bitDepth[3] - modifier)) - 1.0f) : 1.0f);
357 if (isSRGB(access.getFormat()))
358 refColor = linearToSRGB(refColor);
360 const bool result = !(anyNotEqual(logicalAnd(lessThanEqual(absDiff(resColor, refColor), threshold), channelMask), channelMask));
365 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << threshold << " Color:" << resColor;
366 stringResult = s.str();
372 case TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
374 const UVec4 resColor (access.getPixelUint(x, y, z));
375 const UVec4 refColor (ref.uint32[0],
379 const UVec4 threshold (1);
381 const bool result = !(anyNotEqual(logicalAnd(lessThanEqual(absDiff(resColor, refColor), threshold), channelMask), channelMask));
386 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << threshold << " Color:" << resColor;
387 stringResult = s.str();
393 case TEXTURECHANNELCLASS_SIGNED_INTEGER:
395 const IVec4 resColor (access.getPixelInt(x, y, z));
396 const IVec4 refColor (ref.int32[0],
400 const IVec4 threshold (1);
402 const bool result = !(anyNotEqual(logicalAnd(lessThanEqual(absDiff(resColor, refColor), threshold), channelMask), channelMask));
407 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << threshold << " Color:" << resColor;
408 stringResult = s.str();
414 case TEXTURECHANNELCLASS_FLOATING_POINT:
416 const Vec4 resColor (access.getPixel(x, y, z));
417 const Vec4 refColor (ref.float32[0],
421 const IVec4 mantissaBits (getTextureFormatMantissaBitDepth(format));
422 const IVec4 threshold (10 * IVec4(1) << (23 - mantissaBits));
424 DE_ASSERT(allEqual(greaterThanEqual(threshold, IVec4(0)), BVec4(true)));
426 for (int ndx = 0; ndx < 4; ndx++)
428 const bool result = !(calcFloatDiff(resColor[ndx], refColor[ndx]) > threshold[ndx] && channelMask[ndx]);
432 float floatThreshold = Float32((deUint32)(threshold)[0]).asFloat();
433 Vec4 thresholdVec4 (floatThreshold,
438 s << "Ref:" << refColor << " Mask:" << channelMask << " Threshold:" << thresholdVec4 << " Color:" << resColor;
439 stringResult = s.str();
449 DE_FATAL("Invalid channel class");
454 std::string extentToString (VkExtent3D extent, VkImageType imageType)
456 // Don't append image dimensions when using the dimensions found in original test cases. This avoids name clashing with the old versions.
457 if (imageType == VK_IMAGE_TYPE_1D && extent.width == 256u) return "";
458 if (imageType == VK_IMAGE_TYPE_2D && extent.width == 256u && extent.height == 256u) return "";
459 if (imageType == VK_IMAGE_TYPE_3D && extent.width == 256u && extent.height == 256u && extent.depth == 16u) return "";
461 return (std::string("_") + de::toString(extent.width) + std::string("x") + de::toString(extent.height) + (extent.depth != 1 ? (std::string("x") + de::toString(extent.depth)) : ""));
464 enum SeparateDepthStencilLayoutMode
466 SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE = 0,
467 SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH,
468 SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL,
473 bool useSingleMipLevel; //!< only mip level 0, otherwise up to maxMipLevels
474 VkImageType imageType;
475 VkFormat imageFormat;
476 VkImageTiling imageTiling;
477 VkExtent3D imageExtent;
478 deUint32 imageLayerCount;
479 LayerRange imageViewLayerRange;
480 VkClearValue initValue;
481 VkClearValue clearValue[2]; //!< the second value is used with more than one mip map
482 bool useSeparateExpectedClearValue;
483 VkClearValue expectedClearValue[2];
484 LayerRange clearLayerRange;
485 AllocationKind allocationKind;
487 SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
488 bool isColorMultipleSubresourceRangeTest;
491 class ImageClearingTestInstance : public vkt::TestInstance
494 ImageClearingTestInstance (Context& context,
495 const TestParams& testParams);
497 Move<VkCommandPool> createCommandPool (VkCommandPoolCreateFlags commandPoolCreateFlags) const;
498 Move<VkCommandBuffer> allocatePrimaryCommandBuffer (VkCommandPool commandPool) const;
499 Move<VkImage> createImage (VkImageType imageType, VkFormat format, VkImageTiling tiling, VkExtent3D extent, deUint32 arrayLayerCount, VkImageUsageFlags usage) const;
500 Move<VkImageView> createImageView (VkImage image, VkImageViewType viewType, VkFormat format, VkImageAspectFlags aspectMask, LayerRange layerRange) const;
501 Move<VkRenderPass> createRenderPass (VkFormat format) const;
502 Move<VkFramebuffer> createFrameBuffer (VkImageView imageView, VkRenderPass renderPass, deUint32 imageWidth, deUint32 imageHeight, deUint32 imageLayersCount) const;
504 void beginCommandBuffer (VkCommandBufferUsageFlags usageFlags) const;
505 void endCommandBuffer (void) const;
506 void submitCommandBuffer (void) const;
507 void beginRenderPass (VkSubpassContents content, VkClearValue clearValue) const;
508 void preClearImage (const deUint32 imageMipLevels, VkExtent3D imageExtent, deUint32 imageLayerCount, Unique<VkCommandBuffer>& commandBuffer) const;
509 Move<VkBuffer> createImageClearingBuffer (const DeviceInterface& vkd, const VkDevice device, Unique<VkImage>& image);
511 void pipelineImageBarrier (VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImageAspectFlags aspectMask = 0u) const;
512 de::MovePtr<TextureLevelPyramid> readImage (VkImageAspectFlags aspectMask, deUint32 baseLayer) const;
513 tcu::TestStatus verifyResultImage (const std::string& successMessage, const UVec4& clearCoords = UVec4()) const;
522 VkImageViewType getCorrespondingImageViewType (VkImageType imageType, ViewType viewType) const;
523 VkImageUsageFlags getImageUsageFlags (VkFormat format) const;
524 VkImageAspectFlags getImageAspectFlags (VkFormat format) const;
525 bool getIsAttachmentFormat (VkFormat format, VkImageTiling tiling) const;
526 bool getIs3DFormat (VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags) const;
527 bool getIsStencilFormat (VkFormat format) const;
528 bool getIsDepthFormat (VkFormat format) const;
529 VkImageFormatProperties getImageFormatProperties (void) const;
530 VkImageCreateFlags getImageCreateFlags (void) const;
531 ViewType getViewType (deUint32 imageLayerCount) const;
532 de::MovePtr<Allocation> allocateAndBindImageMemory (VkImage image) const;
533 de::MovePtr<Allocation> allocateAndBindBufferMemory (VkBuffer buffer) const;
535 const TestParams& m_params;
536 const VkDevice m_device;
537 const InstanceInterface& m_vki;
538 const DeviceInterface& m_vkd;
539 const VkQueue m_queue;
540 const deUint32 m_queueFamilyIndex;
541 Allocator& m_allocator;
543 const bool m_isAttachmentFormat;
544 const VkImageUsageFlags m_imageUsageFlags;
545 const VkImageAspectFlags m_imageAspectFlags;
546 const VkImageFormatProperties m_imageFormatProperties;
547 const deUint32 m_imageMipLevels;
548 const deUint32 m_thresholdMipLevel;
550 Unique<VkCommandPool> m_commandPool;
551 Unique<VkCommandBuffer> m_commandBuffer;
553 const bool m_is3DFormat;
554 Unique<VkImage> m_image;
555 Move<VkBuffer> m_stagingBuffer;
556 de::MovePtr<Allocation> m_stagingBufferMemory;
557 de::MovePtr<Allocation> m_imageMemory;
558 Unique<VkImageView> m_imageView;
559 Move<VkRenderPass> m_renderPass;
560 Move<VkFramebuffer> m_frameBuffer;
563 ImageClearingTestInstance::ImageClearingTestInstance (Context& context, const TestParams& params)
564 : TestInstance (context)
566 , m_device (context.getDevice())
567 , m_vki (context.getInstanceInterface())
568 , m_vkd (context.getDeviceInterface())
569 , m_queue (context.getUniversalQueue())
570 , m_queueFamilyIndex (context.getUniversalQueueFamilyIndex())
571 , m_allocator (context.getDefaultAllocator())
572 , m_isAttachmentFormat (getIsAttachmentFormat(params.imageFormat, params.imageTiling))
573 , m_imageUsageFlags (getImageUsageFlags(params.imageFormat))
574 , m_imageAspectFlags (getImageAspectFlags(params.imageFormat))
575 , m_imageFormatProperties (getImageFormatProperties())
576 , m_imageMipLevels (params.useSingleMipLevel ? 1u : getNumMipLevels(params.imageExtent, m_imageFormatProperties.maxMipLevels))
577 , m_thresholdMipLevel (std::max(m_imageMipLevels / 2u, 1u))
578 , m_commandPool (createCommandPool(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT))
579 , m_commandBuffer (allocatePrimaryCommandBuffer(*m_commandPool))
580 , m_is3DFormat (getIs3DFormat(params.imageFormat, params.imageType, params.imageTiling, getImageUsageFlags(params.imageFormat), 0u))
582 , m_image (createImage(params.imageType,
586 params.imageLayerCount,
589 , m_stagingBuffer (createImageClearingBuffer(m_vkd, m_device, m_image))
590 , m_stagingBufferMemory (allocateAndBindBufferMemory(*m_stagingBuffer))
592 , m_imageMemory (allocateAndBindImageMemory(*m_image))
593 , m_imageView (m_isAttachmentFormat ? createImageView(*m_image,
594 getCorrespondingImageViewType(params.imageType, getViewType(params.imageLayerCount)),
597 params.imageViewLayerRange) : vk::Move<VkImageView>())
600 if (m_params.allocationKind == ALLOCATION_KIND_DEDICATED)
601 context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
603 if (m_params.separateDepthStencilLayoutMode != SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE)
604 context.requireDeviceFunctionality("VK_KHR_separate_depth_stencil_layouts");
608 if (m_isAttachmentFormat)
610 m_renderPass = createRenderPass(params.imageFormat);
611 m_frameBuffer = createFrameBuffer(*m_imageView, *m_renderPass, params.imageExtent.width, params.imageExtent.height, params.imageViewLayerRange.layerCount);
617 ImageClearingTestInstance::ViewType ImageClearingTestInstance::getViewType (deUint32 imageLayerCount) const
619 if (imageLayerCount > 1u)
620 return m_params.isCube ? VIEW_TYPE_CUBE : VIEW_TYPE_ARRAY;
622 return VIEW_TYPE_SINGLE;
625 VkImageViewType ImageClearingTestInstance::getCorrespondingImageViewType (VkImageType imageType, ViewType viewType) const
629 case VK_IMAGE_TYPE_1D:
630 return (viewType == VIEW_TYPE_ARRAY) ? VK_IMAGE_VIEW_TYPE_1D_ARRAY : VK_IMAGE_VIEW_TYPE_1D;
631 case VK_IMAGE_TYPE_2D:
632 if (viewType == VIEW_TYPE_ARRAY)
633 return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
634 else if (viewType == VIEW_TYPE_CUBE)
635 return VK_IMAGE_VIEW_TYPE_CUBE;
637 return VK_IMAGE_VIEW_TYPE_2D;
638 case VK_IMAGE_TYPE_3D:
639 if (viewType != VIEW_TYPE_SINGLE)
641 DE_FATAL("Cannot have 3D image array");
643 return VK_IMAGE_VIEW_TYPE_3D;
645 DE_FATAL("Unknown image type!");
648 return VK_IMAGE_VIEW_TYPE_2D;
651 VkImageUsageFlags ImageClearingTestInstance::getImageUsageFlags (VkFormat format) const
653 VkImageUsageFlags commonFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
655 if (m_isAttachmentFormat)
657 if (isDepthStencilFormat(format))
658 return commonFlags | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
660 return commonFlags | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
665 VkImageAspectFlags ImageClearingTestInstance::getImageAspectFlags (VkFormat format) const
667 VkImageAspectFlags imageAspectFlags = 0;
669 if (getIsDepthFormat(format))
670 imageAspectFlags |= VK_IMAGE_ASPECT_DEPTH_BIT;
672 if (getIsStencilFormat(format))
673 imageAspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT;
675 if (imageAspectFlags == 0)
676 imageAspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
678 return imageAspectFlags;
681 bool ImageClearingTestInstance::getIs3DFormat (VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags) const
683 const VkImageFormatProperties props = vk::getPhysicalDeviceImageFormatProperties(m_vki, m_context.getPhysicalDevice(), format, type, tiling, usage, flags);
685 return props.maxExtent.depth > 1u;
688 bool ImageClearingTestInstance::getIsAttachmentFormat (VkFormat format, VkImageTiling tiling) const
690 const VkFormatProperties props = vk::getPhysicalDeviceFormatProperties(m_vki, m_context.getPhysicalDevice(), format);
691 const VkFormatFeatureFlags features = tiling == VK_IMAGE_TILING_OPTIMAL ? props.optimalTilingFeatures : props.linearTilingFeatures;
693 return (features & (vk::VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | vk::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) != 0;
696 bool ImageClearingTestInstance::getIsStencilFormat (VkFormat format) const
698 const TextureFormat tcuFormat = mapVkFormat(format);
700 if (tcuFormat.order == TextureFormat::S || tcuFormat.order == TextureFormat::DS)
706 bool ImageClearingTestInstance::getIsDepthFormat (VkFormat format) const
708 const TextureFormat tcuFormat = mapVkFormat(format);
710 if (tcuFormat.order == TextureFormat::D || tcuFormat.order == TextureFormat::DS)
716 VkImageCreateFlags ImageClearingTestInstance::getImageCreateFlags (void) const
718 return m_params.isCube ? (VkImageCreateFlags)VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : (VkImageCreateFlags)0;
721 VkImageFormatProperties ImageClearingTestInstance::getImageFormatProperties (void) const
723 VkImageFormatProperties properties;
724 const VkResult result = m_vki.getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(), m_params.imageFormat, m_params.imageType,
725 m_params.imageTiling, m_imageUsageFlags, getImageCreateFlags(), &properties);
727 if (result == VK_ERROR_FORMAT_NOT_SUPPORTED)
728 TCU_THROW(NotSupportedError, "Format not supported");
733 de::MovePtr<Allocation> ImageClearingTestInstance::allocateAndBindImageMemory (VkImage image) const
735 de::MovePtr<Allocation> imageMemory (allocateImage(m_vki, m_vkd, m_context.getPhysicalDevice(), m_device, image, MemoryRequirement::Any, m_allocator, m_params.allocationKind));
736 VK_CHECK(m_vkd.bindImageMemory(m_device, image, imageMemory->getMemory(), imageMemory->getOffset()));
740 de::MovePtr<Allocation> ImageClearingTestInstance::allocateAndBindBufferMemory (VkBuffer buffer) const
742 de::MovePtr<Allocation> stagingBufferMemory = allocateBuffer(m_vki, m_vkd, m_context.getPhysicalDevice(), m_device, buffer, MemoryRequirement::HostVisible, m_allocator, m_params.allocationKind);
743 VK_CHECK(m_vkd.bindBufferMemory(m_device, buffer, stagingBufferMemory->getMemory(), stagingBufferMemory->getOffset()));
744 return stagingBufferMemory;
747 Move<VkCommandPool> ImageClearingTestInstance::createCommandPool (VkCommandPoolCreateFlags commandPoolCreateFlags) const
749 return vk::createCommandPool(m_vkd, m_device, commandPoolCreateFlags, m_queueFamilyIndex);
752 Move<VkCommandBuffer> ImageClearingTestInstance::allocatePrimaryCommandBuffer (VkCommandPool commandPool) const
754 return vk::allocateCommandBuffer(m_vkd, m_device, commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
757 Move<VkImage> ImageClearingTestInstance::createImage (VkImageType imageType, VkFormat format, VkImageTiling tiling, VkExtent3D extent, deUint32 arrayLayerCount, VkImageUsageFlags usage) const
759 if (arrayLayerCount > m_imageFormatProperties.maxArrayLayers)
760 TCU_THROW(NotSupportedError, "Device does not support enough image array layers");
762 const VkImageCreateInfo imageCreateInfo =
764 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
765 DE_NULL, // const void* pNext;
766 getImageCreateFlags(), // VkImageCreateFlags flags;
767 imageType, // VkImageType imageType;
768 format, // VkFormat format;
769 extent, // VkExtent3D extent;
770 m_imageMipLevels, // deUint32 mipLevels;
771 arrayLayerCount, // deUint32 arrayLayers;
772 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
773 tiling, // VkImageTiling tiling;
774 usage, // VkImageUsageFlags usage;
775 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
776 1u, // deUint32 queueFamilyIndexCount;
777 &m_queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
778 VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
781 return vk::createImage(m_vkd, m_device, &imageCreateInfo, DE_NULL);
784 Move<VkImageView> ImageClearingTestInstance::createImageView (VkImage image, VkImageViewType viewType, VkFormat format, VkImageAspectFlags aspectMask, LayerRange layerRange) const
786 const VkImageViewCreateInfo imageViewCreateInfo =
788 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
789 DE_NULL, // const void* pNext;
790 0u, // VkImageViewCreateFlags flags;
791 image, // VkImage image;
792 viewType, // VkImageViewType viewType;
793 format, // VkFormat format;
795 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle r;
796 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle g;
797 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle b;
798 VK_COMPONENT_SWIZZLE_IDENTITY, // VkComponentSwizzle a;
799 }, // VkComponentMapping components;
801 aspectMask, // VkImageAspectFlags aspectMask;
802 0u, // deUint32 baseMipLevel;
803 1u, // deUint32 mipLevels;
804 layerRange.baseArrayLayer, // deUint32 baseArrayLayer;
805 layerRange.layerCount, // deUint32 arraySize;
806 }, // VkImageSubresourceRange subresourceRange;
809 return vk::createImageView(m_vkd, m_device, &imageViewCreateInfo, DE_NULL);
812 Move<VkRenderPass> ImageClearingTestInstance::createRenderPass (VkFormat format) const
814 if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE)
816 VkImageLayout imageLayout;
818 if (isDepthStencilFormat(format))
819 imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
821 imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
823 const VkAttachmentDescription attachmentDesc =
825 0u, // VkAttachmentDescriptionFlags flags;
826 format, // VkFormat format;
827 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
828 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
829 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
830 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
831 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
832 imageLayout, // VkImageLayout initialLayout;
833 imageLayout, // VkImageLayout finalLayout;
836 const VkAttachmentDescription attachments[1] =
841 const VkAttachmentReference attachmentRef =
843 0u, // deUint32 attachment;
844 imageLayout, // VkImageLayout layout;
847 const VkAttachmentReference* pColorAttachments = DE_NULL;
848 const VkAttachmentReference* pDepthStencilAttachment = DE_NULL;
849 deUint32 colorAttachmentCount = 1;
851 if (isDepthStencilFormat(format))
853 colorAttachmentCount = 0;
854 pDepthStencilAttachment = &attachmentRef;
858 colorAttachmentCount = 1;
859 pColorAttachments = &attachmentRef;
862 const VkSubpassDescription subpassDesc[1] =
865 0u, // VkSubpassDescriptionFlags flags;
866 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
867 0u, // deUint32 inputAttachmentCount;
868 DE_NULL, // const VkAttachmentReference* pInputAttachments;
869 colorAttachmentCount, // deUint32 colorAttachmentCount;
870 pColorAttachments, // const VkAttachmentReference* pColorAttachments;
871 DE_NULL, // const VkAttachmentReference* pResolveAttachments;
872 pDepthStencilAttachment, // const VkAttachmentReference* pDepthStencilAttachment;
873 0u, // deUint32 preserveAttachmentCount;
874 DE_NULL, // const VkAttachmentReference* pPreserveAttachments;
878 const VkRenderPassCreateInfo renderPassCreateInfo =
880 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
881 DE_NULL, // const void* pNext;
882 0u, // VkRenderPassCreateFlags flags;
883 1u, // deUint32 attachmentCount;
884 attachments, // const VkAttachmentDescription* pAttachments;
885 1u, // deUint32 subpassCount;
886 subpassDesc, // const VkSubpassDescription* pSubpasses;
887 0u, // deUint32 dependencyCount;
888 DE_NULL, // const VkSubpassDependency* pDependencies;
891 return vk::createRenderPass(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
895 // Make sure VK_KHR_create_renderpass2 is supported. Due to InstanceFactory1 being used and the render pass being created in
896 // the instance constructor and not every time, this is the best moment to check.
897 m_context.requireDeviceFunctionality("VK_KHR_create_renderpass2");
899 VkImageLayout initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
900 VkImageLayout finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
901 VkAttachmentDescriptionStencilLayoutKHR stencilLayouts =
903 VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR,
905 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
906 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
909 VkImageLayout imageLayout;
910 VkAttachmentReferenceStencilLayoutKHR stencilLayoutRef =
912 VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR,
914 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
917 if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
919 initialLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
920 finalLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
921 stencilLayouts.stencilInitialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
922 stencilLayouts.stencilFinalLayout = VK_IMAGE_LAYOUT_GENERAL;
923 imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
924 stencilLayoutRef.stencilLayout = VK_IMAGE_LAYOUT_GENERAL;
928 initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
929 finalLayout = VK_IMAGE_LAYOUT_GENERAL;
930 stencilLayouts.stencilInitialLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
931 stencilLayouts.stencilFinalLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
932 imageLayout = VK_IMAGE_LAYOUT_GENERAL;
933 stencilLayoutRef.stencilLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
936 const VkAttachmentDescription2KHR attachmentDesc =
938 VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR, // VkStructureType sType;
939 &stencilLayouts, // const void* pNext;
940 0u, // VkAttachmentDescriptionFlags flags;
941 format, // VkFormat format;
942 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
943 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
944 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
945 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
946 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
947 initialLayout, // VkImageLayout initialLayout;
948 finalLayout, // VkImageLayout finalLayout;
951 const VkAttachmentReference2KHR attachmentRef =
953 VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR, // VkStructureType sType;
954 &stencilLayoutRef, // const void* pNext;
955 0u, // deUint32 attachment;
956 imageLayout, // VkImageLayout layout;
957 0u, // VkImageAspectFlags aspectMask;
960 const VkSubpassDescription2KHR subpassDesc =
962 VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR, // VkStructureType sType;
963 DE_NULL, // const void* pNext;
964 0u, // VkSubpassDescriptionFlags flags;
965 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
966 0u, // deUint32 viewMask;
967 0u, // deUint32 inputAttachmentCount;
968 DE_NULL, // const VkAttachmentReference2KHR* pInputAttachments;
969 0u, // deUint32 colorAttachmentCount;
970 DE_NULL, // const VkAttachmentReference2KHR* pColorAttachments;
971 DE_NULL, // const VkAttachmentReference2KHR* pResolveAttachments;
972 &attachmentRef, // const VkAttachmentReference2KHR* pDepthStencilAttachment;
973 0u, // deUint32 preserveAttachmentCount;
974 DE_NULL, // const VkAttachmentReference2KHR* pPreserveAttachments;
977 const VkRenderPassCreateInfo2KHR renderPassCreateInfo =
979 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR, // VkStructureType sType;
980 DE_NULL, // const void* pNext;
981 0u, // VkRenderPassCreateFlags flags;
982 1u, // deUint32 attachmentCount;
983 &attachmentDesc, // const VkAttachmentDescription* pAttachments;
984 1u, // deUint32 subpassCount;
985 &subpassDesc, // const VkSubpassDescription* pSubpasses;
986 0u, // deUint32 dependencyCount;
987 DE_NULL, // const VkSubpassDependency* pDependencies;
988 0u, // deUint32 correlatedViewMaskCount;
989 DE_NULL, // const deUint32* pCorrelatedViewMasks;
992 return vk::createRenderPass2(m_vkd, m_device, &renderPassCreateInfo, DE_NULL);
996 Move<VkFramebuffer> ImageClearingTestInstance::createFrameBuffer (VkImageView imageView, VkRenderPass renderPass, deUint32 imageWidth, deUint32 imageHeight, deUint32 imageLayersCount) const
998 const VkImageView attachmentViews[1] =
1003 const VkFramebufferCreateInfo framebufferCreateInfo =
1005 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
1006 DE_NULL, // const void* pNext;
1007 0u, // VkFramebufferCreateFlags flags;
1008 renderPass, // VkRenderPass renderPass;
1009 1, // deUint32 attachmentCount;
1010 attachmentViews, // const VkImageView* pAttachments;
1011 imageWidth, // deUint32 width;
1012 imageHeight, // deUint32 height;
1013 imageLayersCount, // deUint32 layers;
1016 return createFramebuffer(m_vkd, m_device, &framebufferCreateInfo, DE_NULL);
1019 void ImageClearingTestInstance::beginCommandBuffer (VkCommandBufferUsageFlags usageFlags) const
1021 vk::beginCommandBuffer(m_vkd, *m_commandBuffer, usageFlags);
1024 void ImageClearingTestInstance::endCommandBuffer (void) const
1026 vk::endCommandBuffer(m_vkd, *m_commandBuffer);
1029 void ImageClearingTestInstance::submitCommandBuffer (void) const
1031 submitCommandsAndWait(m_vkd, m_device, m_queue, m_commandBuffer.get());
1034 void ImageClearingTestInstance::pipelineImageBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout, VkImageAspectFlags aspectMask) const
1036 if (!aspectMask || m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE)
1037 aspectMask = m_imageAspectFlags;
1039 const VkImageMemoryBarrier imageBarrier =
1041 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1042 DE_NULL, // const void* pNext;
1043 srcAccessMask, // VkAccessFlags srcAccessMask;
1044 dstAccessMask, // VkAccessFlags dstAccessMask;
1045 oldLayout, // VkImageLayout oldLayout;
1046 newLayout, // VkImageLayout newLayout;
1047 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1048 VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex;
1049 *m_image, // VkImage image;
1051 aspectMask, // VkImageAspectFlags aspectMask;
1052 0u, // deUint32 baseMipLevel;
1053 VK_REMAINING_MIP_LEVELS, // deUint32 levelCount;
1054 0u, // deUint32 baseArrayLayer;
1055 VK_REMAINING_ARRAY_LAYERS, // deUint32 layerCount;
1056 }, // VkImageSubresourceRange subresourceRange;
1059 m_vkd.cmdPipelineBarrier(*m_commandBuffer, srcStageMask, dstStageMask, 0, 0, DE_NULL, 0, DE_NULL, 1, &imageBarrier);
1062 de::MovePtr<TextureLevelPyramid> ImageClearingTestInstance::readImage (VkImageAspectFlags aspectMask, deUint32 arrayLayer) const
1064 const TextureFormat tcuFormat = aspectMask == VK_IMAGE_ASPECT_COLOR_BIT ? mapVkFormat(m_params.imageFormat) :
1065 aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT ? getDepthCopyFormat(m_params.imageFormat) :
1066 aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT ? getStencilCopyFormat(m_params.imageFormat) :
1068 const deUint32 pixelSize = getPixelSize(tcuFormat);
1069 deUint32 alignment = 4; // subsequent mip levels aligned to 4 bytes
1071 if (!getIsDepthFormat(m_params.imageFormat) && !getIsStencilFormat(m_params.imageFormat))
1072 alignment = lowestCommonMultiple(pixelSize, alignment); // alignment must be multiple of pixel size, if not D/S.
1074 const std::vector<deUint32> mipLevelSizes = getImageMipLevelSizes(pixelSize, m_params.imageExtent, m_imageMipLevels, alignment);
1075 const VkDeviceSize imageTotalSize = std::accumulate(mipLevelSizes.begin(), mipLevelSizes.end(), 0u);
1077 de::MovePtr<TextureLevelPyramid> result (new TextureLevelPyramid(tcuFormat, m_imageMipLevels));
1078 Move<VkBuffer> buffer;
1079 de::MovePtr<Allocation> bufferAlloc;
1081 // Create destination buffer
1083 const VkBufferCreateInfo bufferParams =
1085 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
1086 DE_NULL, // const void* pNext;
1087 0u, // VkBufferCreateFlags flags;
1088 imageTotalSize, // VkDeviceSize size;
1089 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
1090 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1091 0u, // deUint32 queueFamilyIndexCount;
1092 DE_NULL // const deUint32* pQueueFamilyIndices;
1095 buffer = createBuffer(m_vkd, m_device, &bufferParams);
1096 bufferAlloc = allocateBuffer(m_vki, m_vkd, m_context.getPhysicalDevice(), m_device, *buffer, MemoryRequirement::HostVisible, m_allocator, m_params.allocationKind);
1097 VK_CHECK(m_vkd.bindBufferMemory(m_device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
1100 // Barriers for copying image to buffer
1102 const VkBufferMemoryBarrier bufferBarrier =
1104 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
1105 DE_NULL, // const void* pNext;
1106 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1107 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
1108 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1109 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1110 *buffer, // VkBuffer buffer;
1111 0u, // VkDeviceSize offset;
1112 imageTotalSize, // VkDeviceSize size;
1115 // Copy image to buffer
1116 std::vector<VkBufferImageCopy> copyRegions;
1118 deUint32 offset = 0u;
1119 for (deUint32 mipLevel = 0; mipLevel < m_imageMipLevels; ++mipLevel)
1121 const VkExtent3D extent = getMipLevelExtent(m_params.imageExtent, mipLevel);
1122 const VkBufferImageCopy region =
1124 offset, // VkDeviceSize bufferOffset;
1125 0u, // deUint32 bufferRowLength;
1126 0u, // deUint32 bufferImageHeight;
1127 { aspectMask, mipLevel, arrayLayer, 1u }, // VkImageSubresourceLayers imageSubresource;
1128 { 0, 0, 0 }, // VkOffset3D imageOffset;
1129 extent // VkExtent3D imageExtent;
1131 copyRegions.push_back(region);
1132 offset += mipLevelSizes[mipLevel];
1136 beginCommandBuffer(0);
1138 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
1139 VK_PIPELINE_STAGE_TRANSFER_BIT,
1140 VK_ACCESS_TRANSFER_WRITE_BIT,
1141 VK_ACCESS_TRANSFER_READ_BIT,
1142 VK_IMAGE_LAYOUT_GENERAL,
1143 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1146 m_vkd.cmdCopyImageToBuffer(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, static_cast<deUint32>(copyRegions.size()), ©Regions[0]);
1147 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);
1149 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
1150 VK_PIPELINE_STAGE_TRANSFER_BIT,
1151 VK_ACCESS_TRANSFER_READ_BIT,
1152 VK_ACCESS_TRANSFER_READ_BIT,
1153 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1154 VK_IMAGE_LAYOUT_GENERAL,
1158 submitCommandBuffer();
1160 invalidateAlloc(m_vkd, m_device, *bufferAlloc);
1163 deUint32 offset = 0u;
1164 for (deUint32 mipLevel = 0; mipLevel < m_imageMipLevels; ++mipLevel)
1166 const VkExtent3D extent = getMipLevelExtent(m_params.imageExtent, mipLevel);
1167 const void* pLevelData = static_cast<const void*>(reinterpret_cast<deUint8*>(bufferAlloc->getHostPtr()) + offset);
1169 result->allocLevel(mipLevel, extent.width, extent.height, extent.depth);
1170 copy(result->getLevel(mipLevel), ConstPixelBufferAccess(result->getFormat(), result->getLevel(mipLevel).getSize(), pLevelData));
1172 offset += mipLevelSizes[mipLevel];
1179 tcu::TestStatus ImageClearingTestInstance::verifyResultImage (const std::string& successMessage, const UVec4& clearCoords) const
1181 DE_ASSERT((clearCoords == UVec4()) || m_params.imageExtent.depth == 1u);
1183 if (getIsDepthFormat(m_params.imageFormat) && m_params.separateDepthStencilLayoutMode != SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL)
1185 DE_ASSERT(m_imageMipLevels == 1u);
1187 for (deUint32 arrayLayer = 0; arrayLayer < m_params.imageLayerCount; ++arrayLayer)
1189 de::MovePtr<TextureLevelPyramid> image = readImage(VK_IMAGE_ASPECT_DEPTH_BIT, arrayLayer);
1190 std::string message;
1193 for (deUint32 y = 0; y < m_params.imageExtent.height; ++y)
1194 for (deUint32 x = 0; x < m_params.imageExtent.width; ++x)
1196 if (isInClearRange(clearCoords, x, y, arrayLayer, m_params.imageViewLayerRange, m_params.clearLayerRange))
1197 depthValue = m_params.clearValue[0].depthStencil.depth;
1199 if (isInInitialClearRange(0u /* mipLevel */, arrayLayer, m_params.imageViewLayerRange))
1201 depthValue = m_params.initValue.depthStencil.depth;
1206 if (!comparePixelToDepthClearValue(image->getLevel(0), x, y, depthValue, message))
1207 return TestStatus::fail("Depth value mismatch! " + message);
1212 if (getIsStencilFormat(m_params.imageFormat) && m_params.separateDepthStencilLayoutMode != SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
1214 DE_ASSERT(m_imageMipLevels == 1u);
1216 for (deUint32 arrayLayer = 0; arrayLayer < m_params.imageLayerCount; ++arrayLayer)
1218 de::MovePtr<TextureLevelPyramid> image = readImage(VK_IMAGE_ASPECT_STENCIL_BIT, arrayLayer);
1219 std::string message;
1220 deUint32 stencilValue;
1222 for (deUint32 y = 0; y < m_params.imageExtent.height; ++y)
1223 for (deUint32 x = 0; x < m_params.imageExtent.width; ++x)
1225 if (isInClearRange(clearCoords, x, y, arrayLayer, m_params.imageViewLayerRange, m_params.clearLayerRange))
1226 stencilValue = m_params.clearValue[0].depthStencil.stencil;
1228 if (isInInitialClearRange(0u /* mipLevel */, arrayLayer, m_params.imageViewLayerRange))
1230 stencilValue = m_params.initValue.depthStencil.stencil;
1235 if (!comparePixelToStencilClearValue(image->getLevel(0), x, y, stencilValue, message))
1236 return TestStatus::fail("Stencil value mismatch! " + message);
1241 if (!isDepthStencilFormat(m_params.imageFormat))
1243 for (deUint32 arrayLayer = 0; arrayLayer < m_params.imageLayerCount; ++arrayLayer)
1245 de::MovePtr<TextureLevelPyramid> image = readImage(VK_IMAGE_ASPECT_COLOR_BIT, arrayLayer);
1246 std::string message;
1247 const VkClearColorValue* pColorValue;
1249 for (deUint32 mipLevel = 0; mipLevel < m_imageMipLevels; ++mipLevel)
1251 const int clearColorNdx = ((mipLevel < m_thresholdMipLevel || m_params.isColorMultipleSubresourceRangeTest) ? 0 : 1);
1252 const VkExtent3D extent = getMipLevelExtent(m_params.imageExtent, mipLevel);
1253 const VkClearColorValue* pExpectedColorValue = &(m_params.useSeparateExpectedClearValue ? m_params.expectedClearValue : m_params.clearValue)[clearColorNdx].color;
1255 for (deUint32 z = 0; z < extent.depth; ++z)
1256 for (deUint32 y = 0; y < extent.height; ++y)
1257 for (deUint32 x = 0; x < extent.width; ++x)
1259 if (isInClearRange(clearCoords, x, y, arrayLayer, m_params.imageViewLayerRange, m_params.clearLayerRange))
1261 pColorValue = pExpectedColorValue;
1265 if (isInInitialClearRange(mipLevel, arrayLayer, m_params.imageViewLayerRange))
1267 pColorValue = &m_params.initValue.color;
1274 if (!comparePixelToColorClearValue(image->getLevel(mipLevel), x, y, z, *pColorValue, message))
1275 return TestStatus::fail("Color value mismatch! " + message);
1281 return TestStatus::pass(successMessage);
1284 Move<VkBuffer> ImageClearingTestInstance::createImageClearingBuffer(const DeviceInterface& vkd, const VkDevice device, Unique<VkImage>& image)
1286 Move<VkBuffer> stagingBuffer;
1287 de::MovePtr<Allocation> stagingBufferAlloc;
1288 const VkDeviceSize stagingBufferSize = getImageMemoryRequirements(vkd, device, *image).size;
1289 // Create image clearing buffer
1291 const VkBufferCreateInfo bufferParams =
1293 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
1294 DE_NULL, // const void* pNext;
1295 0u, // VkBufferCreateFlags flags;
1296 stagingBufferSize, // VkDeviceSize size;
1297 VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
1298 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1299 0u, // deUint32 queueFamilyIndexCount;
1300 DE_NULL // const deUint32* pQueueFamilyIndices;
1302 stagingBuffer = createBuffer(vkd, device, &bufferParams);
1304 return stagingBuffer;
1307 void ImageClearingTestInstance::preClearImage (const deUint32 imageMipLevels, VkExtent3D imageExtent, deUint32 imageLayerCount, Unique<VkCommandBuffer>& commandBuffer) const
1309 std::vector<VkBufferImageCopy> copyRegions;
1310 std::vector<VkImageAspectFlags> aspectMasks;
1312 if (getIsDepthFormat(m_params.imageFormat))
1313 aspectMasks.push_back(VK_IMAGE_ASPECT_DEPTH_BIT);
1314 if (getIsStencilFormat(m_params.imageFormat))
1315 aspectMasks.push_back(VK_IMAGE_ASPECT_STENCIL_BIT);
1316 if (aspectMasks.empty())
1317 aspectMasks.push_back(VK_IMAGE_ASPECT_COLOR_BIT);
1319 for (deUint32 mipLevel = 0; mipLevel < imageMipLevels; ++mipLevel)
1321 const VkExtent3D extent = getMipLevelExtent(imageExtent, mipLevel);
1322 for (auto mask : aspectMasks)
1324 const VkImageSubresourceLayers imageSubResource =
1326 mask, // VkImageAspectFlags aspectMask
1327 mipLevel, // uint32_t mipLevel
1328 0u, // uint32_t baseArrayLayer
1329 imageLayerCount // uint32_t layerCount
1331 const VkBufferImageCopy region =
1333 0u, // VkDeviceSize bufferOffset;
1334 0u, // deUint32 bufferRowLength;
1335 0u, // deUint32 bufferImageHeight;
1336 imageSubResource, // VkImageSubresourceLayers imageSubresource;
1337 {0, 0, 0}, // VkOffset3D imageOffset;
1338 extent // VkExtent3D imageExtent;
1340 copyRegions.push_back(region);
1344 m_vkd.cmdFillBuffer(*commandBuffer, *m_stagingBuffer, 0u, VK_WHOLE_SIZE, 0u);
1346 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1347 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1348 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1349 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1350 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1351 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1353 m_vkd.cmdCopyBufferToImage(*commandBuffer, *m_stagingBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, static_cast<deUint32>(copyRegions.size()), ©Regions[0]);
1356 void ImageClearingTestInstance::beginRenderPass (VkSubpassContents content, VkClearValue clearValue) const
1358 vk::beginRenderPass(m_vkd, *m_commandBuffer, *m_renderPass, *m_frameBuffer, makeRect2D(0, 0, m_params.imageExtent.width, m_params.imageExtent.height), clearValue, content);
1361 class ClearColorImageTestInstance : public ImageClearingTestInstance
1364 ClearColorImageTestInstance (Context& context, const TestParams& testParams, bool twoStep = false) : ImageClearingTestInstance (context, testParams), m_twoStep(twoStep) {}
1365 virtual TestStatus iterate (void);
1370 class TwoStepClearColorImageTestInstance : public ClearColorImageTestInstance
1373 TwoStepClearColorImageTestInstance (Context& context, const TestParams& testParams) : ClearColorImageTestInstance(context, testParams, true) {}
1376 class ClearColorImageMultipleSubresourceRangeTestInstance : public ClearColorImageTestInstance
1379 ClearColorImageMultipleSubresourceRangeTestInstance (Context& context, const TestParams& testParams) : ClearColorImageTestInstance(context, testParams, false) {}
1380 virtual TestStatus iterate (void);
1383 TestStatus ClearColorImageMultipleSubresourceRangeTestInstance::iterate(void)
1385 std::vector<VkImageSubresourceRange> subresourceRanges;
1387 DE_ASSERT(m_imageMipLevels > 1u);
1389 deUint32 mipLevel = 0u;
1390 // Create a subresource range per mipmap level.
1392 subresourceRanges.push_back(makeImageSubresourceRange(m_imageAspectFlags, mipLevel++, 1u, m_params.clearLayerRange.baseArrayLayer, m_params.clearLayerRange.layerCount));
1393 } while (mipLevel < m_imageMipLevels);
1395 beginCommandBuffer(0);
1397 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1398 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1399 0, // VkAccessFlags srcAccessMask
1400 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1401 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1402 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1404 preClearImage(m_imageMipLevels, m_params.imageExtent, m_params.imageLayerCount, m_commandBuffer);
1406 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1407 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1408 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1409 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1410 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1411 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1413 // Test clear color in all ranges
1414 m_vkd.cmdClearColorImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[0].color, static_cast<deUint32>(subresourceRanges.size()), subresourceRanges.data());
1416 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1417 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1418 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1419 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1420 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1421 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
1424 submitCommandBuffer();
1426 return verifyResultImage("cmdClearColorImage passed");
1429 TestStatus ClearColorImageTestInstance::iterate (void)
1431 std::vector<VkImageSubresourceRange> subresourceRanges;
1432 std::vector<VkImageSubresourceRange> steptwoRanges;
1434 if (m_imageMipLevels == 1)
1436 subresourceRanges.push_back(makeImageSubresourceRange(m_imageAspectFlags, 0u, 1u, m_params.clearLayerRange.baseArrayLayer, m_twoStep ? 1 : m_params.clearLayerRange.layerCount));
1437 steptwoRanges.push_back( makeImageSubresourceRange(m_imageAspectFlags, 0u, VK_REMAINING_MIP_LEVELS, m_params.clearLayerRange.baseArrayLayer, VK_REMAINING_ARRAY_LAYERS));
1441 subresourceRanges.push_back(makeImageSubresourceRange(m_imageAspectFlags, 0u, m_thresholdMipLevel, m_params.clearLayerRange.baseArrayLayer, m_params.clearLayerRange.layerCount));
1442 subresourceRanges.push_back(makeImageSubresourceRange(m_imageAspectFlags, m_thresholdMipLevel, VK_REMAINING_MIP_LEVELS, m_params.clearLayerRange.baseArrayLayer, m_params.clearLayerRange.layerCount));
1443 steptwoRanges.push_back( makeImageSubresourceRange(m_imageAspectFlags, 0u, m_thresholdMipLevel, m_params.clearLayerRange.baseArrayLayer, VK_REMAINING_ARRAY_LAYERS));
1444 steptwoRanges.push_back( makeImageSubresourceRange(m_imageAspectFlags, m_thresholdMipLevel, VK_REMAINING_MIP_LEVELS, m_params.clearLayerRange.baseArrayLayer, VK_REMAINING_ARRAY_LAYERS));
1447 beginCommandBuffer(0);
1449 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1450 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1451 0, // VkAccessFlags srcAccessMask
1452 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1453 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1454 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1456 preClearImage(m_imageMipLevels, m_params.imageExtent, m_params.imageLayerCount, m_commandBuffer);
1458 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1459 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1460 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1461 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1462 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1463 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1465 // Different clear color per range
1466 for (std::size_t i = 0u; i < subresourceRanges.size(); ++i)
1468 m_vkd.cmdClearColorImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[i].color, 1, &subresourceRanges[i]);
1472 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1473 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1474 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1475 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1476 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1477 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1479 m_vkd.cmdClearColorImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[i].color, 1, &steptwoRanges[i]);
1483 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1484 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1485 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1486 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1487 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1488 VK_IMAGE_LAYOUT_GENERAL); // VkImageLayout newLayout;
1491 submitCommandBuffer();
1493 return verifyResultImage("cmdClearColorImage passed");
1496 class ClearDepthStencilImageTestInstance : public ImageClearingTestInstance
1499 ClearDepthStencilImageTestInstance (Context& context, const TestParams& testParams, bool twoStep = false) : ImageClearingTestInstance (context, testParams), m_twoStep(twoStep) {}
1500 virtual TestStatus iterate (void);
1505 class TwoStepClearDepthStencilImageTestInstance : public ClearDepthStencilImageTestInstance
1508 TwoStepClearDepthStencilImageTestInstance (Context& context, const TestParams& testParams) : ClearDepthStencilImageTestInstance (context, testParams, true) { }
1511 class ClearDepthStencilImageMultipleSubresourceRangeTestInstance : public ClearDepthStencilImageTestInstance
1514 ClearDepthStencilImageMultipleSubresourceRangeTestInstance (Context& context, const TestParams& testParams) : ClearDepthStencilImageTestInstance(context, testParams, false) { }
1515 virtual TestStatus iterate (void);
1518 TestStatus ClearDepthStencilImageMultipleSubresourceRangeTestInstance::iterate (void)
1520 VkImageAspectFlags aspectMask = m_imageAspectFlags;
1522 // Depth/Stencil formats only. No separate layout modes.
1523 DE_ASSERT(m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE);
1525 std::vector<VkImageSubresourceRange> subresourceRanges;
1527 subresourceRanges.push_back(makeImageSubresourceRange(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, m_params.clearLayerRange.baseArrayLayer, m_params.clearLayerRange.layerCount));
1528 subresourceRanges.push_back(makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, m_params.clearLayerRange.baseArrayLayer, m_params.clearLayerRange.layerCount));
1530 beginCommandBuffer(0);
1532 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1533 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1534 0, // VkAccessFlags srcAccessMask
1535 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1536 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1537 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1539 preClearImage(m_imageMipLevels, m_params.imageExtent, m_params.imageLayerCount, m_commandBuffer);
1541 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1542 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1543 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1544 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1545 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1546 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1548 m_vkd.cmdClearDepthStencilImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[0].depthStencil, static_cast<deUint32>(subresourceRanges.size()), subresourceRanges.data());
1550 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1551 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1552 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1553 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1554 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1555 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout;
1556 aspectMask); // VkImageAspectFlags aspectMask;
1559 submitCommandBuffer();
1561 return verifyResultImage("cmdClearDepthStencilImage passed");
1564 TestStatus ClearDepthStencilImageTestInstance::iterate (void)
1566 VkImageAspectFlags aspectMask = m_imageAspectFlags;
1567 if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
1569 aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1571 else if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL)
1573 aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1576 const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(aspectMask, 0u, 1u, m_params.clearLayerRange.baseArrayLayer, m_twoStep ? 1 : m_params.clearLayerRange.layerCount);
1577 const VkImageSubresourceRange steptwoRange = makeImageSubresourceRange(aspectMask, 0u, VK_REMAINING_MIP_LEVELS, m_params.clearLayerRange.baseArrayLayer, VK_REMAINING_ARRAY_LAYERS);
1579 beginCommandBuffer(0);
1581 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1582 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1583 0, // VkAccessFlags srcAccessMask
1584 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1585 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1586 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1588 preClearImage(m_imageMipLevels, m_params.imageExtent, m_params.imageLayerCount, m_commandBuffer);
1590 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1591 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1592 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1593 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1594 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1595 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1597 m_vkd.cmdClearDepthStencilImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[0].depthStencil, 1, &subresourceRange);
1600 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1601 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1602 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1603 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
1604 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1605 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
1607 m_vkd.cmdClearDepthStencilImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[0].depthStencil, 1, &steptwoRange);
1610 pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
1611 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1612 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
1613 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1614 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1615 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout;
1616 aspectMask); // VkImageAspectFlags aspectMask;
1619 submitCommandBuffer();
1621 return verifyResultImage("cmdClearDepthStencilImage passed");
1624 class ClearAttachmentTestInstance : public ImageClearingTestInstance
1633 ClearAttachmentTestInstance (Context& context, const TestParams& testParams, const ClearType clearType = FULL_CLEAR)
1634 : ImageClearingTestInstance (context, testParams)
1635 , m_clearType (clearType)
1637 if (!m_isAttachmentFormat)
1638 TCU_THROW(NotSupportedError, "Format not renderable");
1641 TestStatus iterate (void)
1643 const bool isDepthStencil = isDepthStencilFormat(m_params.imageFormat);
1644 const VkAccessFlags accessMask = (isDepthStencil ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
1645 VkImageLayout attachmentLayout = (isDepthStencil ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
1646 VkImageAspectFlags aspectMask = m_imageAspectFlags;
1648 if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH)
1650 attachmentLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR;
1651 aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1653 else if (m_params.separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL)
1655 attachmentLayout = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR;
1656 aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1659 const VkClearAttachment clearAttachment =
1661 aspectMask, // VkImageAspectFlags aspectMask;
1662 0u, // deUint32 colorAttachment;
1663 m_params.clearValue[0] // VkClearValue clearValue;
1667 std::vector<VkClearRect> clearRects;
1669 if (m_clearType == FULL_CLEAR)
1671 const VkClearRect rect =
1674 { 0, 0 }, // VkOffset2D offset;
1675 { m_params.imageExtent.width, m_params.imageExtent.height } // VkExtent2D extent;
1676 }, // VkRect2D rect;
1677 m_params.clearLayerRange.baseArrayLayer, // deUint32 baseArrayLayer;
1678 m_params.clearLayerRange.layerCount, // deUint32 layerCount;
1681 clearRects.push_back(rect);
1685 const deUint32 clearX = m_params.imageExtent.width / 8u;
1686 const deUint32 clearY = m_params.imageExtent.height / 8u;
1687 const deUint32 clearWidth = m_params.imageExtent.width / 2u;
1688 const deUint32 clearHeight = m_params.imageExtent.height / 2u;
1690 clearCoords = UVec4(clearX, clearY,
1691 clearX + clearWidth, clearY + clearHeight);
1693 const VkClearRect rects[2] =
1697 { 0, static_cast<deInt32>(clearY) }, // VkOffset2D offset;
1698 { m_params.imageExtent.width, clearHeight } // VkExtent2D extent;
1699 }, // VkRect2D rect;
1700 m_params.clearLayerRange.baseArrayLayer, // deUint32 baseArrayLayer;
1701 m_params.clearLayerRange.layerCount // deUint32 layerCount;
1705 { static_cast<deInt32>(clearX), 0 }, // VkOffset2D offset;
1706 { clearWidth, m_params.imageExtent.height } // VkExtent2D extent;
1707 }, // VkRect2D rect;
1708 m_params.clearLayerRange.baseArrayLayer, // deUint32 baseArrayLayer;
1709 m_params.clearLayerRange.layerCount // deUint32 layerCount;
1713 clearRects.push_back(rects[0]);
1714 clearRects.push_back(rects[1]);
1717 beginCommandBuffer(0);
1719 pipelineImageBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
1720 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // VkPipelineStageFlags dstStageMask
1721 0, // VkAccessFlags srcAccessMask
1722 accessMask, // VkAccessFlags dstAccessMask
1723 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1724 attachmentLayout, // VkImageLayout newLayout;
1725 aspectMask); // VkImageAspectFlags aspectMask;
1727 beginRenderPass(VK_SUBPASS_CONTENTS_INLINE, m_params.initValue);
1728 m_vkd.cmdClearAttachments(*m_commandBuffer, 1, &clearAttachment, static_cast<deUint32>(clearRects.size()), &clearRects[0]);
1729 endRenderPass(m_vkd, *m_commandBuffer);
1731 pipelineImageBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // VkPipelineStageFlags srcStageMask
1732 VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
1733 accessMask, // VkAccessFlags srcAccessMask
1734 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
1735 attachmentLayout, // VkImageLayout oldLayout;
1736 VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout;
1737 aspectMask); // VkImageAspectFlags aspectMask;
1740 submitCommandBuffer();
1742 return verifyResultImage("cmdClearAttachments passed", clearCoords);
1746 const ClearType m_clearType;
1749 class PartialClearAttachmentTestInstance : public ClearAttachmentTestInstance
1752 PartialClearAttachmentTestInstance (Context& context, const TestParams& testParams) : ClearAttachmentTestInstance (context, testParams, PARTIAL_CLEAR) {}
1755 VkClearValue makeClearColorValue (VkFormat format, float r, float g, float b, float a)
1757 const TextureFormat tcuFormat = mapVkFormat(format);
1758 VkClearValue clearValue;
1760 if (getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_FLOATING_POINT
1761 || getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_SIGNED_FIXED_POINT
1762 || getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT)
1764 clearValue.color.float32[0] = r;
1765 clearValue.color.float32[1] = g;
1766 clearValue.color.float32[2] = b;
1767 clearValue.color.float32[3] = a;
1769 else if (getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
1771 UVec4 maxValues = getFormatMaxUintValue(tcuFormat);
1773 clearValue.color.uint32[0] = (deUint32)((float)maxValues[0] * r);
1774 clearValue.color.uint32[1] = (deUint32)((float)maxValues[1] * g);
1775 clearValue.color.uint32[2] = (deUint32)((float)maxValues[2] * b);
1776 clearValue.color.uint32[3] = (deUint32)((float)maxValues[3] * a);
1778 else if (getTextureChannelClass(tcuFormat.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER)
1780 IVec4 maxValues = getFormatMaxIntValue(tcuFormat);
1782 clearValue.color.int32[0] = (deUint32)((float)maxValues[0] * r);
1783 clearValue.color.int32[1] = (deUint32)((float)maxValues[1] * g);
1784 clearValue.color.int32[2] = (deUint32)((float)maxValues[2] * b);
1785 clearValue.color.int32[3] = (deUint32)((float)maxValues[3] * a);
1788 DE_FATAL("Unknown channel class");
1793 std::string getFormatCaseName (VkFormat format)
1795 return de::toLower(de::toString(getFormatStr(format)).substr(10));
1798 const char* getImageTypeCaseName (VkImageType type)
1800 const char* s_names[] =
1806 return de::getSizedArrayElement<VK_CORE_IMAGE_TYPE_LAST>(s_names, type);
1809 const char* getImageTilingCaseName (VkImageTiling tiling)
1811 const char* s_names[] =
1816 return de::getSizedArrayElement<VK_CORE_IMAGE_TILING_LAST>(s_names, tiling);
1819 TestCaseGroup* createImageClearingTestsCommon (TestContext& testCtx, tcu::TestCaseGroup* imageClearingTests, AllocationKind allocationKind)
1821 de::MovePtr<TestCaseGroup> colorImageClearTests (new TestCaseGroup(testCtx, "clear_color_image", "Color Image Clear Tests"));
1822 de::MovePtr<TestCaseGroup> depthStencilImageClearTests (new TestCaseGroup(testCtx, "clear_depth_stencil_image", "Color Depth/Stencil Image Tests"));
1823 de::MovePtr<TestCaseGroup> colorAttachmentClearTests (new TestCaseGroup(testCtx, "clear_color_attachment", "Color Color Attachment Tests"));
1824 de::MovePtr<TestCaseGroup> depthStencilAttachmentClearTests (new TestCaseGroup(testCtx, "clear_depth_stencil_attachment", "Color Depth/Stencil Attachment Tests"));
1825 de::MovePtr<TestCaseGroup> partialColorAttachmentClearTests (new TestCaseGroup(testCtx, "partial_clear_color_attachment", "Clear Partial Color Attachment Tests"));
1826 de::MovePtr<TestCaseGroup> partialDepthStencilAttachmentClearTests (new TestCaseGroup(testCtx, "partial_clear_depth_stencil_attachment", "Clear Partial Depth/Stencil Attachment Tests"));
1828 // Some formats are commented out due to the tcu::TextureFormat does not support them yet.
1829 const VkFormat colorImageFormatsToTest[] =
1831 VK_FORMAT_R4G4_UNORM_PACK8,
1832 VK_FORMAT_R4G4B4A4_UNORM_PACK16,
1833 VK_FORMAT_B4G4R4A4_UNORM_PACK16,
1834 VK_FORMAT_R5G6B5_UNORM_PACK16,
1835 VK_FORMAT_B5G6R5_UNORM_PACK16,
1836 VK_FORMAT_R5G5B5A1_UNORM_PACK16,
1837 VK_FORMAT_B5G5R5A1_UNORM_PACK16,
1838 VK_FORMAT_A1R5G5B5_UNORM_PACK16,
1841 VK_FORMAT_R8_USCALED,
1842 VK_FORMAT_R8_SSCALED,
1846 VK_FORMAT_R8G8_UNORM,
1847 VK_FORMAT_R8G8_SNORM,
1848 VK_FORMAT_R8G8_USCALED,
1849 VK_FORMAT_R8G8_SSCALED,
1850 VK_FORMAT_R8G8_UINT,
1851 VK_FORMAT_R8G8_SINT,
1852 VK_FORMAT_R8G8_SRGB,
1853 VK_FORMAT_R8G8B8_UNORM,
1854 VK_FORMAT_R8G8B8_SNORM,
1855 VK_FORMAT_R8G8B8_USCALED,
1856 VK_FORMAT_R8G8B8_SSCALED,
1857 VK_FORMAT_R8G8B8_UINT,
1858 VK_FORMAT_R8G8B8_SINT,
1859 VK_FORMAT_R8G8B8_SRGB,
1860 VK_FORMAT_B8G8R8_UNORM,
1861 VK_FORMAT_B8G8R8_SNORM,
1862 VK_FORMAT_B8G8R8_USCALED,
1863 VK_FORMAT_B8G8R8_SSCALED,
1864 VK_FORMAT_B8G8R8_UINT,
1865 VK_FORMAT_B8G8R8_SINT,
1866 VK_FORMAT_B8G8R8_SRGB,
1867 VK_FORMAT_R8G8B8A8_UNORM,
1868 VK_FORMAT_R8G8B8A8_SNORM,
1869 VK_FORMAT_R8G8B8A8_USCALED,
1870 VK_FORMAT_R8G8B8A8_SSCALED,
1871 VK_FORMAT_R8G8B8A8_UINT,
1872 VK_FORMAT_R8G8B8A8_SINT,
1873 VK_FORMAT_R8G8B8A8_SRGB,
1874 VK_FORMAT_B8G8R8A8_UNORM,
1875 VK_FORMAT_B8G8R8A8_SNORM,
1876 VK_FORMAT_B8G8R8A8_USCALED,
1877 VK_FORMAT_B8G8R8A8_SSCALED,
1878 VK_FORMAT_B8G8R8A8_UINT,
1879 VK_FORMAT_B8G8R8A8_SINT,
1880 VK_FORMAT_B8G8R8A8_SRGB,
1881 VK_FORMAT_A8B8G8R8_UNORM_PACK32,
1882 VK_FORMAT_A8B8G8R8_SNORM_PACK32,
1883 VK_FORMAT_A8B8G8R8_USCALED_PACK32,
1884 VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
1885 VK_FORMAT_A8B8G8R8_UINT_PACK32,
1886 VK_FORMAT_A8B8G8R8_SINT_PACK32,
1887 VK_FORMAT_A8B8G8R8_SRGB_PACK32,
1888 VK_FORMAT_A2R10G10B10_UNORM_PACK32,
1889 VK_FORMAT_A2R10G10B10_SNORM_PACK32,
1890 VK_FORMAT_A2R10G10B10_USCALED_PACK32,
1891 VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
1892 VK_FORMAT_A2R10G10B10_UINT_PACK32,
1893 VK_FORMAT_A2R10G10B10_SINT_PACK32,
1894 VK_FORMAT_A2B10G10R10_UNORM_PACK32,
1895 VK_FORMAT_A2B10G10R10_SNORM_PACK32,
1896 VK_FORMAT_A2B10G10R10_USCALED_PACK32,
1897 VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
1898 VK_FORMAT_A2B10G10R10_UINT_PACK32,
1899 VK_FORMAT_A2B10G10R10_SINT_PACK32,
1900 VK_FORMAT_R16_UNORM,
1901 VK_FORMAT_R16_SNORM,
1902 VK_FORMAT_R16_USCALED,
1903 VK_FORMAT_R16_SSCALED,
1906 VK_FORMAT_R16_SFLOAT,
1907 VK_FORMAT_R16G16_UNORM,
1908 VK_FORMAT_R16G16_SNORM,
1909 VK_FORMAT_R16G16_USCALED,
1910 VK_FORMAT_R16G16_SSCALED,
1911 VK_FORMAT_R16G16_UINT,
1912 VK_FORMAT_R16G16_SINT,
1913 VK_FORMAT_R16G16_SFLOAT,
1914 VK_FORMAT_R16G16B16_UNORM,
1915 VK_FORMAT_R16G16B16_SNORM,
1916 VK_FORMAT_R16G16B16_USCALED,
1917 VK_FORMAT_R16G16B16_SSCALED,
1918 VK_FORMAT_R16G16B16_UINT,
1919 VK_FORMAT_R16G16B16_SINT,
1920 VK_FORMAT_R16G16B16_SFLOAT,
1921 VK_FORMAT_R16G16B16A16_UNORM,
1922 VK_FORMAT_R16G16B16A16_SNORM,
1923 VK_FORMAT_R16G16B16A16_USCALED,
1924 VK_FORMAT_R16G16B16A16_SSCALED,
1925 VK_FORMAT_R16G16B16A16_UINT,
1926 VK_FORMAT_R16G16B16A16_SINT,
1927 VK_FORMAT_R16G16B16A16_SFLOAT,
1930 VK_FORMAT_R32_SFLOAT,
1931 VK_FORMAT_R32G32_UINT,
1932 VK_FORMAT_R32G32_SINT,
1933 VK_FORMAT_R32G32_SFLOAT,
1934 VK_FORMAT_R32G32B32_UINT,
1935 VK_FORMAT_R32G32B32_SINT,
1936 VK_FORMAT_R32G32B32_SFLOAT,
1937 VK_FORMAT_R32G32B32A32_UINT,
1938 VK_FORMAT_R32G32B32A32_SINT,
1939 VK_FORMAT_R32G32B32A32_SFLOAT,
1940 // VK_FORMAT_R64_UINT,
1941 // VK_FORMAT_R64_SINT,
1942 // VK_FORMAT_R64_SFLOAT,
1943 // VK_FORMAT_R64G64_UINT,
1944 // VK_FORMAT_R64G64_SINT,
1945 // VK_FORMAT_R64G64_SFLOAT,
1946 // VK_FORMAT_R64G64B64_UINT,
1947 // VK_FORMAT_R64G64B64_SINT,
1948 // VK_FORMAT_R64G64B64_SFLOAT,
1949 // VK_FORMAT_R64G64B64A64_UINT,
1950 // VK_FORMAT_R64G64B64A64_SINT,
1951 // VK_FORMAT_R64G64B64A64_SFLOAT,
1952 VK_FORMAT_B10G11R11_UFLOAT_PACK32,
1953 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
1954 // VK_FORMAT_BC1_RGB_UNORM_BLOCK,
1955 // VK_FORMAT_BC1_RGB_SRGB_BLOCK,
1956 // VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
1957 // VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
1958 // VK_FORMAT_BC2_UNORM_BLOCK,
1959 // VK_FORMAT_BC2_SRGB_BLOCK,
1960 // VK_FORMAT_BC3_UNORM_BLOCK,
1961 // VK_FORMAT_BC3_SRGB_BLOCK,
1962 // VK_FORMAT_BC4_UNORM_BLOCK,
1963 // VK_FORMAT_BC4_SNORM_BLOCK,
1964 // VK_FORMAT_BC5_UNORM_BLOCK,
1965 // VK_FORMAT_BC5_SNORM_BLOCK,
1966 // VK_FORMAT_BC6H_UFLOAT_BLOCK,
1967 // VK_FORMAT_BC6H_SFLOAT_BLOCK,
1968 // VK_FORMAT_BC7_UNORM_BLOCK,
1969 // VK_FORMAT_BC7_SRGB_BLOCK,
1970 // VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
1971 // VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
1972 // VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
1973 // VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
1974 // VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
1975 // VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
1976 // VK_FORMAT_EAC_R11_UNORM_BLOCK,
1977 // VK_FORMAT_EAC_R11_SNORM_BLOCK,
1978 // VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
1979 // VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
1980 // VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
1981 // VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
1982 // VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
1983 // VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
1984 // VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
1985 // VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
1986 // VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
1987 // VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
1988 // VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
1989 // VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
1990 // VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
1991 // VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
1992 // VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
1993 // VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
1994 // VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
1995 // VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
1996 // VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
1997 // VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
1998 // VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
1999 // VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
2000 // VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
2001 // VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
2002 // VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
2003 // VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
2004 // VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
2005 // VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
2006 // VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
2007 // VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
2009 VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,
2010 VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,
2012 const size_t numOfColorImageFormatsToTest = DE_LENGTH_OF_ARRAY(colorImageFormatsToTest);
2014 const VkFormat depthStencilImageFormatsToTest[] =
2016 VK_FORMAT_D16_UNORM,
2017 VK_FORMAT_X8_D24_UNORM_PACK32,
2018 VK_FORMAT_D32_SFLOAT,
2020 VK_FORMAT_D16_UNORM_S8_UINT,
2021 VK_FORMAT_D24_UNORM_S8_UINT,
2022 VK_FORMAT_D32_SFLOAT_S8_UINT
2024 const size_t numOfDepthStencilImageFormatsToTest = DE_LENGTH_OF_ARRAY(depthStencilImageFormatsToTest);
2026 struct ClearTestColorParams
2028 bool matchTextureChannelClass;
2029 TextureChannelClass textureChannelClass;
2030 const char* testNameSuffix;
2031 float clearColors[2][4];
2032 bool useSeparateExpectedColors;
2033 float expectedColors[2][4];
2035 const ClearTestColorParams clearColorsToTest[] =
2038 false, // matchTextureChannelClass
2039 TEXTURECHANNELCLASS_LAST, // textureChannelClass
2040 "", // testNameSuffix
2042 { 0.1f, 0.5f, 0.3f, 0.9f }, // clearColors[0]
2043 { 0.3f, 0.6f, 0.2f, 0.7f }, // clearColors[1]
2045 false, // useSeparateExpectedColors
2046 { } // expectedColors
2049 true, // matchTextureChannelClass
2050 TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT, // textureChannelClass
2051 "_clamp_input", // testNameSuffix
2053 { -0.1f, -1e6f, -0.3f, -1.5f }, // clearColors[0]
2054 { -1.5f, -0.6f, -1e6f, -0.7f }, // clearColors[1]
2056 true, // useSeparateExpectedColors
2058 { 0.0f, 0.0f, 0.0f, 0.0f }, // expectedColors[0]
2059 { 0.0f, 0.0f, 0.0f, 0.0f }, // expectedColors[1]
2063 const size_t numOfClearColorsToTest = DE_LENGTH_OF_ARRAY(clearColorsToTest);
2065 struct ImageLayerParams
2067 deUint32 imageLayerCount;
2068 LayerRange imageViewRange;
2069 LayerRange clearLayerRange;
2071 const char* testName;
2074 const ImageLayerParams imageLayerParamsToTest[] =
2077 1u, // imageLayerCount
2078 {0u, 1u}, // imageViewRange
2079 {0u, 1u}, // clearLayerRange
2081 "single_layer", // testName
2085 16u, // imageLayerCount
2086 {3u, 12u}, // imageViewRange
2087 {2u, 5u}, // clearLayerRange
2089 "multiple_layers", // testName
2093 15u, // imageLayerCount
2094 { 3u, 6u }, // imageViewRange
2095 { 2u, 1u }, // clearLayerRange
2097 "cube_layers", // testName
2101 16u, // imageLayerCount
2102 { 3u, 12u }, // imageViewRange
2103 { 8u, VK_REMAINING_ARRAY_LAYERS }, // clearLayerRange
2105 "remaining_array_layers", // testName
2109 16u, // imageLayerCount
2110 { 3u, 12u }, // imageViewRange
2111 { 8u, VK_REMAINING_ARRAY_LAYERS }, // clearLayerRange
2113 "remaining_array_layers_twostep", // testName
2118 // Include test cases with VK_REMAINING_ARRAY_LAYERS when using vkCmdClearColorImage
2119 const size_t numOfImageLayerParamsToTest = DE_LENGTH_OF_ARRAY(imageLayerParamsToTest);
2121 // Exclude test cases with VK_REMAINING_ARRAY_LAYERS when using vkCmdClearAttachments
2122 const size_t numOfAttachmentLayerParamsToTest = numOfImageLayerParamsToTest - 2;
2124 const VkExtent3D imageDimensions[] =
2140 // Clear color image
2142 const VkImageType imageTypesToTest[] =
2148 const size_t numOfImageTypesToTest = DE_LENGTH_OF_ARRAY(imageTypesToTest);
2150 const VkImageTiling imageTilingsToTest[] =
2152 VK_IMAGE_TILING_OPTIMAL,
2153 VK_IMAGE_TILING_LINEAR,
2155 const size_t numOfImageTilingsToTest = DE_LENGTH_OF_ARRAY(imageTilingsToTest);
2157 for (size_t imageTypeIndex = 0; imageTypeIndex < numOfImageTypesToTest; ++imageTypeIndex)
2159 de::MovePtr<TestCaseGroup> imageTypeGroup(new TestCaseGroup(testCtx, getImageTypeCaseName(imageTypesToTest[imageTypeIndex]), ""));
2161 for (size_t imageTilingIndex = 0; imageTilingIndex < numOfImageTilingsToTest; ++imageTilingIndex)
2163 de::MovePtr<TestCaseGroup> imageTilingGroup(new TestCaseGroup(testCtx, getImageTilingCaseName(imageTilingsToTest[imageTilingIndex]), ""));
2165 for (size_t imageLayerParamsIndex = 0; imageLayerParamsIndex < numOfImageLayerParamsToTest; ++imageLayerParamsIndex)
2167 // 3D ARRAY images are not supported
2168 if (imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount > 1u && imageTypesToTest[imageTypeIndex] == VK_IMAGE_TYPE_3D)
2171 // CUBE images are not tested in clear image tests (they are tested in clear attachment tests)
2172 if (imageLayerParamsToTest[imageLayerParamsIndex].isCube)
2175 de::MovePtr<TestCaseGroup> imageLayersGroup(new TestCaseGroup(testCtx, imageLayerParamsToTest[imageLayerParamsIndex].testName, ""));
2177 for (size_t imageDimensionsIndex = 0; imageDimensionsIndex < DE_LENGTH_OF_ARRAY(imageDimensions); ++imageDimensionsIndex)
2179 const VkExtent3D dimensions = imageDimensions[imageDimensionsIndex];
2180 const std::string dimensionsString = extentToString(dimensions, imageTypesToTest[imageTypeIndex]);
2182 if (imageTypesToTest[imageTypeIndex] == VK_IMAGE_TYPE_1D && dimensions.height > 1)
2184 if (imageTypesToTest[imageTypeIndex] == VK_IMAGE_TYPE_2D && (dimensions.depth > 1 || dimensions.height == 1))
2186 if (imageTypesToTest[imageTypeIndex] == VK_IMAGE_TYPE_3D && dimensions.depth == 1)
2189 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfColorImageFormatsToTest; ++imageFormatIndex)
2191 const VkFormat format = colorImageFormatsToTest[imageFormatIndex];
2192 const TextureFormat tcuFormat = mapVkFormat(format);
2193 const TextureChannelClass channelClass = getTextureChannelClass(tcuFormat.type);
2194 for (size_t clearColorIndex = 0; clearColorIndex < numOfClearColorsToTest; ++clearColorIndex)
2196 const ClearTestColorParams& colorParams = clearColorsToTest[clearColorIndex];
2198 if (colorParams.matchTextureChannelClass && channelClass != colorParams.textureChannelClass)
2201 VkClearValue clearColors[2] =
2203 makeClearColorValue(format, colorParams.clearColors[0][0], colorParams.clearColors[0][1], colorParams.clearColors[0][2], colorParams.clearColors[0][3]),
2204 makeClearColorValue(format, colorParams.clearColors[1][0], colorParams.clearColors[1][1], colorParams.clearColors[1][2], colorParams.clearColors[1][3]),
2206 VkClearValue expectedColors[2];
2207 if (clearColorsToTest[clearColorIndex].useSeparateExpectedColors)
2209 expectedColors[0] = makeClearColorValue(format, colorParams.expectedColors[0][0], colorParams.expectedColors[0][1], colorParams.expectedColors[0][2], colorParams.expectedColors[0][3]);
2210 expectedColors[1] = makeClearColorValue(format, colorParams.expectedColors[1][0], colorParams.expectedColors[1][1], colorParams.expectedColors[1][2], colorParams.expectedColors[1][3]);
2214 expectedColors[0] = clearColors[0];
2215 expectedColors[1] = clearColors[1];
2218 std::string testCaseName = getFormatCaseName(format) + dimensionsString + colorParams.testNameSuffix;
2219 TestParams testParams =
2221 false, // bool useSingleMipLevel;
2222 imageTypesToTest[imageTypeIndex], // VkImageType imageType;
2223 format, // VkFormat imageFormat;
2224 imageTilingsToTest[imageTilingIndex], // VkImageTiling imageTiling;
2225 dimensions, // VkExtent3D imageExtent;
2226 imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
2229 imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount
2230 }, // LayerRange imageViewLayerRange;
2231 makeClearColorValue(format, 0.0f, 0.0f, 0.0f, 0.0f), // VkClearValue initValue;
2233 clearColors[0], // VkClearValue clearValue[0];
2234 clearColors[1], // VkClearValue clearValue[1];
2236 clearColorsToTest[clearColorIndex].useSeparateExpectedColors, // bool useSeparateExpectedClearValue;
2238 expectedColors[0], // VkClearValue expectedClearValue[0];
2239 expectedColors[1], // VkClearValue expectedClearValue[1];
2241 imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
2242 allocationKind, // AllocationKind allocationKind;
2243 false, // bool isCube;
2244 SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE, // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
2245 false, // bool isColorMultipleSubresourceRangeTest;
2248 if (!imageLayerParamsToTest[imageLayerParamsIndex].twoStep)
2250 imageLayersGroup->addChild(new InstanceFactory1<ClearColorImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Color Image", testParams));
2252 // Removing linear images as the miplevels may be 1
2253 if (imageTilingsToTest[imageTilingIndex] == VK_IMAGE_TILING_OPTIMAL)
2255 testParams.isColorMultipleSubresourceRangeTest = true;
2256 testCaseName += "_multiple_subresourcerange";
2257 imageLayersGroup->addChild(new InstanceFactory1<ClearColorImageMultipleSubresourceRangeTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Color Image with two ranges", testParams));
2262 imageLayersGroup->addChild(new InstanceFactory1<TwoStepClearColorImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Color Image", testParams));
2267 imageTilingGroup->addChild(imageLayersGroup.release());
2269 imageTypeGroup->addChild(imageTilingGroup.release());
2271 colorImageClearTests->addChild(imageTypeGroup.release());
2273 imageClearingTests->addChild(colorImageClearTests.release());
2276 // Clear depth/stencil image
2278 for (size_t imageLayerParamsIndex = 0; imageLayerParamsIndex < numOfImageLayerParamsToTest; ++imageLayerParamsIndex)
2280 // CUBE images are not tested in clear image tests (they are tested in clear attachment tests)
2281 if (imageLayerParamsToTest[imageLayerParamsIndex].isCube)
2284 de::MovePtr<TestCaseGroup> imageLayersGroup(new TestCaseGroup(testCtx, imageLayerParamsToTest[imageLayerParamsIndex].testName, ""));
2286 for (size_t imageDimensionsIndex = 0; imageDimensionsIndex < DE_LENGTH_OF_ARRAY(imageDimensions); ++imageDimensionsIndex)
2288 const VkExtent3D dimensions = imageDimensions[imageDimensionsIndex];
2289 const std::string dimensionsString = extentToString(dimensions, VK_IMAGE_TYPE_2D);
2291 if (dimensions.height == 1 || dimensions.depth > 1)
2294 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfDepthStencilImageFormatsToTest; ++imageFormatIndex)
2296 const VkFormat format = depthStencilImageFormatsToTest[imageFormatIndex];
2297 const bool hasDepth = tcu::hasDepthComponent(mapVkFormat(format).order);
2298 const bool hasStencil = tcu::hasStencilComponent(mapVkFormat(format).order);
2299 const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 3 : 1;
2301 for (int separateDepthStencilLayoutMode = 0; separateDepthStencilLayoutMode < separateLayoutsLoopCount; ++separateDepthStencilLayoutMode)
2303 const std::string testCaseName = getFormatCaseName(format) +
2304 ((separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH) ? "_separate_layouts_depth" :
2305 (separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL) ? "_separate_layouts_stencil" :
2308 TestParams testParams =
2310 true, // bool useSingleMipLevel;
2311 VK_IMAGE_TYPE_2D, // VkImageType imageType;
2312 format, // VkFormat format;
2313 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
2314 dimensions, // VkExtent3D extent;
2315 imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
2318 imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount
2319 }, // LayerRange imageViewLayerRange;
2320 makeClearValueDepthStencil(0.0f, 0u), // VkClearValue initValue
2322 makeClearValueDepthStencil(0.1f, 0x06), // VkClearValue clearValue[0];
2323 makeClearValueDepthStencil(0.3f, 0x04), // VkClearValue clearValue[1];
2325 false, // bool useSeparateExpectedClearValue;
2326 { }, // VkClearValue[2] expectedClearValue;
2327 imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
2328 allocationKind, // AllocationKind allocationKind;
2329 false, // bool isCube;
2330 SeparateDepthStencilLayoutMode(separateDepthStencilLayoutMode), // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
2331 false, // bool isColorMultipleSubresourceRangeTest;
2334 if (!imageLayerParamsToTest[imageLayerParamsIndex].twoStep)
2336 imageLayersGroup->addChild(new InstanceFactory1<ClearDepthStencilImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Image", testParams));
2338 if (separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE && hasDepth && hasStencil)
2340 const std::string testCaseNameRanges = getFormatCaseName(format) + dimensionsString + "_multiple_subresourcerange";
2341 imageLayersGroup->addChild(new InstanceFactory1<ClearDepthStencilImageMultipleSubresourceRangeTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseNameRanges, "Clear Depth/Stencil Image with ranges", testParams));
2346 imageLayersGroup->addChild(new InstanceFactory1<TwoStepClearDepthStencilImageTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Image", testParams));
2351 depthStencilImageClearTests->addChild(imageLayersGroup.release());
2353 imageClearingTests->addChild(depthStencilImageClearTests.release());
2356 // Clear color attachment
2358 for (size_t imageLayerParamsIndex = 0; imageLayerParamsIndex < numOfAttachmentLayerParamsToTest; ++imageLayerParamsIndex)
2360 if (!imageLayerParamsToTest[imageLayerParamsIndex].twoStep)
2362 de::MovePtr<TestCaseGroup> colorAttachmentClearLayersGroup(new TestCaseGroup(testCtx, imageLayerParamsToTest[imageLayerParamsIndex].testName, ""));
2363 de::MovePtr<TestCaseGroup> partialColorAttachmentClearLayersGroup(new TestCaseGroup(testCtx, imageLayerParamsToTest[imageLayerParamsIndex].testName, ""));
2365 for (size_t imageDimensionsIndex = 0; imageDimensionsIndex < DE_LENGTH_OF_ARRAY(imageDimensions); ++imageDimensionsIndex)
2367 const VkExtent3D dimensions = imageDimensions[imageDimensionsIndex];
2368 const std::string dimensionsString = extentToString(dimensions, VK_IMAGE_TYPE_2D);
2370 if (dimensions.height == 1 || dimensions.depth > 1)
2373 if (imageLayerParamsToTest[imageLayerParamsIndex].isCube && dimensions.width != dimensions.height)
2376 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfColorImageFormatsToTest; ++imageFormatIndex)
2378 const VkFormat format = colorImageFormatsToTest[imageFormatIndex];
2379 const TextureFormat tcuFormat = mapVkFormat(format);
2380 const TextureChannelClass channelClass = getTextureChannelClass(tcuFormat.type);
2381 for (size_t clearColorIndex = 0; clearColorIndex < numOfClearColorsToTest; ++clearColorIndex)
2383 const ClearTestColorParams& colorParams = clearColorsToTest[clearColorIndex];
2385 if (colorParams.matchTextureChannelClass && channelClass != colorParams.textureChannelClass)
2388 VkClearValue clearColors[2] =
2390 makeClearColorValue(format, colorParams.clearColors[0][0], colorParams.clearColors[0][1], colorParams.clearColors[0][2], colorParams.clearColors[0][3]),
2391 makeClearColorValue(format, colorParams.clearColors[1][0], colorParams.clearColors[1][1], colorParams.clearColors[1][2], colorParams.clearColors[1][3]),
2393 VkClearValue expectedColors[2];
2394 if (clearColorsToTest[clearColorIndex].useSeparateExpectedColors)
2396 expectedColors[0] = makeClearColorValue(format, colorParams.expectedColors[0][0], colorParams.expectedColors[0][1], colorParams.expectedColors[0][2], colorParams.expectedColors[0][3]);
2397 expectedColors[1] = makeClearColorValue(format, colorParams.expectedColors[1][0], colorParams.expectedColors[1][1], colorParams.expectedColors[1][2], colorParams.expectedColors[1][3]);
2401 expectedColors[0] = clearColors[0];
2402 expectedColors[1] = clearColors[1];
2405 const std::string testCaseName = getFormatCaseName(format) + dimensionsString + colorParams.testNameSuffix;
2406 const TestParams testParams =
2408 true, // bool useSingleMipLevel;
2409 VK_IMAGE_TYPE_2D, // VkImageType imageType;
2410 format, // VkFormat format;
2411 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
2412 dimensions, // VkExtent3D extent;
2413 imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
2414 imageLayerParamsToTest[imageLayerParamsIndex].imageViewRange, // LayerRange imageViewLayerRange;
2415 makeClearColorValue(format, 0.2f, 0.1f, 0.7f, 0.8f), // VkClearValue initValue
2417 clearColors[0], // VkClearValue clearValue[0];
2418 clearColors[1] // VkClearValue clearValue[1];
2420 colorParams.useSeparateExpectedColors, // bool useSeparateExpectedClearValue;
2422 expectedColors[0], // VkClearValue expectedClearValue[0];
2423 expectedColors[1] // VkClearValue expectedClearValue[1];
2425 imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
2426 allocationKind, // AllocationKind allocationKind;
2427 imageLayerParamsToTest[imageLayerParamsIndex].isCube, // bool isCube;
2428 SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_NONE, // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
2429 false, // bool isColorMultipleSubresourceRangeTest;
2431 colorAttachmentClearLayersGroup->addChild(new InstanceFactory1<ClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Color Attachment", testParams));
2432 if (dimensions.width > 1)
2433 partialColorAttachmentClearLayersGroup->addChild(new InstanceFactory1<PartialClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Partial Clear Color Attachment", testParams));
2437 colorAttachmentClearTests->addChild(colorAttachmentClearLayersGroup.release());
2438 partialColorAttachmentClearTests->addChild(partialColorAttachmentClearLayersGroup.release());
2441 imageClearingTests->addChild(colorAttachmentClearTests.release());
2442 imageClearingTests->addChild(partialColorAttachmentClearTests.release());
2445 // Clear depth/stencil attachment
2447 for (size_t imageLayerParamsIndex = 0; imageLayerParamsIndex < numOfAttachmentLayerParamsToTest; ++imageLayerParamsIndex)
2449 if (!imageLayerParamsToTest[imageLayerParamsIndex].twoStep)
2451 de::MovePtr<TestCaseGroup> depthStencilLayersGroup(new TestCaseGroup(testCtx, imageLayerParamsToTest[imageLayerParamsIndex].testName, ""));
2452 de::MovePtr<TestCaseGroup> partialDepthStencilLayersGroup(new TestCaseGroup(testCtx, imageLayerParamsToTest[imageLayerParamsIndex].testName, ""));
2454 for (size_t imageDimensionsIndex = 0; imageDimensionsIndex < DE_LENGTH_OF_ARRAY(imageDimensions); ++imageDimensionsIndex)
2456 const VkExtent3D dimensions = imageDimensions[imageDimensionsIndex];
2457 const std::string dimensionsString = extentToString(dimensions, VK_IMAGE_TYPE_2D);
2459 if (dimensions.height == 1 || dimensions.depth > 1)
2462 if (imageLayerParamsToTest[imageLayerParamsIndex].isCube && dimensions.width != dimensions.height)
2465 for (size_t imageFormatIndex = 0; imageFormatIndex < numOfDepthStencilImageFormatsToTest; ++imageFormatIndex)
2467 const VkFormat format = depthStencilImageFormatsToTest[imageFormatIndex];
2468 const bool hasDepth = tcu::hasDepthComponent(mapVkFormat(format).order);
2469 const bool hasStencil = tcu::hasStencilComponent(mapVkFormat(format).order);
2470 const int separateLayoutsLoopCount = (hasDepth && hasStencil) ? 3 : 1;
2472 for (int separateDepthStencilLayoutMode = 0; separateDepthStencilLayoutMode < separateLayoutsLoopCount; ++separateDepthStencilLayoutMode)
2474 const std::string testCaseName = getFormatCaseName(format) +
2475 ((separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_DEPTH) ? "_separate_layouts_depth" :
2476 (separateDepthStencilLayoutMode == SEPARATE_DEPTH_STENCIL_LAYOUT_MODE_STENCIL) ? "_separate_layouts_stencil" :
2480 const TestParams testParams =
2482 true, // bool useSingleMipLevel;
2483 VK_IMAGE_TYPE_2D, // VkImageType imageType;
2484 format, // VkFormat format;
2485 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
2486 dimensions, // VkExtent3D extent;
2487 imageLayerParamsToTest[imageLayerParamsIndex].imageLayerCount, // deUint32 imageLayerCount;
2488 imageLayerParamsToTest[imageLayerParamsIndex].imageViewRange, // LayerRange imageViewLayerRange;
2489 makeClearValueDepthStencil(0.0f, 0u), // VkClearValue initValue
2491 makeClearValueDepthStencil(0.1f, 0x06), // VkClearValue clearValue[0];
2492 makeClearValueDepthStencil(0.3f, 0x04), // VkClearValue clearValue[1];
2494 false, // bool useSeparateExpectedClearValue;
2495 { }, // VkClearValue[2] expectedClearValue;
2496 imageLayerParamsToTest[imageLayerParamsIndex].clearLayerRange, // LayerRange clearLayerRange;
2497 allocationKind, // AllocationKind allocationKind;
2498 imageLayerParamsToTest[imageLayerParamsIndex].isCube, // bool isCube;
2499 SeparateDepthStencilLayoutMode(separateDepthStencilLayoutMode), // SeparateDepthStencilLayoutMode separateDepthStencilLayoutMode;
2500 false, // bool isColorMultipleSubresourceRangeTest;
2502 depthStencilLayersGroup->addChild(new InstanceFactory1<ClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Clear Depth/Stencil Attachment", testParams));
2503 if (dimensions.width > 1)
2504 partialDepthStencilLayersGroup->addChild(new InstanceFactory1<PartialClearAttachmentTestInstance, TestParams>(testCtx, NODETYPE_SELF_VALIDATE, testCaseName, "Partial Clear Depth/Stencil Attachment", testParams));
2508 depthStencilAttachmentClearTests->addChild(depthStencilLayersGroup.release());
2509 partialDepthStencilAttachmentClearTests->addChild(partialDepthStencilLayersGroup.release());
2512 imageClearingTests->addChild(depthStencilAttachmentClearTests.release());
2513 imageClearingTests->addChild(partialDepthStencilAttachmentClearTests.release());
2516 return imageClearingTests;
2519 void createCoreImageClearingTests (tcu::TestCaseGroup* group)
2521 createImageClearingTestsCommon(group->getTestContext(), group, ALLOCATION_KIND_SUBALLOCATED);
2524 void createDedicatedAllocationImageClearingTests (tcu::TestCaseGroup* group)
2526 createImageClearingTestsCommon(group->getTestContext(), group, ALLOCATION_KIND_DEDICATED);
2531 TestCaseGroup* createImageClearingTests (TestContext& testCtx)
2533 de::MovePtr<TestCaseGroup> imageClearingTests (new TestCaseGroup(testCtx, "image_clearing", "Image Clearing Tests"));
2535 imageClearingTests->addChild(createTestGroup(testCtx, "core", "Core Image Clearing Tests", createCoreImageClearingTests));
2536 imageClearingTests->addChild(createTestGroup(testCtx, "dedicated_allocation", "Image Clearing Tests For Dedicated Memory Allocation", createDedicatedAllocationImageClearingTests));
2538 return imageClearingTests.release();