+ testParams.params.filter = VK_FILTER_LINEAR;
+ group->addChild(new BlittingTestCase(testCtx, testName + "_linear", description, testParams.params));
+ }
+ }
+ }
+}
+
+void addBlittingImageAllFormatsColorSrcFormatTests (tcu::TestCaseGroup* group, BlitColorTestParams testParams)
+{
+ for (int dstFormatIndex = 0; testParams.compatibleFormats[dstFormatIndex] != VK_FORMAT_UNDEFINED; ++dstFormatIndex)
+ {
+ testParams.params.dst.image.format = testParams.compatibleFormats[dstFormatIndex];
+ if (!isSupportedByFramework(testParams.params.dst.image.format))
+ continue;
+
+ if (!isAllowedBlittingAllFormatsColorSrcFormatTests(testParams))
+ continue;
+
+ const std::string description = "Blit destination format " + getFormatCaseName(testParams.params.dst.image.format);
+ addTestGroup(group, getFormatCaseName(testParams.params.dst.image.format), description, addBlittingImageAllFormatsColorSrcFormatDstFormatTests, testParams);
+ }
+}
+
+const VkFormat compatibleFormatsUInts[] =
+{
+ VK_FORMAT_R8_UINT,
+ VK_FORMAT_R8G8_UINT,
+ VK_FORMAT_R8G8B8_UINT,
+ VK_FORMAT_B8G8R8_UINT,
+ VK_FORMAT_R8G8B8A8_UINT,
+ VK_FORMAT_B8G8R8A8_UINT,
+ VK_FORMAT_A8B8G8R8_UINT_PACK32,
+ VK_FORMAT_A2R10G10B10_UINT_PACK32,
+ VK_FORMAT_A2B10G10R10_UINT_PACK32,
+ VK_FORMAT_R16_UINT,
+ VK_FORMAT_R16G16_UINT,
+ VK_FORMAT_R16G16B16_UINT,
+ VK_FORMAT_R16G16B16A16_UINT,
+ VK_FORMAT_R32_UINT,
+ VK_FORMAT_R32G32_UINT,
+ VK_FORMAT_R32G32B32_UINT,
+ VK_FORMAT_R32G32B32A32_UINT,
+ VK_FORMAT_R64_UINT,
+ VK_FORMAT_R64G64_UINT,
+ VK_FORMAT_R64G64B64_UINT,
+ VK_FORMAT_R64G64B64A64_UINT,
+
+ VK_FORMAT_UNDEFINED
+};
+const VkFormat compatibleFormatsSInts[] =
+{
+ VK_FORMAT_R8_SINT,
+ VK_FORMAT_R8G8_SINT,
+ VK_FORMAT_R8G8B8_SINT,
+ VK_FORMAT_B8G8R8_SINT,
+ VK_FORMAT_R8G8B8A8_SINT,
+ VK_FORMAT_B8G8R8A8_SINT,
+ VK_FORMAT_A8B8G8R8_SINT_PACK32,
+ VK_FORMAT_A2R10G10B10_SINT_PACK32,
+ VK_FORMAT_A2B10G10R10_SINT_PACK32,
+ VK_FORMAT_R16_SINT,
+ VK_FORMAT_R16G16_SINT,
+ VK_FORMAT_R16G16B16_SINT,
+ VK_FORMAT_R16G16B16A16_SINT,
+ VK_FORMAT_R32_SINT,
+ VK_FORMAT_R32G32_SINT,
+ VK_FORMAT_R32G32B32_SINT,
+ VK_FORMAT_R32G32B32A32_SINT,
+ VK_FORMAT_R64_SINT,
+ VK_FORMAT_R64G64_SINT,
+ VK_FORMAT_R64G64B64_SINT,
+ VK_FORMAT_R64G64B64A64_SINT,
+
+ VK_FORMAT_UNDEFINED
+};
+const VkFormat compatibleFormatsFloats[] =
+{
+ VK_FORMAT_R4G4_UNORM_PACK8,
+ VK_FORMAT_R4G4B4A4_UNORM_PACK16,
+ VK_FORMAT_B4G4R4A4_UNORM_PACK16,
+ VK_FORMAT_R5G6B5_UNORM_PACK16,
+ VK_FORMAT_B5G6R5_UNORM_PACK16,
+ VK_FORMAT_R5G5B5A1_UNORM_PACK16,
+ VK_FORMAT_B5G5R5A1_UNORM_PACK16,
+ VK_FORMAT_A1R5G5B5_UNORM_PACK16,
+ VK_FORMAT_R8_UNORM,
+ VK_FORMAT_R8_SNORM,
+ VK_FORMAT_R8_USCALED,
+ VK_FORMAT_R8_SSCALED,
+ VK_FORMAT_R8G8_UNORM,
+ VK_FORMAT_R8G8_SNORM,
+ VK_FORMAT_R8G8_USCALED,
+ VK_FORMAT_R8G8_SSCALED,
+ VK_FORMAT_R8G8B8_UNORM,
+ VK_FORMAT_R8G8B8_SNORM,
+ VK_FORMAT_R8G8B8_USCALED,
+ VK_FORMAT_R8G8B8_SSCALED,
+ VK_FORMAT_B8G8R8_UNORM,
+ VK_FORMAT_B8G8R8_SNORM,
+ VK_FORMAT_B8G8R8_USCALED,
+ VK_FORMAT_B8G8R8_SSCALED,
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_FORMAT_R8G8B8A8_SNORM,
+ VK_FORMAT_R8G8B8A8_USCALED,
+ VK_FORMAT_R8G8B8A8_SSCALED,
+ VK_FORMAT_B8G8R8A8_UNORM,
+ VK_FORMAT_B8G8R8A8_SNORM,
+ VK_FORMAT_B8G8R8A8_USCALED,
+ VK_FORMAT_B8G8R8A8_SSCALED,
+ VK_FORMAT_A8B8G8R8_UNORM_PACK32,
+ VK_FORMAT_A8B8G8R8_SNORM_PACK32,
+ VK_FORMAT_A8B8G8R8_USCALED_PACK32,
+ VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
+ VK_FORMAT_A2R10G10B10_UNORM_PACK32,
+ VK_FORMAT_A2R10G10B10_SNORM_PACK32,
+ VK_FORMAT_A2R10G10B10_USCALED_PACK32,
+ VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
+ VK_FORMAT_A2B10G10R10_UNORM_PACK32,
+ VK_FORMAT_A2B10G10R10_SNORM_PACK32,
+ VK_FORMAT_A2B10G10R10_USCALED_PACK32,
+ VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
+ VK_FORMAT_R16_UNORM,
+ VK_FORMAT_R16_SNORM,
+ VK_FORMAT_R16_USCALED,
+ VK_FORMAT_R16_SSCALED,
+ VK_FORMAT_R16_SFLOAT,
+ VK_FORMAT_R16G16_UNORM,
+ VK_FORMAT_R16G16_SNORM,
+ VK_FORMAT_R16G16_USCALED,
+ VK_FORMAT_R16G16_SSCALED,
+ VK_FORMAT_R16G16_SFLOAT,
+ VK_FORMAT_R16G16B16_UNORM,
+ VK_FORMAT_R16G16B16_SNORM,
+ VK_FORMAT_R16G16B16_USCALED,
+ VK_FORMAT_R16G16B16_SSCALED,
+ VK_FORMAT_R16G16B16_SFLOAT,
+ VK_FORMAT_R16G16B16A16_UNORM,
+ VK_FORMAT_R16G16B16A16_SNORM,
+ VK_FORMAT_R16G16B16A16_USCALED,
+ VK_FORMAT_R16G16B16A16_SSCALED,
+ VK_FORMAT_R16G16B16A16_SFLOAT,
+ VK_FORMAT_R32_SFLOAT,
+ VK_FORMAT_R32G32_SFLOAT,
+ VK_FORMAT_R32G32B32_SFLOAT,
+ VK_FORMAT_R32G32B32A32_SFLOAT,
+ VK_FORMAT_R64_SFLOAT,
+ VK_FORMAT_R64G64_SFLOAT,
+ VK_FORMAT_R64G64B64_SFLOAT,
+ VK_FORMAT_R64G64B64A64_SFLOAT,
+// VK_FORMAT_B10G11R11_UFLOAT_PACK32,
+// VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
+// VK_FORMAT_BC1_RGB_UNORM_BLOCK,
+// VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
+// VK_FORMAT_BC2_UNORM_BLOCK,
+// VK_FORMAT_BC3_UNORM_BLOCK,
+// VK_FORMAT_BC4_UNORM_BLOCK,
+// VK_FORMAT_BC4_SNORM_BLOCK,
+// VK_FORMAT_BC5_UNORM_BLOCK,
+// VK_FORMAT_BC5_SNORM_BLOCK,
+// VK_FORMAT_BC6H_UFLOAT_BLOCK,
+// VK_FORMAT_BC6H_SFLOAT_BLOCK,
+// VK_FORMAT_BC7_UNORM_BLOCK,
+// VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
+// VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
+// VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
+// VK_FORMAT_EAC_R11_UNORM_BLOCK,
+// VK_FORMAT_EAC_R11_SNORM_BLOCK,
+// VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
+// VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
+// VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
+// VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
+// VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
+// VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
+// VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
+// VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
+// VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
+// VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
+// VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
+// VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
+// VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
+// VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
+// VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
+// VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
+
+ VK_FORMAT_UNDEFINED
+};
+const VkFormat compatibleFormatsSrgb[] =
+{
+ VK_FORMAT_R8_SRGB,
+ VK_FORMAT_R8G8_SRGB,
+ VK_FORMAT_R8G8B8_SRGB,
+ VK_FORMAT_B8G8R8_SRGB,
+ VK_FORMAT_R8G8B8A8_SRGB,
+ VK_FORMAT_B8G8R8A8_SRGB,
+ VK_FORMAT_A8B8G8R8_SRGB_PACK32,
+// VK_FORMAT_BC1_RGB_SRGB_BLOCK,
+// VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
+// VK_FORMAT_BC2_SRGB_BLOCK,
+// VK_FORMAT_BC3_SRGB_BLOCK,
+// VK_FORMAT_BC7_SRGB_BLOCK,
+// VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
+// VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
+// VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
+// VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
+// VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
+// VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
+// VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
+// VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
+// VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
+// VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
+// VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
+// VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
+// VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
+// VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
+// VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
+// VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
+// VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
+
+ VK_FORMAT_UNDEFINED
+};
+
+const VkFormat dedicatedAllocationBlittingFormatsToTest[] =
+{
+ // compatibleFormatsUInts
+ VK_FORMAT_R8_UINT,
+ VK_FORMAT_R64G64B64A64_UINT,
+
+ // compatibleFormatsSInts
+ VK_FORMAT_R8_SINT,
+ VK_FORMAT_R64G64B64A64_SINT,
+
+ // compatibleFormatsFloats
+ VK_FORMAT_R4G4_UNORM_PACK8,
+ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
+
+ // compatibleFormatsSrgb
+ VK_FORMAT_R8_SRGB,
+ VK_FORMAT_A8B8G8R8_SRGB_PACK32,
+};
+
+void addBlittingImageAllFormatsColorTests (tcu::TestCaseGroup* group, AllocationKind allocationKind)
+{
+ const struct {
+ const VkFormat* compatibleFormats;
+ const bool onlyNearest;
+ } colorImageFormatsToTestBlit[] =
+ {
+ { compatibleFormatsUInts, true },
+ { compatibleFormatsSInts, true },
+ { compatibleFormatsFloats, false },
+ { compatibleFormatsSrgb, false },
+ };
+
+ const int numOfColorImageFormatsToTest = DE_LENGTH_OF_ARRAY(colorImageFormatsToTestBlit);
+
+ TestParams params;
+ params.src.image.imageType = VK_IMAGE_TYPE_2D;
+ params.src.image.extent = defaultExtent;
+ params.dst.image.imageType = VK_IMAGE_TYPE_2D;
+ params.dst.image.extent = defaultExtent;
+ params.allocationKind = allocationKind;
+
+ CopyRegion region;
+ for (int i = 0, j = 1; (i + defaultFourthSize / j < defaultSize) && (defaultFourthSize > j); i += defaultFourthSize / j++)
+ {
+ const VkImageBlit imageBlit =
+ {
+ defaultSourceLayer, // VkImageSubresourceLayers srcSubresource;
+ {
+ {0, 0, 0},
+ {defaultSize, defaultSize, 1}
+ }, // VkOffset3D srcOffsets[2];
+
+ defaultSourceLayer, // VkImageSubresourceLayers dstSubresource;
+ {
+ {i, 0, 0},
+ {i + defaultFourthSize / j, defaultFourthSize / j, 1}
+ } // VkOffset3D dstOffset[2];
+ };
+ region.imageBlit = imageBlit;
+ params.regions.push_back(region);
+ }
+ for (int i = 0; i < defaultSize; i += defaultFourthSize)
+ {
+ const VkImageBlit imageBlit =
+ {
+ defaultSourceLayer, // VkImageSubresourceLayers srcSubresource;
+ {
+ {i, i, 0},
+ {i + defaultFourthSize, i + defaultFourthSize, 1}
+ }, // VkOffset3D srcOffsets[2];
+
+ defaultSourceLayer, // VkImageSubresourceLayers dstSubresource;
+ {
+ {i, defaultSize / 2, 0},
+ {i + defaultFourthSize, defaultSize / 2 + defaultFourthSize, 1}
+ } // VkOffset3D dstOffset[2];
+ };
+ region.imageBlit = imageBlit;
+ params.regions.push_back(region);
+ }
+
+ if (allocationKind == ALLOCATION_KIND_DEDICATED)
+ {
+ const int numOfColorImageFormatsToTestFilter = DE_LENGTH_OF_ARRAY(dedicatedAllocationBlittingFormatsToTest);
+ for (int compatibleFormatsIndex = 0; compatibleFormatsIndex < numOfColorImageFormatsToTestFilter; ++compatibleFormatsIndex)
+ dedicatedAllocationBlittingFormatsToTestSet.insert(dedicatedAllocationBlittingFormatsToTest[compatibleFormatsIndex]);
+ }
+
+ for (int compatibleFormatsIndex = 0; compatibleFormatsIndex < numOfColorImageFormatsToTest; ++compatibleFormatsIndex)
+ {
+ const VkFormat* compatibleFormats = colorImageFormatsToTestBlit[compatibleFormatsIndex].compatibleFormats;
+ const bool onlyNearest = colorImageFormatsToTestBlit[compatibleFormatsIndex].onlyNearest;
+ for (int srcFormatIndex = 0; compatibleFormats[srcFormatIndex] != VK_FORMAT_UNDEFINED; ++srcFormatIndex)
+ {
+ params.src.image.format = compatibleFormats[srcFormatIndex];
+ if (!isSupportedByFramework(params.src.image.format))
+ continue;
+
+ BlitColorTestParams testParams;
+ testParams.params = params;
+ testParams.compatibleFormats = compatibleFormats;
+ testParams.onlyNearest = onlyNearest;
+
+ const std::string description = "Blit source format " + getFormatCaseName(params.src.image.format);
+ addTestGroup(group, getFormatCaseName(params.src.image.format), description, addBlittingImageAllFormatsColorSrcFormatTests, testParams);
+ }
+ }
+}
+
+void addBlittingImageAllFormatsDepthStencilFormatsTests (tcu::TestCaseGroup* group, TestParams params)
+{
+ const VkImageLayout blitSrcLayouts[] =
+ {
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ VK_IMAGE_LAYOUT_GENERAL
+ };
+ const VkImageLayout blitDstLayouts[] =
+ {
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_IMAGE_LAYOUT_GENERAL
+ };
+
+ for (int srcLayoutNdx = 0u; srcLayoutNdx < DE_LENGTH_OF_ARRAY(blitSrcLayouts); ++srcLayoutNdx)
+ {
+ params.src.image.operationLayout = blitSrcLayouts[srcLayoutNdx];
+
+ for (int dstLayoutNdx = 0u; dstLayoutNdx < DE_LENGTH_OF_ARRAY(blitDstLayouts); ++dstLayoutNdx)
+ {
+ params.dst.image.operationLayout = blitDstLayouts[dstLayoutNdx];
+ params.filter = VK_FILTER_NEAREST;
+
+ const std::string testName = getImageLayoutCaseName(params.src.image.operationLayout) + "_" +
+ getImageLayoutCaseName(params.dst.image.operationLayout);
+ const std::string description = "Blit from " + getImageLayoutCaseName(params.src.image.operationLayout) +
+ " to " + getImageLayoutCaseName(params.dst.image.operationLayout);
+
+ group->addChild(new BlittingTestCase(group->getTestContext(), testName + "_nearest", description, params));
+ }
+ }
+}
+
+void addBlittingImageAllFormatsDepthStencilTests (tcu::TestCaseGroup* group, AllocationKind allocationKind)
+{
+ const VkFormat depthAndStencilFormats[] =
+ {
+ VK_FORMAT_D16_UNORM,
+ VK_FORMAT_X8_D24_UNORM_PACK32,
+ VK_FORMAT_D32_SFLOAT,
+ VK_FORMAT_S8_UINT,
+ VK_FORMAT_D16_UNORM_S8_UINT,
+ VK_FORMAT_D24_UNORM_S8_UINT,
+ VK_FORMAT_D32_SFLOAT_S8_UINT,
+ };
+
+ const VkImageSubresourceLayers defaultDepthSourceLayer = { VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 0u, 1u };
+ const VkImageSubresourceLayers defaultStencilSourceLayer = { VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, 1u };
+
+ for (int compatibleFormatsIndex = 0; compatibleFormatsIndex < DE_LENGTH_OF_ARRAY(depthAndStencilFormats); ++compatibleFormatsIndex)
+ {
+ TestParams params;
+ params.src.image.imageType = VK_IMAGE_TYPE_2D;
+ params.src.image.extent = defaultExtent;
+ params.src.image.format = depthAndStencilFormats[compatibleFormatsIndex];
+ params.dst.image.extent = defaultExtent;
+ params.dst.image.imageType = VK_IMAGE_TYPE_2D;
+ params.dst.image.format = params.src.image.format;
+ params.allocationKind = allocationKind;
+
+ CopyRegion region;
+ for (int i = 0, j = 1; (i + defaultFourthSize / j < defaultSize) && (defaultFourthSize > j); i += defaultFourthSize / j++)
+ {
+ const VkOffset3D srcOffset0 = {0, 0, 0};
+ const VkOffset3D srcOffset1 = {defaultSize, defaultSize, 1};
+ const VkOffset3D dstOffset0 = {i, 0, 0};
+ const VkOffset3D dstOffset1 = {i + defaultFourthSize / j, defaultFourthSize / j, 1};
+
+ if (tcu::hasDepthComponent(mapVkFormat(params.src.image.format).order))
+ {
+ const VkImageBlit imageBlit =