Add AMD FMASK and EQAA extension tests
authorMaciej Jesionowski <maciej.jesionowski@amd.com>
Wed, 16 Oct 2019 11:15:01 +0000 (13:15 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 22 Nov 2019 12:44:56 +0000 (07:44 -0500)
Adds tests for:
- VK_AMD_shader_fragment_mask
- VK_AMD_mixed_attachment_samples

VK_AMD_shader_fragment_mask extension provides efficient read access to the
fragment mask in compressed multisampled color surfaces. The fragment mask is
a lookup table that associates color samples with color fragment values.

VK_AMD_mixed_attachment_samples extension enables applications to use
multisampled rendering with a depth/stencil sample count that is larger than
the color sample count. Having a depth/stencil sample count larger than
the color sample count allows maintaining geometry and coverage information
at a higher sample rate than color information.

Components: Vulkan
VK-GL-CTS issue: 2104

Affected tests:
dEQP-VK.pipeline.multisample.sample_locations_ext.*

New tests:
dEQP-VK.pipeline.multisample.mixed_attachment_samples.*
dEQP-VK.pipeline.multisample.shader_fragment_mask.*

Change-Id: If4876eda00dcd2bac4f685252048c5afd58d3df5

15 files changed:
AndroidGen.mk
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.hpp
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleMixedAttachmentSamplesTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleMixedAttachmentSamplesTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp
external/vulkancts/modules/vulkan/pipeline/vktPipelineSampleLocationsUtil.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/pipeline/vktPipelineSampleLocationsUtil.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/vktTestCase.cpp
external/vulkancts/mustpass/master/vk-default-no-waivers.txt
external/vulkancts/mustpass/master/vk-default.txt

index 3949b47a766a8015f2db89347ae7289fe089a052..6fe0ec549c00b00de118e2ac6b201ad20a74c323 100644 (file)
@@ -207,14 +207,17 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp \
+       external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleMixedAttachmentSamplesTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderBuiltInTests.cpp \
+       external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelinePushConstantTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineReferenceRenderer.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp \
+       external/vulkancts/modules/vulkan/pipeline/vktPipelineSampleLocationsUtil.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineSpecConstantUtil.cpp \
index 18aacab6dfb9fb5d0d5573abf71e1dfd52dfb851..fae1be371ed4601a924f52ae9fc3e24fdf6859d2 100644 (file)
@@ -236080,6 +236080,260 @@ dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_s
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_dynamic
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_secondary_cmd_buf
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_dynamic_secondary_cmd_buf
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r32_sint
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_2
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_2_post_depth_coverage
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_4
index 3c7b6d56a6af39680efbe0c92947de93373424f3..4caec449f21fe84c966a30861c271fde3257cbfe 100644 (file)
@@ -26,6 +26,8 @@ set(DEQP_VK_PIPELINE_SRCS
        vktPipelinePushConstantTests.hpp
        vktPipelinePushDescriptorTests.cpp
        vktPipelinePushDescriptorTests.hpp
+       vktPipelineSampleLocationsUtil.cpp
+       vktPipelineSampleLocationsUtil.hpp
        vktPipelineSpecConstantTests.hpp
        vktPipelineSpecConstantTests.cpp
        vktPipelineSpecConstantUtil.hpp
@@ -52,8 +54,12 @@ set(DEQP_VK_PIPELINE_SRCS
        vktPipelineMultisampleShaderBuiltInTests.hpp
        vktPipelineMultisampleImageTests.cpp
        vktPipelineMultisampleImageTests.hpp
+       vktPipelineMultisampleMixedAttachmentSamplesTests.cpp
+       vktPipelineMultisampleMixedAttachmentSamplesTests.hpp
        vktPipelineMultisampleSampleLocationsExtTests.cpp
        vktPipelineMultisampleSampleLocationsExtTests.hpp
+       vktPipelineMultisampleShaderFragmentMaskTests.cpp
+       vktPipelineMultisampleShaderFragmentMaskTests.hpp
        vktPipelineInputAssemblyTests.cpp
        vktPipelineInputAssemblyTests.hpp
        vktPipelineReferenceRenderer.cpp
index ad11c148dd6232ad40b2ec6a0295df30201e0bbb..cc1e57da238119c45b851ab52f87c42324a9a9f1 100644 (file)
@@ -81,6 +81,18 @@ vk::Move<vk::VkPipeline>             makeComputePipeline             (const vk::DeviceInterface& vk, c
 de::MovePtr<vk::Allocation>            bindImageDedicated              (const vk::InstanceInterface& vki, const vk::DeviceInterface& vkd, const vk::VkPhysicalDevice physDevice, const vk::VkDevice device, const vk::VkImage image, const vk::MemoryRequirement requirement);
 de::MovePtr<vk::Allocation>            bindBufferDedicated             (const vk::InstanceInterface& vki, const vk::DeviceInterface& vkd, const vk::VkPhysicalDevice physDevice, const vk::VkDevice device, const vk::VkBuffer buffer, const vk::MemoryRequirement requirement);
 
+template<typename T>
+inline const T* dataOrNullPtr(const std::vector<T>& v)
+{
+       return (v.empty() ? DE_NULL : &v[0]);
+}
+
+template<typename T>
+inline T* dataOrNullPtr(std::vector<T>& v)
+{
+       return (v.empty() ? DE_NULL : &v[0]);
+}
+
 } // pipeline
 } // vkt
 
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleMixedAttachmentSamplesTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleMixedAttachmentSamplesTests.cpp
new file mode 100644 (file)
index 0000000..0a3f96e
--- /dev/null
@@ -0,0 +1,2054 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 Advanced Micro Devices, Inc.
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests for VK_AMD_mixed_attachment_samples
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleMixedAttachmentSamplesTests.hpp"
+#include "vktPipelineSampleLocationsUtil.hpp"
+#include "vktPipelineMakeUtil.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestCaseUtil.hpp"
+#include "vktTestGroupUtil.hpp"
+
+#include "vkCmdUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkPlatform.hpp"
+#include "vkMemUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkImageUtil.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deSharedPtr.hpp"
+#include "deRandom.hpp"
+#include "deMath.h"
+
+#include "tcuVector.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuTextureUtil.hpp"
+#include "tcuRGBA.hpp"
+
+#include <string>
+#include <vector>
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace
+{
+using namespace vk;
+using de::UniquePtr;
+using de::MovePtr;
+using de::SharedPtr;
+using tcu::UVec2;
+using tcu::Vec2;
+using tcu::Vec4;
+
+bool compareGreenImage (tcu::TestLog& log, const char* name, const char* description, const tcu::ConstPixelBufferAccess& image)
+{
+       tcu::TextureLevel greenImage(image.getFormat(), image.getWidth(), image.getHeight());
+       tcu::clear(greenImage.getAccess(), tcu::RGBA::green().toIVec());
+       return tcu::intThresholdCompare(log, name, description, greenImage.getAccess(), image, tcu::UVec4(2u), tcu::COMPARE_LOG_RESULT);
+}
+
+VkImageAspectFlags getImageAspectFlags (const VkFormat format)
+{
+       const tcu::TextureFormat tcuFormat = mapVkFormat(format);
+
+       if      (tcuFormat.order == tcu::TextureFormat::DS)             return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
+       else if (tcuFormat.order == tcu::TextureFormat::D)              return VK_IMAGE_ASPECT_DEPTH_BIT;
+       else if (tcuFormat.order == tcu::TextureFormat::S)              return VK_IMAGE_ASPECT_STENCIL_BIT;
+
+       DE_ASSERT(false);
+       return 0u;
+}
+
+struct CompareData
+{
+       Vec4            color;
+       float           depth;
+       deUint32        stencil;
+
+       // Pad to 2*16 bytes, in the shader the base alignment of this structure is 16 due to vec4
+       deUint32        padding[2];
+
+       CompareData() : color(Vec4(0.0f)), depth(0.0f), stencil(0u)
+       {
+               padding[0] = 0u;
+               padding[1] = 0u;
+
+               static_assert(sizeof(CompareData) == (2 * 16), "Wrong structure size, expected 16 bytes");
+       }
+};
+
+//! Make a dummy sampler.
+Move<VkSampler> makeSampler (const DeviceInterface& vk, const VkDevice device)
+{
+       const VkSamplerCreateInfo samplerParams =
+       {
+               VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,                  // VkStructureType         sType;
+               DE_NULL,                                                                                // const void*             pNext;
+               (VkSamplerCreateFlags)0,                                                // VkSamplerCreateFlags    flags;
+               VK_FILTER_NEAREST,                                                              // VkFilter                magFilter;
+               VK_FILTER_NEAREST,                                                              // VkFilter                minFilter;
+               VK_SAMPLER_MIPMAP_MODE_NEAREST,                                 // VkSamplerMipmapMode     mipmapMode;
+               VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,                  // VkSamplerAddressMode    addressModeU;
+               VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,                  // VkSamplerAddressMode    addressModeV;
+               VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,                  // VkSamplerAddressMode    addressModeW;
+               0.0f,                                                                                   // float                   mipLodBias;
+               VK_FALSE,                                                                               // VkBool32                anisotropyEnable;
+               1.0f,                                                                                   // float                   maxAnisotropy;
+               VK_FALSE,                                                                               // VkBool32                compareEnable;
+               VK_COMPARE_OP_ALWAYS,                                                   // VkCompareOp             compareOp;
+               0.0f,                                                                                   // float                   minLod;
+               0.0f,                                                                                   // float                   maxLod;
+               VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,                // VkBorderColor           borderColor;
+               VK_FALSE,                                                                               // VkBool32                unnormalizedCoordinates;
+       };
+       return createSampler(vk, device, &samplerParams);
+}
+
+Move<VkImage> makeImage (const DeviceInterface&                        vk,
+                                                const VkDevice                                 device,
+                                                const VkFormat                                 format,
+                                                const UVec2&                                   size,
+                                                const VkSampleCountFlagBits    samples,
+                                                const VkImageUsageFlags                usage)
+{
+       const VkImageCreateInfo imageParams =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                    // VkStructureType                      sType;
+               DE_NULL,                                                                                // const void*                          pNext;
+               (VkImageCreateFlags)0,                                                  // VkImageCreateFlags           flags;
+               VK_IMAGE_TYPE_2D,                                                               // VkImageType                          imageType;
+               format,                                                                                 // VkFormat                                     format;
+               makeExtent3D(size.x(), size.y(), 1),                    // VkExtent3D                           extent;
+               1u,                                                                                             // deUint32                                     mipLevels;
+               1u,                                                                                             // deUint32                                     arrayLayers;
+               samples,                                                                                // VkSampleCountFlagBits        samples;
+               VK_IMAGE_TILING_OPTIMAL,                                                // VkImageTiling                        tiling;
+               usage,                                                                                  // VkImageUsageFlags            usage;
+               VK_SHARING_MODE_EXCLUSIVE,                                              // VkSharingMode                        sharingMode;
+               0u,                                                                                             // deUint32                                     queueFamilyIndexCount;
+               DE_NULL,                                                                                // const deUint32*                      pQueueFamilyIndices;
+               VK_IMAGE_LAYOUT_UNDEFINED,                                              // VkImageLayout                        initialLayout;
+       };
+       return createImage(vk, device, &imageParams);
+}
+
+inline bool isDepthFormat (const VkFormat format)
+{
+       return (getImageAspectFlags(format) & VK_IMAGE_ASPECT_DEPTH_BIT) != 0;
+}
+
+inline bool isStencilFormat (const VkFormat format)
+{
+       return (getImageAspectFlags(format) & VK_IMAGE_ASPECT_STENCIL_BIT) != 0;
+}
+
+//! Create a test-specific MSAA pipeline
+Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface&                                  vk,
+                                                                          const VkDevice                                                       device,
+                                                                          const VkPipelineLayout                                       pipelineLayout,
+                                                                          const VkRenderPass                                           renderPass,
+                                                                          const VkShaderModule                                         vertexModule,
+                                                                          const VkShaderModule                                         fragmentModule,
+                                                                          const bool                                                           useVertexInput,
+                                                                          const deUint32                                                       subpassNdx,
+                                                                          const UVec2&                                                         renderSize,
+                                                                          const VkImageAspectFlags                                     depthStencilAspect,     //!< Used to determine which D/S tests to turn on
+                                                                          const VkSampleCountFlagBits                          numSamples,
+                                                                          const bool                                                           sampleShadingEnable,
+                                                                          const VkSampleLocationsInfoEXT*                      pSampleLocationsInfo = DE_NULL)
+{
+       std::vector<VkVertexInputBindingDescription>    vertexInputBindingDescriptions;
+       std::vector<VkVertexInputAttributeDescription>  vertexInputAttributeDescriptions;
+
+       // Vertex attributes: position and color
+       if (useVertexInput)
+       {
+               vertexInputBindingDescriptions.push_back  (makeVertexInputBindingDescription  (0u, 2 * sizeof(Vec4), VK_VERTEX_INPUT_RATE_VERTEX));
+               vertexInputAttributeDescriptions.push_back(makeVertexInputAttributeDescription(0u, 0u, VK_FORMAT_R32G32B32A32_SFLOAT, 0u));
+               vertexInputAttributeDescriptions.push_back(makeVertexInputAttributeDescription(1u, 0u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(Vec4)));
+       }
+
+       const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,              // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                                // const void*                                                          pNext;
+               (VkPipelineVertexInputStateCreateFlags)0,                                               // VkPipelineVertexInputStateCreateFlags        flags;
+               static_cast<deUint32>(vertexInputBindingDescriptions.size()),   // uint32_t                                                                     vertexBindingDescriptionCount;
+               dataOrNullPtr(vertexInputBindingDescriptions),                                  // const VkVertexInputBindingDescription*       pVertexBindingDescriptions;
+               static_cast<deUint32>(vertexInputAttributeDescriptions.size()), // uint32_t                                                                     vertexAttributeDescriptionCount;
+               dataOrNullPtr(vertexInputAttributeDescriptions),                                // const VkVertexInputAttributeDescription*     pVertexAttributeDescriptions;
+       };
+
+       const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,    // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                                // const void*                                                          pNext;
+               (VkPipelineInputAssemblyStateCreateFlags)0,                                             // VkPipelineInputAssemblyStateCreateFlags      flags;
+               VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,                                                    // VkPrimitiveTopology                                          topology;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     primitiveRestartEnable;
+       };
+
+       const VkViewport viewport =
+       {
+               0.0f, 0.0f,                                                                                                                                     // x, y
+               static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()),         // widht, height
+               0.0f, 1.0f                                                                                                                                      // minDepth, maxDepth
+       };
+
+       const VkRect2D scissor =
+       {
+               makeOffset2D(0, 0),
+               makeExtent2D(renderSize.x(), renderSize.y()),
+       };
+
+       const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,                  // VkStructureType                                              sType;
+               DE_NULL,                                                                                                                // const void*                                                  pNext;
+               (VkPipelineViewportStateCreateFlags)0,                                                  // VkPipelineViewportStateCreateFlags   flags;
+               1u,                                                                                                                             // uint32_t                                                             viewportCount;
+               &viewport,                                                                                                              // const VkViewport*                                    pViewports;
+               1u,                                                                                                                             // uint32_t                                                             scissorCount;
+               &scissor,                                                                                                               // const VkRect2D*                                              pScissors;
+       };
+
+       const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,     // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               (VkPipelineRasterizationStateCreateFlags)0,                                     // VkPipelineRasterizationStateCreateFlags      flags;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthClampEnable;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     rasterizerDiscardEnable;
+               VK_POLYGON_MODE_FILL,                                                                           // VkPolygonMode                                                        polygonMode;
+               VK_CULL_MODE_NONE,                                                                                      // VkCullModeFlags                                                      cullMode;
+               VK_FRONT_FACE_COUNTER_CLOCKWISE,                                                        // VkFrontFace                                                          frontFace;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthBiasEnable;
+               0.0f,                                                                                                           // float                                                                        depthBiasConstantFactor;
+               0.0f,                                                                                                           // float                                                                        depthBiasClamp;
+               0.0f,                                                                                                           // float                                                                        depthBiasSlopeFactor;
+               1.0f,                                                                                                           // float                                                                        lineWidth;
+       };
+
+       VkPipelineSampleLocationsStateCreateInfoEXT pipelineSampleLocationsCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT,      // VkStructureType             sType;
+               DE_NULL,                                                                                                                        // const void*                 pNext;
+               VK_TRUE,                                                                                                                        // VkBool32                    sampleLocationsEnable;
+               VkSampleLocationsInfoEXT(),                                                                                     // VkSampleLocationsInfoEXT    sampleLocationsInfo;
+       };
+
+       VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,       // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               (VkPipelineMultisampleStateCreateFlags)0,                                       // VkPipelineMultisampleStateCreateFlags        flags;
+               numSamples,                                                                                                     // VkSampleCountFlagBits                                        rasterizationSamples;
+               sampleShadingEnable,                                                                            // VkBool32                                                                     sampleShadingEnable;
+               1.0f,                                                                                                           // float                                                                        minSampleShading;
+               DE_NULL,                                                                                                        // const VkSampleMask*                                          pSampleMask;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     alphaToCoverageEnable;
+               VK_FALSE                                                                                                        // VkBool32                                                                     alphaToOneEnable;
+       };
+
+       if (pSampleLocationsInfo)
+       {
+               pipelineSampleLocationsCreateInfo.sampleLocationsInfo   = *pSampleLocationsInfo;
+               pipelineMultisampleStateInfo.pNext                                              = &pipelineSampleLocationsCreateInfo;
+       }
+
+       // Simply increment the buffer
+       const VkStencilOpState stencilOpState = makeStencilOpState(
+               VK_STENCIL_OP_KEEP,                                             // stencil fail
+               VK_STENCIL_OP_INCREMENT_AND_CLAMP,              // depth & stencil pass
+               VK_STENCIL_OP_KEEP,                                             // depth only fail
+               VK_COMPARE_OP_ALWAYS,                                   // compare op
+               ~0u,                                                                    // compare mask
+               ~0u,                                                                    // write mask
+               0u);                                                                    // reference
+
+       // Always pass the depth test
+       VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,     // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               (VkPipelineDepthStencilStateCreateFlags)0,                                      // VkPipelineDepthStencilStateCreateFlags       flags;
+               (depthStencilAspect & VK_IMAGE_ASPECT_DEPTH_BIT) != 0u,         // VkBool32                                                                     depthTestEnable;
+               VK_TRUE,                                                                                                        // VkBool32                                                                     depthWriteEnable;
+               VK_COMPARE_OP_ALWAYS,                                                                           // VkCompareOp                                                          depthCompareOp;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthBoundsTestEnable;
+               (depthStencilAspect & VK_IMAGE_ASPECT_STENCIL_BIT) != 0u,       // VkBool32                                                                     stencilTestEnable;
+               stencilOpState,                                                                                         // VkStencilOpState                                                     front;
+               stencilOpState,                                                                                         // VkStencilOpState                                                     back;
+               0.0f,                                                                                                           // float                                                                        minDepthBounds;
+               1.0f,                                                                                                           // float                                                                        maxDepthBounds;
+       };
+
+       const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+       const VkPipelineColorBlendAttachmentState defaultBlendAttachmentState =
+       {
+               VK_FALSE,                               // VkBool32                                     blendEnable;
+               VK_BLEND_FACTOR_ONE,    // VkBlendFactor                        srcColorBlendFactor;
+               VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        dstColorBlendFactor;
+               VK_BLEND_OP_ADD,                // VkBlendOp                            colorBlendOp;
+               VK_BLEND_FACTOR_ONE,    // VkBlendFactor                        srcAlphaBlendFactor;
+               VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        dstAlphaBlendFactor;
+               VK_BLEND_OP_ADD,                // VkBlendOp                            alphaBlendOp;
+               colorComponentsAll,             // VkColorComponentFlags        colorWriteMask;
+       };
+
+       const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,       // VkStructureType                                                              sType;
+               DE_NULL,                                                                                                        // const void*                                                                  pNext;
+               (VkPipelineColorBlendStateCreateFlags)0,                                        // VkPipelineColorBlendStateCreateFlags                 flags;
+               VK_FALSE,                                                                                                       // VkBool32                                                                             logicOpEnable;
+               VK_LOGIC_OP_COPY,                                                                                       // VkLogicOp                                                                    logicOp;
+               1u,                                                                                                                     // deUint32                                                                             attachmentCount;
+               &defaultBlendAttachmentState,                                                           // const VkPipelineColorBlendAttachmentState*   pAttachments;
+               { 0.0f, 0.0f, 0.0f, 0.0f },                                                                     // float                                                                                blendConstants[4];
+       };
+
+       const VkPipelineShaderStageCreateInfo pShaderStages[] =
+       {
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                // const void*                                                  pNext;
+                       (VkPipelineShaderStageCreateFlags)0,                                    // VkPipelineShaderStageCreateFlags             flags;
+                       VK_SHADER_STAGE_VERTEX_BIT,                                                             // VkShaderStageFlagBits                                stage;
+                       vertexModule,                                                                                   // VkShaderModule                                               module;
+                       "main",                                                                                                 // const char*                                                  pName;
+                       DE_NULL,                                                                                                // const VkSpecializationInfo*                  pSpecializationInfo;
+               },
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                // const void*                                                  pNext;
+                       (VkPipelineShaderStageCreateFlags)0,                                    // VkPipelineShaderStageCreateFlags             flags;
+                       VK_SHADER_STAGE_FRAGMENT_BIT,                                                   // VkShaderStageFlagBits                                stage;
+                       fragmentModule,                                                                                 // VkShaderModule                                               module;
+                       "main",                                                                                                 // const char*                                                  pName;
+                       DE_NULL,                                                                                                // const VkSpecializationInfo*                  pSpecializationInfo;
+               }
+       };
+
+       const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
+       {
+               VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,        // VkStructureType                                                                      sType;
+               DE_NULL,                                                                                        // const void*                                                                          pNext;
+               (VkPipelineCreateFlags)0,                                                       // VkPipelineCreateFlags                                                        flags;
+               DE_LENGTH_OF_ARRAY(pShaderStages),                                      // deUint32                                                                                     stageCount;
+               pShaderStages,                                                                          // const VkPipelineShaderStageCreateInfo*                       pStages;
+               &vertexInputStateInfo,                                                          // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
+               &pipelineInputAssemblyStateInfo,                                        // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
+               DE_NULL,                                                                                        // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
+               &pipelineViewportStateInfo,                                                     // const VkPipelineViewportStateCreateInfo*                     pViewportState;
+               &pipelineRasterizationStateInfo,                                        // const VkPipelineRasterizationStateCreateInfo*        pRasterizationState;
+               &pipelineMultisampleStateInfo,                                          // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
+               &pipelineDepthStencilStateInfo,                                         // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
+               &pipelineColorBlendStateInfo,                                           // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
+               DE_NULL,                                                                                        // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
+               pipelineLayout,                                                                         // VkPipelineLayout                                                                     layout;
+               renderPass,                                                                                     // VkRenderPass                                                                         renderPass;
+               subpassNdx,                                                                                     // deUint32                                                                                     subpass;
+               DE_NULL,                                                                                        // VkPipeline                                                                           basePipelineHandle;
+               -1,                                                                                                     // deInt32                                                                                      basePipelineIndex;
+       };
+
+       return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
+}
+
+//! Wrap float after an increment
+inline float wrapIncFloat (float a, float min, float max)
+{
+       return deFloatMax(min, deFloatMod(a, max));
+}
+
+//! Generate expected data for color, depth, and stencil samples of a given image.
+//! Samples are ordered starting at pixel (0, 0) - see compute shader source for reference.
+std::vector<CompareData> generateCompareData (const deUint32   seed,
+                                                                                         const UVec2&          imageSize,
+                                                                                         const deUint32        numCoverageSamples,
+                                                                                         const deUint32        numColorSamples,
+                                                                                         const deUint32        numDepthStencilSamples)
+{
+       std::vector<CompareData>        allData;
+       de::Random                                      rng (seed);
+
+       for (deUint32 y          = 0u; y          < imageSize.y();              ++y)
+       for (deUint32 x          = 0u; x          < imageSize.x();              ++x)
+       for (deUint32 sample = 0u; sample < numCoverageSamples; ++sample)
+       {
+               CompareData cd;
+
+               if (sample < numColorSamples)
+               {
+                       for (int i = 0; i < 3; ++i)
+                               cd.color[i]     = 0.1f * static_cast<float>(rng.getInt(1, 10));
+
+                       cd.color.w() = 1.0f;
+               }
+
+               if (sample < numDepthStencilSamples)
+               {
+                       const deUint32 globalSample = sample + numColorSamples * (x + imageSize.x() * y);
+                       cd.depth        = wrapIncFloat(0.05f * static_cast<float>(1 + globalSample), 0.05f, 1.0f);
+                       cd.stencil      = 1 + globalSample % numCoverageSamples;
+               }
+
+               allData.push_back(cd);
+       }
+
+       return allData;
+}
+
+//! NDC transformation algorithm for sample locations
+template<typename SampleAccessor>
+std::vector<Vec2> ndcTransformEachSampleInPixel (const UVec2& framebufferSize, const deUint32 numSamplesPerPixel, const SampleAccessor& access)
+{
+       std::vector<Vec2> locations;
+
+       for (deUint32 y                 = 0; y                  < framebufferSize.y();  ++y)
+       for (deUint32 x                 = 0; x                  < framebufferSize.x();  ++x)
+       for (deUint32 sampleNdx = 0; sampleNdx  < numSamplesPerPixel;   ++sampleNdx)
+       {
+               const Vec2& sp = access(x, y, sampleNdx);
+               const float     globalX  = sp.x() + static_cast<float>(x);
+               const float     globalY  = sp.y() + static_cast<float>(y);
+
+               // Transform to [-1, 1] space
+               locations.push_back(Vec2(-1.0f + 2.0f * (globalX / static_cast<float>(framebufferSize.x())),
+                                                                -1.0f + 2.0f * (globalY / static_cast<float>(framebufferSize.y()))));
+       }
+
+       return locations;
+}
+
+class AccessStandardSampleLocationsArray
+{
+public:
+       AccessStandardSampleLocationsArray (const Vec2* ptr) : m_pData (ptr) {}
+
+       const Vec2& operator ()(const deUint32 x, const deUint32 y, const deUint32 sampleNdx) const
+       {
+               DE_UNREF(x);
+               DE_UNREF(y);
+               return m_pData[sampleNdx];
+       }
+
+private:
+       const Vec2*     m_pData;
+};
+
+class AccessMultisamplePixelGrid
+{
+public:
+       AccessMultisamplePixelGrid (const MultisamplePixelGrid* ptr) : m_pGrid (ptr) {}
+
+       Vec2 operator ()(const deUint32 x, const deUint32 y, const deUint32 sampleNdx) const
+       {
+               const VkSampleLocationEXT& sp = m_pGrid->getSample(x, y, sampleNdx);
+               return Vec2(sp.x, sp.y);
+       }
+
+private:
+       const MultisamplePixelGrid*     m_pGrid;
+};
+
+//! Generate NDC space standard sample locations at each framebuffer pixel
+//! Data is filled starting at pixel (0,0) and for each pixel there are numSamples samples
+std::vector<Vec2> genFramebufferStandardSampleLocations (const VkSampleCountFlagBits numSamples, const UVec2& framebufferSize)
+{
+       static const Vec2 s_location_samples_1[] =
+       {
+               Vec2(0.5f, 0.5f),
+       };
+       static const Vec2 s_location_samples_2[] =
+       {
+               Vec2(0.75f, 0.75f),
+               Vec2(0.25f, 0.25f),
+       };
+       static const Vec2 s_location_samples_4[] =
+       {
+               Vec2(0.375f, 0.125f),
+               Vec2(0.875f, 0.375f),
+               Vec2(0.125f, 0.625f),
+               Vec2(0.625f, 0.875f),
+       };
+       static const Vec2 s_location_samples_8[] =
+       {
+               Vec2(0.5625f, 0.3125f),
+               Vec2(0.4375f, 0.6875f),
+               Vec2(0.8125f, 0.5625f),
+               Vec2(0.3125f, 0.1875f),
+               Vec2(0.1875f, 0.8125f),
+               Vec2(0.0625f, 0.4375f),
+               Vec2(0.6875f, 0.9375f),
+               Vec2(0.9375f, 0.0625f),
+       };
+       static const Vec2 s_location_samples_16[] =
+       {
+               Vec2(0.5625f, 0.5625f),
+               Vec2(0.4375f, 0.3125f),
+               Vec2(0.3125f, 0.6250f),
+               Vec2(0.7500f, 0.4375f),
+               Vec2(0.1875f, 0.3750f),
+               Vec2(0.6250f, 0.8125f),
+               Vec2(0.8125f, 0.6875f),
+               Vec2(0.6875f, 0.1875f),
+               Vec2(0.3750f, 0.8750f),
+               Vec2(0.5000f, 0.0625f),
+               Vec2(0.2500f, 0.1250f),
+               Vec2(0.1250f, 0.7500f),
+               Vec2(0.0000f, 0.5000f),
+               Vec2(0.9375f, 0.2500f),
+               Vec2(0.8750f, 0.9375f),
+               Vec2(0.0625f, 0.0000f),
+       };
+
+       const Vec2*     pSampleLocation = DE_NULL;
+
+       switch (numSamples)
+       {
+               case VK_SAMPLE_COUNT_1_BIT:             pSampleLocation = s_location_samples_1;         break;
+               case VK_SAMPLE_COUNT_2_BIT:             pSampleLocation = s_location_samples_2;         break;
+               case VK_SAMPLE_COUNT_4_BIT:             pSampleLocation = s_location_samples_4;         break;
+               case VK_SAMPLE_COUNT_8_BIT:             pSampleLocation = s_location_samples_8;         break;
+               case VK_SAMPLE_COUNT_16_BIT:    pSampleLocation = s_location_samples_16;        break;
+
+               default:
+                       DE_ASSERT(0);
+                       return std::vector<Vec2>();
+       }
+
+       return ndcTransformEachSampleInPixel(framebufferSize, static_cast<deUint32>(numSamples), AccessStandardSampleLocationsArray(pSampleLocation));
+}
+
+//! Generate NDC space custom sample locations at each framebuffer pixel, based on the given pixel grid
+std::vector<Vec2> getSampleLocations (const MultisamplePixelGrid& pixelGrid, const UVec2& framebufferSize)
+{
+       return ndcTransformEachSampleInPixel(framebufferSize, pixelGrid.samplesPerPixel(), AccessMultisamplePixelGrid(&pixelGrid));
+}
+
+struct PositionColor
+{
+       tcu::Vec4       position;
+       tcu::Vec4       color;
+
+       PositionColor (const tcu::Vec4& pos, const tcu::Vec4& col) : position(pos), color(col) {}
+};
+
+//! Generate subpixel triangles containing the sample position, based on compare data.
+//! Stencil values are created by overlapping triangles, so the stencil pipeline state must be set up accordingly.
+std::vector<PositionColor> generateSubpixelTriangles (const UVec2&                                             renderSize,
+                                                                                                         const std::vector<CompareData>&       compareData,
+                                                                                                         const std::vector<Vec2>&                      sampleLocations)
+{
+       std::vector<PositionColor>      vertices;
+
+       // For each sample location (in the whole framebuffer), create a sub-pixel triangle that contains it.
+       // NDC viewport size is 2.0 in X and Y and NDC pixel width/height depends on the framebuffer resolution.
+       const Vec2                      pixelSize       = Vec2(2.0f) / renderSize.cast<float>();
+       const Vec2                      offset          = pixelSize / 16.0f;    // 4 bits precision
+
+       // Surround with a roughly centered triangle
+       const float y1 = 0.5f  * offset.y();
+       const float y2 = 0.35f * offset.y();
+       const float x1 = 0.5f  * offset.x();
+
+       DE_ASSERT(compareData.size() == sampleLocations.size());
+
+       for (std::size_t globalSampleNdx = 0; globalSampleNdx < sampleLocations.size(); ++globalSampleNdx)
+       {
+               const Vec2&                     loc     = sampleLocations[globalSampleNdx];
+               const CompareData&      cd      = compareData    [globalSampleNdx];
+
+               // Overdraw at the same position to get the desired stencil
+               // Draw at least once, if stencil is 0
+               for (deUint32 i = 0; i < deMaxu32(1u, cd.stencil); ++i)
+               {
+                       vertices.push_back(PositionColor(Vec4(loc.x(),      loc.y() - y1, cd.depth, 1.0f), cd.color));
+                       vertices.push_back(PositionColor(Vec4(loc.x() - x1, loc.y() + y2, cd.depth, 1.0f), cd.color));
+                       vertices.push_back(PositionColor(Vec4(loc.x() + x1, loc.y() + y2, cd.depth, 1.0f), cd.color));
+               }
+       }
+
+       return vertices;
+}
+
+void reportSampleError (tcu::TestLog& log, const std::string& sampleDesc, UVec2& renderSize, const deUint32 numCoverageSamples, const deUint32 globalSampleNdx)
+{
+       const deUint32 pixelNdx = globalSampleNdx / numCoverageSamples;
+       const deUint32 x                = pixelNdx % renderSize.x();
+       const deUint32 y                = pixelNdx / renderSize.x();
+       const deUint32 sample   = globalSampleNdx % numCoverageSamples;
+
+       log << tcu::TestLog::Message << "Incorrect " << sampleDesc << " sample (" << sample << ") at pixel (" << x << ", " << y << ")" << tcu::TestLog::EndMessage;
+}
+
+void checkSampleRequirements (Context&                                         context,
+                                                         const VkSampleCountFlagBits   numColorSamples,
+                                                         const VkSampleCountFlagBits   numDepthStencilSamples,
+                                                         const bool                                    requireStandardSampleLocations)
+{
+       const VkPhysicalDeviceLimits& limits = context.getDeviceProperties().limits;
+
+       if ((limits.framebufferColorSampleCounts & numColorSamples) == 0u)
+               TCU_THROW(NotSupportedError, "framebufferColorSampleCounts: sample count not supported");
+
+       if ((limits.framebufferDepthSampleCounts & numDepthStencilSamples) == 0u)
+               TCU_THROW(NotSupportedError, "framebufferDepthSampleCounts: sample count not supported");
+
+       if ((limits.framebufferStencilSampleCounts & numDepthStencilSamples) == 0u)
+               TCU_THROW(NotSupportedError, "framebufferStencilSampleCounts: sample count not supported");
+
+       if ((limits.sampledImageColorSampleCounts & numColorSamples) == 0u)
+               TCU_THROW(NotSupportedError, "sampledImageColorSampleCounts: sample count not supported");
+
+       if ((limits.sampledImageDepthSampleCounts & numDepthStencilSamples) == 0u)
+               TCU_THROW(NotSupportedError, "sampledImageDepthSampleCounts: sample count not supported");
+
+       if ((limits.sampledImageStencilSampleCounts & numDepthStencilSamples) == 0u)
+               TCU_THROW(NotSupportedError, "sampledImageStencilSampleCounts: sample count not supported");
+
+       // This is required to output geometry that is covering a specific sample
+       if (requireStandardSampleLocations && !limits.standardSampleLocations)
+               TCU_THROW(NotSupportedError, "standardSampleLocations: not supported");
+}
+
+void checkImageRequirements (Context&                                          context,
+                                                        const VkFormat                                 format,
+                                                        const VkFormatFeatureFlags             requiredFeatureFlags,
+                                                        const VkImageUsageFlags                requiredUsageFlags,
+                                                        const VkSampleCountFlagBits    requiredSampleCount = VK_SAMPLE_COUNT_1_BIT)
+{
+       const InstanceInterface&        vki                             = context.getInstanceInterface();
+       const VkPhysicalDevice          physicalDevice  = context.getPhysicalDevice();
+       VkImageFormatProperties         imageProperties;
+
+       const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(vki, physicalDevice, format);
+
+       if ((formatProperties.optimalTilingFeatures & requiredFeatureFlags) != requiredFeatureFlags)
+               TCU_THROW(NotSupportedError, (de::toString(format) + ": format features not supported").c_str());
+
+       const VkResult result = vki.getPhysicalDeviceImageFormatProperties(physicalDevice, format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, requiredUsageFlags, (VkImageCreateFlags)0, &imageProperties);
+
+       if (result == VK_ERROR_FORMAT_NOT_SUPPORTED)
+               TCU_THROW(NotSupportedError, (de::toString(format) + ": format not supported").c_str());
+
+       if ((imageProperties.sampleCounts & requiredSampleCount) != requiredSampleCount)
+               TCU_THROW(NotSupportedError, (de::toString(format) + ": sample count not supported").c_str());
+}
+
+//! Used after a render pass color output (draw or resolve)
+void recordCopyOutputImageToBuffer (const DeviceInterface&     vk,
+                                                                       const VkCommandBuffer   cmdBuffer,
+                                                                       const UVec2&                    imageSize,
+                                                                       const VkImage                   srcImage,
+                                                                       const VkBuffer                  dstBuffer)
+{
+       // Image read barrier after color output
+       {
+               const VkImageMemoryBarrier barrier =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                                                                 // VkStructureType            sType;
+                       DE_NULL,                                                                                                                                // const void*                pNext;
+                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                                                                   // VkAccessFlags              srcAccessMask;
+                       VK_ACCESS_TRANSFER_READ_BIT,                                                                                    // VkAccessFlags              dstAccessMask;
+                       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,                                                                   // VkImageLayout              oldLayout;
+                       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,                                                                   // VkImageLayout              newLayout;
+                       VK_QUEUE_FAMILY_IGNORED,                                                                                                // uint32_t                   srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                                                                // uint32_t                   dstQueueFamilyIndex;
+                       srcImage,                                                                                                                               // VkImage                    image;
+                       makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u),   // VkImageSubresourceRange    subresourceRange;
+               };
+
+               vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0u, DE_NULL, 0u, DE_NULL, 1u, &barrier);
+       }
+       // Resolve image -> host buffer
+       {
+               const VkBufferImageCopy region =
+               {
+                       0ull,                                                                                                                           // VkDeviceSize                bufferOffset;
+                       0u,                                                                                                                                     // uint32_t                    bufferRowLength;
+                       0u,                                                                                                                                     // uint32_t                    bufferImageHeight;
+                       makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),      // VkImageSubresourceLayers    imageSubresource;
+                       makeOffset3D(0, 0, 0),                                                                                          // VkOffset3D                  imageOffset;
+                       makeExtent3D(imageSize.x(), imageSize.y(), 1u),                                         // VkExtent3D                  imageExtent;
+               };
+
+               vk.cmdCopyImageToBuffer(cmdBuffer, srcImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstBuffer, 1u, &region);
+       }
+       // Buffer write barrier
+       {
+               const VkBufferMemoryBarrier barrier =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,                // VkStructureType    sType;
+                       DE_NULL,                                                                                // const void*        pNext;
+                       VK_ACCESS_TRANSFER_WRITE_BIT,                                   // VkAccessFlags      srcAccessMask;
+                       VK_ACCESS_HOST_READ_BIT,                                                // VkAccessFlags      dstAccessMask;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           dstQueueFamilyIndex;
+                       dstBuffer,                                                                              // VkBuffer           buffer;
+                       0ull,                                                                                   // VkDeviceSize       offset;
+                       VK_WHOLE_SIZE,                                                                  // VkDeviceSize       size;
+               };
+
+               vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0,
+                                                         0u, DE_NULL, 1u, &barrier, DE_NULL, 0u);
+       }
+}
+
+namespace VerifySamples
+{
+
+//! The parameters that define a test case
+struct TestParams
+{
+       struct SampleCount
+       {
+               VkSampleCountFlagBits   numCoverageSamples;                             //!< VkPipelineMultisampleStateCreateInfo::rasterizationSamples
+               VkSampleCountFlagBits   numColorSamples;                                //!< VkAttachmentDescription::samples and VkImageCreateInfo::samples
+               VkSampleCountFlagBits   numDepthStencilSamples;                 //!< VkAttachmentDescription::samples and VkImageCreateInfo::samples
+       };
+
+       VkFormat                                        colorFormat;                                    //!< Color attachment format
+       VkFormat                                        depthStencilFormat;                             //!< D/S attachment format. Will test both aspects if it's a mixed format
+       bool                                            useProgrammableSampleLocations; //!< Try to use VK_EXT_sample_locations if available
+       std::vector<SampleCount>        perSubpassSamples;                              //!< Will use multiple subpasses if more than one element
+
+       TestParams (void)
+               : colorFormat                                           ()
+               , depthStencilFormat                            ()
+               , useProgrammableSampleLocations        ()
+       {
+       }
+};
+
+//! Common data used by the test
+struct WorkingData
+{
+       struct PerSubpass
+       {
+               deUint32                                                numVertices;                            //!< Number of vertices defined in the vertex buffer
+               Move<VkBuffer>                                  vertexBuffer;
+               MovePtr<Allocation>                             vertexBufferAlloc;
+               Move<VkImage>                                   colorImage;                                     //!< Color image
+               Move<VkImageView>                               colorImageView;                         //!< Color attachment
+               MovePtr<Allocation>                             colorImageAlloc;
+               Move<VkImage>                                   depthStencilImage;                      //!< Depth stencil image
+               Move<VkImageView>                               depthStencilImageView;          //!< Depth stencil attachment
+               Move<VkImageView>                               depthOnlyImageView;                     //!< Depth aspect for shader read
+               Move<VkImageView>                               stencilOnlyImageView;           //!< Stencil aspect for shader read
+               MovePtr<Allocation>                             depthStencilImageAlloc;
+               Move<VkBuffer>                                  compareBuffer;                          //!< Buffer used to verify the images - comparison data
+               MovePtr<Allocation>                             compareBufferAlloc;
+               VkDeviceSize                                    compareBufferSize;
+               Move<VkBuffer>                                  resultBuffer;                           //!< Buffer used to verify the images - results
+               MovePtr<Allocation>                             resultBufferAlloc;
+               VkDeviceSize                                    resultBufferSize;
+               deUint32                                                numResultElements;                      //!< Number of checksums in the result buffer
+               MovePtr<MultisamplePixelGrid>   pixelGrid;                                      //!< Programmable locations
+
+               PerSubpass (void)
+                       : numVertices           ()
+                       , compareBufferSize     ()
+                       , resultBufferSize      ()
+                       , numResultElements     ()
+               {
+               }
+       };
+
+       UVec2                                                                                   renderSize;                                     //!< Size of the framebuffer
+       VkPhysicalDeviceSampleLocationsPropertiesEXT    sampleLocationsProperties;      //!< Used with VK_EXT_sample_locations
+
+       std::vector<de::SharedPtr<PerSubpass> >                 perSubpass;                                     //!< Test may use more than one set of data
+
+       WorkingData (void)
+               : sampleLocationsProperties ()
+       {
+       }
+};
+
+void addVerificationComputeShader (SourceCollections&                  programCollection,
+                                                                  const VkSampleCountFlagBits  numCoverageSamples,
+                                                                  const VkSampleCountFlagBits  numColorSamples,
+                                                                  const VkSampleCountFlagBits  numDepthStencilSamples,
+                                                                  const VkFormat                               depthStencilFormat,
+                                                                  const std::string&                   nameSuffix)
+{
+               const bool                      isColorMS                       = (numColorSamples                != VK_SAMPLE_COUNT_1_BIT);
+               const bool                      isDepthStencilMS        = (numDepthStencilSamples != VK_SAMPLE_COUNT_1_BIT);
+               const std::string       colorBit                        = de::toString(static_cast<deUint32>(VK_IMAGE_ASPECT_COLOR_BIT)) + "u";
+               const std::string       depthBit                        = de::toString(static_cast<deUint32>(VK_IMAGE_ASPECT_DEPTH_BIT)) + "u";
+               const std::string       stencilBit                      = de::toString(static_cast<deUint32>(VK_IMAGE_ASPECT_STENCIL_BIT)) + "u";
+
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "struct CompareData {\n"
+                       << "    vec4  color;\n"
+                       << "    float depth;\n"
+                       << "    uint  stencil;\n"
+                       << "};\n"
+                       << "\n"
+                       << "layout(local_size_x = " << static_cast<deUint32>(numCoverageSamples) << ") in;\n"
+                       // Always use this descriptor layout and ignore unused bindings
+                       << "layout(set = 0, binding = 0, std430) writeonly buffer Output {\n"
+                       << "    uint values[];\n"
+                       << "} sb_out;\n"
+                       << "layout(set = 0, binding = 1, std430) readonly buffer InputCompare {\n"
+                       << "    CompareData     data[];\n"
+                       << "} sb_cmp;\n"
+                       << "layout(set = 0, binding = 2) uniform sampler2D" << (isColorMS ? "MS" : "") << "  colorImage;\n"
+                       << "layout(set = 0, binding = 3) uniform sampler2D" << (isDepthStencilMS ? "MS" : "") <<"  depthImage;\n"
+                       << "layout(set = 0, binding = 4) uniform usampler2D" << (isDepthStencilMS ? "MS" : "") <<" stencilImage;\n"
+                       << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+
+               // Data for each sample in each pixel is laid out linearly (e.g 2 samples):
+               // [pixel(0, 0) sample(0)][pixel(0, 0) sample(1)][pixel(1, 0) sample(0)][pixel(1, 0) sample(1)]...
+
+                       << "    uint  globalIndex = gl_LocalInvocationID.x + gl_WorkGroupSize.x * (gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.x);\n"
+                       << "    ivec2 position    = ivec2(gl_WorkGroupID.x, gl_WorkGroupID.y);\n"
+                       << "    int   sampleNdx   = int(gl_LocalInvocationID.x);\n"
+                       << "    uint  result      = 0u;\n"
+                       << "\n"
+                       << "    // Verify color samples\n"
+                       << "    if (sampleNdx < " << static_cast<deUint32>(numColorSamples) << ")\n"
+                       << "    {\n"
+                       << "        vec4 color     = texelFetch(colorImage, position, sampleNdx);\n"    // for non-MS (1 sample) case, sampleNdx = 0 and will instead be LOD = 0
+                       << "        vec4 diff      = abs(color - sb_cmp.data[globalIndex].color);\n"
+                       << "        vec4 threshold = vec4(0.02);\n"
+                       << "\n"
+                       << "        if (all(lessThan(diff, threshold)))\n"
+                       << "            result |= " << colorBit << ";\n"
+                       << "    }\n"
+                       << "    else\n"
+                       << "        result |= " << colorBit << ";\n"    // Pass, if sample doesn't exist
+                       << "\n";
+
+               if (isDepthFormat(depthStencilFormat))
+               {
+                       src << "    // Verify depth samples\n"
+                               << "    if (sampleNdx < " << static_cast<deUint32>(numDepthStencilSamples) << ")\n"
+                               << "    {\n"
+                               << "        float depth     = texelFetch(depthImage, position, sampleNdx).r;\n"
+                               << "        float diff      = abs(depth - sb_cmp.data[globalIndex].depth);\n"
+                               << "        float threshold = 0.002;\n"
+                               << "\n"
+                               << "        if (diff < threshold)\n"
+                               << "            result |= " << depthBit << ";\n"
+                               << "    }\n"
+                               << "    else\n"
+                               << "        result |= " << depthBit << ";\n"
+                               << "\n";
+               }
+
+               if (isStencilFormat(depthStencilFormat))
+               {
+                       src << "    // Verify stencil samples\n"
+                               << "    if (sampleNdx < " << static_cast<deUint32>(numDepthStencilSamples) << ")\n"
+                               << "    {\n"
+                               << "        uint stencil   = texelFetch(stencilImage, position, sampleNdx).r;\n"
+                               << "        uint diff      = stencil - sb_cmp.data[globalIndex].stencil;\n"
+                               << "\n"
+                               << "        if (diff == 0u)\n"
+                               << "            result |= " << stencilBit << ";\n"
+                               << "    }\n"
+                               << "    else\n"
+                               << "        result |= " << stencilBit << ";\n"
+                               << "\n";
+               }
+
+               src << "    sb_out.values[globalIndex] = result;\n"
+                       << "}\n";
+               programCollection.glslSources.add("comp" + nameSuffix) << glu::ComputeSource(src.str());
+}
+
+//! Get a compact sample count string in format X_Y_Z
+std::string getSampleCountString (const TestParams::SampleCount& samples)
+{
+       std::ostringstream str;
+
+       str << static_cast<deUint32>(samples.numCoverageSamples) << "_"
+               << static_cast<deUint32>(samples.numColorSamples)        << "_"
+               << static_cast<deUint32>(samples.numDepthStencilSamples);
+
+       return str.str();
+}
+
+void initPrograms (SourceCollections& programCollection, const TestParams params)
+{
+       // Vertex shader - position and color
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(location = 0) in  vec4 in_position;\n"
+                       << "layout(location = 1) in  vec4 in_color;\n"
+                       << "layout(location = 0) out vec4 o_color;\n"
+                       << "\n"
+                       << "out gl_PerVertex {\n"
+                       << "    vec4 gl_Position;\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    gl_Position = in_position;\n"
+                       << "    o_color     = in_color;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+       }
+
+       // Fragment shader - output color from VS
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(location = 0) in  vec4 in_color;\n"
+                       << "layout(location = 0) out vec4 o_color;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    o_color = in_color;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
+       }
+
+       // Compute shader - image verification
+       for (deUint32 subpassNdx = 0; subpassNdx < static_cast<deUint32>(params.perSubpassSamples.size()); ++subpassNdx)
+       {
+               const TestParams::SampleCount&  samples = params.perSubpassSamples[subpassNdx];
+               addVerificationComputeShader(programCollection,
+                                                                        samples.numCoverageSamples,
+                                                                        samples.numColorSamples,
+                                                                        samples.numDepthStencilSamples,
+                                                                        params.depthStencilFormat,
+                                                                        "_" + getSampleCountString(samples));
+       }
+}
+
+//! A simple color, depth/stencil draw. Subpasses (if more than one) are independent
+void draw (Context& context, const TestParams& params, WorkingData& wd)
+{
+       const DeviceInterface&  vk                              = context.getDeviceInterface();
+       const VkDevice                  device                  = context.getDevice();
+       const deUint32                  numSubpasses    = static_cast<deUint32>(wd.perSubpass.size());
+
+       Move<VkRenderPass>                                                      renderPass;
+       Move<VkFramebuffer>                                                     framebuffer;
+       std::vector<VkSampleLocationsInfoEXT>           perSubpassSampleLocationsInfo;
+       std::vector<VkAttachmentSampleLocationsEXT>     attachmentSampleLocations;
+       std::vector<VkSubpassSampleLocationsEXT>        subpassSampleLocations;
+
+       if (params.useProgrammableSampleLocations)
+       for (deUint32 subpassNdx = 0; subpassNdx < numSubpasses; ++subpassNdx)
+       {
+               perSubpassSampleLocationsInfo.push_back(makeSampleLocationsInfo(*wd.perSubpass[subpassNdx]->pixelGrid));
+       }
+
+       // Create a render pass and a framebuffer
+       {
+               std::vector<VkSubpassDescription>               subpasses;
+               std::vector<VkImageView>                                attachments;
+               std::vector<VkAttachmentDescription>    attachmentDescriptions;
+               std::vector<VkAttachmentReference>              attachmentReferences;
+
+               // Reserve capacity to avoid invalidating pointers to elements
+               attachmentReferences.reserve(numSubpasses * 2);
+
+               for (deUint32 subpassNdx = 0; subpassNdx < numSubpasses; ++subpassNdx)
+               {
+                       attachments.push_back(wd.perSubpass[subpassNdx]->colorImageView.get());
+                       attachments.push_back(wd.perSubpass[subpassNdx]->depthStencilImageView.get());
+
+                       attachmentDescriptions.push_back(makeAttachmentDescription(
+                               (VkAttachmentDescriptionFlags)0,                                                                // VkAttachmentDescriptionFlags         flags;
+                               params.colorFormat,                                                                                             // VkFormat                                                     format;
+                               params.perSubpassSamples[subpassNdx].numColorSamples,                   // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_CLEAR,                                                                    // VkAttachmentLoadOp                           loadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                                                   // VkAttachmentStoreOp                          storeOp;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                                                // VkAttachmentLoadOp                           stencilLoadOp;
+                               VK_ATTACHMENT_STORE_OP_DONT_CARE,                                                               // VkAttachmentStoreOp                          stencilStoreOp;
+                               VK_IMAGE_LAYOUT_UNDEFINED,                                                                              // VkImageLayout                                        initialLayout;
+                               VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL                                                // VkImageLayout                                        finalLayout;
+                       ));
+
+                       attachmentDescriptions.push_back(makeAttachmentDescription(
+                               (VkAttachmentDescriptionFlags)0,                                                                // VkAttachmentDescriptionFlags         flags;
+                               params.depthStencilFormat,                                                                              // VkFormat                                                     format;
+                               params.perSubpassSamples[subpassNdx].numDepthStencilSamples,    // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_CLEAR,                                                                    // VkAttachmentLoadOp                           loadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                                                   // VkAttachmentStoreOp                          storeOp;
+                               VK_ATTACHMENT_LOAD_OP_CLEAR,                                                                    // VkAttachmentLoadOp                           stencilLoadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                                                   // VkAttachmentStoreOp                          stencilStoreOp;
+                               VK_IMAGE_LAYOUT_UNDEFINED,                                                                              // VkImageLayout                                        initialLayout;
+                               VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL                                 // VkImageLayout                                        finalLayout;
+                       ));
+
+                       attachmentReferences.push_back(makeAttachmentReference(static_cast<deUint32>(attachmentReferences.size()),      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
+                       const VkAttachmentReference* colorRef = &attachmentReferences.back();
+
+                       attachmentReferences.push_back(makeAttachmentReference(static_cast<deUint32>(attachmentReferences.size()),      VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL));
+                       const VkAttachmentReference* depthStencilRef = &attachmentReferences.back();
+
+                       if (params.useProgrammableSampleLocations)
+                       {
+                               const VkAttachmentSampleLocationsEXT newAttachmentSampleLocations =
+                               {
+                                       attachmentReferences.back().attachment,                 // uint32_t                    attachmentIndex;
+                                       perSubpassSampleLocationsInfo[subpassNdx],              // VkSampleLocationsInfoEXT    sampleLocationsInfo;
+                               };
+                               attachmentSampleLocations.push_back(newAttachmentSampleLocations);
+
+                               const VkSubpassSampleLocationsEXT newSubpassSampleLocations =
+                               {
+                                       subpassNdx,                                                                             // uint32_t                    subpassIndex;
+                                       perSubpassSampleLocationsInfo[subpassNdx],              // VkSampleLocationsInfoEXT    sampleLocationsInfo;
+                               };
+                               subpassSampleLocations.push_back(newSubpassSampleLocations);
+                       }
+
+                       const VkSubpassDescription subpassDescription =
+                       {
+                               (VkSubpassDescriptionFlags)0,                                           // VkSubpassDescriptionFlags       flags;
+                               VK_PIPELINE_BIND_POINT_GRAPHICS,                                        // VkPipelineBindPoint             pipelineBindPoint;
+                               0u,                                                                                                     // uint32_t                        inputAttachmentCount;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pInputAttachments;
+                               1u,                                                                                                     // uint32_t                        colorAttachmentCount;
+                               colorRef,                                                                                       // const VkAttachmentReference*    pColorAttachments;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pResolveAttachments;
+                               depthStencilRef,                                                                        // const VkAttachmentReference*    pDepthStencilAttachment;
+                               0u,                                                                                                     // uint32_t                        preserveAttachmentCount;
+                               DE_NULL,                                                                                        // const uint32_t*                 pPreserveAttachments;
+                       };
+
+                       subpasses.push_back(subpassDescription);
+               }
+
+               // Assume there are no dependencies between subpasses
+               const VkRenderPassCreateInfo renderPassInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,                              // VkStructureType                                      sType;
+                       DE_NULL,                                                                                                // const void*                                          pNext;
+                       (VkRenderPassCreateFlags)0,                                                             // VkRenderPassCreateFlags                      flags;
+                       static_cast<deUint32>(attachmentDescriptions.size()),   // deUint32                                                     attachmentCount;
+                       dataOrNullPtr(attachmentDescriptions),                                  // const VkAttachmentDescription*       pAttachments;
+                       static_cast<deUint32>(subpasses.size()),                                // deUint32                                                     subpassCount;
+                       dataOrNullPtr(subpasses),                                                               // const VkSubpassDescription*          pSubpasses;
+                       0u,                                                                                                             // deUint32                                                     dependencyCount;
+                       DE_NULL,                                                                                                // const VkSubpassDependency*           pDependencies;
+               };
+
+               renderPass  = createRenderPass(vk, device, &renderPassInfo);
+               framebuffer = makeFramebuffer (vk, device, *renderPass, static_cast<deUint32>(attachments.size()), dataOrNullPtr(attachments), wd.renderSize.x(), wd.renderSize.y());
+       }
+
+       const Unique<VkShaderModule>    vertexModule    (createShaderModule(vk, device, context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule>    fragmentModule  (createShaderModule(vk, device, context.getBinaryCollection().get("frag"), 0u));
+       const Unique<VkPipelineLayout>  pipelineLayout  (makePipelineLayout(vk, device));
+
+       typedef SharedPtr<Unique<VkPipeline> > PipelineSp;
+       std::vector<PipelineSp> pipelines;
+
+       for (deUint32 subpassNdx = 0; subpassNdx < numSubpasses; ++subpassNdx)
+       {
+               const VkSampleLocationsInfoEXT* pSampleLocationsInfo = (params.useProgrammableSampleLocations ? &perSubpassSampleLocationsInfo[subpassNdx] : DE_NULL);
+
+               pipelines.push_back(PipelineSp(new Unique<VkPipeline>(
+                       makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertexModule, *fragmentModule, /*use vertex input*/ true, subpassNdx,
+                                                                wd.renderSize, getImageAspectFlags(params.depthStencilFormat), params.perSubpassSamples[subpassNdx].numCoverageSamples,
+                                                                /*use sample shading*/ true, pSampleLocationsInfo))));
+       }
+
+       const Unique<VkCommandPool>             cmdPool         (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, context.getUniversalQueueFamilyIndex()));
+       const Unique<VkCommandBuffer>   cmdBuffer       (makeCommandBuffer(vk, device, *cmdPool));
+
+       beginCommandBuffer(vk, *cmdBuffer);
+
+       {
+               std::vector<VkClearValue> clearValues;
+
+               for (deUint32 subpassNdx = 0; subpassNdx < numSubpasses; ++subpassNdx)
+               {
+                       clearValues.push_back(makeClearValueColorF32(0.0f, 0.0f, 0.0f, 1.0f));
+                       clearValues.push_back(makeClearValueDepthStencil(1.0f, 0u));
+               }
+
+               const VkRect2D renderArea =
+               {
+                       { 0u, 0u },
+                       { wd.renderSize.x(), wd.renderSize.y() }
+               };
+
+               VkRenderPassBeginInfo renderPassBeginInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,                       // VkStructureType         sType;
+                       DE_NULL,                                                                                        // const void*             pNext;
+                       *renderPass,                                                                            // VkRenderPass            renderPass;
+                       *framebuffer,                                                                           // VkFramebuffer           framebuffer;
+                       renderArea,                                                                                     // VkRect2D                renderArea;
+                       static_cast<deUint32>(clearValues.size()),                      // uint32_t                clearValueCount;
+                       dataOrNullPtr(clearValues),                                                     // const VkClearValue*     pClearValues;
+               };
+
+               if (params.useProgrammableSampleLocations)
+               {
+                       const VkRenderPassSampleLocationsBeginInfoEXT renderPassSampleLocationsBeginInfo =
+                       {
+                               VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT,  // VkStructureType                          sType;
+                               DE_NULL,                                                                                                                // const void*                              pNext;
+                               static_cast<deUint32>(attachmentSampleLocations.size()),                // uint32_t                                 attachmentInitialSampleLocationsCount;
+                               dataOrNullPtr(attachmentSampleLocations),                                               // const VkAttachmentSampleLocationsEXT*    pAttachmentInitialSampleLocations;
+                               static_cast<deUint32>(subpassSampleLocations.size()),                   // uint32_t                                 postSubpassSampleLocationsCount;
+                               dataOrNullPtr(subpassSampleLocations),                                                  // const VkSubpassSampleLocationsEXT*       pPostSubpassSampleLocations;
+                       };
+
+                       renderPassBeginInfo.pNext = &renderPassSampleLocationsBeginInfo;
+
+                       vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+               }
+               else
+                       vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+       }
+
+       for (deUint32 subpassNdx = 0; subpassNdx < numSubpasses; ++subpassNdx)
+       {
+               if (subpassNdx != 0)
+                       vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+
+               const VkDeviceSize vertexBufferOffset = 0ull;
+               vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &wd.perSubpass[subpassNdx]->vertexBuffer.get(), &vertexBufferOffset);
+
+               vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]);
+
+               vk.cmdDraw(*cmdBuffer, wd.perSubpass[subpassNdx]->numVertices, 1u, 0u, 0u);
+       }
+
+       vk.cmdEndRenderPass(*cmdBuffer);
+
+       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+       submitCommandsAndWait(vk, device, context.getUniversalQueue(), *cmdBuffer);
+}
+
+void dispatchImageCheck (Context& context, const TestParams& params, WorkingData& wd, const deUint32 subpassNdx)
+{
+       const DeviceInterface&          vk                      = context.getDeviceInterface();
+       const VkDevice                          device          = context.getDevice();
+       WorkingData::PerSubpass&        subpassData     = *wd.perSubpass[subpassNdx];
+
+       const Unique<VkSampler> defaultSampler  (makeSampler(vk, device));
+
+       // Create descriptor set
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               DescriptorSetLayoutBuilder()
+               .addSingleBinding               (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,                     VK_SHADER_STAGE_COMPUTE_BIT)
+               .addSingleBinding               (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,                     VK_SHADER_STAGE_COMPUTE_BIT)
+               .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,     VK_SHADER_STAGE_COMPUTE_BIT, &defaultSampler.get())
+               .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,     VK_SHADER_STAGE_COMPUTE_BIT, &defaultSampler.get())
+               .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,     VK_SHADER_STAGE_COMPUTE_BIT, &defaultSampler.get())
+               .build(vk, device));
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               DescriptorPoolBuilder()
+               .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2u)
+               .addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 3u)
+               .build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       const Unique<VkDescriptorSet> descriptorSet(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
+
+       {
+               const VkDescriptorBufferInfo    compareBufferInfo       = makeDescriptorBufferInfo(*subpassData.compareBuffer, 0ull, subpassData.compareBufferSize);
+               const VkDescriptorBufferInfo    resultBufferInfo        = makeDescriptorBufferInfo(*subpassData.resultBuffer, 0ull, subpassData.resultBufferSize);
+               const VkDescriptorImageInfo             colorImageInfo          = makeDescriptorImageInfo(DE_NULL, *subpassData.colorImageView,                 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+               const VkDescriptorImageInfo             depthImageInfo          = makeDescriptorImageInfo(DE_NULL, *subpassData.depthOnlyImageView,             VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+               const VkDescriptorImageInfo             stencilImageInfo        = makeDescriptorImageInfo(DE_NULL, *subpassData.stencilOnlyImageView,   VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+
+               DescriptorSetUpdateBuilder      builder;
+
+               builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultBufferInfo);
+               builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &compareBufferInfo);
+               builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &colorImageInfo);
+
+               if (subpassData.depthOnlyImageView)
+                       builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(3u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &depthImageInfo);
+
+               if (subpassData.stencilOnlyImageView)
+                       builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(4u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &stencilImageInfo);
+
+               builder.update(vk, device);
+       }
+
+       // Pipeline
+
+       const std::string                               shaderName              ("comp_" + getSampleCountString(params.perSubpassSamples[subpassNdx]));
+       const Unique<VkShaderModule>    shaderModule    (createShaderModule(vk, device, context.getBinaryCollection().get(shaderName), 0u));
+       const Unique<VkPipelineLayout>  pipelineLayout  (makePipelineLayout(vk, device, *descriptorSetLayout));
+       const Unique<VkPipeline>                pipeline                (makeComputePipeline(vk, device, *pipelineLayout, *shaderModule, DE_NULL));
+
+       const Unique<VkCommandPool>             cmdPool         (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, context.getUniversalQueueFamilyIndex()));
+       const Unique<VkCommandBuffer>   cmdBuffer       (makeCommandBuffer(vk, device, *cmdPool));
+
+       beginCommandBuffer(vk, *cmdBuffer);
+
+       vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+       vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
+
+       vk.cmdDispatch(*cmdBuffer, wd.renderSize.x(), wd.renderSize.y(), 1u);
+
+       {
+               const VkBufferMemoryBarrier barrier =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,                // VkStructureType    sType;
+                       DE_NULL,                                                                                // const void*        pNext;
+                       VK_ACCESS_SHADER_WRITE_BIT,                                             // VkAccessFlags      srcAccessMask;
+                       VK_ACCESS_HOST_READ_BIT,                                                // VkAccessFlags      dstAccessMask;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           dstQueueFamilyIndex;
+                       *subpassData.resultBuffer,                                              // VkBuffer           buffer;
+                       0ull,                                                                                   // VkDeviceSize       offset;
+                       VK_WHOLE_SIZE,                                                                  // VkDeviceSize       size;
+               };
+
+               vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0,
+                       (const VkMemoryBarrier*)DE_NULL, 1u, &barrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
+       }
+
+       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+       submitCommandsAndWait(vk, device, context.getUniversalQueue(), *cmdBuffer);
+
+       invalidateMappedMemoryRange(vk, device, subpassData.resultBufferAlloc->getMemory(), subpassData.resultBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+}
+
+void createPerSubpassData (Context& context, const TestParams& params, WorkingData& wd, const deUint32 subpassNdx)
+{
+       const DeviceInterface&                  vk                      = context.getDeviceInterface();
+       const VkDevice                                  device          = context.getDevice();
+       MovePtr<Allocator>                              allocator   = MovePtr<Allocator>(new SimpleAllocator(vk, device, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())));
+       const TestParams::SampleCount&  samples         = params.perSubpassSamples[subpassNdx];
+       WorkingData::PerSubpass&                subpassData     = *wd.perSubpass[subpassNdx];
+
+       // Create images
+       {
+
+               const VkImageUsageFlags colorImageUsageFlags            = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT             | VK_IMAGE_USAGE_SAMPLED_BIT;
+               const VkImageUsageFlags depthStencilImageUsageFlags     = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+
+               checkImageRequirements (context,
+                                                               params.colorFormat,
+                                                               VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
+                                                               colorImageUsageFlags,
+                                                               samples.numColorSamples);
+
+               subpassData.colorImage          = makeImage(vk, device, params.colorFormat, wd.renderSize, samples.numColorSamples, colorImageUsageFlags);
+               subpassData.colorImageAlloc     = bindImage(vk, device, *allocator, *subpassData.colorImage, MemoryRequirement::Any);
+               subpassData.colorImageView      = makeImageView(vk, device, *subpassData.colorImage, VK_IMAGE_VIEW_TYPE_2D, params.colorFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
+
+               checkImageRequirements (context,
+                                                               params.depthStencilFormat,
+                                                               VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
+                                                               depthStencilImageUsageFlags,
+                                                               samples.numDepthStencilSamples);
+
+               subpassData.depthStencilImage           = makeImage(vk, device, params.depthStencilFormat, wd.renderSize, samples.numDepthStencilSamples, depthStencilImageUsageFlags);
+               subpassData.depthStencilImageAlloc      = bindImage(vk, device, *allocator, *subpassData.depthStencilImage, MemoryRequirement::Any);
+               subpassData.depthStencilImageView       = makeImageView(vk, device, *subpassData.depthStencilImage, VK_IMAGE_VIEW_TYPE_2D, params.depthStencilFormat, makeImageSubresourceRange(getImageAspectFlags(params.depthStencilFormat), 0u, 1u, 0u, 1u));
+
+               if (isDepthFormat(params.depthStencilFormat))
+                       subpassData.depthOnlyImageView  = makeImageView(vk, device, *subpassData.depthStencilImage, VK_IMAGE_VIEW_TYPE_2D, params.depthStencilFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u));
+
+               if (isStencilFormat(params.depthStencilFormat))
+                       subpassData.stencilOnlyImageView        = makeImageView(vk, device, *subpassData.depthStencilImage, VK_IMAGE_VIEW_TYPE_2D, params.depthStencilFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u));
+       }
+
+       // Create vertex and comparison buffers
+       {
+               const deUint32                                  seed            = 123 + 19 * subpassNdx;
+               const std::vector<CompareData>  compareData     = generateCompareData(seed, wd.renderSize, samples.numCoverageSamples, samples.numColorSamples, samples.numDepthStencilSamples);
+
+               subpassData.compareBufferSize   = static_cast<VkDeviceSize>(sizeof(CompareData) * compareData.size());
+               subpassData.compareBuffer               = makeBuffer(vk, device, subpassData.compareBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+               subpassData.compareBufferAlloc  = bindBuffer(vk, device, *allocator, *subpassData.compareBuffer, MemoryRequirement::HostVisible);
+
+               deMemcpy(subpassData.compareBufferAlloc->getHostPtr(), dataOrNullPtr(compareData), static_cast<std::size_t>(subpassData.compareBufferSize));
+               flushMappedMemoryRange(vk, device, subpassData.compareBufferAlloc->getMemory(), subpassData.compareBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+
+               subpassData.numResultElements   = static_cast<deUint32>(compareData.size());
+               subpassData.resultBufferSize    = static_cast<VkDeviceSize>(sizeof(deUint32) * compareData.size());
+               subpassData.resultBuffer                = makeBuffer(vk, device, subpassData.resultBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+               subpassData.resultBufferAlloc   = bindBuffer(vk, device, *allocator, *subpassData.resultBuffer, MemoryRequirement::HostVisible);
+
+               deMemset(subpassData.resultBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(subpassData.resultBufferSize));
+               flushMappedMemoryRange(vk, device, subpassData.resultBufferAlloc->getMemory(), subpassData.resultBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+
+               std::vector<PositionColor> vertices;
+
+               if (params.useProgrammableSampleLocations)
+               {
+                       subpassData.pixelGrid = MovePtr<MultisamplePixelGrid>(new MultisamplePixelGrid(UVec2(wd.sampleLocationsProperties.maxSampleLocationGridSize.width,
+                                                                                                                                                                                                wd.sampleLocationsProperties.maxSampleLocationGridSize.height),
+                                                                                                                                                                                  samples.numCoverageSamples));
+
+                       const deUint32 locationsSeed = 211 + 4 * subpassNdx;
+                       fillSampleLocationsRandom(*subpassData.pixelGrid, wd.sampleLocationsProperties.sampleLocationSubPixelBits, locationsSeed);
+                       vertices = generateSubpixelTriangles(wd.renderSize, compareData, getSampleLocations(*subpassData.pixelGrid, wd.renderSize));
+               }
+               else
+               {
+                       const std::vector<Vec2> locations = genFramebufferStandardSampleLocations(samples.numCoverageSamples, wd.renderSize);
+                       vertices = generateSubpixelTriangles(wd.renderSize, compareData, locations);
+               }
+
+               const VkDeviceSize      vertexBufferSize = static_cast<VkDeviceSize>(sizeof(vertices[0]) * vertices.size());
+               subpassData.numVertices                 = static_cast<deUint32>(vertices.size());
+               subpassData.vertexBuffer                        = makeBuffer(vk, device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+               subpassData.vertexBufferAlloc   = bindBuffer(vk, device, *allocator, *subpassData.vertexBuffer, MemoryRequirement::HostVisible);
+
+               deMemcpy(subpassData.vertexBufferAlloc->getHostPtr(), dataOrNullPtr(vertices), static_cast<std::size_t>(vertexBufferSize));
+               flushMappedMemoryRange(vk, device, subpassData.vertexBufferAlloc->getMemory(), subpassData.vertexBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+       }
+}
+
+void checkRequirements (Context& context, TestParams params)
+{
+       context.requireDeviceFunctionality("VK_AMD_mixed_attachment_samples");
+
+       if (params.useProgrammableSampleLocations)
+               context.requireDeviceFunctionality("VK_EXT_sample_locations");
+
+       for (deUint32 subpassNdx = 0; subpassNdx < static_cast<deUint32>(params.perSubpassSamples.size()); ++subpassNdx)
+       {
+               const TestParams::SampleCount& samples = params.perSubpassSamples[subpassNdx];
+               checkSampleRequirements(context, samples.numColorSamples, samples.numDepthStencilSamples, !params.useProgrammableSampleLocations);
+       }
+}
+
+//! Verify the values of all samples in all attachments.
+tcu::TestStatus test (Context& context, const TestParams params)
+{
+       WorkingData wd;
+       wd.renderSize   = UVec2(2, 2);  // Use a very small image, as we will verify all samples for all pixels
+
+       // Query state related to programmable sample locations
+       if (params.useProgrammableSampleLocations)
+       {
+               const InstanceInterface&        vki                             = context.getInstanceInterface();
+               const VkPhysicalDevice          physicalDevice  = context.getPhysicalDevice();
+
+               wd.sampleLocationsProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT;
+               wd.sampleLocationsProperties.pNext = DE_NULL;
+
+               VkPhysicalDeviceProperties2 properties =
+               {
+                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR,         // VkStructureType               sType;
+                       &wd.sampleLocationsProperties,                                                  // void*                         pNext;
+                       VkPhysicalDeviceProperties(),                                                   // VkPhysicalDeviceProperties    properties;
+               };
+
+               vki.getPhysicalDeviceProperties2(physicalDevice, &properties);
+
+               for (deUint32 subpassNdx = 0; subpassNdx < static_cast<deUint32>(params.perSubpassSamples.size()); ++subpassNdx)
+               {
+                       if ((wd.sampleLocationsProperties.sampleLocationSampleCounts & params.perSubpassSamples[subpassNdx].numCoverageSamples) == 0u)
+                               TCU_THROW(NotSupportedError, "VkSampleLocationsPropertiesAMD: sample count not supported");
+               }
+       }
+
+       // Create subpass data
+       for (deUint32 subpassNdx = 0; subpassNdx < static_cast<deUint32>(params.perSubpassSamples.size()); ++subpassNdx)
+       {
+               wd.perSubpass.push_back(SharedPtr<WorkingData::PerSubpass>(new WorkingData::PerSubpass()));
+               createPerSubpassData(context, params, wd, subpassNdx);
+       }
+
+       // Draw test geometry
+       draw (context, params, wd);
+
+       // Verify images with a compute shader
+       for (deUint32 subpassNdx = 0; subpassNdx < static_cast<deUint32>(params.perSubpassSamples.size()); ++subpassNdx)
+               dispatchImageCheck (context, params, wd, subpassNdx);
+
+       // Test checksums
+       for (deUint32 subpassNdx = 0; subpassNdx < static_cast<deUint32>(params.perSubpassSamples.size()); ++subpassNdx)
+       {
+               const deUint32* const   pSampleChecksumBase     = static_cast<deUint32*>(wd.perSubpass[subpassNdx]->resultBufferAlloc->getHostPtr());
+               const bool                              hasDepth                        = isDepthFormat(params.depthStencilFormat);
+               const bool                              hasStencil                      = isStencilFormat(params.depthStencilFormat);
+               bool                                    allOk                           = true;
+
+               context.getTestContext().getLog() << tcu::TestLog::Message << "Verify images in subpass " << subpassNdx << tcu::TestLog::EndMessage;
+
+               for (deUint32 globalSampleNdx = 0; globalSampleNdx < wd.perSubpass[subpassNdx]->numResultElements; ++globalSampleNdx)
+               {
+                       const TestParams::SampleCount&  samples  = params.perSubpassSamples[subpassNdx];
+                       const deUint32                                  checksum = pSampleChecksumBase[globalSampleNdx];
+
+                       if ((checksum & VK_IMAGE_ASPECT_COLOR_BIT) == 0u)
+                       {
+                               reportSampleError(context.getTestContext().getLog(), "color", wd.renderSize, samples.numCoverageSamples, globalSampleNdx);
+                               allOk = false;
+                       }
+
+                       if (hasDepth && ((checksum & VK_IMAGE_ASPECT_DEPTH_BIT) == 0u))
+                       {
+                               reportSampleError(context.getTestContext().getLog(), "depth", wd.renderSize, samples.numCoverageSamples, globalSampleNdx);
+                               allOk = false;
+                       }
+
+                       if (hasStencil && ((checksum & VK_IMAGE_ASPECT_STENCIL_BIT) == 0u))
+                       {
+                               reportSampleError(context.getTestContext().getLog(), "stencil", wd.renderSize, samples.numCoverageSamples, globalSampleNdx);
+                               allOk = false;
+                       }
+               }
+
+               if (!allOk)
+                       return tcu::TestStatus::fail("Multisampled image has incorrect samples");
+       }
+
+       return tcu::TestStatus::pass("Pass");
+}
+
+} // VerifySamples
+
+namespace ShaderBuiltins
+{
+
+struct TestParams
+{
+       VkSampleCountFlagBits           numCoverageSamples;                     //!< VkPipelineMultisampleStateCreateInfo::rasterizationSamples
+       VkSampleCountFlagBits           numColorSamples;                        //!< VkAttachmentDescription::samples and VkImageCreateInfo::samples
+       VkSampleCountFlagBits           numDepthStencilSamples;         //!< VkAttachmentDescription::samples and VkImageCreateInfo::samples
+       VkFormat                                        colorFormat;                            //!< Color attachment format
+       VkFormat                                        depthStencilFormat;                     //!< D/S attachment format. Will test both aspects if it's a mixed format
+};
+
+struct WorkingData
+{
+       UVec2                                           renderSize;                                     //!< Size of the framebuffer
+       deUint32                                        numVertices;                            //!< Number of vertices defined in the vertex buffer
+       Move<VkBuffer>                          vertexBuffer;
+       MovePtr<Allocation>                     vertexBufferAlloc;
+       Move<VkImage>                           colorImage;                                     //!< Color image
+       Move<VkImageView>                       colorImageView;                         //!< Color attachment
+       MovePtr<Allocation>                     colorImageAlloc;
+       Move<VkImage>                           depthStencilImage;                      //!< Depth stencil image
+       Move<VkImageView>                       depthStencilImageView;          //!< Depth stencil attachment
+       Move<VkImageView>                       depthOnlyImageView;                     //!< Depth aspect for shader read
+       Move<VkImageView>                       stencilOnlyImageView;           //!< Stencil aspect for shader read
+       MovePtr<Allocation>                     depthStencilImageAlloc;
+       Move<VkImage>                           resolveImage;                           //!< Resolve image
+       Move<VkImageView>                       resolveImageView;                       //!< Resolve attachment
+       MovePtr<Allocation>                     resolveImageAlloc;
+       Move<VkBuffer>                          colorBuffer;                            //!< Buffer used to copy resolve output
+       MovePtr<Allocation>                     colorBufferAlloc;
+       VkDeviceSize                            colorBufferSize;
+
+       WorkingData (void)
+               : numVertices           ()
+       {
+       }
+};
+
+void initPrograms (SourceCollections& programCollection, const TestParams params)
+{
+       // Vertex shader - no vertex data
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "out gl_PerVertex {\n"
+                       << "    vec4 gl_Position;\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       // Specify an oversized triangle covering the whole viewport.
+                       << "    switch (gl_VertexIndex)\n"
+                       << "    {\n"
+                       << "        case 0:\n"
+                       << "            gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);\n"
+                       << "            break;\n"
+                       << "        case 1:\n"
+                       << "            gl_Position = vec4(-1.0,  3.0, 0.0, 1.0);\n"
+                       << "            break;\n"
+                       << "        case 2:\n"
+                       << "            gl_Position = vec4( 3.0, -1.0, 0.0, 1.0);\n"
+                       << "            break;\n"
+                       << "    }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+       }
+
+       // Fragment shader
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(location = 0) out vec4 o_color;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    vec4 col = vec4(0.0, 0.0, 0.0, 1.0);\n"
+                       << "\n";
+
+               if (params.numColorSamples == VK_SAMPLE_COUNT_1_BIT)
+               {
+                       const deUint32 expectedMask = ((1u << static_cast<deUint32>(params.numCoverageSamples)) - 1u);
+
+                       // Expect all covered samples to be lit, the rest is zero
+                       src << "    if (gl_SampleMaskIn[0] == " << expectedMask << ")\n"
+                               << "        col.g = 1.0;\n"
+                               << "    else\n"
+                               << "        col.r = 1.0;\n";
+               }
+               else
+               {
+                       // Expect only a matching sample to be lit
+                       src << "    if (gl_SampleMaskIn[0] == (1 << gl_SampleID))\n"
+                               << "        col.g = 1.0;\n"
+                               << "    else\n"
+                               << "        col.r = 1.0;\n"
+                               << "\n"
+                               << "    if (gl_SampleID >= " << static_cast<deUint32>(params.numColorSamples) << ")  // number of color samples, should not happen\n"
+                               << "        col.b = 1.0;\n";
+               }
+
+               src << "\n"
+                       << "    o_color = col;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
+       }
+}
+
+//! A simple color, depth/stencil draw. Single subpass, no vertex input
+void drawResolve (Context& context, const TestParams& params, WorkingData& wd)
+{
+       const DeviceInterface&  vk                      = context.getDeviceInterface();
+       const VkDevice                  device          = context.getDevice();
+       const bool                              needResolve     = (params.numColorSamples != VK_SAMPLE_COUNT_1_BIT);
+
+       Move<VkRenderPass>              renderPass;
+       Move<VkFramebuffer>             framebuffer;
+
+       // Create a render pass and a framebuffer
+       {
+               std::vector<VkImageView>                                attachments;
+               std::vector<VkAttachmentDescription>    attachmentDescriptions;
+
+               attachments.push_back(*wd.colorImageView);
+               attachments.push_back(*wd.depthStencilImageView);
+
+               attachmentDescriptions.push_back(makeAttachmentDescription(
+                       (VkAttachmentDescriptionFlags)0,                                                // VkAttachmentDescriptionFlags         flags;
+                       params.colorFormat,                                                                             // VkFormat                                                     format;
+                       params.numColorSamples,                                                                 // VkSampleCountFlagBits                        samples;
+                       VK_ATTACHMENT_LOAD_OP_CLEAR,                                                    // VkAttachmentLoadOp                           loadOp;
+                       VK_ATTACHMENT_STORE_OP_STORE,                                                   // VkAttachmentStoreOp                          storeOp;
+                       VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                                // VkAttachmentLoadOp                           stencilLoadOp;
+                       VK_ATTACHMENT_STORE_OP_DONT_CARE,                                               // VkAttachmentStoreOp                          stencilStoreOp;
+                       VK_IMAGE_LAYOUT_UNDEFINED,                                                              // VkImageLayout                                        initialLayout;
+                       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL                                    // VkImageLayout                                        finalLayout;
+               ));
+
+               attachmentDescriptions.push_back(makeAttachmentDescription(
+                       (VkAttachmentDescriptionFlags)0,                                                // VkAttachmentDescriptionFlags         flags;
+                       params.depthStencilFormat,                                                              // VkFormat                                                     format;
+                       params.numDepthStencilSamples,                                                  // VkSampleCountFlagBits                        samples;
+                       VK_ATTACHMENT_LOAD_OP_CLEAR,                                                    // VkAttachmentLoadOp                           loadOp;
+                       VK_ATTACHMENT_STORE_OP_STORE,                                                   // VkAttachmentStoreOp                          storeOp;
+                       VK_ATTACHMENT_LOAD_OP_CLEAR,                                                    // VkAttachmentLoadOp                           stencilLoadOp;
+                       VK_ATTACHMENT_STORE_OP_STORE,                                                   // VkAttachmentStoreOp                          stencilStoreOp;
+                       VK_IMAGE_LAYOUT_UNDEFINED,                                                              // VkImageLayout                                        initialLayout;
+                       VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL                // VkImageLayout                                        finalLayout;
+               ));
+
+               if (needResolve)
+               {
+                       attachments.push_back(*wd.resolveImageView);
+
+                       attachmentDescriptions.push_back(makeAttachmentDescription(
+                               (VkAttachmentDescriptionFlags)0,                                        // VkAttachmentDescriptionFlags         flags;
+                               params.colorFormat,                                                                     // VkFormat                                                     format;
+                               VK_SAMPLE_COUNT_1_BIT,                                                          // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                        // VkAttachmentLoadOp                           loadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                           // VkAttachmentStoreOp                          storeOp;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                        // VkAttachmentLoadOp                           stencilLoadOp;
+                               VK_ATTACHMENT_STORE_OP_DONT_CARE,                                       // VkAttachmentStoreOp                          stencilStoreOp;
+                               VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                                        initialLayout;
+                               VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL                            // VkImageLayout                                        finalLayout;
+                       ));
+               }
+
+               const VkAttachmentReference     colorRef                = makeAttachmentReference(0u, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+               const VkAttachmentReference     depthStencilRef = makeAttachmentReference(1u, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
+               const VkAttachmentReference     resolveRef              = makeAttachmentReference(2u, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+
+               const VkSubpassDescription subpassDescription =
+               {
+                       (VkSubpassDescriptionFlags)0,                                                   // VkSubpassDescriptionFlags       flags;
+                       VK_PIPELINE_BIND_POINT_GRAPHICS,                                                // VkPipelineBindPoint             pipelineBindPoint;
+                       0u,                                                                                                             // uint32_t                        inputAttachmentCount;
+                       DE_NULL,                                                                                                // const VkAttachmentReference*    pInputAttachments;
+                       1u,                                                                                                             // uint32_t                        colorAttachmentCount;
+                       &colorRef,                                                                                              // const VkAttachmentReference*    pColorAttachments;
+                       (needResolve ? &resolveRef : DE_NULL),                                  // const VkAttachmentReference*    pResolveAttachments;
+                       &depthStencilRef,                                                                               // const VkAttachmentReference*    pDepthStencilAttachment;
+                       0u,                                                                                                             // uint32_t                        preserveAttachmentCount;
+                       DE_NULL,                                                                                                // const uint32_t*                 pPreserveAttachments;
+               };
+
+               // Assume there are no dependencies between subpasses
+               VkRenderPassCreateInfo renderPassInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,                              // VkStructureType                                      sType;
+                       DE_NULL,                                                                                                // const void*                                          pNext;
+                       (VkRenderPassCreateFlags)0,                                                             // VkRenderPassCreateFlags                      flags;
+                       static_cast<deUint32>(attachmentDescriptions.size()),   // deUint32                                                     attachmentCount;
+                       dataOrNullPtr(attachmentDescriptions),                                  // const VkAttachmentDescription*       pAttachments;
+                       1u,                                                                                                             // deUint32                                                     subpassCount;
+                       &subpassDescription,                                                                    // const VkSubpassDescription*          pSubpasses;
+                       0u,                                                                                                             // deUint32                                                     dependencyCount;
+                       DE_NULL,                                                                                                // const VkSubpassDependency*           pDependencies;
+               };
+
+               renderPass  = createRenderPass(vk, device, &renderPassInfo);
+               framebuffer = makeFramebuffer (vk, device, *renderPass, static_cast<deUint32>(attachments.size()), dataOrNullPtr(attachments), wd.renderSize.x(), wd.renderSize.y());
+       }
+
+       const Unique<VkShaderModule>    vertexModule    (createShaderModule(vk, device, context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule>    fragmentModule  (createShaderModule(vk, device, context.getBinaryCollection().get("frag"), 0u));
+       const Unique<VkPipelineLayout>  pipelineLayout  (makePipelineLayout(vk, device));
+       const bool                                              useVertexInput  = false;
+       const bool                                              sampleShading   = (params.numColorSamples != VK_SAMPLE_COUNT_1_BIT);
+       const deUint32                                  subpassNdx              = 0u;
+       const Unique<VkPipeline>                pipeline                (makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertexModule, *fragmentModule, useVertexInput, subpassNdx,
+                                                                                                                                                 wd.renderSize, getImageAspectFlags(params.depthStencilFormat), params.numCoverageSamples, sampleShading));
+
+       const Unique<VkCommandPool>             cmdPool         (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, context.getUniversalQueueFamilyIndex()));
+       const Unique<VkCommandBuffer>   cmdBuffer       (makeCommandBuffer(vk, device, *cmdPool));
+
+       beginCommandBuffer(vk, *cmdBuffer);
+
+       {
+               std::vector<VkClearValue> clearValues;
+               clearValues.push_back(makeClearValueColorF32(0.0f, 0.0f, 0.0f, 1.0f));
+               clearValues.push_back(makeClearValueDepthStencil(1.0f, 0u));
+
+               const VkRect2D renderArea =
+               {
+                       { 0u, 0u },
+                       { wd.renderSize.x(), wd.renderSize.y() }
+               };
+
+               const VkRenderPassBeginInfo renderPassBeginInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,                       // VkStructureType         sType;
+                       DE_NULL,                                                                                        // const void*             pNext;
+                       *renderPass,                                                                            // VkRenderPass            renderPass;
+                       *framebuffer,                                                                           // VkFramebuffer           framebuffer;
+                       renderArea,                                                                                     // VkRect2D                renderArea;
+                       static_cast<deUint32>(clearValues.size()),                      // uint32_t                clearValueCount;
+                       dataOrNullPtr(clearValues),                                                     // const VkClearValue*     pClearValues;
+               };
+               vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+       }
+
+       vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+       vk.cmdDraw(*cmdBuffer, 3u, 1u, 0u, 0u);
+
+       vk.cmdEndRenderPass(*cmdBuffer);
+
+       if (needResolve)
+               recordCopyOutputImageToBuffer(vk, *cmdBuffer, wd.renderSize, *wd.resolveImage, *wd.colorBuffer);
+       else
+               recordCopyOutputImageToBuffer(vk, *cmdBuffer, wd.renderSize, *wd.colorImage, *wd.colorBuffer);
+
+       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+       submitCommandsAndWait(vk, device, context.getUniversalQueue(), *cmdBuffer);
+}
+
+void checkRequirements (Context& context, TestParams params)
+{
+       context.requireDeviceFunctionality("VK_AMD_mixed_attachment_samples");
+
+       checkSampleRequirements(context, params.numColorSamples, params.numDepthStencilSamples, false /* require standard sample locations */);
+}
+
+//! Verify the values of shader builtins
+tcu::TestStatus test (Context& context, const TestParams params)
+{
+       WorkingData                             wd;
+       const DeviceInterface&  vk                      = context.getDeviceInterface();
+       const VkDevice                  device          = context.getDevice();
+       MovePtr<Allocator>              allocator       = MovePtr<Allocator>(new SimpleAllocator(vk, device, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())));
+
+       wd.renderSize   = UVec2(16, 16);
+
+       // Create images and a color buffer
+       {
+
+               const VkImageUsageFlags colorImageUsageFlags            = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+               const VkImageUsageFlags depthStencilImageUsageFlags     = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
+
+               checkImageRequirements (context,
+                                                               params.colorFormat,
+                                                               VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT,
+                                                               colorImageUsageFlags,
+                                                               params.numColorSamples);
+
+               wd.colorImage           = makeImage(vk, device, params.colorFormat, wd.renderSize, params.numColorSamples, colorImageUsageFlags);
+               wd.colorImageAlloc      = bindImage(vk, device, *allocator, *wd.colorImage, MemoryRequirement::Any);
+               wd.colorImageView       = makeImageView(vk, device, *wd.colorImage, VK_IMAGE_VIEW_TYPE_2D, params.colorFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
+
+               if (params.numColorSamples != VK_SAMPLE_COUNT_1_BIT)
+               {
+                       wd.resolveImage                 = makeImage(vk, device, params.colorFormat, wd.renderSize, VK_SAMPLE_COUNT_1_BIT, colorImageUsageFlags);
+                       wd.resolveImageAlloc    = bindImage(vk, device, *allocator, *wd.resolveImage, MemoryRequirement::Any);
+                       wd.resolveImageView             = makeImageView(vk, device, *wd.resolveImage, VK_IMAGE_VIEW_TYPE_2D, params.colorFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
+               }
+
+               // Resolve result
+               wd.colorBufferSize      = static_cast<VkDeviceSize>(tcu::getPixelSize(mapVkFormat(params.colorFormat)) * wd.renderSize.x() * wd.renderSize.y());
+               wd.colorBuffer          = makeBuffer(vk, device, wd.colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+               wd.colorBufferAlloc     = bindBuffer(vk, device, *allocator, *wd.colorBuffer, MemoryRequirement::HostVisible);
+
+               deMemset(wd.colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(wd.colorBufferSize));
+               flushMappedMemoryRange(vk, device, wd.colorBufferAlloc->getMemory(), wd.colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+
+               checkImageRequirements (context,
+                                                               params.depthStencilFormat,
+                                                               VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT,
+                                                               depthStencilImageUsageFlags,
+                                                               params.numDepthStencilSamples);
+
+               wd.depthStencilImage            = makeImage(vk, device, params.depthStencilFormat, wd.renderSize, params.numDepthStencilSamples, depthStencilImageUsageFlags);
+               wd.depthStencilImageAlloc       = bindImage(vk, device, *allocator, *wd.depthStencilImage, MemoryRequirement::Any);
+               wd.depthStencilImageView        = makeImageView(vk, device, *wd.depthStencilImage, VK_IMAGE_VIEW_TYPE_2D, params.depthStencilFormat, makeImageSubresourceRange(getImageAspectFlags(params.depthStencilFormat), 0u, 1u, 0u, 1u));
+
+               if (isDepthFormat(params.depthStencilFormat))
+                       wd.depthOnlyImageView   = makeImageView(vk, device, *wd.depthStencilImage, VK_IMAGE_VIEW_TYPE_2D, params.depthStencilFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT, 0u, 1u, 0u, 1u));
+
+               if (isStencilFormat(params.depthStencilFormat))
+                       wd.stencilOnlyImageView = makeImageView(vk, device, *wd.depthStencilImage, VK_IMAGE_VIEW_TYPE_2D, params.depthStencilFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u));
+       }
+
+       // Draw, resolve, and copy to color buffer (see the fragment shader for details)
+       drawResolve(context, params, wd);
+
+       // Verify resolved image
+       {
+               const tcu::ConstPixelBufferAccess image (tcu::ConstPixelBufferAccess(mapVkFormat(params.colorFormat), tcu::IVec3(wd.renderSize.x(), wd.renderSize.y(), 1),wd.colorBufferAlloc->getHostPtr()));
+
+               if (compareGreenImage(context.getTestContext().getLog(), "resolve0", "Resolved test image", image))
+                       return tcu::TestStatus::pass("Pass");
+               else
+                       return tcu::TestStatus::fail("Some samples were incorrect");
+       }
+}
+
+} // ShaderBuiltins
+
+std::string getSampleCountGroupName(const VkSampleCountFlagBits coverageCount,
+                                                                       const VkSampleCountFlagBits colorCount,
+                                                                       const VkSampleCountFlagBits depthStencilCount)
+{
+       std::ostringstream str;
+       str << "coverage_"               << static_cast<deUint32>(coverageCount)
+               << "_color_"             << static_cast<deUint32>(colorCount)
+               << "_depth_stencil_" << static_cast<deUint32>(depthStencilCount);
+       return str.str();
+}
+
+std::string getFormatShortString (const VkFormat format)
+{
+       std::string s(de::toLower(getFormatName(format)));
+       return s.substr(10);
+}
+
+std::string getFormatCaseName (const VkFormat colorFormat,
+                                                          const VkFormat depthStencilFormat)
+{
+       std::ostringstream str;
+       str << getFormatShortString(colorFormat) << "_" << getFormatShortString(depthStencilFormat);
+       return str.str();
+}
+
+void createMixedAttachmentSamplesTestsInGroup (tcu::TestCaseGroup* rootGroup)
+{
+       const VkFormat colorFormatRange[] =
+       {
+               VK_FORMAT_R8G8B8A8_UNORM,
+               // If you add more, make sure it is handled in the test/shader
+       };
+
+       const VkFormat depthStencilFormatRange[] =
+       {
+               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,
+       };
+
+       // Minimal set of formats to cover depth and stencil
+       const VkFormat depthStencilReducedFormatRange[] =
+       {
+               VK_FORMAT_D16_UNORM,                            //!< Must be supported
+               VK_FORMAT_D24_UNORM_S8_UINT,            //!< Either this, or the next one must be supported
+               VK_FORMAT_D32_SFLOAT_S8_UINT,
+       };
+
+       struct SampleCase
+       {
+               VkSampleCountFlagBits   colorSamples;
+               VkSampleCountFlagBits   depthStencilSamples;
+       };
+
+       // Currently supported EQAA cases
+       static const SampleCase singlePassCases[] =
+       {
+               // Less color than depth/stencil
+               { VK_SAMPLE_COUNT_1_BIT,        VK_SAMPLE_COUNT_2_BIT  },
+               { VK_SAMPLE_COUNT_1_BIT,        VK_SAMPLE_COUNT_4_BIT  },
+               { VK_SAMPLE_COUNT_1_BIT,        VK_SAMPLE_COUNT_8_BIT  },
+               { VK_SAMPLE_COUNT_1_BIT,        VK_SAMPLE_COUNT_16_BIT },
+               { VK_SAMPLE_COUNT_2_BIT,        VK_SAMPLE_COUNT_4_BIT  },
+               { VK_SAMPLE_COUNT_2_BIT,        VK_SAMPLE_COUNT_8_BIT  },
+               { VK_SAMPLE_COUNT_2_BIT,        VK_SAMPLE_COUNT_16_BIT },
+               { VK_SAMPLE_COUNT_4_BIT,        VK_SAMPLE_COUNT_8_BIT  },
+               { VK_SAMPLE_COUNT_4_BIT,        VK_SAMPLE_COUNT_16_BIT },
+               { VK_SAMPLE_COUNT_8_BIT,        VK_SAMPLE_COUNT_16_BIT },
+       };
+
+       // Multi-subpass cases
+
+       static const SampleCase caseSubpassIncreaseColor_1[] =
+       {
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_4_BIT },
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_4_BIT },
+       };
+       static const SampleCase caseSubpassIncreaseColor_2[] =
+       {
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_8_BIT },
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_8_BIT },
+               { VK_SAMPLE_COUNT_4_BIT, VK_SAMPLE_COUNT_8_BIT },
+       };
+       static const SampleCase caseSubpassDecreaseColor_1[] =
+       {
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_4_BIT },
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_4_BIT },
+       };
+       static const SampleCase caseSubpassDecreaseColor_2[] =
+       {
+               { VK_SAMPLE_COUNT_4_BIT, VK_SAMPLE_COUNT_8_BIT },
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_8_BIT },
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_8_BIT },
+       };
+       static const SampleCase caseSubpassIncreaseCoverage_1[] =
+       {
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_2_BIT },
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_4_BIT },
+       };
+       static const SampleCase caseSubpassIncreaseCoverage_2[] =
+       {
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_2_BIT },
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_4_BIT },
+               { VK_SAMPLE_COUNT_4_BIT, VK_SAMPLE_COUNT_8_BIT },
+       };
+       static const SampleCase caseSubpassDecreaseCoverage_1[] =
+       {
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_4_BIT },
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_2_BIT },
+       };
+       static const SampleCase caseSubpassDecreaseCoverage_2[] =
+       {
+               { VK_SAMPLE_COUNT_4_BIT, VK_SAMPLE_COUNT_8_BIT },
+               { VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_4_BIT },
+               { VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_2_BIT },
+       };
+
+       static const struct
+       {
+               const char* const       caseName;
+               const deUint32          numSampleCases;
+               const SampleCase*       pSampleCase;
+       } subpassCases[] =
+       {
+               { "multi_subpass_decrease_color_4",             DE_LENGTH_OF_ARRAY(caseSubpassDecreaseColor_1),         caseSubpassDecreaseColor_1 },
+               { "multi_subpass_decrease_color_8",             DE_LENGTH_OF_ARRAY(caseSubpassDecreaseColor_2),         caseSubpassDecreaseColor_2 },
+               { "multi_subpass_decrease_coverage_4",  DE_LENGTH_OF_ARRAY(caseSubpassDecreaseCoverage_1),      caseSubpassDecreaseCoverage_1 },
+               { "multi_subpass_decrease_coverage_8",  DE_LENGTH_OF_ARRAY(caseSubpassDecreaseCoverage_2),      caseSubpassDecreaseCoverage_2 },
+               { "multi_subpass_increase_color_4",             DE_LENGTH_OF_ARRAY(caseSubpassIncreaseColor_1),         caseSubpassIncreaseColor_1 },
+               { "multi_subpass_increase_color_8",             DE_LENGTH_OF_ARRAY(caseSubpassIncreaseColor_2),         caseSubpassIncreaseColor_2 },
+               { "multi_subpass_increase_coverage_4",  DE_LENGTH_OF_ARRAY(caseSubpassIncreaseCoverage_1),      caseSubpassIncreaseCoverage_1 },
+               { "multi_subpass_increase_coverage_8",  DE_LENGTH_OF_ARRAY(caseSubpassIncreaseCoverage_2),      caseSubpassIncreaseCoverage_2 },
+       };
+
+       // Test 1: Per-sample expected value check
+       {
+               MovePtr<tcu::TestCaseGroup> standardLocationsGroup              (new tcu::TestCaseGroup(rootGroup->getTestContext(), "verify_standard_locations", ""));
+               MovePtr<tcu::TestCaseGroup> programmableLocationsGroup  (new tcu::TestCaseGroup(rootGroup->getTestContext(), "verify_programmable_locations", ""));
+
+               tcu::TestCaseGroup* locationsGroups[2] =
+               {
+                       standardLocationsGroup.get(),
+                       programmableLocationsGroup.get()
+               };
+
+               for (deUint32 groupNdx = 0u; groupNdx < DE_LENGTH_OF_ARRAY(locationsGroups); ++groupNdx)
+               {
+                       // Single subpass cases
+                       for (deUint32 caseNdx = 0u; caseNdx < DE_LENGTH_OF_ARRAY(singlePassCases); ++caseNdx)
+                       {
+                               VerifySamples::TestParams::SampleCount  samples;
+                               samples.numColorSamples                                 = singlePassCases[caseNdx].colorSamples;
+                               samples.numDepthStencilSamples                  = singlePassCases[caseNdx].depthStencilSamples;
+                               samples.numCoverageSamples                              = de::max(samples.numColorSamples, samples.numDepthStencilSamples);
+
+                               VerifySamples::TestParams params;
+                               params.perSubpassSamples.push_back(samples);
+                               params.useProgrammableSampleLocations   = (locationsGroups[groupNdx] == programmableLocationsGroup.get());
+
+                               MovePtr<tcu::TestCaseGroup> sampleCaseGroup(new tcu::TestCaseGroup(
+                                       rootGroup->getTestContext(), getSampleCountGroupName(samples.numCoverageSamples, samples.numColorSamples, samples.numDepthStencilSamples).c_str(), ""));
+
+                               for (const VkFormat *pDepthStencilFormat = depthStencilFormatRange; pDepthStencilFormat != DE_ARRAY_END(depthStencilFormatRange); ++pDepthStencilFormat)
+                               for (const VkFormat *pColorFormat                = colorFormatRange;            pColorFormat            != DE_ARRAY_END(colorFormatRange);                ++pColorFormat)
+                               {
+                                       params.colorFormat                      = *pColorFormat;
+                                       params.depthStencilFormat       = *pDepthStencilFormat;
+
+                                       addFunctionCaseWithPrograms(
+                                               sampleCaseGroup.get(),
+                                               getFormatCaseName(params.colorFormat, params.depthStencilFormat).c_str(),
+                                               "",
+                                               VerifySamples::checkRequirements,
+                                               VerifySamples::initPrograms,
+                                               VerifySamples::test, params);
+                               }
+
+                               locationsGroups[groupNdx]->addChild(sampleCaseGroup.release());
+                       }
+
+                       // Multi subpass cases
+                       for (deUint32 caseNdx = 0u; caseNdx < DE_LENGTH_OF_ARRAY(subpassCases); ++caseNdx)
+                       {
+                               VerifySamples::TestParams params;
+                               params.useProgrammableSampleLocations = (locationsGroups[groupNdx] == programmableLocationsGroup.get());
+
+                               for (deUint32 subpassNdx = 0; subpassNdx < subpassCases[caseNdx].numSampleCases; ++subpassNdx)
+                               {
+                                       VerifySamples::TestParams::SampleCount  samples;
+                                       samples.numColorSamples                                 = subpassCases[caseNdx].pSampleCase[subpassNdx].colorSamples;
+                                       samples.numDepthStencilSamples                  = subpassCases[caseNdx].pSampleCase[subpassNdx].depthStencilSamples;
+                                       samples.numCoverageSamples                              = de::max(samples.numColorSamples, samples.numDepthStencilSamples);
+                                       params.perSubpassSamples.push_back(samples);
+                               }
+
+                               MovePtr<tcu::TestCaseGroup> sampleCaseGroup(new tcu::TestCaseGroup(rootGroup->getTestContext(), subpassCases[caseNdx].caseName, ""));
+
+                               for (const VkFormat *pDepthStencilFormat = depthStencilReducedFormatRange;      pDepthStencilFormat != DE_ARRAY_END(depthStencilReducedFormatRange); ++pDepthStencilFormat)
+                               for (const VkFormat *pColorFormat                = colorFormatRange;                            pColorFormat            != DE_ARRAY_END(colorFormatRange);                               ++pColorFormat)
+                               {
+                                       params.colorFormat                      = *pColorFormat;
+                                       params.depthStencilFormat       = *pDepthStencilFormat;
+
+                                       addFunctionCaseWithPrograms(
+                                               sampleCaseGroup.get(),
+                                               getFormatCaseName(params.colorFormat, params.depthStencilFormat).c_str(),
+                                               "",
+                                               VerifySamples::checkRequirements,
+                                               VerifySamples::initPrograms,
+                                               VerifySamples::test, params);
+                               }
+
+                               locationsGroups[groupNdx]->addChild(sampleCaseGroup.release());
+                       }
+               }
+
+               rootGroup->addChild(standardLocationsGroup.release());
+               rootGroup->addChild(programmableLocationsGroup.release());
+       }
+
+       // Test 2: Shader built-ins check
+       {
+               MovePtr<tcu::TestCaseGroup> builtinsGroup (new tcu::TestCaseGroup(rootGroup->getTestContext(), "shader_builtins", ""));
+
+               for (deUint32 caseNdx = 0u; caseNdx < DE_LENGTH_OF_ARRAY(singlePassCases); ++caseNdx)
+               {
+                       ShaderBuiltins::TestParams params;
+                       params.numColorSamples                  = singlePassCases[caseNdx].colorSamples;
+                       params.numDepthStencilSamples   = singlePassCases[caseNdx].depthStencilSamples;
+                       params.numCoverageSamples               = de::max(params.numColorSamples, params.numDepthStencilSamples);
+
+                       MovePtr<tcu::TestCaseGroup> sampleCaseGroup(new tcu::TestCaseGroup(
+                               rootGroup->getTestContext(), getSampleCountGroupName(params.numCoverageSamples, params.numColorSamples, params.numDepthStencilSamples).c_str(), ""));
+
+                       for (const VkFormat *pDepthStencilFormat = depthStencilReducedFormatRange;  pDepthStencilFormat != DE_ARRAY_END(depthStencilReducedFormatRange); ++pDepthStencilFormat)
+                       for (const VkFormat *pColorFormat                = colorFormatRange;                            pColorFormat            != DE_ARRAY_END(colorFormatRange);                               ++pColorFormat)
+                       {
+                               params.colorFormat                      = *pColorFormat;
+                               params.depthStencilFormat       = *pDepthStencilFormat;
+
+                               addFunctionCaseWithPrograms(
+                                       sampleCaseGroup.get(),
+                                       getFormatCaseName(params.colorFormat, params.depthStencilFormat).c_str(),
+                                       "",
+                                       ShaderBuiltins::checkRequirements,
+                                       ShaderBuiltins::initPrograms,
+                                       ShaderBuiltins::test,
+                                       params);
+                       }
+
+                       builtinsGroup->addChild(sampleCaseGroup.release());
+               }
+
+               rootGroup->addChild(builtinsGroup.release());
+       }
+}
+
+} // anonymous ns
+
+tcu::TestCaseGroup* createMultisampleMixedAttachmentSamplesTests (tcu::TestContext& testCtx)
+{
+       return createTestGroup(testCtx, "mixed_attachment_samples", "Test a graphics pipeline with varying sample count per color and depth/stencil attachments", createMixedAttachmentSamplesTestsInGroup);
+}
+
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleMixedAttachmentSamplesTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleMixedAttachmentSamplesTests.hpp
new file mode 100644 (file)
index 0000000..7653090
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef _VKTPIPELINEMULTISAMPLEMIXEDATTACHMENTSAMPLESTESTS_HPP
+#define _VKTPIPELINEMULTISAMPLEMIXEDATTACHMENTSAMPLESTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 Advanced Micro Devices, Inc.
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests for VK_AMD_mixed_attachment_samples
+ *//*--------------------------------------------------------------------*/
+
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+
+tcu::TestCaseGroup* createMultisampleMixedAttachmentSamplesTests (tcu::TestContext& testCtx);
+
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINEMULTISAMPLEMIXEDATTACHMENTSAMPLESTESTS_HPP
index 6067bd2f26ee4d1faffb857766dc0c9056e397c5..80861fac241e6865fd2226a0fd07a053b747e4f6 100644 (file)
@@ -23,6 +23,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktPipelineMultisampleSampleLocationsExtTests.hpp"
+#include "vktPipelineSampleLocationsUtil.hpp"
 #include "vktPipelineMakeUtil.hpp"
 #include "vktTestCase.hpp"
 #include "vktTestGroupUtil.hpp"
