VK_KHR_fragment_shading_rate pixel consistency
authorMarcin Kańtoch <marcin.kantoch@amd.com>
Tue, 11 Aug 2020 13:43:15 +0000 (15:43 +0200)
committerAlexander Galazin <alexander.galazin@arm.com>
Wed, 3 Feb 2021 09:51:01 +0000 (10:51 +0100)
Pixel selection consistency tests

New tests:
dEQP-VK.fragment_shading_rate.pixel_consistency*

Components: Vulkan
VK-GL-CTS Issue: 2397

Change-Id: I3a1b10da7ef3a0897d78c9352c5373f6d4e5fae0

AndroidGen.mk
android/cts/master/vk-master-2020-03-01.txt
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/fragment_shading_rate/CMakeLists.txt
external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateTests.cpp
external/vulkancts/mustpass/master/vk-default.txt

index 37b0606..9e6ae63 100644 (file)
@@ -155,6 +155,7 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp \
        external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockTests.cpp \
        external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateBasic.cpp \
+       external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.cpp \
        external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateTests.cpp \
        external/vulkancts/modules/vulkan/geometry/vktGeometryBasicClass.cpp \
        external/vulkancts/modules/vulkan/geometry/vktGeometryBasicGeometryShaderTests.cpp \
index 1ba15af..79fce94 100644 (file)
@@ -392307,3 +392307,228 @@ dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.r
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples8.gs
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples16.vs
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples16.gs
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_256x256
index 7c6a0e7..ab7c45f 100644 (file)
@@ -802500,3 +802500,228 @@ dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.r
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples8.gs
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples16.vs
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples16.gs
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_256x256
index 0cbd423..07a339d 100644 (file)
@@ -5,6 +5,8 @@ set(DEQP_VK_FRAGMENT_SHADING_RATE_SRCS
        vktFragmentShadingRateTests.hpp
        vktFragmentShadingRateBasic.cpp
        vktFragmentShadingRateBasic.hpp
+       vktFragmentShadingRatePixelConsistency.hpp
+       vktFragmentShadingRatePixelConsistency.cpp
 )
 
 set(DEQP_VK_FRAGMENT_SHADING_RATE_LIBS
diff --git a/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.cpp b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.cpp
new file mode 100644 (file)
index 0000000..adbc66b
--- /dev/null
@@ -0,0 +1,1345 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2020 The Khronos Group Inc.
+ * Copyright (c) 2020 AMD
+ *
+ * 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_KHR_fragment_shading_rate
+ *//*--------------------------------------------------------------------*/
+
+#include "vktFragmentShadingRatePixelConsistency.hpp"
+
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkPlatform.hpp"
+
+#include "vktTestGroupUtil.hpp"
+#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
+
+#include "deDefs.h"
+#include "deMath.h"
+#include "deRandom.h"
+#include "deSharedPtr.hpp"
+#include "deString.h"
+
+#include "tcuTestCase.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
+
+#include <limits>
+#include <string>
+#include <sstream>
+
+namespace vkt
+{
+namespace FragmentShadingRate
+{
+namespace
+{
+using namespace vk;
+using namespace std;
+
+struct CaseDef
+{
+       VkExtent2D                              shadingRate;
+       VkSampleCountFlagBits   samples;
+       VkExtent2D                              framebufferExtent;
+};
+
+struct Vertex
+{
+       float x;
+       float y;
+};
+
+Vertex basicTriangles[6] =
+{
+       {-1.0f, -1.0f},
+       { 1.0f, -1.0f},
+       { 1.0f,  1.0f},
+
+       {-1.0f,  1.0f},
+       { 1.0f, -1.0f},
+       { 1.0f,  1.0f},
+};
+
+Move<VkDevice> createImageRobustnessDevice(Context& context)
+{
+       const InstanceInterface&        instance                = context.getInstanceInterface();
+       const vk::VkPhysicalDevice      physicalDevice  = context.getPhysicalDevice();
+       const float                                     queuePriority   = 1.0f;
+
+       // Create a universal queue
+       const VkDeviceQueueCreateInfo queueParams =
+       {
+               VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,     // VkStructureType                              sType;
+               DE_NULL,                                                                        // const void*                                  pNext;
+               0u,                                                                                     // VkDeviceQueueCreateFlags             flags;
+               context.getUniversalQueueFamilyIndex(),         // deUint32                                             queueFamilyIndex;
+               1u,                                                                                     // deUint32                                             queueCount;
+               &queuePriority                                                          // const float*                                 pQueuePriorities;
+       };
+
+       // Add image robustness extension if supported
+       std::vector<const char*> deviceExtensions;
+
+       if (context.isDeviceFunctionalitySupported("VK_EXT_image_robustness"))
+       {
+               deviceExtensions.push_back("VK_EXT_image_robustness");
+       }
+
+       VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsrFeatures =
+       {
+               VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR,   // VkStructureType      sType;
+               DE_NULL,                                                                                                                                // void*                        pNext;
+               DE_FALSE,                                                                                                                               // VkBool32                     pipelineFragmentShadingRate;
+               DE_FALSE,                                                                                                                               // VkBool32                     primitiveFragmentShadingRate;
+               DE_FALSE,                                                                                                                               // VkBool32                     attachmentFragmentShadingRate;
+       };
+
+       VkPhysicalDeviceFeatures2 enabledFeatures;
+       enabledFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+       enabledFeatures.pNext = &fsrFeatures;
+
+       instance.getPhysicalDeviceFeatures2(physicalDevice, &enabledFeatures);
+
+       const VkDeviceCreateInfo deviceParams =
+       {
+               VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                                           // VkStructureType                                      sType;
+               &enabledFeatures,                                                                                       // const void*                                          pNext;
+               0u,                                                                                                                     // VkDeviceCreateFlags                          flags;
+               1u,                                                                                                                     // deUint32                                                     queueCreateInfoCount;
+               &queueParams,                                                                                           // const VkDeviceQueueCreateInfo*       pQueueCreateInfos;
+               0u,                                                                                                                     // deUint32                                                     enabledLayerCount;
+               DE_NULL,                                                                                                        // const char* const*                           ppEnabledLayerNames;
+               static_cast<deUint32>(deviceExtensions.size()),                         // deUint32                                                     enabledExtensionCount;
+               deviceExtensions.empty() ? DE_NULL : &deviceExtensions[0],      // const char* const*                           ppEnabledExtensionNames;
+               DE_NULL,                                                                                                        // const VkPhysicalDeviceFeatures*      pEnabledFeatures;
+       };
+
+       return createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), context.getPlatformInterface(),
+                                                         context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &deviceParams);
+}
+
+class FSRPixelConsistencyInstance : public TestInstance
+{
+public:
+                                               FSRPixelConsistencyInstance     (Context& context, const CaseDef& data);
+                                               ~FSRPixelConsistencyInstance(void);
+       tcu::TestStatus         iterate                                         (void);
+
+private:
+       void                            clampShadingRate();
+       tcu::TestStatus         verifyResult(tcu::ConstPixelBufferAccess& resultBuffer, const deUint32 index);
+
+       CaseDef                                                                                 m_data;
+       vector<VkExtent2D>                                                              m_shadingRateClamped;
+
+       deUint32                                                                                m_supportedFragmentShadingRateCount;
+       vector<VkPhysicalDeviceFragmentShadingRateKHR>  m_supportedFragmentShadingRates;
+};
+
+FSRPixelConsistencyInstance::FSRPixelConsistencyInstance(Context& context, const CaseDef& data)
+       : vkt::TestInstance             (context)
+       , m_data(data)
+       , m_supportedFragmentShadingRateCount(0)
+{
+       // Fetch information about supported fragment shading rates
+       context.getInstanceInterface().getPhysicalDeviceFragmentShadingRatesKHR(context.getPhysicalDevice(), &m_supportedFragmentShadingRateCount, DE_NULL);
+
+       m_supportedFragmentShadingRates.resize(m_supportedFragmentShadingRateCount);
+       context.getInstanceInterface().getPhysicalDeviceFragmentShadingRatesKHR(context.getPhysicalDevice(), &m_supportedFragmentShadingRateCount, &m_supportedFragmentShadingRates[0]);
+
+       clampShadingRate();
+}
+
+FSRPixelConsistencyInstance::~FSRPixelConsistencyInstance(void)
+{
+}
+
+class FSRPixelConsistencyTestCase : public TestCase
+{
+       public:
+                                                               FSRPixelConsistencyTestCase             (tcu::TestContext& context, const char* name, const char* desc, const CaseDef data);
+                                                               ~FSRPixelConsistencyTestCase    (void);
+       virtual void                            initPrograms                                    (SourceCollections& programCollection) const;
+       virtual TestInstance*           createInstance                                  (Context& context) const;
+       virtual void                            checkSupport                                    (Context& context) const;
+
+private:
+
+       CaseDef                                                                                 m_data;
+};
+
+FSRPixelConsistencyTestCase::FSRPixelConsistencyTestCase(tcu::TestContext& context, const char* name, const char* desc, const CaseDef data)
+       : vkt::TestCase (context, name, desc)
+       , m_data                (data)
+{
+}
+
+FSRPixelConsistencyTestCase::~FSRPixelConsistencyTestCase(void)
+{
+}
+
+void FSRPixelConsistencyTestCase::checkSupport(Context& context) const
+{
+       const VkImageUsageFlags cbUsage =       VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                                               VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
+                                                                               VK_IMAGE_USAGE_TRANSFER_SRC_BIT         |
+                                                                               VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+
+       context.requireDeviceFunctionality("VK_KHR_fragment_shading_rate");
+
+       if (!context.getFragmentShadingRateFeatures().pipelineFragmentShadingRate)
+               TCU_THROW(NotSupportedError, "pipelineFragmentShadingRate not supported");
+
+       VkImageFormatProperties imageProperties;
+       VkResult result = context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(context.getPhysicalDevice(), VK_FORMAT_R32G32_UINT, VK_IMAGE_TYPE_2D,
+                                                                                                                                                                                       VK_IMAGE_TILING_OPTIMAL, cbUsage , 0, &imageProperties);
+
+       if (result == VK_ERROR_FORMAT_NOT_SUPPORTED)
+               TCU_THROW(NotSupportedError, "VK_FORMAT_R32G32_UINT not supported");
+
+       if (!(imageProperties.sampleCounts & m_data.samples))
+               TCU_THROW(NotSupportedError, "Image sample count not supported");
+
+       if ((imageProperties.maxExtent.width < m_data.framebufferExtent.width) || (imageProperties.maxExtent.height < m_data.framebufferExtent.height))
+               TCU_THROW(NotSupportedError, "Image max extents are smaller than required");
+}
+
+void FSRPixelConsistencyTestCase::initPrograms (SourceCollections& programCollection) const
+{
+       std::stringstream vss;
+
+       vss <<
+               "#version 450 core\n"
+               "layout(location = 0) in vec2 position;\n"
+               "out gl_PerVertex\n"
+               "{\n"
+               "   vec4 gl_Position;\n"
+               "};\n"
+               "void main()\n"
+               "{\n"
+               "  gl_Position = vec4(position, 0, 1);\n"
+               "}\n";
+
+       programCollection.glslSources.add("vert") << glu::VertexSource(vss.str());
+
+       std::stringstream fssPass0;
+
+       fssPass0 <<
+               "#version 450 core\n"
+               "layout(push_constant) uniform PC {\n"
+               "       uvec2 shadingRate[2];\n"
+               "} pc;\n"
+               "layout(location = 0) out uvec2 col0;\n"
+               "void main()\n"
+               "{\n"
+               "  col0.x = (uint(gl_FragCoord.x) % pc.shadingRate[0].x) + ((uint(gl_FragCoord.y) % pc.shadingRate[0].y) * pc.shadingRate[0].x);\n"
+               "  col0.y = (uint(gl_FragCoord.x) % pc.shadingRate[1].x) + ((uint(gl_FragCoord.y) % pc.shadingRate[1].y) * pc.shadingRate[1].x);\n"
+               "}\n";
+
+       programCollection.glslSources.add("frag_pass0") << glu::FragmentSource(fssPass0.str());
+
+       std::stringstream fssPass1;
+
+       fssPass1 <<
+               "#version 450 core\n";
+
+       if (m_data.samples == VK_SAMPLE_COUNT_1_BIT)
+       {
+               fssPass1 <<
+                       "layout(input_attachment_index=0, set=0, binding=0) uniform usubpassInput inputAttachment;\n";
+       }
+       else
+       {
+               fssPass1 <<
+                       "layout(input_attachment_index=0, set=0, binding=0) uniform usubpassInputMS inputAttachment;\n";
+       }
+
+       fssPass1 <<
+               "layout(location = 0) out uvec2 col0;\n"
+               "void main()\n"
+               "{\n";
+
+       if (m_data.samples == VK_SAMPLE_COUNT_1_BIT)
+       {
+               fssPass1 <<
+                       "  col0 = subpassLoad(inputAttachment).xy;\n";
+       }
+       else
+       {
+               fssPass1 <<
+                       "  col0 = subpassLoad(inputAttachment, 0).xy;\n";
+       }
+
+       fssPass1 <<
+               "}\n";
+
+       programCollection.glslSources.add("frag_pass1") << glu::FragmentSource(fssPass1.str());
+}
+
+TestInstance* FSRPixelConsistencyTestCase::createInstance (Context& context) const
+{
+       return new FSRPixelConsistencyInstance(context, m_data);
+}
+
+bool compareShadingRate(VkExtent2D ext1, VkExtent2D ext2)
+{
+       deUint32 ratio1 = std::max(ext1.width, ext1.height) / std::min(ext1.width, ext1.height);
+       deUint32 ratio2 = std::max(ext2.width, ext2.height) / std::min(ext2.width, ext2.height);
+
+       return ratio1 < ratio2;
+}
+
+void FSRPixelConsistencyInstance::clampShadingRate()
+{
+       deUint32 desiredSize = m_data.shadingRate.width * m_data.shadingRate.height;
+
+       while (desiredSize > 0)
+       {
+               // Find modes that maximize the area
+               for (deUint32 i = 0; i < m_supportedFragmentShadingRateCount; ++i)
+               {
+                       const VkPhysicalDeviceFragmentShadingRateKHR& supportedRate = m_supportedFragmentShadingRates[i];
+
+                       if (supportedRate.sampleCounts & VK_SAMPLE_COUNT_1_BIT)
+                       {
+                               // We found exact match
+                               if (supportedRate.fragmentSize.width  == m_data.shadingRate.width       &&
+                                       supportedRate.fragmentSize.height == m_data.shadingRate.height)
+                               {
+                                       m_shadingRateClamped.push_back(supportedRate.fragmentSize);
+
+                                       return;
+                               }
+                               else
+                               {
+                                       if (supportedRate.fragmentSize.width  <= m_data.shadingRate.width  &&
+                                               supportedRate.fragmentSize.height <= m_data.shadingRate.height &&
+                                               supportedRate.fragmentSize.width  *  supportedRate.fragmentSize.height == desiredSize)
+                                       {
+                                               m_shadingRateClamped.push_back(supportedRate.fragmentSize);
+                                       }
+                               }
+                       }
+               }
+               if (!m_shadingRateClamped.empty())
+               {
+                       // Sort the modes so that the ones with the smallest aspect ratio are in front
+                       std::sort(m_shadingRateClamped.begin(), m_shadingRateClamped.end(), compareShadingRate);
+
+                       deUint32 desiredRatio = std::max(m_shadingRateClamped[0].width, m_shadingRateClamped[0].height) /
+                                                                       std::min(m_shadingRateClamped[0].width, m_shadingRateClamped[0].height);
+
+                       // Leave only entries with the smallest aspect ratio
+                       auto it = m_shadingRateClamped.begin();
+                       while (it != m_shadingRateClamped.end())
+                       {
+                               deUint32 ratio = std::max(it->width, it->height) / std::min(it->width, it->height);
+
+                               if (ratio < desiredRatio)
+                               {
+                                       it = m_shadingRateClamped.erase(it, m_shadingRateClamped.end());
+                               }
+                               else
+                               {
+                                       ++it;
+                               }
+                       }
+
+                       return;
+               }
+               else
+               {
+                       desiredSize /= 2;
+               }
+       }
+       DE_ASSERT(0);
+
+       return;
+}
+
+tcu::TestStatus        FSRPixelConsistencyInstance::verifyResult(tcu::ConstPixelBufferAccess& resultBuffer, const deUint32 index)
+{
+       deUint32 pixelIndex                     = std::numeric_limits<unsigned int>::max();
+       deUint32 pixelOutsideIndex      = std::numeric_limits<unsigned int>::max();
+
+       for (int y = 0; y < resultBuffer.getHeight(); y++)
+       {
+               for (int x = 0; x < resultBuffer.getWidth(); x++)
+               {
+                       deUint32 pixel = resultBuffer.getPixelUint(x, y)[index];
+
+                       // If pixel was not covered by any triangle, we skip it
+                       if (pixel == std::numeric_limits<unsigned int>::max())
+                       {
+                               continue;
+                       }
+
+                       // We check if pixel is part of fragment area that is partially outside of framebuffer area
+                       deBool outsideW = (x / m_shadingRateClamped[index].width  + 1) * m_shadingRateClamped[index].width  > static_cast<deUint32>(resultBuffer.getWidth());
+                       deBool outsideH = (y / m_shadingRateClamped[index].height + 1) * m_shadingRateClamped[index].height > static_cast<deUint32>(resultBuffer.getHeight());
+
+                       if (outsideW || outsideH)
+                       {
+                               // If image robustness is enabled such pixel can have either a value of 0 or one of the values from the area inside framebuffer
+                               if (m_context.isDeviceFunctionalitySupported("VK_EXT_image_robustness"))
+                               {
+                                       if (pixelOutsideIndex == std::numeric_limits<unsigned int>::max() || pixelOutsideIndex == 0)
+                                       {
+                                               pixelOutsideIndex = pixel;
+                                       }
+                                       // If value is non-zero we make sure that all 'corner' pixels have the same value
+                                       else if ((pixel != 0) && (pixelOutsideIndex != pixel))
+                                       {
+                                               return tcu::TestStatus(QP_TEST_RESULT_FAIL, qpGetTestResultName(QP_TEST_RESULT_FAIL));
+                                       }
+                               }
+                               // If image robustness is not enabled such pixel can have an undefined value, so we skip it
+                               else
+                               {
+                                       continue;
+                               }
+                       }
+                       else
+                       {
+                               if (pixelIndex == std::numeric_limits<unsigned int>::max())
+                               {
+                                       if (pixel >= m_shadingRateClamped[index].width * m_shadingRateClamped[index].height)
+                                       {
+                                               return tcu::TestStatus(QP_TEST_RESULT_FAIL, qpGetTestResultName(QP_TEST_RESULT_FAIL));
+                                       }
+
+                                       pixelIndex = pixel;
+                               }
+                               // If pixel is not part of 'corner' pixels we make sure that is has the same value as other non-'corner' pixels
+                               else if (pixelIndex != pixel)
+                               {
+                                       return tcu::TestStatus(QP_TEST_RESULT_FAIL, qpGetTestResultName(QP_TEST_RESULT_FAIL));
+                               }
+                       }
+               }
+       }
+
+       return tcu::TestStatus(QP_TEST_RESULT_PASS, qpGetTestResultName(QP_TEST_RESULT_PASS));
+}
+
+tcu::TestStatus FSRPixelConsistencyInstance::iterate (void)
+{
+       const VkPhysicalDeviceMemoryProperties memoryProperties = vk::getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
+
+       Move<VkDevice>                          vkd                      = createImageRobustnessDevice(m_context);
+       const VkDevice                          device           = *vkd;
+       de::MovePtr<DeviceDriver>       deviceDriver = de::MovePtr<DeviceDriver>(new DeviceDriver(m_context.getPlatformInterface(), m_context.getInstance(), device));
+       const DeviceInterface&          vk                       = *deviceDriver.get();
+       const VkQueue                           queue            = getDeviceQueue(vk, device, m_context.getUniversalQueueFamilyIndex(), 0);
+       de::MovePtr<Allocator>          allocator        = de::MovePtr<Allocator>(new SimpleAllocator(vk, device, memoryProperties));
+
+       // Create vertex buffer
+       const VkDeviceSize vertexBufferSize = sizeof(basicTriangles);
+
+       const VkFormat imageFormat = VK_FORMAT_R32G32_UINT;
+
+       de::MovePtr<BufferWithMemory> vertexBuffer;
+       vertexBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
+               vk, device, *allocator, makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), MemoryRequirement::HostVisible));
+
+       float* vbuf = (float*)vertexBuffer->getAllocation().getHostPtr();
+
+       deMemcpy(vbuf, basicTriangles, vertexBufferSize);
+
+       flushAlloc(vk, device, vertexBuffer->getAllocation());
+
+       // Create color output buffer
+       const VkDeviceSize colorOutputBufferSize = m_data.framebufferExtent.width * m_data.framebufferExtent.height * tcu::getPixelSize(mapVkFormat(imageFormat));
+
+       de::MovePtr<BufferWithMemory> colorOutputBuffer;
+       colorOutputBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
+               vk, device, *allocator, makeBufferCreateInfo(colorOutputBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT), MemoryRequirement::HostVisible));
+
+
+       // Create color attachment for subpass 0
+       de::MovePtr<ImageWithMemory> cbImagePass0;
+       Move<VkImageView>                        cbImagePass0View;
+       {
+               const VkImageUsageFlags cbUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                                                 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
+                                                                                 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+
+               const VkImageCreateInfo                 imageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // VkStructureType                      sType;
+                       DE_NULL,                                                                // const void*                          pNext;
+                       (VkImageCreateFlags)0u,                                 // VkImageCreateFlags           flags;
+                       VK_IMAGE_TYPE_2D,                                               // VkImageType                          imageType;
+                       imageFormat,                                                    // VkFormat                                     format;
+                       {
+                               m_data.framebufferExtent.width,         // deUint32     width;
+                               m_data.framebufferExtent.height,        // deUint32     height;
+                               1u                                                                      // deUint32     depth;
+                       },                                                                              // VkExtent3D                           extent;
+                       1u,                                                                             // deUint32                                     mipLevels;
+                       1u,                                                                             // deUint32                                     arrayLayers;
+                       m_data.samples,                                                 // VkSampleCountFlagBits        samples;
+                       VK_IMAGE_TILING_OPTIMAL,                                // VkImageTiling                        tiling;
+                       cbUsage,                                                                // VkImageUsageFlags            usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                              // VkSharingMode                        sharingMode;
+                       0u,                                                                             // deUint32                                     queueFamilyIndexCount;
+                       DE_NULL,                                                                // const deUint32*                      pQueueFamilyIndices;
+                       VK_IMAGE_LAYOUT_UNDEFINED                               // VkImageLayout                        initialLayout;
+               };
+               cbImagePass0 = de::MovePtr<ImageWithMemory>(new ImageWithMemory(
+                       vk, device, *allocator, imageCreateInfo, MemoryRequirement::Any));
+
+               VkImageViewCreateInfo           imageViewCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,       // VkStructureType                      sType;
+                       DE_NULL,                                                                        // const void*                          pNext;
+                       (VkImageViewCreateFlags)0u,                                     // VkImageViewCreateFlags       flags;
+                       **cbImagePass0,                                                         // VkImage                                      image;
+                       VK_IMAGE_VIEW_TYPE_2D,                                          // VkImageViewType                      viewType;
+                       imageFormat,                                                            // VkFormat                                     format;
+                       {
+                               VK_COMPONENT_SWIZZLE_R,                                 // VkComponentSwizzle   r;
+                               VK_COMPONENT_SWIZZLE_G,                                 // VkComponentSwizzle   g;
+                               VK_COMPONENT_SWIZZLE_B,                                 // VkComponentSwizzle   b;
+                               VK_COMPONENT_SWIZZLE_A                                  // VkComponentSwizzle   a;
+                       },                                                                                      // VkComponentMapping            components;
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask;
+                               0u,                                                                             // deUint32                             baseMipLevel;
+                               1u,                                                                             // deUint32                             levelCount;
+                               0u,                                                                             // deUint32                             baseArrayLayer;
+                               1u                                                                              // deUint32                             layerCount;
+                       }                                                                                       // VkImageSubresourceRange      subresourceRange;
+               };
+               cbImagePass0View = createImageView(vk, device, &imageViewCreateInfo, NULL);
+       }
+
+       // Create color attachment for subpass 1
+       de::MovePtr<ImageWithMemory> cbImagePass1;
+       Move<VkImageView>                        cbImagePass1View;
+       {
+               const VkImageUsageFlags cbUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
+                                                                                 VK_IMAGE_USAGE_TRANSFER_SRC_BIT         |
+                                                                                 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+
+               const VkImageCreateInfo                 imageCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // VkStructureType                      sType;
+                       DE_NULL,                                                                // const void*                          pNext;
+                       (VkImageCreateFlags)0u,                                 // VkImageCreateFlags           flags;
+                       VK_IMAGE_TYPE_2D,                                               // VkImageType                          imageType;
+                       imageFormat,                                                    // VkFormat                                     format;
+                       {
+                               m_data.framebufferExtent.width,         // deUint32     width;
+                               m_data.framebufferExtent.height,        // deUint32     height;
+                               1u                                                                      // deUint32     depth;
+                       },                                                                              // VkExtent3D                           extent;
+                       1u,                                                                             // deUint32                                     mipLevels;
+                       1u,                                                                             // deUint32                                     arrayLayers;
+                       VK_SAMPLE_COUNT_1_BIT,                                  // VkSampleCountFlagBits        samples;
+                       VK_IMAGE_TILING_OPTIMAL,                                // VkImageTiling                        tiling;
+                       cbUsage,                                                                // VkImageUsageFlags            usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                              // VkSharingMode                        sharingMode;
+                       0u,                                                                             // deUint32                                     queueFamilyIndexCount;
+                       DE_NULL,                                                                // const deUint32*                      pQueueFamilyIndices;
+                       VK_IMAGE_LAYOUT_UNDEFINED                               // VkImageLayout                        initialLayout;
+               };
+               cbImagePass1 = de::MovePtr<ImageWithMemory>(new ImageWithMemory(
+                       vk, device, *allocator, imageCreateInfo, MemoryRequirement::Any));
+
+               VkImageViewCreateInfo           imageViewCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,       // VkStructureType                      sType;
+                       DE_NULL,                                                                        // const void*                          pNext;
+                       (VkImageViewCreateFlags)0u,                                     // VkImageViewCreateFlags       flags;
+                       **cbImagePass1,                                                         // VkImage                                      image;
+                       VK_IMAGE_VIEW_TYPE_2D,                                          // VkImageViewType                      viewType;
+                       imageFormat,                                                            // VkFormat                                     format;
+                       {
+                               VK_COMPONENT_SWIZZLE_R,                                 // VkComponentSwizzle   r;
+                               VK_COMPONENT_SWIZZLE_G,                                 // VkComponentSwizzle   g;
+                               VK_COMPONENT_SWIZZLE_B,                                 // VkComponentSwizzle   b;
+                               VK_COMPONENT_SWIZZLE_A                                  // VkComponentSwizzle   a;
+                       },                                                                                      // VkComponentMapping            components;
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask;
+                               0u,                                                                             // deUint32                             baseMipLevel;
+                               1u,                                                                             // deUint32                             levelCount;
+                               0u,                                                                             // deUint32                             baseArrayLayer;
+                               1u                                                                              // deUint32                             layerCount;
+                       }                                                                                       // VkImageSubresourceRange      subresourceRange;
+               };
+               cbImagePass1View = createImageView(vk, device, &imageViewCreateInfo, NULL);
+       }
+
+       // Create render pass
+       Move<VkRenderPass>      renderPass;
+       {
+               const vk::VkAttachmentReference colorAttachment0Reference =
+               {
+                       0,                                                                                                                      // attachment
+                       vk::VK_IMAGE_LAYOUT_GENERAL,                                                            // layout
+               };
+
+               const vk::VkAttachmentReference colorAttachment1Reference =
+               {
+                       1,                                                                                                                      // attachment
+                       vk::VK_IMAGE_LAYOUT_GENERAL,                                                            // layout
+               };
+
+               std::vector<VkAttachmentDescription> attachmentDescriptions;
+
+               attachmentDescriptions.push_back(
+                       {
+                               (VkAttachmentDescriptionFlags)0u,                       // VkAttachmentDescriptionFlags         flags;
+                               imageFormat,                                                            // VkFormat                                                     format;
+                               m_data.samples,                                                         // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_LOAD,                                     // 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_GENERAL,                                        // VkImageLayout                                        initialLayout;
+                               VK_IMAGE_LAYOUT_GENERAL                                         // VkImageLayout                                        finalLayout;
+                       }
+               );
+
+               attachmentDescriptions.push_back(
+                       {
+                               (VkAttachmentDescriptionFlags)0u,                       // VkAttachmentDescriptionFlags         flags;
+                               imageFormat,                                                            // VkFormat                                                     format;
+                               VK_SAMPLE_COUNT_1_BIT,                                          // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_LOAD,                                     // 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_GENERAL,                                        // VkImageLayout                                        initialLayout;
+                               VK_IMAGE_LAYOUT_GENERAL                                         // VkImageLayout                                        finalLayout;
+                       }
+               );
+
+               const VkSubpassDescription subpassDescs[] =
+               {
+                       {
+                               (vk::VkSubpassDescriptionFlags)0,                                               // flags
+                               vk::VK_PIPELINE_BIND_POINT_GRAPHICS,                                    // pipelineBindPoint
+                               0u,                                                                                                             // inputCount
+                               DE_NULL,                                                                                                // pInputAttachments
+                               1u,                                                                                                             // colorCount
+                               &colorAttachment0Reference,                                                             // pColorAttachments
+                               DE_NULL,                                                                                                // pResolveAttachments
+                               DE_NULL,                                                                                                // depthStencilAttachment
+                               0u,                                                                                                             // preserveCount
+                               DE_NULL,                                                                                                // pPreserveAttachments
+                       },
+                       {
+                               (vk::VkSubpassDescriptionFlags)0,                                               // flags
+                               vk::VK_PIPELINE_BIND_POINT_GRAPHICS,                                    // pipelineBindPoint
+                               1u,                                                                                                             // inputCount
+                               &colorAttachment0Reference,                                                             // pInputAttachments
+                               1u,                                                                                                             // colorCount
+                               &colorAttachment1Reference,                                                             // pColorAttachments
+                               DE_NULL,                                                                                                // pResolveAttachments
+                               DE_NULL,                                                                                                // depthStencilAttachment
+                               0u,                                                                                                             // preserveCount
+                               DE_NULL,                                                                                                // pPreserveAttachments
+                       },
+               };
+
+               const VkSubpassDependency subpassDependency =
+               {
+                       0u,                                                                                             // srcSubpass;
+                       1u,                                                                                             // dstSubpass;
+                       VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,  // srcStageMask;
+                       VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,                  // dstStageMask;
+                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                   // srcAccessMask;
+                       VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,                    // dstAccessMask;
+                       0                                                                                               // dependencyFlags;
+               };
+
+               const VkRenderPassCreateInfo renderPassParams =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,                              // sType
+                       DE_NULL,                                                                                                // pNext
+                       (vk::VkRenderPassCreateFlags)0,
+                       (deUint32)attachmentDescriptions.size(),                                // attachmentCount
+                       &attachmentDescriptions[0],                                                             // pAttachments
+                       sizeof(subpassDescs) / sizeof(subpassDescs[0]),                 // subpassCount
+                       subpassDescs,                                                                                   // pSubpasses
+                       1u,                                                                                                             // dependencyCount
+                       &subpassDependency,                                                                             // pDependencies
+               };
+
+               renderPass = createRenderPass(vk, device, &renderPassParams);
+       }
+
+       // Create framebuffer
+       Move<VkFramebuffer> framebuffer;
+       {
+               std::vector<VkImageView> attachments;
+               attachments.push_back(*cbImagePass0View);
+               attachments.push_back(*cbImagePass1View);
+
+               const vk::VkFramebufferCreateInfo framebufferParams =
+               {
+                       vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,  // sType
+                       DE_NULL,                                                                                // pNext
+                       (vk::VkFramebufferCreateFlags)(0),                              // createFlags
+                       *renderPass,                                                                    // renderPass
+                       (deUint32)attachments.size(),                                   // attachmentCount
+                       &attachments[0],                                                                // pAttachments
+                       m_data.framebufferExtent.width,                                 // width
+                       m_data.framebufferExtent.height,                                // height
+                       1u,                                                                                             // layers
+               };
+
+               framebuffer = createFramebuffer(vk, device, &framebufferParams);
+       }
+
+
+       // Create vertex attribute
+       const VkVertexInputBindingDescription vertexBinding =
+       {
+               0u,                                                     // deUint32                             binding;
+               sizeof(Vertex),                         // deUint32                             stride;
+               VK_VERTEX_INPUT_RATE_VERTEX     // VkVertexInputRate    inputRate;
+       };
+
+       const VkVertexInputAttributeDescription vertexInputAttributeDescription =
+       {
+               0u,                                                     // deUint32     location;
+               0u,                                                     // deUint32     binding;
+               VK_FORMAT_R32G32_SFLOAT,        // VkFormat     format;
+               0u                                                      // deUint32     offset;
+       };
+
+       const VkPipelineVertexInputStateCreateInfo      vertexInputStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,      // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               (VkPipelineVertexInputStateCreateFlags)0,                                       // VkPipelineVertexInputStateCreateFlags        flags;
+               1u,                                                                                                                     // deUint32                                                                     vertexBindingDescriptionCount;
+               &vertexBinding,                                                                                         // const VkVertexInputBindingDescription*       pVertexBindingDescriptions;
+               1u,                                                                                                                     // deUint32                                                                     vertexAttributeDescriptionCount;
+               &vertexInputAttributeDescription                                                        // const VkVertexInputAttributeDescription*     pVertexAttributeDescriptions;
+       };
+
+       const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo =
+       {
+               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;
+       };
+
+       // Create rasterization state
+       const VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
+       {
+               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_CLOCKWISE,                                                                                // VkFrontFace                                                          frontFace;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     depthBiasEnable;
+               0.0f,                                                                                                                   // float                                                                        depthBiasConstantFactor;
+               0.0f,                                                                                                                   // float                                                                        depthBiasClamp;
+               0.0f,                                                                                                                   // float                                                                        depthBiasSlopeFactor;
+               1.0f                                                                                                                    // float                                                                        lineWidth;
+       };
+
+       // Create scissor and viewport
+       VkViewport      viewport        = makeViewport(m_data.framebufferExtent.width, m_data.framebufferExtent.height);
+       VkRect2D        scissor         = makeRect2D(m_data.framebufferExtent.width, m_data.framebufferExtent.height);
+
+       const VkPipelineViewportStateCreateInfo viewportStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,          // VkStructureType                                                      sType
+               DE_NULL,                                                                                                        // const void*                                                          pNext
+               (VkPipelineViewportStateCreateFlags)0,                                          // VkPipelineViewportStateCreateFlags           flags
+               1u,                                                                                                                     // deUint32                                                                     viewportCount
+               &viewport,                                                                                                      // const VkViewport*                                            pViewports
+               1u,                                                                                                                     // deUint32                                                                     scissorCount
+               &scissor                                                                                                        // const VkRect2D*                                                      pScissors
+       };
+
+       const VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,           // VkStructureType                                        sType;
+               DE_NULL,                                                                                                        // const void*                                            pNext;
+               (VkPipelineDynamicStateCreateFlags)0,                                           // VkPipelineDynamicStateCreateFlags    flags;
+               0u,                                                                                                                     // uint32_t                                                      dynamicStateCount;
+               DE_NULL,                                                                                                        // const VkDynamicState*                                pDynamicStates;
+       };
+
+       const VkPipelineColorBlendAttachmentState colorBlendAttachmentState[] =
+       {
+               {
+                       VK_FALSE,                               // VkBool32                                     blendEnable;
+                       VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        srcColorBlendFactor;
+                       VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        dstColorBlendFactor;
+                       VK_BLEND_OP_ADD,                // VkBlendOp                            colorBlendOp;
+                       VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        srcAlphaBlendFactor;
+                       VK_BLEND_FACTOR_ZERO,   // VkBlendFactor                        dstAlphaBlendFactor;
+                       VK_BLEND_OP_ADD,                // VkBlendOp                            alphaBlendOp;
+                       0xf                                             // VkColorComponentFlags        colorWriteMask;
+               }
+       };
+
+       const VkPipelineColorBlendStateCreateInfo               colorBlendStateCreateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,                                       // VkStructureType                                                              sType;
+               DE_NULL,                                                                                                                                        // const void*                                                                  pNext;
+               0u,                                                                                                                                                     // VkPipelineColorBlendStateCreateFlags                 flags;
+               VK_FALSE,                                                                                                                                       // VkBool32                                                                             logicOpEnable;
+               VK_LOGIC_OP_COPY,                                                                                                                       // VkLogicOp                                                                    logicOp;
+               sizeof(colorBlendAttachmentState) / sizeof(colorBlendAttachmentState[0]),       // deUint32                                                                             attachmentCount;
+               colorBlendAttachmentState,                                                                                                      // const VkPipelineColorBlendAttachmentState*   pAttachments;
+               { 1.0f, 1.0f, 1.0f, 1.0f }                                                                                                      // float                                                                                blendConstants[4];
+       };
+
+       VkPipelineDepthStencilStateCreateInfo   depthStencilStateParams =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,     // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                        // const void*                                                          pNext;
+               0u,                                                                                                                     // VkPipelineDepthStencilStateCreateFlags       flags;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthTestEnable;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthWriteEnable;
+               VK_COMPARE_OP_ALWAYS,                                                                           // VkCompareOp                                                          depthCompareOp;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     depthBoundsTestEnable;
+               VK_FALSE,                                                                                                       // VkBool32                                                                     stencilTestEnable;
+               // VkStencilOpState     front;
+               {
+                       VK_STENCIL_OP_REPLACE,  // VkStencilOp  failOp;
+                       VK_STENCIL_OP_REPLACE,  // VkStencilOp  passOp;
+                       VK_STENCIL_OP_REPLACE,  // VkStencilOp  depthFailOp;
+                       VK_COMPARE_OP_ALWAYS,   // VkCompareOp  compareOp;
+                       0u,                                             // deUint32             compareMask;
+                       0xFFu,                                  // deUint32             writeMask;
+                       0xFFu,                                  // deUint32             reference;
+               },
+               // VkStencilOpState     back;
+               {
+                       VK_STENCIL_OP_REPLACE,  // VkStencilOp  failOp;
+                       VK_STENCIL_OP_REPLACE,  // VkStencilOp  passOp;
+                       VK_STENCIL_OP_REPLACE,  // VkStencilOp  depthFailOp;
+                       VK_COMPARE_OP_ALWAYS,   // VkCompareOp  compareOp;
+                       0u,                                             // deUint32             compareMask;
+                       0xFFu,                                  // deUint32             writeMask;
+                       0xFFu,                                  // deUint32             reference;
+               },
+               0.0f,                                           // float                        minDepthBounds;
+               0.0f,                                           // float                        maxDepthBounds;
+       };
+
+       // Create pipeline for pass 0
+       Move<VkPipeline> pipelinePass0;
+       Move<VkPipelineLayout> pipelineLayoutPass0;
+       {
+               const VkPushConstantRange               pushConstantRange =
+               {
+                       VK_SHADER_STAGE_FRAGMENT_BIT,                                                           // VkShaderStageFlags                                   stageFlags;
+                       0u,                                                                                                                     // deUint32                                                             offset;
+                       2 * sizeof(VkExtent2D)                                                                          // deUint32                                                             size;
+               };
+
+               const VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,                          // sType
+                       DE_NULL,                                                                                                        // pNext
+                       (VkPipelineLayoutCreateFlags)0,
+                       0u,                                                                                                                     // setLayoutCount
+                       DE_NULL,                                                                                                        // pSetLayouts
+                       1u,                                                                                                                     // pushConstantRangeCount
+                       &pushConstantRange,                                                                                     // pPushConstantRanges
+               };
+
+               pipelineLayoutPass0 = createPipelineLayout(vk, device, &pipelineLayoutCreateInfo, NULL);
+
+               const VkPipelineMultisampleStateCreateInfo      multisampleStateCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,       // VkStructureType                                                      sType
+                       DE_NULL,                                                                                                        // const void*                                  pNext
+                       0u,                                                                                                                     // VkPipelineMultisampleStateCreateFlags        flags
+                       (VkSampleCountFlagBits)m_data.samples,                                          // VkSampleCountFlagBits                                        rasterizationSamples
+                       VK_FALSE,                                                                                                       // VkBool32                                                                     sampleShadingEnable
+                       1.0f,                                                                                                           // float                                                                        minSampleShading
+                       DE_NULL,                                                                                                        // const VkSampleMask*                                          pSampleMask
+                       VK_FALSE,                                                                                                       // VkBool32                                                                     alphaToCoverageEnable
+                       VK_FALSE                                                                                                        // VkBool32                                                                     alphaToOneEnable
+               };
+
+               Move<VkShaderModule> vertShader = createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0);
+               Move<VkShaderModule> fragShader = createShaderModule(vk, device, m_context.getBinaryCollection().get("frag_pass0"), 0);
+
+               const VkPipelineShaderStageCreateInfo   shaderCreateInfo[] =
+               {
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+                               DE_NULL,
+                               (VkPipelineShaderStageCreateFlags)0,
+                               VK_SHADER_STAGE_VERTEX_BIT,                                                                     // stage
+                               *vertShader,                                                                                            // shader
+                               "main",
+                               DE_NULL,                                                                                                        // pSpecializationInfo
+                       },
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+                               DE_NULL,
+                               (VkPipelineShaderStageCreateFlags)0,
+                               VK_SHADER_STAGE_FRAGMENT_BIT,                                                           // stage
+                               *fragShader,                                                                                            // shader
+                               "main",
+                               DE_NULL,                                                                                                        // pSpecializationInfo
+                       }
+               };
+
+               const VkGraphicsPipelineCreateInfo      graphicsPipelineCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,                // VkStructureType                                                                      sType;
+                       DE_NULL,                                                                                                // const void*                                                                          pNext;
+                       (VkPipelineCreateFlags)0,                                                               // VkPipelineCreateFlags                                                        flags;
+                       sizeof(shaderCreateInfo) / sizeof(shaderCreateInfo[0]), // deUint32                                                                                     stageCount;
+                       &shaderCreateInfo[0],                                                                   // const VkPipelineShaderStageCreateInfo*                       pStages;
+                       &vertexInputStateCreateInfo,                                                    // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
+                       &inputAssemblyStateCreateInfo,                                                  // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
+                       DE_NULL,                                                                                                // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
+                       &viewportStateCreateInfo,                                                               // const VkPipelineViewportStateCreateInfo*                     pViewportState;
+                       &rasterizationStateCreateInfo,                                                  // const VkPipelineRasterizationStateCreateInfo*        pRasterizationState;
+                       &multisampleStateCreateInfo,                                                    // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
+                       &depthStencilStateParams,                                                               // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
+                       &colorBlendStateCreateInfo,                                                             // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
+                       &dynamicStateCreateInfo,                                                                // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
+                       pipelineLayoutPass0.get(),                                                              // VkPipelineLayout                                                                     layout;
+                       renderPass.get(),                                                                               // VkRenderPass                                                                         renderPass;
+                       0u,                                                                                                             // deUint32                                                                                     subpass;
+                       DE_NULL,                                                                                                // VkPipeline                                                                           basePipelineHandle;
+                       0                                                                                                               // int                                                                                          basePipelineIndex;
+               };
+
+               pipelinePass0 = createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineCreateInfo);
+       }
+
+
+       // Create pipeline for pass 1
+       Move<VkPipeline>                                pipelinePass1;
+       Move<VkPipelineLayout>                  pipelineLayoutPass1;
+       Move<vk::VkDescriptorPool>              descriptorPool;
+       Move<vk::VkDescriptorSetLayout> descriptorSetLayout;
+       Move<vk::VkDescriptorSet>               descriptorSet;
+       {
+               const VkDescriptorSetLayoutBinding bindings[] =
+               {
+                       {
+                               0u,                                                                             // binding
+                               VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,    // descriptorType
+                               1u,                                                                             // descriptorCount
+                               VK_SHADER_STAGE_FRAGMENT_BIT,                   // stageFlags
+                               DE_NULL,                                                                // pImmutableSamplers
+                       }
+               };
+
+               // Create a layout and allocate a descriptor set for it.
+               const VkDescriptorSetLayoutCreateInfo setLayoutCreateInfo =
+               {
+                       vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,        // sType
+                       DE_NULL,                                                                                                        // pNext
+                       (VkDescriptorSetLayoutCreateFlags)(0),                                          // flags
+                       sizeof(bindings) / sizeof(bindings[0]),                                         // bindingCount
+                       &bindings[0]                                                                                            // pBindings
+               };
+
+               descriptorSetLayout = vk::createDescriptorSetLayout(vk, device, &setLayoutCreateInfo);
+
+               vk::DescriptorPoolBuilder poolBuilder;
+
+               for (deInt32 i = 0; i < (deInt32)(sizeof(bindings) / sizeof(bindings[0])); ++i)
+               {
+                       poolBuilder.addType(bindings[i].descriptorType, bindings[i].descriptorCount);
+               }
+
+               descriptorPool = poolBuilder.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+               descriptorSet = makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout);
+
+               VkDescriptorImageInfo imageInfo = makeDescriptorImageInfo(DE_NULL, *cbImagePass0View, VK_IMAGE_LAYOUT_GENERAL);
+
+               VkWriteDescriptorSet writeDescriptorSet =
+               {
+                       VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,                                                 // sType
+                       DE_NULL,                                                                                                                // pNext
+                       *descriptorSet,                                                                                                 // dstSet
+                       0u,                                                                                                                             // dstBinding
+                       0u,                                                                                                                             // dstArrayElement
+                       1u,                                                                                                                             // descriptorCount
+                       bindings[0].descriptorType,                                                                             // descriptorType
+                       &imageInfo,                                                                                                             // pImageInfo
+                       DE_NULL,                                                                                                                // pBufferInfo
+                       DE_NULL,                                                                                                                // pTexelBufferView
+               };
+
+               vk.updateDescriptorSets(device, 1, &writeDescriptorSet, 0, NULL);
+
+               const VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,                          // sType
+                       DE_NULL,                                                                                                        // pNext
+                       (VkPipelineLayoutCreateFlags)0,
+                       1u,                                                                                                                     // setLayoutCount
+                       &descriptorSetLayout.get(),                                                                     // pSetLayouts
+                       0u,                                                                                                                     // pushConstantRangeCount
+                       DE_NULL,                                                                                                        // pPushConstantRanges
+               };
+
+               pipelineLayoutPass1 = createPipelineLayout(vk, device, &pipelineLayoutCreateInfo, NULL);
+
+               const VkPipelineMultisampleStateCreateInfo      multisampleStateCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,       // VkStructureType                                                      sType
+                       DE_NULL,                                                                                                        // const void*                                                          pNext
+                       0u,                                                                                                                     // VkPipelineMultisampleStateCreateFlags        flags
+                       VK_SAMPLE_COUNT_1_BIT,                                                                          // VkSampleCountFlagBits                                        rasterizationSamples
+                       VK_FALSE,                                                                                                       // VkBool32                                                                     sampleShadingEnable
+                       1.0f,                                                                                                           // float                                                                        minSampleShading
+                       DE_NULL,                                                                                                        // const VkSampleMask*                                          pSampleMask
+                       VK_FALSE,                                                                                                       // VkBool32                                                                     alphaToCoverageEnable
+                       VK_FALSE                                                                                                        // VkBool32                                                                     alphaToOneEnable
+               };
+
+               VkPipelineFragmentShadingRateStateCreateInfoKHR shadingRateStateCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR,                                                         // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                                                                                                        // const void*                                                  pNext;
+                       m_data.shadingRate,                                                                                                                                                                     // VkExtent2D                                                   fragmentSize;
+                       { VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR, VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR },       // VkFragmentShadingRateCombinerOpKHR   combinerOps[2];
+               };
+
+               Move<VkShaderModule> vertShader = createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0);
+               Move<VkShaderModule> fragShader = createShaderModule(vk, device, m_context.getBinaryCollection().get("frag_pass1"), 0);
+
+               const VkPipelineShaderStageCreateInfo   shaderCreateInfo[] =
+               {
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+                               DE_NULL,
+                               (VkPipelineShaderStageCreateFlags)0,
+                               VK_SHADER_STAGE_VERTEX_BIT,                                                                     // stage
+                               *vertShader,                                                                                            // shader
+                               "main",
+                               DE_NULL,                                                                                                        // pSpecializationInfo
+                       },
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+                               DE_NULL,
+                               (VkPipelineShaderStageCreateFlags)0,
+                               VK_SHADER_STAGE_FRAGMENT_BIT,                                                           // stage
+                               *fragShader,                                                                                            // shader
+                               "main",
+                               DE_NULL,                                                                                                        // pSpecializationInfo
+                       }
+               };
+
+               const VkGraphicsPipelineCreateInfo      graphicsPipelineCreateInfo =
+               {
+                       VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,                // VkStructureType                                                                      sType;
+                       &shadingRateStateCreateInfo,                                                    // const void*                                                                          pNext;
+                       (VkPipelineCreateFlags)0,                                                               // VkPipelineCreateFlags                                                        flags;
+                       sizeof(shaderCreateInfo) / sizeof(shaderCreateInfo[0]), // deUint32                                                                                     stageCount;
+                       &shaderCreateInfo[0],                                                                   // const VkPipelineShaderStageCreateInfo*                       pStages;
+                       &vertexInputStateCreateInfo,                                                    // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
+                       &inputAssemblyStateCreateInfo,                                                  // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
+                       DE_NULL,                                                                                                // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
+                       &viewportStateCreateInfo,                                                               // const VkPipelineViewportStateCreateInfo*                     pViewportState;
+                       &rasterizationStateCreateInfo,                                                  // const VkPipelineRasterizationStateCreateInfo*        pRasterizationState;
+                       &multisampleStateCreateInfo,                                                    // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
+                       &depthStencilStateParams,                                                               // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
+                       &colorBlendStateCreateInfo,                                                             // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
+                       &dynamicStateCreateInfo,                                                                // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
+                       pipelineLayoutPass1.get(),                                                              // VkPipelineLayout                                                                     layout;
+                       renderPass.get(),                                                                               // VkRenderPass                                                                         renderPass;
+                       1u,                                                                                                             // deUint32                                                                                     subpass;
+                       DE_NULL,                                                                                                // VkPipeline                                                                           basePipelineHandle;
+                       0                                                                                                               // int                                                                                          basePipelineIndex;
+               };
+
+               pipelinePass1 = createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineCreateInfo);
+       }
+
+       // Create command buffer
+       Move<VkCommandPool>             cmdPool         = createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, m_context.getUniversalQueueFamilyIndex());
+       Move<VkCommandBuffer>   cmdBuffer       = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+       VkImageMemoryBarrier preImageBarrier =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                         // VkStructureType              sType
+               DE_NULL,                                                                                        // const void*                  pNext
+               0u,                                                                                                     // VkAccessFlags                srcAccessMask
+               VK_ACCESS_TRANSFER_WRITE_BIT,                                           // VkAccessFlags                dstAccessMask
+               VK_IMAGE_LAYOUT_UNDEFINED,                                                      // VkImageLayout                oldLayout
+               VK_IMAGE_LAYOUT_GENERAL,                                                        // VkImageLayout                newLayout
+               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             srcQueueFamilyIndex
+               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             dstQueueFamilyIndex
+               **cbImagePass0,                                                                         // VkImage                              image
+               {
+                       VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask
+                       0u,                                                                             // uint32_t                             baseMipLevel
+                       VK_REMAINING_MIP_LEVELS,                                // uint32_t                             mipLevels,
+                       0u,                                                                             // uint32_t                             baseArray
+                       VK_REMAINING_ARRAY_LAYERS,                              // uint32_t                             arraySize
+               }
+       };
+
+       // Record commands
+       beginCommandBuffer(vk, *cmdBuffer, 0u);
+
+       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                       (VkDependencyFlags)0,
+                                                       0, (const VkMemoryBarrier*)DE_NULL,
+                                                       0, (const VkBufferMemoryBarrier*)DE_NULL,
+                                                       1, &preImageBarrier);
+
+       preImageBarrier.image = **cbImagePass1;
+
+       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                       (VkDependencyFlags)0,
+                                                       0, (const VkMemoryBarrier*)DE_NULL,
+                                                       0, (const VkBufferMemoryBarrier*)DE_NULL,
+                                                       1, &preImageBarrier);
+
+       // Clear both images to UINT_MAX
+       VkImageSubresourceRange range           = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+       VkClearValue                    clearColor      = makeClearValueColorU32(std::numeric_limits<unsigned int>::max(),0,0,0);
+
+       vk.cmdClearColorImage(*cmdBuffer, **cbImagePass0, VK_IMAGE_LAYOUT_GENERAL, &clearColor.color, 1, &range);
+       vk.cmdClearColorImage(*cmdBuffer, **cbImagePass1, VK_IMAGE_LAYOUT_GENERAL, &clearColor.color, 1, &range);
+
+       beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer,
+                                       makeRect2D(m_data.framebufferExtent.width, m_data.framebufferExtent.height),
+                                       0, DE_NULL, VK_SUBPASS_CONTENTS_INLINE, DE_NULL);
+
+       // Put primitive shading rate in a push constant
+       if (m_shadingRateClamped.size() == 1)
+       {
+               vk.cmdPushConstants(*cmdBuffer, *pipelineLayoutPass0, VK_SHADER_STAGE_FRAGMENT_BIT,     0, sizeof(m_shadingRateClamped[0]), &m_shadingRateClamped[0]);
+               vk.cmdPushConstants(*cmdBuffer, *pipelineLayoutPass0, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(m_shadingRateClamped[0]), sizeof(m_shadingRateClamped[0]), &m_shadingRateClamped[0]);
+       }
+       else
+       {
+               vk.cmdPushConstants(*cmdBuffer, *pipelineLayoutPass0, VK_SHADER_STAGE_FRAGMENT_BIT, 0, static_cast<deUint32>(m_shadingRateClamped.size() * sizeof(m_shadingRateClamped[0])), &m_shadingRateClamped[0]);
+       }
+
+       // Bind vertex buffer
+       const VkDeviceSize vertexBufferOffset = 0;
+       VkBuffer vb = **vertexBuffer;
+       vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vb, &vertexBufferOffset);
+
+       // Bind pipeline
+       vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelinePass0);
+
+       // Draw triangles
+       vk.cmdDraw(*cmdBuffer, sizeof(basicTriangles) / sizeof(Vertex), 1u, 0u, 0u);
+
+       // Start next subpass
+       vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+
+       // Bind descriptors
+       vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayoutPass1, 0, 1, &descriptorSet.get(), 0, DE_NULL);
+
+       // Bind vertex buffer
+       vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vb, &vertexBufferOffset);
+
+       // Bind pipeline
+       vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelinePass1);
+
+       // Draw triangles
+       vk.cmdDraw(*cmdBuffer, sizeof(basicTriangles) / sizeof(Vertex), 1u, 0u, 0u);
+
+       endRenderPass(vk, *cmdBuffer);
+
+       VkImageMemoryBarrier postImageBarrier =
+       {
+               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_GENERAL,                                                        // VkImageLayout                oldLayout
+               VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,                           // VkImageLayout                newLayout
+               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             srcQueueFamilyIndex
+               VK_QUEUE_FAMILY_IGNORED,                                                        // uint32_t                             dstQueueFamilyIndex
+               **cbImagePass1,                                                                         // VkImage                              image
+               {
+                       VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspectFlags   aspectMask
+                       0u,                                                                             // uint32_t                             baseMipLevel
+                       VK_REMAINING_MIP_LEVELS,                                // uint32_t                             mipLevels,
+                       0u,                                                                             // uint32_t                             baseArray
+                       VK_REMAINING_ARRAY_LAYERS,                              // uint32_t                             arraySize
+               }
+       };
+
+       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
+
+       const VkBufferImageCopy copyRegion =
+       {
+               0u,                                                                                                                                             // VkDeviceSize                         bufferOffset;
+               0u,                                                                                                                                             // deUint32                                     bufferRowLength;
+               0u,                                                                                                                                             // deUint32                                     bufferImageHeight;
+               {
+                       VK_IMAGE_ASPECT_COLOR_BIT,                                                                                      // VkImageAspectFlags           aspect;
+                       0u,                                                                                                                                     // deUint32                                     mipLevel;
+                       0u,                                                                                                                                     // deUint32                                     baseArrayLayer;
+                       1u,                                                                                                                                     // deUint32                                     layerCount;
+               },                                                                                                                                              // VkImageSubresourceLayers     imageSubresource;
+               { 0, 0, 0 },                                                                                                                    // VkOffset3D                           imageOffset;
+               {m_data.framebufferExtent.width, m_data.framebufferExtent.height, 1}    // VkExtent3D                           imageExtent;
+       };
+
+
+       vk.cmdCopyImageToBuffer(*cmdBuffer, **cbImagePass1, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, **colorOutputBuffer, 1u, &copyRegion);
+
+       const VkBufferMemoryBarrier     bufferBarrier =
+       {
+               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,                                        // deUint32                     srcQueueFamilyIndex;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                     dstQueueFamilyIndex;
+               **colorOutputBuffer,                                            // 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, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
+
+       endCommandBuffer(vk, *cmdBuffer);
+
+       submitCommandsAndWait(vk, device, queue, cmdBuffer.get());
+
+       // Read buffer data
+       invalidateAlloc(vk, device, colorOutputBuffer->getAllocation());
+
+       tcu::ConstPixelBufferAccess resultBuffer = tcu::ConstPixelBufferAccess(
+               tcu::TextureFormat(tcu::TextureFormat::RG, tcu::TextureFormat::UNSIGNED_INT32),
+               m_data.framebufferExtent.width, m_data.framebufferExtent.height, 1, (const void *)colorOutputBuffer->getAllocation().getHostPtr());
+
+       for (deUint32 i = 0; i < m_shadingRateClamped.size(); i++)
+       {
+               tcu::TestStatus result = verifyResult(resultBuffer, i);
+               if (result.getCode() == QP_TEST_RESULT_PASS)
+               {
+                       return result;
+               }
+       }
+
+       return tcu::TestStatus(QP_TEST_RESULT_FAIL, qpGetTestResultName(QP_TEST_RESULT_FAIL));
+}
+
+}      // anonymous
+
+void createPixelConsistencyTests(tcu::TestContext& testCtx, tcu::TestCaseGroup* parentGroup)
+{
+       typedef struct
+       {
+               deUint32                                count;
+               const char*                             name;
+               const char*                             description;
+       } TestGroupCase;
+
+       typedef struct
+       {
+               VkExtent2D                              count;
+               const char*                             name;
+               const char*                             description;
+       } TestGroupCase2D;
+
+       TestGroupCase2D shadingRateCases[] =
+       {
+               { {1, 1},       "rate_1x1",     "1x1 shading rate"      },
+               { {1, 2},       "rate_1x2",     "1x2 shading rate"      },
+               { {1, 4},       "rate_1x4",     "1x4 shading rate"      },
+               { {2, 1},       "rate_2x1",     "2x1 shading rate"      },
+               { {2, 2},       "rate_2x2",     "2x2 shading rate"      },
+               { {2, 4},       "rate_2x4",     "2x4 shading rate"      },
+               { {4, 1},       "rate_4x1",     "4x1 shading rate"      },
+               { {4, 2},       "rate_4x2",     "4x2 shading rate"      },
+               { {4, 4},       "rate_4x4",     "4x4 shading rate"      },
+       };
+
+       TestGroupCase sampCases[] =
+       {
+               { VK_SAMPLE_COUNT_1_BIT,        "samples_1",    "1 raster sample"       },
+               { VK_SAMPLE_COUNT_2_BIT,        "samples_2",    "2 raster samples"      },
+               { VK_SAMPLE_COUNT_4_BIT,        "samples_4",    "4 raster samples"      },
+               { VK_SAMPLE_COUNT_8_BIT,        "samples_8",    "8 raster samples"      },
+               { VK_SAMPLE_COUNT_16_BIT,       "samples_16",   "16 raster samples"     },
+       };
+
+       TestGroupCase2D extentCases[] =
+       {
+               { {1,   1},             "extent_1x1",           "framebuffer size 1x1"          },
+               { {4,   4},             "extent_4x4",           "framebuffer size 4x4"          },
+               { {33,  35},    "extent_33x35",         "framebuffer size 33x35"        },
+               { {151, 431},   "extent_151x431",       "framebuffer size 151x431"      },
+               { {256, 256},   "extent_256x256",       "framebuffer size 256x256"      },
+       };
+
+       de::MovePtr<tcu::TestCaseGroup> pixelGroup(new tcu::TestCaseGroup(testCtx, "pixel_consistency", "Pixel selection consistency"));
+
+       for (int rateNdx = 0; rateNdx < DE_LENGTH_OF_ARRAY(shadingRateCases); rateNdx++)
+       {
+               de::MovePtr<tcu::TestCaseGroup> rateGroup(new tcu::TestCaseGroup(testCtx, shadingRateCases[rateNdx].name, shadingRateCases[rateNdx].description));
+
+               for (int sampNdx = 0; sampNdx < DE_LENGTH_OF_ARRAY(sampCases); sampNdx++)
+               {
+                       de::MovePtr<tcu::TestCaseGroup> sampleGroup(new tcu::TestCaseGroup(testCtx, sampCases[sampNdx].name, sampCases[sampNdx].description));
+
+                       for (int extNdx = 0; extNdx < DE_LENGTH_OF_ARRAY(extentCases); extNdx++)
+                       {
+                               CaseDef c =
+                               {
+                                       shadingRateCases[rateNdx].count,
+                                       (VkSampleCountFlagBits)sampCases[sampNdx].count,
+                                       extentCases[extNdx].count
+                               };
+
+                               sampleGroup->addChild(new FSRPixelConsistencyTestCase(testCtx, extentCases[extNdx].name, extentCases[extNdx].description, c));
+                       }
+
+                       rateGroup->addChild(sampleGroup.release());
+               }
+
+               pixelGroup->addChild(rateGroup.release());
+       }
+
+       parentGroup->addChild(pixelGroup.release());
+}
+
+}      // FragmentShadingRage
+}      // vkt
diff --git a/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.hpp b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.hpp
new file mode 100644 (file)
index 0000000..4d2ee8c
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _VKTFRAGMENTSHADINGRATEPIXELCONSISTENCY_HPP
+#define _VKTFRAGMENTSHADINGRATEPIXELCONSISTENCY_HPP
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2017-2020 The Khronos Group Inc.
+ * Copyright (c) 2020 AMD
+ *
+ * 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_KHR_fragment_shading_rate.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace FragmentShadingRate
+{
+
+void createPixelConsistencyTests(tcu::TestContext& testCtx, tcu::TestCaseGroup* group);
+
+} // FragmentShadingRate
+} // vkt
+
+#endif // _VKTFRAGMENTSHADINGRATEPIXELCONSISTENCY_HPP
index 721f7a7..b1ea10f 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "vktFragmentShadingRateTests.hpp"
 #include "vktFragmentShadingRateBasic.hpp"
+#include "vktFragmentShadingRatePixelConsistency.hpp"
 #include "vktTestGroupUtil.hpp"
 
 namespace vkt
@@ -38,7 +39,8 @@ void createChildren (tcu::TestCaseGroup* group)
 {
        tcu::TestContext&       testCtx         = group->getTestContext();
 
-       createBasicTests(testCtx, group);
+       createBasicTests                   (testCtx, group);
+       createPixelConsistencyTests(testCtx, group);
 }
 
 } // anonymous
index e27b037..33869cb 100644 (file)
@@ -804948,3 +804948,228 @@ dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.r
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples8.gs
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples16.vs
 dEQP-VK.fragment_shading_rate.sampleshadinginput.dynamic.attachment.shaderrate.replace.replace.256x256.samples16.gs
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_1x4.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_2x4.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x1.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x2.samples_16.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_1.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_2.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_4.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_8.extent_256x256
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_1x1
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_4x4
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_33x35
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_151x431
+dEQP-VK.fragment_shading_rate.pixel_consistency.rate_4x4.samples_16.extent_256x256