@@ -211,72 +212,11 @@ VkPhysicalDeviceSampleLocationsPropertiesEXT getSampleLocationsPropertiesEXT (Co
        return sampleLocationsProperties;
 }
 
-//! Specify sample locations in a pixel grid
-class MultisamplePixelGrid
-{
-public:
-       MultisamplePixelGrid (const tcu::UVec2& gridSize, const VkSampleCountFlagBits numSamples)
-               : m_gridSize            (gridSize)
-               , m_numSamples          (numSamples)
-               , m_sampleLocations     (gridSize.x() * gridSize.y() * numSamples)
-       {
-               DE_ASSERT(gridSize.x() > 0 && gridSize.y() > 0);
-               DE_ASSERT(numSamples   > 1);
-       }
-
-       //! If grid x,y is larger than gridSize, then each coordinate is wrapped, x' = x % size_x
-       const VkSampleLocationEXT& getSample (deUint32 gridX, deUint32 gridY, const deUint32 sampleNdx) const
-       {
-               return m_sampleLocations[getSampleIndex(gridX, gridY, sampleNdx)];
-       }
-
-       void setSample (const deUint32 gridX, const deUint32 gridY, const deUint32 sampleNdx, const VkSampleLocationEXT& location)
-       {
-               DE_ASSERT(gridX < m_gridSize.x());
-               DE_ASSERT(gridY < m_gridSize.y());
-
-               m_sampleLocations[getSampleIndex(gridX, gridY, sampleNdx)] = location;
-       }
-
-       const tcu::UVec2&                       size                            (void) const    { return m_gridSize; }
-       VkSampleCountFlagBits           samplesPerPixel         (void) const    { return m_numSamples; }
-       const VkSampleLocationEXT*      sampleLocations         (void) const    { return dataOrNullPtr(m_sampleLocations); }
-       VkSampleLocationEXT*            sampleLocations         (void)                  { return dataOrNullPtr(m_sampleLocations); }
-       deUint32                                        sampleLocationCount     (void) const    { return static_cast<deUint32>(m_sampleLocations.size()); }
-
-private:
-       deUint32 getSampleIndex (deUint32 gridX, deUint32 gridY, const deUint32 sampleNdx) const
-       {
-               gridX %= m_gridSize.x();
-               gridY %= m_gridSize.y();
-               return (gridY * m_gridSize.x() + gridX) * static_cast<deUint32>(m_numSamples) + sampleNdx;
-       }
-
-       tcu::UVec2                                                      m_gridSize;
-       VkSampleCountFlagBits                           m_numSamples;
-       std::vector<VkSampleLocationEXT>        m_sampleLocations;
-};
-
 inline deUint32 numSamplesPerPixel (const MultisamplePixelGrid& pixelGrid)
 {
        return static_cast<deUint32>(pixelGrid.samplesPerPixel());
 }
 
-//! References the data inside MultisamplePixelGrid
-inline VkSampleLocationsInfoEXT makeSampleLocationsInfo (const MultisamplePixelGrid& pixelGrid)
-{
-       const VkSampleLocationsInfoEXT info =
-       {
-               VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT,                            // VkStructureType               sType;
-               DE_NULL,                                                                                                        // const void*                   pNext;
-               pixelGrid.samplesPerPixel(),                                                            // VkSampleCountFlagBits         sampleLocationsPerPixel;
-               makeExtent2D(pixelGrid.size().x(), pixelGrid.size().y()),       // VkExtent2D                    sampleLocationGridSize;
-               pixelGrid.sampleLocationCount(),                                                        // uint32_t                      sampleLocationsCount;
-               pixelGrid.sampleLocations(),                                                            // const VkSampleLocationEXT*    pSampleLocations;
-       };
-       return info;
-}
-
 inline VkSampleLocationsInfoEXT makeEmptySampleLocationsInfo ()
 {
        const VkSampleLocationsInfoEXT info =
@@ -348,38 +288,6 @@ void logPixelGrid (tcu::TestLog& log, const VkPhysicalDeviceSampleLocationsPrope
        log << tcu::TestLog::EndSection;
 }
 
-//! Fill each grid pixel with a distinct samples pattern, rounding locations based on subPixelBits
-void fillSampleLocationsRandom (MultisamplePixelGrid& grid, const deUint32 subPixelBits, const deUint32 seed = 142u)
-{
-       const deUint32  numLocations    = 1u << subPixelBits;
-       de::Random              rng                             (seed);
-
-       for (deUint32 gridY = 0; gridY < grid.size().y(); ++gridY)
-       for (deUint32 gridX = 0; gridX < grid.size().x(); ++gridX)
-       {
-               std::set<UVec2, LessThan<UVec2> >       takenLocationIndices;
-               for (deUint32 sampleNdx = 0; sampleNdx < numSamplesPerPixel(grid); /* no increment */)
-               {
-                       const UVec2 locationNdx (rng.getUint32() % numLocations,
-                                                                        rng.getUint32() % numLocations);
-
-                       if (takenLocationIndices.find(locationNdx) == takenLocationIndices.end())
-                       {
-                               const VkSampleLocationEXT location =
-                               {
-                                       static_cast<float>(locationNdx.x()) / static_cast<float>(numLocations), // float x;
-                                       static_cast<float>(locationNdx.y()) / static_cast<float>(numLocations), // float y;
-                               };
-
-                               grid.setSample(gridX, gridY, sampleNdx, location);
-                               takenLocationIndices.insert(locationNdx);
-
-                               ++sampleNdx;    // next sample
-                       }
-               }
-       }
-}
-
 //! Place samples very close to each other
 void fillSampleLocationsPacked (MultisamplePixelGrid& grid, const deUint32 subPixelBits)
 {
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.cpp
new file mode 100644 (file)
index 0000000..d27aada
--- /dev/null
@@ -0,0 +1,1309 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 Advanced Micro Devices, Inc.
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests for VK_AMD_shader_fragment_mask
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineMultisampleShaderFragmentMaskTests.hpp"
+#include "vktPipelineMakeUtil.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestCaseUtil.hpp"
+#include "vktTestGroupUtil.hpp"
+
+#include "vkCmdUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkPlatform.hpp"
+#include "vkMemUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkImageUtil.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deSharedPtr.hpp"
+#include "deRandom.hpp"
+
+#include "tcuVector.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuTextureUtil.hpp"
+
+#include <string>
+#include <vector>
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace
+{
+using namespace vk;
+using de::UniquePtr;
+using de::MovePtr;
+using de::SharedPtr;
+using tcu::UVec2;
+using tcu::UVec4;
+using tcu::Vec2;
+using tcu::Vec4;
+
+typedef SharedPtr<Unique<VkImageView> >                ImageViewSp;
+typedef SharedPtr<Unique<VkPipeline> >         PipelineSp;
+
+struct PositionColor
+{
+       tcu::Vec4               position;
+       VkClearColorValue       color;
+
+       PositionColor (const tcu::Vec4& pos, const tcu::UVec4& col) : position(pos)
+    {
+        deMemcpy(color.uint32, col.getPtr(), sizeof(color.uint32));
+    }
+
+       PositionColor (const tcu::Vec4& pos, const tcu::Vec4&  col) : position(pos)
+    {
+        deMemcpy(color.float32, col.getPtr(), sizeof(color.float32));
+    }
+
+       PositionColor (const PositionColor& rhs)
+               : position      (rhs.position)
+        , color     (rhs.color)
+       {
+       }
+};
+
+//! Make a dummy sampler.
+Move<VkSampler> makeSampler (const DeviceInterface& vk, const VkDevice device)
+{
+       const VkSamplerCreateInfo samplerParams =
+       {
+               VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,                  // VkStructureType         sType;
+               DE_NULL,                                                                                // const void*             pNext;
+               (VkSamplerCreateFlags)0,                                                // VkSamplerCreateFlags    flags;
+               VK_FILTER_NEAREST,                                                              // VkFilter                magFilter;
+               VK_FILTER_NEAREST,                                                              // VkFilter                minFilter;
+               VK_SAMPLER_MIPMAP_MODE_NEAREST,                                 // VkSamplerMipmapMode     mipmapMode;
+               VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,                  // VkSamplerAddressMode    addressModeU;
+               VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,                  // VkSamplerAddressMode    addressModeV;
+               VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,                  // VkSamplerAddressMode    addressModeW;
+               0.0f,                                                                                   // float                   mipLodBias;
+               VK_FALSE,                                                                               // VkBool32                anisotropyEnable;
+               1.0f,                                                                                   // float                   maxAnisotropy;
+               VK_FALSE,                                                                               // VkBool32                compareEnable;
+               VK_COMPARE_OP_ALWAYS,                                                   // VkCompareOp             compareOp;
+               0.0f,                                                                                   // float                   minLod;
+               0.0f,                                                                                   // float                   maxLod;
+               VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,                // VkBorderColor           borderColor;
+               VK_FALSE,                                                                               // VkBool32                unnormalizedCoordinates;
+       };
+       return createSampler(vk, device, &samplerParams);
+}
+
+Move<VkImage> makeImage (const DeviceInterface&                        vk,
+                                                const VkDevice                                 device,
+                                                const VkFormat                                 format,
+                                                const UVec2&                                   size,
+                                                const deUint32                                 layers,
+                                                const VkSampleCountFlagBits    samples,
+                                                const VkImageUsageFlags                usage)
+{
+       const VkImageCreateInfo imageParams =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                    // VkStructureType                      sType;
+               DE_NULL,                                                                                // const void*                          pNext;
+               (VkImageCreateFlags)0,                                                  // VkImageCreateFlags           flags;
+               VK_IMAGE_TYPE_2D,                                                               // VkImageType                          imageType;
+               format,                                                                                 // VkFormat                                     format;
+               makeExtent3D(size.x(), size.y(), 1),                    // VkExtent3D                           extent;
+               1u,                                                                                             // deUint32                                     mipLevels;
+               layers,                                                                                 // deUint32                                     arrayLayers;
+               samples,                                                                                // VkSampleCountFlagBits        samples;
+               VK_IMAGE_TILING_OPTIMAL,                                                // VkImageTiling                        tiling;
+               usage,                                                                                  // VkImageUsageFlags            usage;
+               VK_SHARING_MODE_EXCLUSIVE,                                              // VkSharingMode                        sharingMode;
+               0u,                                                                                             // deUint32                                     queueFamilyIndexCount;
+               DE_NULL,                                                                                // const deUint32*                      pQueueFamilyIndices;
+               VK_IMAGE_LAYOUT_UNDEFINED,                                              // VkImageLayout                        initialLayout;
+       };
+       return createImage(vk, device, &imageParams);
+}
+
+//! Create a test-specific MSAA pipeline
+Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface&                                  vk,
+                                                                          const VkDevice                                                       device,
+                                                                          const VkPipelineLayout                                       pipelineLayout,
+                                                                          const VkRenderPass                                           renderPass,
+                                                                          const VkShaderModule                                         vertexModule,
+                                                                          const VkShaderModule                                         fragmentModule,
+                                                                          const bool                                                           useVertexInput,
+                                                                          const VkFormat                                                       vertexAttribColorFormat,
+                                                                          const bool                                                           useColorAttachment,
+                                                                          const deUint32                                                       subpassNdx,
+                                                                          const UVec2&                                                         renderSize,
+                                                                          const VkSampleCountFlagBits                          numSamples)
+{
+       std::vector<VkVertexInputBindingDescription>    vertexInputBindingDescriptions;
+       std::vector<VkVertexInputAttributeDescription>  vertexInputAttributeDescriptions;
+
+       // Vertex attributes: position and color
+       if (useVertexInput)
+       {
+               vertexInputBindingDescriptions.push_back  (makeVertexInputBindingDescription  (0u, sizeof(PositionColor), VK_VERTEX_INPUT_RATE_VERTEX));
+               vertexInputAttributeDescriptions.push_back(makeVertexInputAttributeDescription(0u, 0u, VK_FORMAT_R32G32B32A32_SFLOAT, 0u));
+               vertexInputAttributeDescriptions.push_back(makeVertexInputAttributeDescription(1u, 0u, vertexAttribColorFormat, sizeof(Vec4)));
+       }
+
+       const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,              // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                                // const void*                                                          pNext;
+               (VkPipelineVertexInputStateCreateFlags)0,                                               // VkPipelineVertexInputStateCreateFlags        flags;
+               static_cast<deUint32>(vertexInputBindingDescriptions.size()),   // uint32_t                                                                     vertexBindingDescriptionCount;
+               dataOrNullPtr(vertexInputBindingDescriptions),                                  // const VkVertexInputBindingDescription*       pVertexBindingDescriptions;
+               static_cast<deUint32>(vertexInputAttributeDescriptions.size()), // uint32_t                                                                     vertexAttributeDescriptionCount;
+               dataOrNullPtr(vertexInputAttributeDescriptions),                                // const VkVertexInputAttributeDescription*     pVertexAttributeDescriptions;
+       };
+
+       const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,    // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                                // const void*                                                          pNext;
+               (VkPipelineInputAssemblyStateCreateFlags)0,                                             // VkPipelineInputAssemblyStateCreateFlags      flags;
+               VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,                                                    // VkPrimitiveTopology                                          topology;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     primitiveRestartEnable;
+       };
+
+       const VkViewport viewport =
+       {
+               0.0f, 0.0f,                                                                                                                                     // x, y
+               static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()),         // widht, height
+               0.0f, 1.0f                                                                                                                                      // minDepth, maxDepth
+       };
+
+       const VkRect2D scissor =
+       {
+               makeOffset2D(0, 0),
+               makeExtent2D(renderSize.x(), renderSize.y()),
+       };
+
+       const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,                  // VkStructureType                                              sType;
+               DE_NULL,                                                                                                                // const void*                                                  pNext;
+               (VkPipelineViewportStateCreateFlags)0,                                                  // VkPipelineViewportStateCreateFlags   flags;
+               1u,                                                                                                                             // uint32_t                                                             viewportCount;
+               &viewport,                                                                                                              // const VkViewport*                                    pViewports;
+               1u,                                                                                                                             // uint32_t                                                             scissorCount;
+               &scissor,                                                                                                               // const VkRect2D*                                              pScissors;
+       };
+
+       const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,     // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               (VkPipelineRasterizationStateCreateFlags)0,                                     // VkPipelineRasterizationStateCreateFlags      flags;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthClampEnable;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     rasterizerDiscardEnable;
+               VK_POLYGON_MODE_FILL,                                                                           // VkPolygonMode                                                        polygonMode;
+               VK_CULL_MODE_NONE,                                                                                      // VkCullModeFlags                                                      cullMode;
+               VK_FRONT_FACE_COUNTER_CLOCKWISE,                                                        // VkFrontFace                                                          frontFace;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthBiasEnable;
+               0.0f,                                                                                                           // float                                                                        depthBiasConstantFactor;
+               0.0f,                                                                                                           // float                                                                        depthBiasClamp;
+               0.0f,                                                                                                           // float                                                                        depthBiasSlopeFactor;
+               1.0f,                                                                                                           // float                                                                        lineWidth;
+       };
+
+       const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,       // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               (VkPipelineMultisampleStateCreateFlags)0,                                       // VkPipelineMultisampleStateCreateFlags        flags;
+               numSamples,                                                                                                     // VkSampleCountFlagBits                                        rasterizationSamples;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     sampleShadingEnable;
+               1.0f,                                                                                                           // float                                                                        minSampleShading;
+               DE_NULL,                                                                                                        // const VkSampleMask*                                          pSampleMask;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     alphaToCoverageEnable;
+               VK_FALSE                                                                                                        // VkBool32                                                                     alphaToOneEnable;
+       };
+
+       VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,     // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               (VkPipelineDepthStencilStateCreateFlags)0,                                      // VkPipelineDepthStencilStateCreateFlags       flags;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthTestEnable;
+               VK_TRUE,                                                                                                        // VkBool32                                                                     depthWriteEnable;
+               VK_COMPARE_OP_ALWAYS,                                                                           // VkCompareOp                                                          depthCompareOp;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthBoundsTestEnable;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     stencilTestEnable;
+               VkStencilOpState(),                                                                                     // VkStencilOpState                                                     front;
+               VkStencilOpState(),                                                                                     // VkStencilOpState                                                     back;
+               0.0f,                                                                                                           // float                                                                        minDepthBounds;
+               1.0f,                                                                                                           // float                                                                        maxDepthBounds;
+       };
+
+       const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+       const VkPipelineColorBlendAttachmentState defaultBlendAttachmentState =
+       {
+               VK_FALSE,                               // VkBool32                                     blendEnable;
+               VK_BLEND_FACTOR_ONE,    // VkBlendFactor                        srcColorBlendFactor;
+               VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        dstColorBlendFactor;
+               VK_BLEND_OP_ADD,                // VkBlendOp                            colorBlendOp;
+               VK_BLEND_FACTOR_ONE,    // VkBlendFactor                        srcAlphaBlendFactor;
+               VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        dstAlphaBlendFactor;
+               VK_BLEND_OP_ADD,                // VkBlendOp                            alphaBlendOp;
+               colorComponentsAll,             // VkColorComponentFlags        colorWriteMask;
+       };
+
+       const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,       // VkStructureType                                                              sType;
+               DE_NULL,                                                                                                        // const void*                                                                  pNext;
+               (VkPipelineColorBlendStateCreateFlags)0,                                        // VkPipelineColorBlendStateCreateFlags                 flags;
+               VK_FALSE,                                                                                                       // VkBool32                                                                             logicOpEnable;
+               VK_LOGIC_OP_COPY,                                                                                       // VkLogicOp                                                                    logicOp;
+               (useColorAttachment ? 1u : 0u),                                                         // deUint32                                                                             attachmentCount;
+               &defaultBlendAttachmentState,                                                           // const VkPipelineColorBlendAttachmentState*   pAttachments;
+               { 0.0f, 0.0f, 0.0f, 0.0f },                                                                     // float                                                                                blendConstants[4];
+       };
+
+       const VkPipelineShaderStageCreateInfo pShaderStages[] =
+       {
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                // const void*                                                  pNext;
+                       (VkPipelineShaderStageCreateFlags)0,                                    // VkPipelineShaderStageCreateFlags             flags;
+                       VK_SHADER_STAGE_VERTEX_BIT,                                                             // VkShaderStageFlagBits                                stage;
+                       vertexModule,                                                                                   // VkShaderModule                                               module;
+                       "main",                                                                                                 // const char*                                                  pName;
+                       DE_NULL,                                                                                                // const VkSpecializationInfo*                  pSpecializationInfo;
+               },
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                // const void*                                                  pNext;
+                       (VkPipelineShaderStageCreateFlags)0,                                    // VkPipelineShaderStageCreateFlags             flags;
+                       VK_SHADER_STAGE_FRAGMENT_BIT,                                                   // VkShaderStageFlagBits                                stage;
+                       fragmentModule,                                                                                 // VkShaderModule                                               module;
+                       "main",                                                                                                 // const char*                                                  pName;
+                       DE_NULL,                                                                                                // const VkSpecializationInfo*                  pSpecializationInfo;
+               }
+       };
+
+       const VkGraphicsPipelineCreateInfo      graphicsPipelineInfo =
+       {
+               VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,        // VkStructureType                                                                      sType;
+               DE_NULL,                                                                                        // const void*                                                                          pNext;
+               (VkPipelineCreateFlags)0,                                                       // VkPipelineCreateFlags                                                        flags;
+               DE_LENGTH_OF_ARRAY(pShaderStages),                                      // deUint32                                                                                     stageCount;
+               pShaderStages,                                                                          // const VkPipelineShaderStageCreateInfo*                       pStages;
+               &vertexInputStateInfo,                                                          // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
+               &pipelineInputAssemblyStateInfo,                                        // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
+               DE_NULL,                                                                                        // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
+               &pipelineViewportStateInfo,                                                     // const VkPipelineViewportStateCreateInfo*                     pViewportState;
+               &pipelineRasterizationStateInfo,                                        // const VkPipelineRasterizationStateCreateInfo*        pRasterizationState;
+               &pipelineMultisampleStateInfo,                                          // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
+               &pipelineDepthStencilStateInfo,                                         // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
+               &pipelineColorBlendStateInfo,                                           // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
+               DE_NULL,                                                                                        // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
+               pipelineLayout,                                                                         // VkPipelineLayout                                                                     layout;
+               renderPass,                                                                                     // VkRenderPass                                                                         renderPass;
+               subpassNdx,                                                                                     // deUint32                                                                                     subpass;
+               DE_NULL,                                                                                        // VkPipeline                                                                           basePipelineHandle;
+               -1,                                                                                                     // deInt32                                                                                      basePipelineIndex;
+       };
+
+       return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
+}
+
+std::vector<PositionColor> genShapes (const VkFormat colorFormat)
+{
+       std::vector<PositionColor> vertices;
+
+       if (colorFormat == VK_FORMAT_R8G8B8A8_UNORM)
+       {
+               vertices.push_back(PositionColor(Vec4( 0.0f,  -0.75f, 0.0f, 1.0f), Vec4(0.5f, 0.5f, 0.5f, 1.0f)));
+               vertices.push_back(PositionColor(Vec4(-0.75f,  0.75f, 0.0f, 1.0f), Vec4(1.0f, 0.5f, 0.5f, 1.0f)));
+               vertices.push_back(PositionColor(Vec4( 0.75f,  0.65f, 0.0f, 1.0f), Vec4(0.0f, 0.5f, 1.0f, 1.0f)));
+       }
+       else
+       {
+               vertices.push_back(PositionColor(Vec4( 0.0f,  -0.75f, 0.0f, 1.0f), UVec4(0xabcdu, 0u, 0u, 0u)));
+               vertices.push_back(PositionColor(Vec4(-0.75f,  0.75f, 0.0f, 1.0f), UVec4(0xbcdeu, 0u, 0u, 0u)));
+               vertices.push_back(PositionColor(Vec4( 0.75f,  0.65f, 0.0f, 1.0f), UVec4(0xcdefu, 0u, 0u, 0u)));
+       }
+
+       return vertices;
+}
+
+//! Map color image format to a convenient format used in vertex attributes
+VkFormat getVertexInputColorFormat (const VkFormat colorImageFormat)
+{
+       switch (tcu::getTextureChannelClass(mapVkFormat(colorImageFormat).type))
+       {
+               case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
+               case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
+               case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
+                       return VK_FORMAT_R32G32B32A32_SFLOAT;
+
+               case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
+                       return VK_FORMAT_R32G32B32A32_SINT;
+
+               case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
+                       return VK_FORMAT_R32G32B32A32_UINT;
+
+               default:
+                       DE_ASSERT(0);
+                       return VK_FORMAT_UNDEFINED;
+       }
+}
+
+enum SampleSource
+{
+       SAMPLE_SOURCE_IMAGE,                    //!< texel fetch from an image
+       SAMPLE_SOURCE_SUBPASS_INPUT,    //!< texel fetch from an input attachment
+};
+
+//! The parameters that define a test case
+struct TestParams
+{
+       UVec2                                   renderSize;
+       deUint32                                numLayers;                      //!< 1 or N for layered image
+       SampleSource                    sampleSource;           //!< source of texel fetch
+       VkSampleCountFlagBits   numColorSamples;
+       VkFormat                                colorFormat;            //!< Color attachment format
+
+       TestParams (void)
+               : numLayers                     ()
+               , numColorSamples       ()
+               , colorFormat           ()
+       {
+       }
+};
+
+void checkRequirements (Context& context, TestParams params)
+{
+       context.requireDeviceFunctionality("VK_AMD_shader_fragment_mask");
+
+       // In the subpass input case we have to store fetch results into a buffer for subsequent verification in a compute shader.
+       const bool requireFragmentStores = (params.sampleSource == SAMPLE_SOURCE_SUBPASS_INPUT);
+
+       const VkPhysicalDeviceLimits& limits = context.getDeviceProperties().limits;
+
+       if ((limits.framebufferColorSampleCounts & params.numColorSamples) == 0u)
+               TCU_THROW(NotSupportedError, "framebufferColorSampleCounts: sample count not supported");
+
+       if ((isIntFormat(params.colorFormat) || isUintFormat(params.colorFormat)))
+       {
+               if ((limits.sampledImageIntegerSampleCounts & params.numColorSamples) == 0u)
+                       TCU_THROW(NotSupportedError, "sampledImageIntegerSampleCounts: sample count not supported");
+       }
+       else
+       {
+               if ((limits.sampledImageColorSampleCounts & params.numColorSamples) == 0u)
+                       TCU_THROW(NotSupportedError, "sampledImageColorSampleCounts: sample count not supported");
+       }
+
+       if (requireFragmentStores)
+       {
+               if (!context.getDeviceFeatures().fragmentStoresAndAtomics)
+                       TCU_THROW(NotSupportedError, "fragmentStoresAndAtomics: feature not supported");
+       }
+}
+
+//! Common data used by the test
+struct WorkingData
+{
+       deUint32                                                numVertices;                            //!< Number of vertices defined in the vertex buffer
+       Move<VkBuffer>                                  vertexBuffer;
+       MovePtr<Allocation>                             vertexBufferAlloc;
+       Move<VkImage>                                   colorImage;                                     //!< Color image
+       MovePtr<Allocation>                             colorImageAlloc;
+       Move<VkImageView>                               colorImageView;                         //!< Color image view spanning all layers
+       Move<VkBuffer>                                  colorBuffer;                            //!< Buffer used to copy image data
+       MovePtr<Allocation>                             colorBufferAlloc;
+       VkDeviceSize                                    colorBufferSize;
+       Move<VkSampler>                                 defaultSampler;                         //!< Dummy sampler, we are using texel fetches
+
+       WorkingData (void)
+               : numVertices           ()
+               , colorBufferSize       ()
+       {
+       }
+};
+
+void initPrograms (SourceCollections& programCollection, const TestParams params)
+{
+       std::string     colorType;                                      //!< color pixel type used by image functions
+       std::string     colorBufferType;                        //!< packed pixel type as stored in a ssbo
+       std::string colorBufferPack;                    //!< a cast or a function call when writing back color format to the ssbo
+       std::string     colorFragInQualifier;           //!< fragment shader color input qualifier
+       std::string samplerPrefix;                              //!< u, i, or empty
+
+       switch (params.colorFormat)
+       {
+               case VK_FORMAT_R8G8B8A8_UNORM:
+                       colorType                               = "vec4";
+                       colorBufferType                 = "uint";
+                       colorBufferPack                 = "packUnorm4x8";
+                       break;
+
+               case VK_FORMAT_R32_UINT:
+                       colorType                               = "uint";
+                       colorBufferType                 = "uint";
+                       colorBufferPack                 = colorBufferType;
+                       colorFragInQualifier    = "flat";
+                       samplerPrefix                   = "u";
+                       break;
+
+               case VK_FORMAT_R32_SINT:
+                       colorType                               = "int";
+                       colorBufferType                 = "int";
+                       colorBufferPack                 = colorBufferType;
+                       colorFragInQualifier    = "flat";
+                       samplerPrefix                   = "i";
+                       break;
+
+               default:
+                       DE_FATAL("initPrograms not handled for this color format");
+                       break;
+       }
+
+       // Vertex shader - position and color
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(location = 0) in  vec4 in_position;\n"
+                       << "layout(location = 1) in  " << colorType << " in_color;\n"
+                       << "layout(location = 0) out " << colorType << " o_color;\n"
+                       << "\n"
+                       << "out gl_PerVertex {\n"
+                       << "    vec4 gl_Position;\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       // Introduce a variance in geometry per instance index which maps to the image layer
+                       << "    float a   = 0.25 * float(gl_InstanceIndex);\n"
+                       << "    mat3 rm   = mat3( cos(a), sin(a), 0.0,\n"
+                       << "                     -sin(a), cos(a), 0.0,\n"
+                       << "                         0.0,    0.0, 1.0);\n"
+                       << "    vec2 rpos = (rm * vec3(in_position.xy, 1.0)).xy;\n"
+                       << "\n"
+                       << "    gl_Position = vec4(rpos, in_position.zw);\n"
+                       << "    o_color     = in_color;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+       }
+
+       // Vertex shader - no vertex data, fill viewport with one primitive
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "out gl_PerVertex {\n"
+                       << "    vec4 gl_Position;\n"
+                       << "};\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       // Specify an oversized triangle covering the whole viewport.
+                       << "    switch (gl_VertexIndex)\n"
+                       << "    {\n"
+                       << "        case 0:\n"
+                       << "            gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);\n"
+                       << "            break;\n"
+                       << "        case 1:\n"
+                       << "            gl_Position = vec4(-1.0,  3.0, 0.0, 1.0);\n"
+                       << "            break;\n"
+                       << "        case 2:\n"
+                       << "            gl_Position = vec4( 3.0, -1.0, 0.0, 1.0);\n"
+                       << "            break;\n"
+                       << "    }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert_full") << glu::VertexSource(src.str());
+       }
+
+       // Fragment shader - output color from VS
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(location = 0) in " << colorFragInQualifier << " " << colorType << " in_color;\n"
+                       << "layout(location = 0) out " << colorType << " o_color;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    o_color = in_color;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
+       }
+
+       // Fragment shader - FMASK fetch from an input attachment
+       if (params.sampleSource == SAMPLE_SOURCE_SUBPASS_INPUT)
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "#extension GL_AMD_shader_fragment_mask : enable\n"
+                       << "\n"
+                       << "layout(set = 0, binding = 0) uniform " << samplerPrefix << "sampler2DMS" << (params.numLayers > 1 ? "Array" : "") << " u_image;\n"
+                       << "layout(set = 0, binding = 1, std430) writeonly buffer ColorOutput {\n"
+                       << "    " << colorBufferType << " color[];\n"
+                       << "} sb_out;\n"
+                       << "layout(input_attachment_index = " << params.numLayers << ", set = 0, binding = 2) uniform " << samplerPrefix << "subpassInputMS" << " input_attach;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    ivec2 p            = ivec2(gl_FragCoord.xy);\n"
+                       << "    int   width        = " << params.renderSize.x() << ";\n"
+                       << "    int   numSamples   = " << static_cast<deUint32>(params.numColorSamples) << ";\n"
+                       << "    int   colorOutNdx  = numSamples * (p.x + width * p.y);\n"
+                       << "\n"
+                       << "    uint mask = fragmentMaskFetchAMD(input_attach);\n"
+                       << "    for (int sampleNdx = 0; sampleNdx < numSamples; ++sampleNdx)\n"
+                       << "    {\n"
+                       << "        int fragNdx = int((mask >> (4 * sampleNdx)) & 0xf);\n"
+                       << "        " << samplerPrefix << "vec4 color = fragmentFetchAMD(input_attach, fragNdx);\n"
+                       << "        sb_out.color[colorOutNdx + sampleNdx] = " << colorBufferPack << "(color);\n"
+                       << "    }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("frag_fmask_fetch") << glu::FragmentSource(src.str());
+       }
+
+       // Generate compute shaders
+       const struct ComputeShaderParams
+       {
+               const char*             name;
+               bool                    isFmaskFetch;
+               bool                    enabled;
+       } computeShaders[] =
+       {
+               // name                                 // FMASK?       // enabled?
+               { "comp_fetch",                 false,          true,                                                                                                   },
+               { "comp_fmask_fetch",   true,           (params.sampleSource != SAMPLE_SOURCE_SUBPASS_INPUT)    },
+       };
+
+       for (const ComputeShaderParams* pShaderParams = computeShaders; pShaderParams != DE_ARRAY_END(computeShaders); ++pShaderParams)
+       if (pShaderParams->enabled)
+       {
+               const std::string samplingPos = (params.numLayers == 1 ? "ivec2(gl_WorkGroupID.xy)"
+                                                                                                                          : "ivec3(gl_WorkGroupID)");
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << (pShaderParams->isFmaskFetch ? "#extension GL_AMD_shader_fragment_mask : enable\n" : "")
+                       << "#define NUM_SAMPLES " << static_cast<deUint32>(params.numColorSamples) << "\n"
+                       << "\n"
+                       << "layout(local_size_x = NUM_SAMPLES) in;\n"   // one work group per pixel, each sample gets a local invocation
+                       << "\n"
+                       << "layout(set = 0, binding = 0) uniform " << samplerPrefix << "sampler2DMS" << (params.numLayers > 1 ? "Array" : "") << " u_image;\n"
+                       << "layout(set = 0, binding = 1, std430) writeonly buffer ColorOutput {\n"
+                       << "    " << colorBufferType << " color[];\n"
+                       << "} sb_out;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    int sampleNdx   = int(gl_LocalInvocationID.x);\n"
+                       << "    int colorOutNdx = NUM_SAMPLES * int(gl_WorkGroupID.x +\n"
+                       << "                                        gl_WorkGroupID.y * gl_NumWorkGroups.x +\n"
+                       << "                                        gl_WorkGroupID.z * gl_NumWorkGroups.x * gl_NumWorkGroups.y);\n"
+                       << "\n";
+               if (pShaderParams->isFmaskFetch)
+               {
+                       src << "    uint  mask    = fragmentMaskFetchAMD(u_image, " << samplingPos << ");\n"
+                               << "    int   fragNdx = int((mask >> (4 * sampleNdx)) & 0xf);\n"
+                               << "    " << samplerPrefix << "vec4 color = fragmentFetchAMD(u_image, " << samplingPos << ", fragNdx);\n"
+                               << "    sb_out.color[colorOutNdx + sampleNdx] = " << colorBufferPack << "(color);\n";
+               }
+               else
+               {
+                       src << "    " << samplerPrefix << "vec4 color = texelFetch(u_image, " << samplingPos << ", sampleNdx);\n"
+                               << "    sb_out.color[colorOutNdx + sampleNdx] = " << colorBufferPack << "(color);\n";
+               }
+               src << "}\n";
+
+               programCollection.glslSources.add(pShaderParams->name) << glu::ComputeSource(src.str());
+       }
+}
+
+std::vector<VkClearValue> genClearValues (const VkFormat format, const deUint32 count)
+{
+       std::vector<VkClearValue>       clearValues;
+       de::Random                                      rng (332);
+
+       switch (format)
+       {
+               case VK_FORMAT_R8G8B8A8_UNORM:
+                       for (deUint32 i = 0u; i < count; ++i)
+                               clearValues.push_back(makeClearValueColorF32(rng.getFloat(), rng.getFloat(), rng.getFloat(), 1.0f));
+                       break;
+
+               case VK_FORMAT_R32_UINT:
+               case VK_FORMAT_R32_SINT:
+                       for (deUint32 i = 0u; i < count; ++i)
+                               clearValues.push_back(makeClearValueColorU32(rng.getUint32(), 0u, 0u, 0u));
+                       break;
+
+               default:
+                       DE_FATAL("Clear color not defined for this format");
+                       break;
+       }
+
+       return clearValues;
+}
+
+//! For subpass load case draw and fetch must happen within the same render pass.
+void drawAndSampleInputAttachment (Context& context, const TestParams& params, WorkingData& wd)
+{
+       DE_ASSERT(params.numLayers == 1u);      // subpass load with single-layer image
+
+       const DeviceInterface&  vk              = context.getDeviceInterface();
+       const VkDevice                  device  = context.getDevice();
+
+       Move<VkRenderPass>              renderPass;
+       Move<VkFramebuffer>             framebuffer;
+
+       // Create descriptor set
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout (DescriptorSetLayoutBuilder()
+               .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,     VK_SHADER_STAGE_FRAGMENT_BIT, &wd.defaultSampler.get())
+               .addSingleBinding               (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,                     VK_SHADER_STAGE_FRAGMENT_BIT)
+               .addSingleBinding               (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,           VK_SHADER_STAGE_FRAGMENT_BIT)
+               .build(vk, device));
+
+       const Unique<VkDescriptorPool> descriptorPool (DescriptorPoolBuilder()
+               .addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
+               .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+               .addType(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
+               .build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       const Unique<VkDescriptorSet> descriptorSet (makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
+
+       {
+               const VkDescriptorImageInfo             colorImageInfo  = makeDescriptorImageInfo(DE_NULL, *wd.colorImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+               const VkDescriptorBufferInfo    bufferInfo              = makeDescriptorBufferInfo(*wd.colorBuffer, 0u, wd.colorBufferSize);
+
+               DescriptorSetUpdateBuilder      builder;
+
+               builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &colorImageInfo);
+               builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,                &bufferInfo);
+
+               if (params.sampleSource == SAMPLE_SOURCE_SUBPASS_INPUT)
+                       builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, &colorImageInfo);
+
+               builder.update(vk, device);
+       }
+
+       // Create a render pass and a framebuffer
+       {
+               std::vector<VkSubpassDescription>               subpasses;
+               std::vector<VkSubpassDependency>                subpassDependencies;
+               std::vector<VkImageView>                                attachments;
+               std::vector<VkAttachmentDescription>    attachmentDescriptions;
+               std::vector<VkAttachmentReference>              attachmentReferences;
+
+               // Reserve capacity to avoid invalidating pointers to elements
+               attachmentReferences.reserve(2);        // color image + input attachment
+
+               // Create a MS draw subpass
+               {
+                       attachments.push_back(*wd.colorImageView);
+
+                       attachmentDescriptions.push_back(makeAttachmentDescription(
+                               (VkAttachmentDescriptionFlags)0,                                                                // VkAttachmentDescriptionFlags         flags;
+                               params.colorFormat,                                                                                             // VkFormat                                                     format;
+                               params.numColorSamples,                                                                                 // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_CLEAR,                                                                    // VkAttachmentLoadOp                           loadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                                                   // VkAttachmentStoreOp                          storeOp;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                                                // VkAttachmentLoadOp                           stencilLoadOp;
+                               VK_ATTACHMENT_STORE_OP_DONT_CARE,                                                               // VkAttachmentStoreOp                          stencilStoreOp;
+                               VK_IMAGE_LAYOUT_UNDEFINED,                                                                              // VkImageLayout                                        initialLayout;
+                               VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL                                                // VkImageLayout                                        finalLayout;
+                       ));
+
+                       attachmentReferences.push_back(makeAttachmentReference(static_cast<deUint32>(attachmentReferences.size()),      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
+                       const VkAttachmentReference* colorRef = &attachmentReferences.back();
+
+                       const VkSubpassDescription subpassDescription =
+                       {
+                               (VkSubpassDescriptionFlags)0,                                           // VkSubpassDescriptionFlags       flags;
+                               VK_PIPELINE_BIND_POINT_GRAPHICS,                                        // VkPipelineBindPoint             pipelineBindPoint;
+                               0u,                                                                                                     // uint32_t                        inputAttachmentCount;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pInputAttachments;
+                               1u,                                                                                                     // uint32_t                        colorAttachmentCount;
+                               colorRef,                                                                                       // const VkAttachmentReference*    pColorAttachments;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pResolveAttachments;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pDepthStencilAttachment;
+                               0u,                                                                                                     // uint32_t                        preserveAttachmentCount;
+                               DE_NULL,                                                                                        // const uint32_t*                 pPreserveAttachments;
+                       };
+
+                       subpasses.push_back(subpassDescription);
+               }
+
+               // Create a sampling subpass
+               {
+                       attachmentReferences.push_back(makeAttachmentReference(0u, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+                       const VkAttachmentReference* inputRef = &attachmentReferences.back();
+
+                       // No color attachment, side effects only
+                       VkSubpassDescription subpassDescription =
+                       {
+                               (VkSubpassDescriptionFlags)0,                                           // VkSubpassDescriptionFlags       flags;
+                               VK_PIPELINE_BIND_POINT_GRAPHICS,                                        // VkPipelineBindPoint             pipelineBindPoint;
+                               1u,                                                                                                     // uint32_t                        inputAttachmentCount;
+                               inputRef,                                                                                       // const VkAttachmentReference*    pInputAttachments;
+                               0u,                                                                                                     // uint32_t                        colorAttachmentCount;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pColorAttachments;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pResolveAttachments;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pDepthStencilAttachment;
+                               0u,                                                                                                     // uint32_t                        preserveAttachmentCount;
+                               DE_NULL,                                                                                        // const uint32_t*                 pPreserveAttachments;
+                       };
+
+                       subpasses.push_back(subpassDescription);
+               }
+
+               // Serialize the subpasses
+               {
+                       const VkAccessFlags     dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
+                                                                                         | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT
+                                                                                         | VK_ACCESS_SHADER_WRITE_BIT;
+                       const VkSubpassDependency       dependency      =
+                       {
+                               0u,                                                                                                                                                                                     // uint32_t                srcSubpass;
+                               1u,                                                                                                                                                                                     // uint32_t                dstSubpass;
+                               VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,          // VkPipelineStageFlags    srcStageMask;
+                               VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,                                                                                                          // VkPipelineStageFlags    dstStageMask;
+                               VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                                                                                                           // VkAccessFlags           srcAccessMask;
+                               dstAccessMask,                                                                                                                                                          // VkAccessFlags           dstAccessMask;
+                               VK_DEPENDENCY_BY_REGION_BIT,                                                                                                                            // VkDependencyFlags       dependencyFlags;
+                       };
+                       subpassDependencies.push_back(dependency);
+               }
+
+               VkRenderPassCreateInfo renderPassInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,                              // VkStructureType                                      sType;
+                       DE_NULL,                                                                                                // const void*                                          pNext;
+                       (VkRenderPassCreateFlags)0,                                                             // VkRenderPassCreateFlags                      flags;
+                       static_cast<deUint32>(attachmentDescriptions.size()),   // deUint32                                                     attachmentCount;
+                       dataOrNullPtr(attachmentDescriptions),                                  // const VkAttachmentDescription*       pAttachments;
+                       static_cast<deUint32>(subpasses.size()),                                // deUint32                                                     subpassCount;
+                       dataOrNullPtr(subpasses),                                                               // const VkSubpassDescription*          pSubpasses;
+                       static_cast<deUint32>(subpassDependencies.size()),              // deUint32                                                     dependencyCount;
+                       dataOrNullPtr(subpassDependencies),                                             // const VkSubpassDependency*           pDependencies;
+               };
+
+               renderPass  = createRenderPass(vk, device, &renderPassInfo);
+               framebuffer = makeFramebuffer (vk, device, *renderPass, static_cast<deUint32>(attachments.size()), dataOrNullPtr(attachments), params.renderSize.x(), params.renderSize.y());
+       }
+
+       const Unique<VkShaderModule>    vertexModuleDraw        (createShaderModule(vk, device, context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule>    fragmentModuleDraw      (createShaderModule(vk, device, context.getBinaryCollection().get("frag"), 0u));
+
+       // Create pipelines for MS draw
+       const Unique<VkPipelineLayout>  pipelineLayout          (makePipelineLayout(vk, device, *descriptorSetLayout));
+       const Unique<VkPipeline>                pipelineDraw            (makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertexModuleDraw, *fragmentModuleDraw,
+                                                                                                                                                         true/*use vertex attribs*/, getVertexInputColorFormat(params.colorFormat), true/*use color attach*/, 0u/*subpass*/,
+                                                                                                                                                         params.renderSize, params.numColorSamples));
+
+       // Sampling pass is single-sampled, output to storage buffer
+       const Unique<VkShaderModule>    vertexModuleSample              (createShaderModule(vk, device, context.getBinaryCollection().get("vert_full"), 0u));
+       const Unique<VkShaderModule>    fragmentModuleSample    (createShaderModule(vk, device, context.getBinaryCollection().get("frag_fmask_fetch"), 0u));
+
+       // Sampling pipeline
+       const Unique<VkPipeline>                pipelineSample          (makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertexModuleSample, *fragmentModuleSample,
+                                                                                                                                                         false/*use vertex attribs*/, VK_FORMAT_UNDEFINED, false/*no color output*/, 1u/*subpass*/,
+                                                                                                                                                         params.renderSize, VK_SAMPLE_COUNT_1_BIT));
+
+       const Unique<VkCommandPool>             cmdPool         (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, context.getUniversalQueueFamilyIndex()));
+       const Unique<VkCommandBuffer>   cmdBuffer       (makeCommandBuffer(vk, device, *cmdPool));
+
+       beginCommandBuffer(vk, *cmdBuffer);
+
+       {
+               // Generate clear values
+               std::vector<VkClearValue> clearValues = genClearValues(params.colorFormat, params.numLayers);
+
+               const VkRect2D renderArea =
+               {
+                       { 0u, 0u },
+                       { params.renderSize.x(), params.renderSize.y() }
+               };
+
+               const VkRenderPassBeginInfo renderPassBeginInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,                       // VkStructureType         sType;
+                       DE_NULL,                                                                                        // const void*             pNext;
+                       *renderPass,                                                                            // VkRenderPass            renderPass;
+                       *framebuffer,                                                                           // VkFramebuffer           framebuffer;
+                       renderArea,                                                                                     // VkRect2D                renderArea;
+                       static_cast<deUint32>(clearValues.size()),                      // uint32_t                clearValueCount;
+                       dataOrNullPtr(clearValues),                                                     // const VkClearValue*     pClearValues;
+               };
+               vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+       }
+
+       vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
+
+       {
+               const VkDeviceSize vertexBufferOffset = 0ull;
+               vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &wd.vertexBuffer.get(), &vertexBufferOffset);
+       }
+
+       vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineDraw);
+       vk.cmdDraw(*cmdBuffer, wd.numVertices, 1u, 0u, 0u);
+
+       vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+
+       vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineSample);
+       vk.cmdDraw(*cmdBuffer, 3u, 1u, 0u, 0u); // fill the framebuffer, geometry defined in the VS
+
+       vk.cmdEndRenderPass(*cmdBuffer);
+
+       // Buffer write barrier
+       {
+               const VkBufferMemoryBarrier barrier =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,                // VkStructureType    sType;
+                       DE_NULL,                                                                                // const void*        pNext;
+                       VK_ACCESS_SHADER_WRITE_BIT,                                             // VkAccessFlags      srcAccessMask;
+                       VK_ACCESS_HOST_READ_BIT,                                                // VkAccessFlags      dstAccessMask;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           dstQueueFamilyIndex;
+                       *wd.colorBuffer,                                                                // VkBuffer           buffer;
+                       0ull,                                                                                   // VkDeviceSize       offset;
+                       VK_WHOLE_SIZE,                                                                  // VkDeviceSize       size;
+               };
+
+               vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0u, DE_NULL, 1u, &barrier, DE_NULL, 0u);
+       }
+
+       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+       submitCommandsAndWait(vk, device, context.getUniversalQueue(), *cmdBuffer);
+
+       invalidateMappedMemoryRange(vk, device, wd.colorBufferAlloc->getMemory(), wd.colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+}
+
+//! Only draw a multisampled image
+void draw (Context& context, const TestParams& params, WorkingData& wd)
+{
+       const DeviceInterface&  vk              = context.getDeviceInterface();
+       const VkDevice                  device  = context.getDevice();
+
+       std::vector<ImageViewSp>        imageViews;
+       Move<VkRenderPass>                      renderPass;
+       Move<VkFramebuffer>                     framebuffer;
+
+       // Create color attachments
+       for (deUint32 layerNdx = 0u; layerNdx < params.numLayers; ++layerNdx)
+       {
+               imageViews.push_back(ImageViewSp(new Unique<VkImageView>(
+                       makeImageView(vk, device, *wd.colorImage, VK_IMAGE_VIEW_TYPE_2D, params.colorFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, layerNdx, 1u)))));
+       }
+
+       // Create a render pass and a framebuffer
+       {
+               std::vector<VkSubpassDescription>               subpasses;
+               std::vector<VkImageView>                                attachments;
+               std::vector<VkAttachmentDescription>    attachmentDescriptions;
+               std::vector<VkAttachmentReference>              attachmentReferences;
+
+               // Reserve capacity to avoid invalidating pointers to elements
+               attachmentReferences.reserve(params.numLayers);
+
+               // Create MS draw subpasses
+               for (deUint32 layerNdx = 0u; layerNdx < params.numLayers; ++layerNdx)
+               {
+                       attachments.push_back(**imageViews[layerNdx]);
+
+                       attachmentDescriptions.push_back(makeAttachmentDescription(
+                               (VkAttachmentDescriptionFlags)0,                                                                // VkAttachmentDescriptionFlags         flags;
+                               params.colorFormat,                                                                                             // VkFormat                                                     format;
+                               params.numColorSamples,                                                                                 // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_CLEAR,                                                                    // VkAttachmentLoadOp                           loadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                                                   // VkAttachmentStoreOp                          storeOp;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                                                // VkAttachmentLoadOp                           stencilLoadOp;
+                               VK_ATTACHMENT_STORE_OP_DONT_CARE,                                                               // VkAttachmentStoreOp                          stencilStoreOp;
+                               VK_IMAGE_LAYOUT_UNDEFINED,                                                                              // VkImageLayout                                        initialLayout;
+                               VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL                                                // VkImageLayout                                        finalLayout;
+                       ));
+
+                       attachmentReferences.push_back(makeAttachmentReference(static_cast<deUint32>(attachmentReferences.size()),      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
+                       const VkAttachmentReference* colorRef = &attachmentReferences.back();
+
+                       const VkSubpassDescription subpassDescription =
+                       {
+                               (VkSubpassDescriptionFlags)0,                                           // VkSubpassDescriptionFlags       flags;
+                               VK_PIPELINE_BIND_POINT_GRAPHICS,                                        // VkPipelineBindPoint             pipelineBindPoint;
+                               0u,                                                                                                     // uint32_t                        inputAttachmentCount;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pInputAttachments;
+                               1u,                                                                                                     // uint32_t                        colorAttachmentCount;
+                               colorRef,                                                                                       // const VkAttachmentReference*    pColorAttachments;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pResolveAttachments;
+                               DE_NULL,                                                                                        // const VkAttachmentReference*    pDepthStencilAttachment;
+                               0u,                                                                                                     // uint32_t                        preserveAttachmentCount;
+                               DE_NULL,                                                                                        // const uint32_t*                 pPreserveAttachments;
+                       };
+
+                       subpasses.push_back(subpassDescription);
+               }
+
+               // All MS image drawing subpasses are independent
+               VkRenderPassCreateInfo renderPassInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,                              // VkStructureType                                      sType;
+                       DE_NULL,                                                                                                // const void*                                          pNext;
+                       (VkRenderPassCreateFlags)0,                                                             // VkRenderPassCreateFlags                      flags;
+                       static_cast<deUint32>(attachmentDescriptions.size()),   // deUint32                                                     attachmentCount;
+                       dataOrNullPtr(attachmentDescriptions),                                  // const VkAttachmentDescription*       pAttachments;
+                       static_cast<deUint32>(subpasses.size()),                                // deUint32                                                     subpassCount;
+                       dataOrNullPtr(subpasses),                                                               // const VkSubpassDescription*          pSubpasses;
+                       0u,                                                                                                             // deUint32                                                     dependencyCount;
+                       DE_NULL,                                                                                                // const VkSubpassDependency*           pDependencies;
+               };
+
+               renderPass  = createRenderPass(vk, device, &renderPassInfo);
+               framebuffer = makeFramebuffer (vk, device, *renderPass, static_cast<deUint32>(attachments.size()), dataOrNullPtr(attachments), params.renderSize.x(), params.renderSize.y());
+       }
+
+       std::vector<PipelineSp>                 pipelines;
+       const Unique<VkPipelineLayout>  pipelineLayout          (makePipelineLayout(vk, device));
+       const Unique<VkShaderModule>    vertexModuleDraw        (createShaderModule(vk, device, context.getBinaryCollection().get("vert"), 0u));
+       const Unique<VkShaderModule>    fragmentModuleDraw      (createShaderModule(vk, device, context.getBinaryCollection().get("frag"), 0u));
+
+       // Create pipelines for MS draw
+       for (deUint32 layerNdx = 0u; layerNdx < params.numLayers; ++layerNdx)
+       {
+               pipelines.push_back(PipelineSp(new Unique<VkPipeline>(
+                       makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertexModuleDraw, *fragmentModuleDraw,
+                                                                true /*use vertex attribs*/, getVertexInputColorFormat(params.colorFormat), true/*use color attachment*/, layerNdx /*subpass*/,
+                                                                params.renderSize, params.numColorSamples))));
+       }
+
+       const Unique<VkCommandPool>             cmdPool         (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, context.getUniversalQueueFamilyIndex()));
+       const Unique<VkCommandBuffer>   cmdBuffer       (makeCommandBuffer(vk, device, *cmdPool));
+
+       beginCommandBuffer(vk, *cmdBuffer);
+
+       {
+               // Generate clear values
+               std::vector<VkClearValue> clearValues = genClearValues(params.colorFormat, params.numLayers);
+
+               const VkRect2D renderArea =
+               {
+                       { 0u, 0u },
+                       { params.renderSize.x(), params.renderSize.y() }
+               };
+
+               const VkRenderPassBeginInfo renderPassBeginInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,                       // VkStructureType         sType;
+                       DE_NULL,                                                                                        // const void*             pNext;
+                       *renderPass,                                                                            // VkRenderPass            renderPass;
+                       *framebuffer,                                                                           // VkFramebuffer           framebuffer;
+                       renderArea,                                                                                     // VkRect2D                renderArea;
+                       static_cast<deUint32>(clearValues.size()),                      // uint32_t                clearValueCount;
+                       dataOrNullPtr(clearValues),                                                     // const VkClearValue*     pClearValues;
+               };
+               vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+       }
+
+       {
+               const VkDeviceSize vertexBufferOffset = 0ull;
+               vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &wd.vertexBuffer.get(), &vertexBufferOffset);
+       }
+
+       for (deUint32 layerNdx = 0u; layerNdx < params.numLayers; ++layerNdx)
+       {
+               if (layerNdx != 0u)
+                       vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+
+               vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[layerNdx]);
+               vk.cmdDraw(*cmdBuffer, wd.numVertices, 1u, 0u, layerNdx);       // pass instance index to slightly change geometry per layer
+       }
+
+       vk.cmdEndRenderPass(*cmdBuffer);
+
+       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+       submitCommandsAndWait(vk, device, context.getUniversalQueue(), *cmdBuffer);
+}
+
+//! Sample from an image in a compute shader, storing the result in a color buffer
+void dispatchSampleImage (Context& context, const TestParams& params, WorkingData& wd, const std::string& shaderName)
+{
+       const DeviceInterface&  vk              = context.getDeviceInterface();
+       const VkDevice                  device  = context.getDevice();
+
+       // Create descriptor set
+
+       const Unique<VkDescriptorSetLayout> descriptorSetLayout(
+               DescriptorSetLayoutBuilder()
+               .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,     VK_SHADER_STAGE_COMPUTE_BIT, &wd.defaultSampler.get())
+               .addSingleBinding               (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,                     VK_SHADER_STAGE_COMPUTE_BIT)
+               .build(vk, device));
+
+       const Unique<VkDescriptorPool> descriptorPool(
+               DescriptorPoolBuilder()
+               .addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
+               .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+               .build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+       const Unique<VkDescriptorSet> descriptorSet(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
+
+       {
+               const VkDescriptorImageInfo             colorImageInfo          = makeDescriptorImageInfo(DE_NULL, *wd.colorImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+               const VkDescriptorBufferInfo    resultBufferInfo        = makeDescriptorBufferInfo(*wd.colorBuffer, 0ull, wd.colorBufferSize);
+
+               DescriptorSetUpdateBuilder      builder;
+
+               builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &colorImageInfo);
+               builder.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,                 &resultBufferInfo);
+
+               builder.update(vk, device);
+       }
+
+       // Pipeline
+
+       const Unique<VkShaderModule>    shaderModule    (createShaderModule(vk, device, context.getBinaryCollection().get(shaderName), 0u));
+       const Unique<VkPipelineLayout>  pipelineLayout  (makePipelineLayout(vk, device, *descriptorSetLayout));
+       const Unique<VkPipeline>                pipeline                (makeComputePipeline(vk, device, *pipelineLayout, *shaderModule, DE_NULL));
+
+       const Unique<VkCommandPool>             cmdPool         (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, context.getUniversalQueueFamilyIndex()));
+       const Unique<VkCommandBuffer>   cmdBuffer       (makeCommandBuffer(vk, device, *cmdPool));
+
+       beginCommandBuffer(vk, *cmdBuffer);
+
+       vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+       vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
+
+       vk.cmdDispatch(*cmdBuffer, params.renderSize.x(), params.renderSize.y(), params.numLayers);
+
+       {
+               const VkBufferMemoryBarrier barrier =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,                // VkStructureType    sType;
+                       DE_NULL,                                                                                // const void*        pNext;
+                       VK_ACCESS_SHADER_WRITE_BIT,                                             // VkAccessFlags      srcAccessMask;
+                       VK_ACCESS_HOST_READ_BIT,                                                // VkAccessFlags      dstAccessMask;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                                // uint32_t           dstQueueFamilyIndex;
+                       *wd.colorBuffer,                                                                // VkBuffer           buffer;
+                       0ull,                                                                                   // VkDeviceSize       offset;
+                       VK_WHOLE_SIZE,                                                                  // VkDeviceSize       size;
+               };
+
+               vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0,
+                       (const VkMemoryBarrier*)DE_NULL, 1u, &barrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
+       }
+
+       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+       submitCommandsAndWait(vk, device, context.getUniversalQueue(), *cmdBuffer);
+
+       invalidateMappedMemoryRange(vk, device, wd.colorBufferAlloc->getMemory(), wd.colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+}
+
+//! Get a single-sampled image access from a multisampled color buffer with samples packed per pixel
+tcu::ConstPixelBufferAccess getSingleSampledAccess (const void* const imageData, const TestParams& params, const deUint32 sampleNdx, const deUint32 layerNdx)
+{
+       const deUint32          numSamples      = static_cast<deUint32>(params.numColorSamples);
+       const deUint32          pixelSize       = tcu::getPixelSize(mapVkFormat(params.colorFormat));
+       const deUint32          rowSize         = pixelSize * params.renderSize.x();
+       const deUint32          layerSize       = rowSize * params.renderSize.y();
+       const deUint8*          src                     = static_cast<const deUint8*>(imageData)
+                                                                       + (layerNdx * numSamples * layerSize)
+                                                                       + (sampleNdx * pixelSize);
+       const tcu::IVec3        size            (params.renderSize.x(), params.renderSize.y(), 1);
+       const tcu::IVec3        pitch           (numSamples * pixelSize,
+                                                                        numSamples * rowSize,
+                                                                        numSamples * layerSize);
+       return tcu::ConstPixelBufferAccess(mapVkFormat(params.colorFormat), size, pitch, src);
+}
+
+tcu::TestStatus test (Context& context, const TestParams params)
+{
+       WorkingData                             wd;
+       const DeviceInterface&  vk                = context.getDeviceInterface();
+       const VkDevice                  device    = context.getDevice();
+       MovePtr<Allocator>              allocator = MovePtr<Allocator>(new SimpleAllocator(vk, device, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())));
+
+       // Initialize resources
+       {
+               const VkImageUsageFlags msImageUsage    = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
+                                                                                               | VK_IMAGE_USAGE_SAMPLED_BIT
+                                                                                               | (params.sampleSource == SAMPLE_SOURCE_SUBPASS_INPUT ? VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT : (VkImageUsageFlagBits)0);
+               wd.colorImage           = makeImage(vk, device, params.colorFormat, params.renderSize, params.numLayers, params.numColorSamples, msImageUsage);
+               wd.colorImageAlloc      = bindImage(vk, device, *allocator, *wd.colorImage, MemoryRequirement::Any);
+               wd.colorImageView       = makeImageView(vk, device, *wd.colorImage, (params.numLayers == 1u ? VK_IMAGE_VIEW_TYPE_2D : VK_IMAGE_VIEW_TYPE_2D_ARRAY), params.colorFormat,
+                                                                                       makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, params.numLayers));
+
+               wd.defaultSampler       = makeSampler(vk, device);
+
+               // Color buffer is meant to hold data for all layers and all samples of the image.
+               // Data is tightly packed layer by layer, for each pixel all samples are laid out together starting with sample 0.
+               // E.g.: pixel(0,0)sample(0)sample(1), pixel(1,0)sample(0)sample(1), ...
+               wd.colorBufferSize      = static_cast<VkDeviceSize>(tcu::getPixelSize(mapVkFormat(params.colorFormat))
+                                                                                                               * params.renderSize.x() * params.renderSize.y() * params.numLayers * static_cast<deUint32>(params.numColorSamples));
+               wd.colorBuffer          = makeBuffer(vk, device, wd.colorBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+               wd.colorBufferAlloc     = bindBuffer(vk, device, *allocator, *wd.colorBuffer, MemoryRequirement::HostVisible);
+
+               deMemset(wd.colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(wd.colorBufferSize));
+               flushMappedMemoryRange(vk, device, wd.colorBufferAlloc->getMemory(), wd.colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+
+               const std::vector<PositionColor>        vertices                        = genShapes(params.colorFormat);
+               const VkDeviceSize                                      vertexBufferSize        = static_cast<VkDeviceSize>(sizeof(vertices[0]) * vertices.size());
+
+               wd.numVertices                  = static_cast<deUint32>(vertices.size());
+               wd.vertexBuffer                 = makeBuffer(vk, device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+               wd.vertexBufferAlloc    = bindBuffer(vk, device, *allocator, *wd.vertexBuffer, MemoryRequirement::HostVisible);
+
+               deMemcpy(wd.vertexBufferAlloc->getHostPtr(), dataOrNullPtr(vertices), static_cast<std::size_t>(vertexBufferSize));
+               flushMappedMemoryRange(vk, device, wd.vertexBufferAlloc->getMemory(), wd.vertexBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+       }
+
+       if (params.sampleSource == SAMPLE_SOURCE_SUBPASS_INPUT)
+       {
+               // Create a multisample image and sample from it
+               drawAndSampleInputAttachment (context, params, wd);
+       }
+       else
+       {
+               // Draw the image, then sample from it in a CS
+               draw                            (context, params, wd);
+               dispatchSampleImage (context, params, wd, "comp_fmask_fetch");
+       }
+
+       // Copy the result
+       std::vector<deUint8> fmaskFetchColorBuffer (static_cast<deUint32>(wd.colorBufferSize));
+       deMemcpy(&fmaskFetchColorBuffer[0], wd.colorBufferAlloc->getHostPtr(), static_cast<std::size_t>(wd.colorBufferSize));
+
+       // Clear the color buffer, just to be sure we're getting the new data
+       deMemset(wd.colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(wd.colorBufferSize));
+       flushMappedMemoryRange(vk, device, wd.colorBufferAlloc->getMemory(), wd.colorBufferAlloc->getOffset(), VK_WHOLE_SIZE);
+
+       // Sample image using the standard texel fetch
+       dispatchSampleImage (context, params, wd, "comp_fetch");
+
+       // Verify the images
+       {
+               const void* const fmaskResult    = dataOrNullPtr(fmaskFetchColorBuffer);
+               const void* const expectedResult = wd.colorBufferAlloc->getHostPtr();
+
+               DE_ASSERT(!isFloatFormat(params.colorFormat));  // we're using int compare
+
+               // Mismatch, do image compare to pinpoint the failure
+               for (deUint32 layerNdx  = 0u; layerNdx  < params.numLayers;                                                              ++layerNdx)
+               for (deUint32 sampleNdx = 0u; sampleNdx < static_cast<deUint32>(params.numColorSamples); ++sampleNdx)
+               {
+                       const std::string                                       imageName       = "layer_" + de::toString(layerNdx) + "_sample_" + de::toString(sampleNdx);
+                       const std::string                                       imageDesc       = "Layer " + de::toString(layerNdx) + " Sample " + de::toString(sampleNdx);
+                       const tcu::ConstPixelBufferAccess       expected        = getSingleSampledAccess(expectedResult, params, sampleNdx, layerNdx);
+                       const tcu::ConstPixelBufferAccess       actual          = getSingleSampledAccess(fmaskResult,    params, sampleNdx, layerNdx);
+                       const UVec4                                                     threshold       (0);    // should match exactly
+
+                       const bool ok = tcu::intThresholdCompare(context.getTestContext().getLog(), imageName.c_str(), imageDesc.c_str(),
+                                                                                                        expected, actual, threshold, tcu::COMPARE_LOG_RESULT);
+
+                       if (!ok)
+                               return tcu::TestStatus::fail("Some texels were incorrect");
+               }
+       }
+
+       return tcu::TestStatus::pass("Pass");
+}
+
+std::string getFormatShortString (const VkFormat format)
+{
+       std::string s(de::toLower(getFormatName(format)));
+       return s.substr(10);
+}
+
+void createShaderFragmentMaskTestsInGroup (tcu::TestCaseGroup* rootGroup)
+{
+       // Per spec, the following formats must support color attachment and sampled image
+       const VkFormat colorFormats[] =
+       {
+               VK_FORMAT_R8G8B8A8_UNORM,
+               VK_FORMAT_R32_UINT,
+               VK_FORMAT_R32_SINT,
+       };
+
+       const VkSampleCountFlagBits     sampleCounts[] =
+       {
+               VK_SAMPLE_COUNT_2_BIT,
+               VK_SAMPLE_COUNT_4_BIT,
+               VK_SAMPLE_COUNT_8_BIT,
+               VK_SAMPLE_COUNT_16_BIT,
+       };
+
+       const struct SourceCase
+       {
+               const char*                     name;
+               deUint32                        numLayers;
+               SampleSource            sampleSource;
+       } sourceCases[] =
+       {
+               { "image_2d",           1u,     SAMPLE_SOURCE_IMAGE                     },
+               { "image_2d_array",     3u,     SAMPLE_SOURCE_IMAGE                     },
+               { "subpass_input",      1u,     SAMPLE_SOURCE_SUBPASS_INPUT     },
+       };
+
+       // Test 1: Compare fragments fetched via FMASK and an ordinary texel fetch
+       {
+               for (const VkSampleCountFlagBits* pSampleCount = sampleCounts; pSampleCount != DE_ARRAY_END(sampleCounts); ++pSampleCount)
+               {
+                       MovePtr<tcu::TestCaseGroup> sampleCountGroup (new tcu::TestCaseGroup(rootGroup->getTestContext(), ("samples_" + de::toString(*pSampleCount)).c_str(), ""));
+                       for (const SourceCase* pSourceCase = sourceCases; pSourceCase != DE_ARRAY_END(sourceCases); ++pSourceCase)
+                       {
+                               MovePtr<tcu::TestCaseGroup> sourceGroup (new tcu::TestCaseGroup(rootGroup->getTestContext(), pSourceCase->name, ""));
+                               for (const VkFormat* pColorFormat = colorFormats; pColorFormat != DE_ARRAY_END(colorFormats); ++pColorFormat)
+                               {
+                                       TestParams params;
+                                       params.renderSize               = UVec2(32, 32);
+                                       params.colorFormat              = *pColorFormat;
+                                       params.numColorSamples  = *pSampleCount;
+                                       params.numLayers                = pSourceCase->numLayers;
+                                       params.sampleSource             = pSourceCase->sampleSource;
+
+                                       addFunctionCaseWithPrograms(sourceGroup.get(), getFormatShortString(*pColorFormat), "", checkRequirements, initPrograms, test, params);
+                               }
+                               sampleCountGroup->addChild(sourceGroup.release());
+                       }
+                       rootGroup->addChild(sampleCountGroup.release());
+               }
+       }
+}
+
+} // anonymous ns
+
+tcu::TestCaseGroup* createMultisampleShaderFragmentMaskTests (tcu::TestContext& testCtx)
+{
+       return createTestGroup(testCtx, "shader_fragment_mask", "Access raw texel values in a compressed MSAA surface", createShaderFragmentMaskTestsInGroup);
+}
+
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.hpp
new file mode 100644 (file)
index 0000000..9855bcf
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef _VKTPIPELINEMULTISAMPLESHADERFRAGMENTMASKTESTS_HPP
+#define _VKTPIPELINEMULTISAMPLESHADERFRAGMENTMASKTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 Advanced Micro Devices, Inc.
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests for VK_AMD_shader_fragment_mask
+ *//*--------------------------------------------------------------------*/
+
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+
+tcu::TestCaseGroup* createMultisampleShaderFragmentMaskTests (tcu::TestContext& testCtx);
+
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINEMULTISAMPLESHADERFRAGMENTMASKTESTS_HPP
index e184950c84c5266914e663ed14e6d6e7dec2117c..0682a53bfa99c6bd422fdb07706ef49e72af146e 100644 (file)
@@ -26,6 +26,8 @@
 #include "vktPipelineMultisampleTests.hpp"
 #include "vktPipelineMultisampleImageTests.hpp"
 #include "vktPipelineMultisampleSampleLocationsExtTests.hpp"
+#include "vktPipelineMultisampleMixedAttachmentSamplesTests.hpp"
+#include "vktPipelineMultisampleShaderFragmentMaskTests.hpp"
 #include "vktPipelineClearUtil.hpp"
 #include "vktPipelineImageUtil.hpp"
 #include "vktPipelineVertexUtil.hpp"
@@ -3886,6 +3888,12 @@ tcu::TestCaseGroup* createMultisampleTests (tcu::TestContext& testCtx)
                multisampleTests->addChild(createMultisampleSampleLocationsExtTests(testCtx));
        }
 
+       // VK_AMD_mixed_attachment samples and VK_AMD_shader_fragment_mask
+       {
+               multisampleTests->addChild(createMultisampleMixedAttachmentSamplesTests(testCtx));
+               multisampleTests->addChild(createMultisampleShaderFragmentMaskTests(testCtx));
+       }
+
        // Sample mask with and without vk_ext_post_depth_coverage
        {
                const vk::VkSampleCountFlagBits standardSamplesSet[] =
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSampleLocationsUtil.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSampleLocationsUtil.cpp
new file mode 100644 (file)
index 0000000..d720a25
--- /dev/null
@@ -0,0 +1,94 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 Advanced Micro Devices, Inc.
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Utilities for VK_EXT_sample_locations
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineSampleLocationsUtil.hpp"
+#include "deRandom.hpp"
+#include <set>
+
+namespace vkt
+{
+namespace pipeline
+{
+using namespace vk;
+using tcu::UVec2;
+using tcu::Vec2;
+
+//! Order a Vector by X, Y, Z, and W
+template<typename VectorT>
+struct LessThan
+{
+       bool operator()(const VectorT& v1, const VectorT& v2) const
+       {
+               for (int i = 0; i < VectorT::SIZE; ++i)
+               {
+                       if (v1[i] == v2[i])
+                               continue;
+                       else
+                               return v1[i] < v2[i];
+               }
+
+               return false;
+       }
+};
+
+static inline deUint32 numSamplesPerPixel (const MultisamplePixelGrid& pixelGrid)
+{
+       return static_cast<deUint32>(pixelGrid.samplesPerPixel());
+}
+
+//! Fill each grid pixel with a distinct samples pattern, rounding locations based on subPixelBits
+void fillSampleLocationsRandom (MultisamplePixelGrid& grid, const deUint32 subPixelBits, const deUint32 seed)
+{
+       const deUint32  guardOffset                     = 1u;   // don't put samples on the right or the bottom edge of the pixel
+       const deUint32  maxLocationIndex        = 1u << subPixelBits;
+       de::Random              rng                                     (seed);
+
+       for (deUint32 gridY = 0; gridY < grid.size().y(); ++gridY)
+       for (deUint32 gridX = 0; gridX < grid.size().x(); ++gridX)
+       {
+               std::set<UVec2, LessThan<UVec2> >       takenLocationIndices;
+               for (deUint32 sampleNdx = 0; sampleNdx < numSamplesPerPixel(grid); /* no increment */)
+               {
+                       const UVec2 locationNdx (rng.getUint32() % (maxLocationIndex + 1 - guardOffset),
+                                                                        rng.getUint32() % (maxLocationIndex + 1 - guardOffset));
+
+                       if (takenLocationIndices.find(locationNdx) == takenLocationIndices.end())
+                       {
+                               const VkSampleLocationEXT location =
+                               {
+                                       static_cast<float>(locationNdx.x()) / static_cast<float>(maxLocationIndex),     // float x;
+                                       static_cast<float>(locationNdx.y()) / static_cast<float>(maxLocationIndex),     // float y;
+                               };
+
+                               grid.setSample(gridX, gridY, sampleNdx, location);
+                               takenLocationIndices.insert(locationNdx);
+
+                               ++sampleNdx;    // next sample
+                       }
+               }
+       }
+}
+
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSampleLocationsUtil.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSampleLocationsUtil.hpp
new file mode 100644 (file)
index 0000000..46b7955
--- /dev/null
@@ -0,0 +1,106 @@
+#ifndef _VKTPIPELINESAMPLELOCATIONSUTIL_HPP
+#define _VKTPIPELINESAMPLELOCATIONSUTIL_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 Advanced Micro Devices, Inc.
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Utilities for VK_EXT_sample_locations
+ *//*--------------------------------------------------------------------*/
+
+#include "vkDefs.hpp"
+#include "vkTypeUtil.hpp"
+#include "vktPipelineMakeUtil.hpp"
+#include "vktTestCase.hpp"
+#include "tcuVector.hpp"
+#include <vector>
+
+namespace vkt
+{
+namespace pipeline
+{
+
+//! Specify sample locations in a pixel grid
+class MultisamplePixelGrid
+{
+public:
+       MultisamplePixelGrid (const tcu::UVec2& gridSize, const vk::VkSampleCountFlagBits numSamples)
+               : m_gridSize            (gridSize)
+               , m_numSamples          (numSamples)
+               , m_sampleLocations     (gridSize.x() * gridSize.y() * numSamples)
+       {
+               DE_ASSERT(gridSize.x() > 0 && gridSize.y() > 0);
+               DE_ASSERT(numSamples   > 1);
+       }
+
+       //! If grid x,y is larger than gridSize, then each coordinate is wrapped, x' = x % size_x
+       const vk::VkSampleLocationEXT& getSample (deUint32 gridX, deUint32 gridY, const deUint32 sampleNdx) const
+       {
+               return m_sampleLocations[getSampleIndex(gridX, gridY, sampleNdx)];
+       }
+
+       void setSample (const deUint32 gridX, const deUint32 gridY, const deUint32 sampleNdx, const vk::VkSampleLocationEXT& location)
+       {
+               DE_ASSERT(gridX < m_gridSize.x());
+               DE_ASSERT(gridY < m_gridSize.y());
+
+               m_sampleLocations[getSampleIndex(gridX, gridY, sampleNdx)] = location;
+       }
+
+       const tcu::UVec2&                               size                            (void) const    { return m_gridSize; }
+       vk::VkSampleCountFlagBits               samplesPerPixel         (void) const    { return m_numSamples; }
+       const vk::VkSampleLocationEXT*  sampleLocations         (void) const    { return dataOrNullPtr(m_sampleLocations); }
+       vk::VkSampleLocationEXT*                sampleLocations         (void)                  { return dataOrNullPtr(m_sampleLocations); }
+       deUint32                                                sampleLocationCount     (void) const    { return static_cast<deUint32>(m_sampleLocations.size()); }
+
+private:
+       deUint32 getSampleIndex (deUint32 gridX, deUint32 gridY, const deUint32 sampleNdx) const
+       {
+               gridX %= m_gridSize.x();
+               gridY %= m_gridSize.y();
+               return (gridY * m_gridSize.x() + gridX) * static_cast<deUint32>(m_numSamples) + sampleNdx;
+       }
+
+       tcu::UVec2                                                              m_gridSize;
+       vk::VkSampleCountFlagBits                               m_numSamples;
+       std::vector<vk::VkSampleLocationEXT>    m_sampleLocations;
+};
+
+//! References the data inside MultisamplePixelGrid
+inline vk::VkSampleLocationsInfoEXT makeSampleLocationsInfo (const MultisamplePixelGrid& pixelGrid)
+{
+       const vk::VkSampleLocationsInfoEXT info =
+       {
+               vk::VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT,                                // VkStructureType               sType;
+               DE_NULL,                                                                                                                // const void*                   pNext;
+               pixelGrid.samplesPerPixel(),                                                                    // VkSampleCountFlagBits         sampleLocationsPerPixel;
+               vk::makeExtent2D(pixelGrid.size().x(), pixelGrid.size().y()),   // VkExtent2D                    sampleLocationGridSize;
+               pixelGrid.sampleLocationCount(),                                                                // uint32_t                      sampleLocationsCount;
+               pixelGrid.sampleLocations(),                                                                    // const VkSampleLocationEXT*    pSampleLocations;
+       };
+       return info;
+}
+
+//! Fill each grid pixel with a distinct samples pattern, rounding locations based on subPixelBits
+void fillSampleLocationsRandom (MultisamplePixelGrid& grid, const deUint32 subPixelBits, const deUint32 seed = 142u);
+
+} // pipeline
+} // vkt
+
+#endif // _VKTPIPELINESAMPLELOCATIONSUTIL_HPP
index aa0009c0a407f2ac7ab5d531ea4f43b3a85c4cd0..cf3ef94b3bd4ea7f4b90a52c53e925aa0b43fd28 100644 (file)
@@ -64,7 +64,9 @@ vector<string> filterExtensions (const vector<VkExtensionProperties>& extensions
                "VK_KHX_",
                "VK_NV_cooperative_matrix",
                "VK_NV_shading_rate_image",
-               "VK_NV_ray_tracing"
+               "VK_NV_ray_tracing",
+               "VK_AMD_mixed_attachment_samples",
+               "VK_AMD_shader_fragment_mask",
        };
 
        for (size_t extNdx = 0; extNdx < extensions.size(); extNdx++)
index 554334d780afbf518c75011244034451cc1e4c9c..51e536f858454c670f4b4d318aca701365ee2e30 100644 (file)
@@ -235967,6 +235967,260 @@ dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_s
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_dynamic
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_secondary_cmd_buf
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_dynamic_secondary_cmd_buf
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r32_sint
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_2
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_2_post_depth_coverage
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_4
index 8dff2b02b60b174237572dd497bd1e221aa916ff..03f1382302d006603a382fa9253b5e33dedd97a1 100644 (file)
@@ -235967,6 +235967,260 @@ dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_s
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_dynamic
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_secondary_cmd_buf
 dEQP-VK.pipeline.multisample.sample_locations_ext.draw.stencil.samples_16.same_subpass_clear_attachments_dynamic_secondary_cmd_buf
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_standard_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_x8_d24_unorm_pack32
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_decrease_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_color_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.verify_programmable_locations.multi_subpass_increase_coverage_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_2_color_1_depth_stencil_2.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_1_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_1_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_1_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_4_color_2_depth_stencil_4.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_2_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_2_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_8_color_4_depth_stencil_8.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_4_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d16_unorm
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d24_unorm_s8_uint
+dEQP-VK.pipeline.multisample.mixed_attachment_samples.shader_builtins.coverage_16_color_8_depth_stencil_16.r8g8b8a8_unorm_d32_sfloat_s8_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_2.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_4.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_8.subpass_input.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.image_2d_array.r32_sint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r8g8b8a8_unorm
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r32_uint
+dEQP-VK.pipeline.multisample.shader_fragment_mask.samples_16.subpass_input.r32_sint
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_2
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_2_post_depth_coverage
 dEQP-VK.pipeline.multisample.sample_mask_with_depth_test.samples_4