diff options
author | Mikko Tiusanen <mikko.tiusanen@siru.fi> | 2020-10-12 17:11:45 +0300 |
---|---|---|
committer | Alexander Galazin <Alexander.Galazin@arm.com> | 2020-12-17 13:29:04 +0000 |
commit | 8ff64a73820f4368bf7e615afdc59837cc5558db (patch) | |
tree | f4d726d468b8ad3a9550579b74ecec77b7e6e1ba | |
parent | 431368c6ac9c6943c18fc81c6e75edf4523070a4 (diff) | |
download | VK-GL-CTS-8ff64a73820f4368bf7e615afdc59837cc5558db.tar.gz VK-GL-CTS-8ff64a73820f4368bf7e615afdc59837cc5558db.tar.bz2 VK-GL-CTS-8ff64a73820f4368bf7e615afdc59837cc5558db.zip |
Tests for multiple clears within render pass
Adds tests that perform multiple color/depth buffer clears within one
render pass.
New tests:
dEQP-VK.draw.multiple_clears_within_render_pass.*
Component: Vulkan
VK-GL-CTS issue: 2595
Change-Id: Ica79be44cfd540e83dc5c900a8cfd4e0327405a4
-rw-r--r-- | AndroidGen.mk | 1 | ||||
-rw-r--r-- | android/cts/master/vk-master-2020-03-01.txt | 144 | ||||
-rw-r--r-- | android/cts/master/vk-master.txt | 144 | ||||
-rw-r--r-- | external/vulkancts/modules/vulkan/draw/CMakeLists.txt | 2 | ||||
-rw-r--r-- | external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.cpp | 736 | ||||
-rw-r--r-- | external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.hpp | 46 | ||||
-rw-r--r-- | external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp | 42 | ||||
-rw-r--r-- | external/vulkancts/mustpass/master/vk-default.txt | 144 |
8 files changed, 1239 insertions, 20 deletions
diff --git a/AndroidGen.mk b/AndroidGen.mk index 41ac93f4b..833f49fc8 100644 --- a/AndroidGen.mk +++ b/AndroidGen.mk @@ -130,6 +130,7 @@ LOCAL_SRC_FILES := \ external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp \ external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp \ external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp \ + external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.cpp \ external/vulkancts/modules/vulkan/draw/vktDrawMultipleInterpolationTests.cpp \ external/vulkancts/modules/vulkan/draw/vktDrawNegativeViewportHeightTests.cpp \ external/vulkancts/modules/vulkan/draw/vktDrawOutputLocationTests.cpp \ diff --git a/android/cts/master/vk-master-2020-03-01.txt b/android/cts/master/vk-master-2020-03-01.txt index 3b785c95e..ac2121238 100644 --- a/android/cts/master/vk-master-2020-03-01.txt +++ b/android/cts/master/vk-master-2020-03-01.txt @@ -199273,6 +199273,150 @@ dEQP-VK.draw.ahb.triangle_list dEQP-VK.draw.ahb.triangle_list_layers_3 dEQP-VK.draw.ahb.triangle_list_layers_5 dEQP-VK.draw.ahb.triangle_list_layers_8 +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle dEQP-VK.compute.basic.concurrent_compute dEQP-VK.compute.basic.max_local_size_x dEQP-VK.compute.basic.max_local_size_y diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 7421e987f..a14dcf040 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -516027,6 +516027,150 @@ dEQP-VK.draw.ahb.triangle_list dEQP-VK.draw.ahb.triangle_list_layers_3 dEQP-VK.draw.ahb.triangle_list_layers_5 dEQP-VK.draw.ahb.triangle_list_layers_8 +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle dEQP-VK.compute.basic.empty_shader dEQP-VK.compute.basic.concurrent_compute dEQP-VK.compute.basic.max_local_size_x diff --git a/external/vulkancts/modules/vulkan/draw/CMakeLists.txt b/external/vulkancts/modules/vulkan/draw/CMakeLists.txt index 6d82b2881..baeda9b57 100644 --- a/external/vulkancts/modules/vulkan/draw/CMakeLists.txt +++ b/external/vulkancts/modules/vulkan/draw/CMakeLists.txt @@ -50,6 +50,8 @@ set(DEQP_VK_DRAW_SRCS vktDrawDepthClampTests.hpp vktDrawAhbTests.cpp vktDrawAhbTests.hpp + vktDrawMultipleClearsWithinRenderPass.cpp + vktDrawMultipleClearsWithinRenderPass.hpp ) set(DEQP_VK_DRAW_LIBS diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.cpp new file mode 100644 index 000000000..f22749ed6 --- /dev/null +++ b/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.cpp @@ -0,0 +1,736 @@ +/*------------------------------------------------------------------------- + * Vulkan Conformance Tests + * ----------------------------- + * + * Copyright (c) 2020 Google Inc. + * Copyright (c) 2020 The Khronos Group Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *//*! + * \file + * \brief Tests for multiple color or depth clears within a render pass + *//*--------------------------------------------------------------------*/ + +#include "vktDrawMultipleClearsWithinRenderPass.hpp" + +#include "vktTestGroupUtil.hpp" +#include "vktTestCaseUtil.hpp" +#include "vktDrawCreateInfoUtil.hpp" +#include "vktDrawBufferObjectUtil.hpp" +#include "vktDrawImageObjectUtil.hpp" +#include "vkPrograms.hpp" +#include "vkTypeUtil.hpp" +#include "vkRefUtil.hpp" +#include "vkCmdUtil.hpp" +#include "vkBuilderUtil.hpp" +#include "vkImageUtil.hpp" +#include "vkQueryUtil.hpp" +#include "tcuTextureUtil.hpp" +#include "vktDrawTestCaseUtil.hpp" + +#include "deStringUtil.hpp" + +#include <cmath> +#include <vector> +#include <string> +#include <sstream> + +namespace vkt +{ +namespace Draw +{ +namespace +{ +using namespace vk; +using tcu::Vec4; +using de::SharedPtr; +using std::string; +using std::abs; +using std::vector; +using std::ostringstream; + +const deUint32 WIDTH = 400; +const deUint32 HEIGHT = 300; + +enum struct Topology +{ + TRIANGLE_STRIP = 0, + TRIANGLES, + TRIANGLE +}; + +const Topology topologiesToTest[] = +{ + Topology::TRIANGLE_STRIP, + Topology::TRIANGLES, + Topology::TRIANGLE +}; + +struct FormatPair +{ + VkFormat colorFormat; + VkFormat depthFormat; +}; + +const FormatPair formatsToTest[] = +{ + { VK_FORMAT_R8G8B8A8_UNORM , VK_FORMAT_UNDEFINED }, + { VK_FORMAT_R8G8B8A8_SNORM , VK_FORMAT_UNDEFINED }, + { VK_FORMAT_UNDEFINED , VK_FORMAT_D32_SFLOAT }, + { VK_FORMAT_UNDEFINED , VK_FORMAT_D16_UNORM }, + { VK_FORMAT_R8G8B8A8_UNORM , VK_FORMAT_D32_SFLOAT }, + { VK_FORMAT_R8G8B8A8_UNORM , VK_FORMAT_D16_UNORM }, + { VK_FORMAT_R8G8B8A8_SNORM , VK_FORMAT_D32_SFLOAT }, + { VK_FORMAT_R8G8B8A8_SNORM , VK_FORMAT_D16_UNORM }, +}; + +const Vec4 verticesTriangleStrip[] = +{ + Vec4(-1.0f, -1.0f, 0.0f, 1.0f), // 0 -- 2 + Vec4(-1.0f, 1.0f, 0.0f, 1.0f), // | / | + Vec4( 1.0f, -1.0f, 0.0f, 1.0f), // | / | + Vec4( 1.0f, 1.0f, 0.0f, 1.0f) // 1 -- 3 +}; +const Vec4 verticesTriangles[] = +{ + Vec4(-1.0f, -1.0f, 0.0f, 1.0f), // 0 - 1 + Vec4(-1.0f, 1.0f, 0.0f, 1.0f), // | / + Vec4( 1.0f, -1.0f, 0.0f, 1.0f), // 2 + Vec4( 1.0f, -1.0f, 0.0f, 1.0f), // 4 + Vec4(-1.0f, 1.0f, 0.0f, 1.0f), // / | + Vec4( 1.0f, 1.0f, 0.0f, 1.0f) // 3 - 5 +}; +const Vec4 verticesBigTriangle[] = +{ + Vec4(-1.0f, -1.0f, 0.0f, 1.0f), // 0 - 2 + Vec4(-1.0f, 3.0f, 0.0f, 1.0f), // | / + Vec4( 3.0f, -1.0f, 0.0f, 1.0f), // 1 +}; + +const deUint32 TOPOLOGY_MAX_VERTICES_COUNT = 6; +const deUint32 TEST_MAX_STEPS_COUNT = 3; + +struct Vertices +{ + const char* testNameSuffix; + VkPrimitiveTopology topology; + deUint32 verticesCount; + const Vec4* vertices; +}; + +const Vertices verticesByTopology[] = +{ + { + "_triangle_strip", + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, + DE_LENGTH_OF_ARRAY(verticesTriangleStrip), + verticesTriangleStrip + }, + { + "_triangles", + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + DE_LENGTH_OF_ARRAY(verticesTriangles), + verticesTriangles + }, + { + "_big_triangle", + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + DE_LENGTH_OF_ARRAY(verticesBigTriangle), + verticesBigTriangle + } +}; + +enum struct ClearOp +{ + LOAD = 0, + DRAW, + CLEAR +}; + +struct ClearStep +{ + ClearOp clearOp; + Vec4 color; + float depth; +}; + +struct TestParams +{ + VkFormat colorFormat; + VkFormat depthFormat; + Topology topology; + Vec4 expectedColor; + float colorEpsilon; + float expectedDepth; + float depthEpsilon; + deUint32 repeatCount; + bool enableBlend; + vector<ClearStep> steps; +}; + +class MultipleClearsTest : public TestInstance +{ +public: + MultipleClearsTest (Context& context, const TestParams& params); + virtual tcu::TestStatus iterate (void); +private: + void clearAttachments (const DeviceInterface& vk, VkCommandBuffer cmdBuffer, const ClearOp clearOp, const size_t stepIndex); + + SharedPtr<Image> m_colorTargetImage; + SharedPtr<Image> m_depthTargetImage; + Move<VkImageView> m_colorTargetView; + Move<VkImageView> m_depthTargetView; + SharedPtr<Buffer> m_vertexBuffer; + Move<VkRenderPass> m_renderPass; + Move<VkFramebuffer> m_framebuffer; + Move<VkPipelineLayout> m_pipelineLayout; + Move<VkPipeline> m_pipeline; + + const TestParams m_params; + Vec4 m_vertices[TOPOLOGY_MAX_VERTICES_COUNT * TEST_MAX_STEPS_COUNT]; +}; + +MultipleClearsTest::MultipleClearsTest (Context &context, const TestParams& params) + : TestInstance(context) + , m_params(params) +{ + const DeviceInterface& vk = m_context.getDeviceInterface(); + const VkDevice device = m_context.getDevice(); + const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); + const bool hasColor = m_params.colorFormat != VK_FORMAT_UNDEFINED; + const bool hasDepth = m_params.depthFormat != VK_FORMAT_UNDEFINED; + + DescriptorSetLayoutBuilder descriptorSetLayoutBuilder; + // Vertex data + const auto& vertexData = verticesByTopology[(size_t)m_params.topology]; + { + DE_ASSERT(vertexData.verticesCount <= TOPOLOGY_MAX_VERTICES_COUNT); + const size_t verticesCount = vertexData.verticesCount; + const VkDeviceSize dataSize = verticesCount * sizeof(Vec4); + const VkDeviceSize totalDataSize = m_params.steps.size() * dataSize; + DE_ASSERT(totalDataSize <= sizeof(m_vertices)); + + for(size_t i = 0; i < m_params.steps.size(); ++i) + { + const size_t start = i * verticesCount; + deMemcpy(&m_vertices[start], vertexData.vertices, static_cast<size_t>(dataSize)); + for(size_t j = 0; j < verticesCount; ++j) + m_vertices[start + j][2] = m_params.steps[i].depth; + } + m_vertexBuffer = Buffer::createAndAlloc(vk, device, BufferCreateInfo(totalDataSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), + m_context.getDefaultAllocator(), MemoryRequirement::HostVisible); + deMemcpy(m_vertexBuffer->getBoundMemory().getHostPtr(), m_vertices, static_cast<std::size_t>(totalDataSize)); + flushMappedMemoryRange(vk, device, m_vertexBuffer->getBoundMemory().getMemory(), m_vertexBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE); + } + // Render pass + std::vector<VkImageView> attachments; + { + RenderPassCreateInfo renderPassCreateInfo; + if (hasColor) + { + const VkImageUsageFlags targetImageUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + const ImageCreateInfo targetImageCreateInfo (VK_IMAGE_TYPE_2D, m_params.colorFormat, { WIDTH, HEIGHT, 1u }, 1u, 1u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, targetImageUsageFlags); + m_colorTargetImage = Image::createAndAlloc(vk, device, targetImageCreateInfo, m_context.getDefaultAllocator(), queueFamilyIndex); + + renderPassCreateInfo.addAttachment(AttachmentDescription( + m_params.colorFormat, // format + VK_SAMPLE_COUNT_1_BIT, // samples + VK_ATTACHMENT_LOAD_OP_LOAD, // loadOp + VK_ATTACHMENT_STORE_OP_STORE, // storeOp + VK_ATTACHMENT_LOAD_OP_DONT_CARE, // stencilLoadOp + VK_ATTACHMENT_STORE_OP_DONT_CARE, // stencilStoreOp + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // initialLayout + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)); // finalLayout + + const ImageViewCreateInfo colorTargetViewInfo (m_colorTargetImage->object(), VK_IMAGE_VIEW_TYPE_2D, m_params.colorFormat); + m_colorTargetView = createImageView(vk, device, &colorTargetViewInfo); + attachments.push_back(*m_colorTargetView); + } + if (hasDepth) + { + const VkImageUsageFlags depthImageUsageFlags = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + const ImageCreateInfo depthImageCreateInfo (VK_IMAGE_TYPE_2D, m_params.depthFormat, { WIDTH, HEIGHT, 1u }, 1u, 1u, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, depthImageUsageFlags); + m_depthTargetImage = Image::createAndAlloc(vk, device, depthImageCreateInfo, m_context.getDefaultAllocator(), queueFamilyIndex); + + renderPassCreateInfo.addAttachment(AttachmentDescription( + m_params.depthFormat, // format + VK_SAMPLE_COUNT_1_BIT, // samples + VK_ATTACHMENT_LOAD_OP_LOAD, // loadOp + VK_ATTACHMENT_STORE_OP_STORE, // storeOp + VK_ATTACHMENT_LOAD_OP_DONT_CARE, // stencilLoadOp + VK_ATTACHMENT_STORE_OP_DONT_CARE, // stencilStoreOp + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // initialLayout + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)); // finalLayout + + const ImageViewCreateInfo depthTargetViewInfo (m_depthTargetImage->object(), VK_IMAGE_VIEW_TYPE_2D, m_params.depthFormat); + m_depthTargetView = createImageView(vk, device, &depthTargetViewInfo);; + attachments.push_back(*m_depthTargetView); + } + const VkAttachmentReference colorAttachmentReference = hasColor ? makeAttachmentReference(0u, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) : AttachmentReference(); + const VkAttachmentReference depthAttachmentReference = hasDepth ? makeAttachmentReference(hasColor ? 1u : 0u, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) : AttachmentReference(); + renderPassCreateInfo.addSubpass(SubpassDescription( + VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint + (VkSubpassDescriptionFlags)0, // flags + 0u, // inputAttachmentCount + DE_NULL, // inputAttachments + hasColor ? 1 : 0, // colorAttachmentCount + hasColor ? &colorAttachmentReference : DE_NULL, // colorAttachments + DE_NULL, // resolveAttachments + depthAttachmentReference, // depthStencilAttachment + 0u, // preserveAttachmentCount + DE_NULL)); // preserveAttachments + m_renderPass = createRenderPass(vk, device, &renderPassCreateInfo); + } + const FramebufferCreateInfo framebufferCreateInfo (*m_renderPass, attachments, WIDTH, HEIGHT, 1); + m_framebuffer = createFramebuffer(vk, device, &framebufferCreateInfo); + + // Vertex input + const VkVertexInputBindingDescription vertexInputBindingDescription = + { + 0u, // uint32_t binding; + sizeof(Vec4), // uint32_t stride; + VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate; + }; + + const VkVertexInputAttributeDescription vertexInputAttributeDescription = + { + 0u, // uint32_t location; + 0u, // uint32_t binding; + VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; + 0u // uint32_t offset; + }; + + const PipelineCreateInfo::VertexInputState vertexInputState = PipelineCreateInfo::VertexInputState(1, &vertexInputBindingDescription, + 1, &vertexInputAttributeDescription); + + // Graphics pipeline + const Unique<VkShaderModule> vertexModule (createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0)); + const Unique<VkShaderModule> fragmentModule (createShaderModule(vk, device, m_context.getBinaryCollection().get(hasColor ? "frag" : "frag_depthonly"), 0)); + + const VkPushConstantRange pcRange = vk::VkPushConstantRange { VkShaderStageFlagBits::VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(ClearStep::color) }; + const PipelineLayoutCreateInfo pipelineLayoutCreateInfo (0u, DE_NULL, 1u, &pcRange); + m_pipelineLayout = createPipelineLayout(vk, device, &pipelineLayoutCreateInfo); + + const VkRect2D scissor = makeRect2D(WIDTH, HEIGHT); + const VkViewport viewport = makeViewport(WIDTH, HEIGHT); + + const auto vkCbAttachmentState = makePipelineColorBlendAttachmentState( + m_params.enableBlend ? VK_TRUE : VK_FALSE, // VkBool32 blendEnable + VK_BLEND_FACTOR_SRC_ALPHA, // VkBlendFactor srcColorBlendFactor + VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, // VkBlendFactor dstColorBlendFactor + VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp + VK_BLEND_FACTOR_ZERO, // VkBlendFactor srcAlphaBlendFactor + VK_BLEND_FACTOR_ONE, // VkBlendFactor dstAlphaBlendFactor + VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp + VK_COLOR_COMPONENT_R_BIT | // VkColorComponentFlags colorWriteMask + VK_COLOR_COMPONENT_G_BIT | + VK_COLOR_COMPONENT_B_BIT | + VK_COLOR_COMPONENT_A_BIT); + PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, (VkPipelineCreateFlags)0); + pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vertexModule, "main", VK_SHADER_STAGE_VERTEX_BIT)); + pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fragmentModule, "main", VK_SHADER_STAGE_FRAGMENT_BIT)); + pipelineCreateInfo.addState (PipelineCreateInfo::VertexInputState (vertexInputState)); + pipelineCreateInfo.addState (PipelineCreateInfo::InputAssemblerState(vertexData.topology)); + pipelineCreateInfo.addState (PipelineCreateInfo::ColorBlendState (1, &vkCbAttachmentState)); + pipelineCreateInfo.addState (PipelineCreateInfo::ViewportState (1, std::vector<VkViewport>(1, viewport), std::vector<VkRect2D>(1, scissor))); + pipelineCreateInfo.addState (PipelineCreateInfo::DepthStencilState (hasDepth, hasDepth, VK_COMPARE_OP_ALWAYS, VK_FALSE, VK_FALSE)); + pipelineCreateInfo.addState (PipelineCreateInfo::RasterizerState ()); + pipelineCreateInfo.addState (PipelineCreateInfo::MultiSampleState ()); + m_pipeline = createGraphicsPipeline(vk, device, DE_NULL, &pipelineCreateInfo); +} + +void MultipleClearsTest::clearAttachments (const DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, const ClearOp clearOp, const size_t stepIndex) +{ + const Vec4& color = m_params.steps[stepIndex].color; + const float depth = m_params.steps[stepIndex].depth; + switch(clearOp) { + case ClearOp::LOAD: + break; + case ClearOp::DRAW: + { + const auto& vertexData = verticesByTopology[(size_t)m_params.topology]; + const deUint32 verticesCount = vertexData.verticesCount; + vk.cmdPushConstants(cmdBuffer, *m_pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(color), color.getPtr()); + vk.cmdDraw(cmdBuffer, verticesCount, 1, static_cast<deUint32>(verticesCount * stepIndex), 0); + } + break; + case ClearOp::CLEAR: + { + vector<VkClearAttachment> clearAttachments; + if (m_params.colorFormat != VK_FORMAT_UNDEFINED) + { + const VkClearAttachment clearAttachment = + { + VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask + static_cast<deUint32>(clearAttachments.size()), // uint32_t colorAttachment + makeClearValueColor(color) // VkClearValue clearValue + }; + clearAttachments.push_back(clearAttachment); + } + if (m_params.depthFormat != VK_FORMAT_UNDEFINED) + { + const VkClearAttachment clearAttachment = + { + VK_IMAGE_ASPECT_DEPTH_BIT, // VkImageAspectFlags aspectMask + static_cast<deUint32>(clearAttachments.size()), // uint32_t colorAttachment + makeClearValueDepthStencil(depth, 0) // VkClearValue clearValue + }; + clearAttachments.push_back(clearAttachment); + } + const VkClearRect clearRect = + { + makeRect2D(WIDTH, HEIGHT), // VkRect2D rect + 0, // uint32_t baseArrayLayer + 1 // uint32_t layerCount + }; + vk.cmdClearAttachments(cmdBuffer, static_cast<deUint32>(clearAttachments.size()), clearAttachments.data(), 1, &clearRect); + } + break; + default: + break; + } +} + +tcu::TestStatus MultipleClearsTest::iterate (void) +{ + const DeviceInterface& vk = m_context.getDeviceInterface(); + const VkDevice device = m_context.getDevice(); + const VkQueue queue = m_context.getUniversalQueue(); + const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); + + const CmdPoolCreateInfo cmdPoolCreateInfo (queueFamilyIndex); + const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, &cmdPoolCreateInfo)); + const Unique<VkCommandBuffer> cmdBuffer (allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); + + const bool hasColor = m_params.colorFormat != VK_FORMAT_UNDEFINED; + const bool hasDepth = m_params.depthFormat != VK_FORMAT_UNDEFINED; + + beginCommandBuffer(vk, *cmdBuffer); + if (hasColor) + initialTransitionColor2DImage(vk, *cmdBuffer, m_colorTargetImage->object(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); + if (hasDepth) + initialTransitionDepth2DImage(vk, *cmdBuffer, m_depthTargetImage->object(), VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT); + + if (!m_params.steps.empty() && m_params.steps[0].clearOp == ClearOp::LOAD) + beginRenderPass(vk, *cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT), m_params.steps[0].color, m_params.steps[0].depth, 0); + else + beginRenderPass(vk, *cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT)); + vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline); + { + const VkDeviceSize offset = 0; + const VkBuffer buffer = m_vertexBuffer->object(); + vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &buffer, &offset); + } + for(deUint32 i = 0; i < m_params.repeatCount; ++i) + for(size_t j = 0; j < m_params.steps.size(); ++j) + { + const auto& step = m_params.steps[j]; + // ClearOp::LOAD only supported for first step + DE_ASSERT(j == 0 || step.clearOp != ClearOp::LOAD); + clearAttachments(vk, *cmdBuffer, step.clearOp, j); + } + + endRenderPass(vk, *cmdBuffer); + + if (hasDepth) + { + const VkMemoryBarrier memBarrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER, DE_NULL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT }; + vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 0, 1, &memBarrier, 0, DE_NULL, 0, DE_NULL); + } + if (hasColor) + { + const VkMemoryBarrier memBarrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER, DE_NULL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT }; + vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 1, &memBarrier, 0, DE_NULL, 0, DE_NULL); + } + + if (hasColor) + transition2DImage(vk, *cmdBuffer, m_colorTargetImage->object(), VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_HOST_BIT); + if (hasDepth) + transition2DImage(vk, *cmdBuffer, m_depthTargetImage->object(), VK_IMAGE_ASPECT_DEPTH_BIT, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT, + VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_HOST_BIT); + + endCommandBuffer(vk, *cmdBuffer); + submitCommandsAndWait(vk, device, queue, *cmdBuffer); + + VK_CHECK(vk.queueWaitIdle(queue)); + + if (hasColor) + { + const auto resultImage = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, { 0, 0, 0 }, WIDTH, HEIGHT, VK_IMAGE_ASPECT_COLOR_BIT); + + for(int z = 0; z < resultImage.getDepth(); ++z) + for(int y = 0; y < resultImage.getHeight(); ++y) + for(int x = 0; x < resultImage.getWidth(); ++x) + { + const Vec4 difference = m_params.expectedColor - resultImage.getPixel(x,y,z); + if (abs(difference.x()) >= m_params.colorEpsilon || abs(difference.y()) >= m_params.colorEpsilon || abs(difference.z()) >= m_params.colorEpsilon) + { + ostringstream msg; + msg << "Color value mismatch, expected: " << m_params.expectedColor << ", got: " << resultImage.getPixel(x,y,z) << " at " << "(" << x << ", " << y << ", " << z << ")"; + return tcu::TestStatus::fail(msg.str()); + } + } + } + if (hasDepth) + { + const auto resultImage = m_depthTargetImage->readSurface(queue, m_context.getDefaultAllocator(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, { 0, 0, 0 }, WIDTH, HEIGHT, VK_IMAGE_ASPECT_DEPTH_BIT); + + for(int z = 0; z < resultImage.getDepth(); ++z) + for(int y = 0; y < resultImage.getHeight(); ++y) + for(int x = 0; x < resultImage.getWidth(); ++x) + { + const float difference = m_params.expectedDepth - resultImage.getPixDepth(x,y,z); + if (abs(difference) >= m_params.depthEpsilon) + { + ostringstream msg; + msg << "Depth value mismatch, expected: " << m_params.expectedDepth << ", got: " << resultImage.getPixDepth(x,y,z) << " at " << "(" << x << ", " << y << ", " << z << ")"; + return tcu::TestStatus::fail(msg.str()); + } + } + } + return tcu::TestStatus::pass("Pass"); +} + +class MultipleClearsWithinRenderPassTest : public TestCase +{ +public: + MultipleClearsWithinRenderPassTest (tcu::TestContext& testCtx, const string& name, const string& description, const TestParams& params) + : TestCase(testCtx, name, description) + , m_params(params) + { + DE_ASSERT(m_params.steps.size() <= static_cast<size_t>(TEST_MAX_STEPS_COUNT)); + } + + virtual void initPrograms (SourceCollections& programCollection) const + { + { + ostringstream src; + src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" + << "\n" + << "layout(location = 0) in vec4 in_position;\n" + << "\n" + << "out gl_PerVertex {\n" + << " vec4 gl_Position;\n" + << "};\n" + << "\n" + << "void main(void)\n" + << "{\n" + << " gl_Position = in_position;\n" + << "}\n"; + programCollection.glslSources.add("vert") << glu::VertexSource(src.str()); + } + { + ostringstream src; + src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" + << "\n" + << "layout(push_constant) uniform Color { vec4 color; } u_color;\n" + << "layout(location = 0) out vec4 out_color;\n" + << "\n" + << "void main(void)\n" + << "{\n" + << " out_color = u_color.color;\n" + << "}\n"; + programCollection.glslSources.add("frag") << glu::FragmentSource(src.str()); + } + { + ostringstream src; + src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" + << "\n" + << "layout(push_constant) uniform Color { vec4 color; } u_color;\n" + << "\n" + << "void main(void)\n" + << "{\n" + << "}\n"; + programCollection.glslSources.add("frag_depthonly") << glu::FragmentSource(src.str()); + } + } + + virtual void checkSupport (Context& context) const + { + VkImageFormatProperties imageFormatProperties; + const auto& vki = context.getInstanceInterface(); + const auto& vkd = context.getPhysicalDevice(); + if (m_params.colorFormat != VK_FORMAT_UNDEFINED) + { + const auto colorUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + if (vki.getPhysicalDeviceImageFormatProperties(vkd, m_params.colorFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, colorUsage, 0u, &imageFormatProperties) != VK_SUCCESS) + TCU_THROW(NotSupportedError, "Color format not supported"); + } + if (m_params.depthFormat != VK_FORMAT_UNDEFINED) + { + const auto depthUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + if (vki.getPhysicalDeviceImageFormatProperties(vkd, m_params.depthFormat, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, depthUsage, 0u, &imageFormatProperties) != VK_SUCCESS) + TCU_THROW(NotSupportedError, "Depth format not supported"); + } + } + + virtual TestInstance* createInstance (Context& context) const + { + return new MultipleClearsTest(context, m_params); + } + +private: + const TestParams m_params; +}; + +} // anonymous + +MultipleClearsWithinRenderPassTests::MultipleClearsWithinRenderPassTests (tcu::TestContext &testCtx) + : TestCaseGroup (testCtx, "multiple_clears_within_render_pass", "Tests for multiple clears within render pass") +{ +} + +MultipleClearsWithinRenderPassTests::~MultipleClearsWithinRenderPassTests () +{ +} + +void MultipleClearsWithinRenderPassTests::init () +{ + for(const auto &formatPair : formatsToTest) + { + ostringstream formatSuffix; + if (formatPair.colorFormat != VK_FORMAT_UNDEFINED) + formatSuffix << "_c" << de::toLower(string(getFormatName(formatPair.colorFormat)).substr(9)); + if (formatPair.depthFormat != VK_FORMAT_UNDEFINED) + formatSuffix << "_d" << de::toLower(string(getFormatName(formatPair.depthFormat)).substr(9)); + for(const auto &topology : topologiesToTest) + { + const string testNameSuffix = formatSuffix.str() + verticesByTopology[(deUint32)topology].testNameSuffix; + { + const TestParams params = + { + formatPair.colorFormat, // VkFormat colorFormat; + formatPair.depthFormat, // VkFormat depthFormat; + topology, // Topology topology; + Vec4(0.0f, 0.5f, 0.5f, 1.0f), // Vec4 expectedColor; + 0.01f, // float colorEpsilon; + 0.9f, // float expectedDepth; + 0.01f, // float depthEpsilon; + 1u, // deUint32 repeatCount; + true, // bool enableBlend; + { // vector<ClearStep> steps; + { ClearOp::LOAD , Vec4(1.0f, 0.0f, 0.0f, 1.0f) , 0.7f }, + { ClearOp::CLEAR , Vec4(0.0f, 1.0f, 0.0f, 1.0f) , 0.3f }, + { ClearOp::DRAW , Vec4(0.0f, 0.0f, 1.0f, 0.5f) , 0.9f } + } + }; + addChild(new MultipleClearsWithinRenderPassTest(m_testCtx, "load_clear_draw" + testNameSuffix, "Multiple clears within same render pass, methods: load, clear, draw", params)); + } + { + const TestParams params = + { + formatPair.colorFormat, // VkFormat format; + formatPair.depthFormat, // VkFormat depthFormat; + topology, // Topology topology; + Vec4(0.0f, 0.5f, 0.5f, 1.0f), // Vec4 expectedColor; + 0.01f, // float colorEpsilon; + 0.9f, // float expectedDepth; + 0.01f, // float depthEpsilon; + 1u, // deUint32 repeatCount; + true, // bool enableBlend; + { // vector<ClearStep> steps; + { ClearOp::DRAW , Vec4(1.0f, 0.0f, 0.0f, 1.0f) , 0.7f }, + { ClearOp::CLEAR , Vec4(0.0f, 1.0f, 0.0f, 1.0f) , 0.3f }, + { ClearOp::DRAW , Vec4(0.0f, 0.0f, 1.0f, 0.5f) , 0.9f } + } + }; + addChild(new MultipleClearsWithinRenderPassTest(m_testCtx, "draw_clear_draw" + testNameSuffix, "Multiple clears within same render pass, methods: draw, clear, draw", params)); + } + { + const TestParams params = + { + formatPair.colorFormat, // VkFormat format; + formatPair.depthFormat, // VkFormat depthFormat; + topology, // Topology topology; + Vec4(0.0f, 0.5f, 0.5f, 1.0f), // Vec4 expectedColor; + 0.01f, // float colorEpsilon; + 0.9f, // float expectedDepth; + 0.01f, // float depthEpsilon; + 1u, // deUint32 repeatCount; + true, // bool enableBlend; + { // vector<ClearStep> steps; + { ClearOp::CLEAR , Vec4(1.0f, 0.0f, 0.0f, 1.0f) , 0.7f }, + { ClearOp::CLEAR , Vec4(0.0f, 1.0f, 0.0f, 1.0f) , 0.3f }, + { ClearOp::DRAW , Vec4(0.0f, 0.0f, 1.0f, 0.5f) , 0.9f } + } + }; + addChild(new MultipleClearsWithinRenderPassTest(m_testCtx, "clear_clear_draw" + testNameSuffix, "Multiple clears within same render pass, methods: clear, clear, draw", params)); + } + { + const TestParams params = + { + formatPair.colorFormat, // VkFormat format; + formatPair.depthFormat, // VkFormat depthFormat; + topology, // Topology topology; + Vec4(0.0f, 1.0f, 0.0f, 1.0f), // Vec4 expectedColor; + 0.01f, // float colorEpsilon; + 0.9f, // float expectedDepth; + 0.01f, // float depthEpsilon; + 1u, // deUint32 repeatCount; + false, // bool enableBlend; + { // vector<ClearStep> steps; + { ClearOp::LOAD , Vec4(1.0f, 0.0f, 0.0f, 1.0f) , 0.3f }, + { ClearOp::CLEAR , Vec4(0.0f, 1.0f, 0.0f, 1.0f) , 0.9f } + } + }; + addChild(new MultipleClearsWithinRenderPassTest(m_testCtx, "load_clear" + testNameSuffix, "Multiple clears within same render pass, methods: load, clear", params)); + } + { + const TestParams params = + { + formatPair.colorFormat, // VkFormat format; + formatPair.depthFormat, // VkFormat depthFormat; + topology, // Topology topology; + Vec4(0.0f, 1.0f, 0.0f, 1.0f), // Vec4 expectedColor; + 0.01f, // float colorEpsilon; + 0.9f, // float expectedDepth; + 0.01f, // float depthEpsilon; + 1u, // deUint32 repeatCount; + false, // bool enableBlend; + { // vector<ClearStep> steps; + { ClearOp::DRAW , Vec4(1.0f, 0.0f, 0.0f, 1.0f) , 0.3f }, + { ClearOp::CLEAR , Vec4(0.0f, 1.0f, 0.0f, 1.0f) , 0.9f } + } + }; + addChild(new MultipleClearsWithinRenderPassTest(m_testCtx, "draw_clear" + testNameSuffix, "Multiple clears within same render pass, methods: draw, clear", params)); + } + { + const TestParams params = + { + formatPair.colorFormat, // VkFormat format; + formatPair.depthFormat, // VkFormat depthFormat; + topology, // Topology topology; + Vec4(0.0f, 1.0f, 0.0f, 1.0f), // Vec4 expectedColor; + 0.01f, // float colorEpsilon; + 0.9f, // float expectedDepth; + 0.01f, // float depthEpsilon; + 1u, // deUint32 repeatCount; + false, // bool enableBlend; + { // vector<ClearStep> steps; + { ClearOp::CLEAR , Vec4(1.0f, 0.0f, 0.0f, 1.0f) , 0.3f }, + { ClearOp::CLEAR , Vec4(0.0f, 1.0f, 0.0f, 1.0f) , 0.9f } + } + }; + addChild(new MultipleClearsWithinRenderPassTest(m_testCtx, "clear_clear" + testNameSuffix, "Multiple clears within same render pass, methods: clear, clear", params)); + } + } + } +} +} // Draw +} // vkt diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.hpp b/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.hpp new file mode 100644 index 000000000..d361408e8 --- /dev/null +++ b/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.hpp @@ -0,0 +1,46 @@ +#ifndef _VKTDRAWMULTIPLECLEARSWITHINRENDERPASS_HPP +#define _VKTDRAWMULTIPLECLEARSWITHINRENDERPASS_HPP +/*------------------------------------------------------------------------- + * Vulkan Conformance Tests + * ----------------------------- + * + * Copyright (c) 2020 Google Inc. + * Copyright (c) 2020 The Khronos Group Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *//*! + * \file + * \brief Test for multiple color or depth clears within a render pass + *//*--------------------------------------------------------------------*/ + +#include "vktTestCase.hpp" + +namespace vkt +{ +namespace Draw +{ +class MultipleClearsWithinRenderPassTests : public tcu::TestCaseGroup +{ +public: + MultipleClearsWithinRenderPassTests (tcu::TestContext &testCtx); + ~MultipleClearsWithinRenderPassTests (); + void init (); + +private: + MultipleClearsWithinRenderPassTests (const MultipleClearsWithinRenderPassTests &other); + MultipleClearsWithinRenderPassTests& operator= (const MultipleClearsWithinRenderPassTests &other); +}; +} +} +#endif // _VKTDRAWMULTIPLECLEARSWITHINRENDERPASS_HPP diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp index c2b126a2e..47b2e4a34 100644 --- a/external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp +++ b/external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp @@ -44,6 +44,7 @@ #include "vktDrawOutputLocationTests.hpp" #include "vktDrawDepthClampTests.hpp" #include "vktDrawAhbTests.hpp" +#include "vktDrawMultipleClearsWithinRenderPass.hpp" namespace vkt { @@ -57,26 +58,27 @@ void createChildren (tcu::TestCaseGroup* group) { tcu::TestContext& testCtx = group->getTestContext(); - group->addChild(new ConcurrentDrawTests (testCtx)); - group->addChild(new SimpleDrawTests (testCtx)); - group->addChild(new DrawIndexedTests (testCtx)); - group->addChild(new IndirectDrawTests (testCtx)); - group->addChild(createBasicDrawTests (testCtx)); - group->addChild(new InstancedTests (testCtx)); - group->addChild(new ShaderDrawParametersTests (testCtx)); - group->addChild(createNegativeViewportHeightTests (testCtx)); - group->addChild(createZeroViewportHeightTests (testCtx)); - group->addChild(createInvertedDepthRangesTests (testCtx)); - group->addChild(createDifferingInterpolationTests (testCtx)); - group->addChild(createShaderLayerTests (testCtx)); - group->addChild(createShaderViewportIndexTests (testCtx)); - group->addChild(createScissorTests (testCtx)); - group->addChild(createMultipleInterpolationTests (testCtx)); - group->addChild(createDiscardRectanglesTests (testCtx)); - group->addChild(createExplicitVertexParameterTests (testCtx)); - group->addChild(createOutputLocationTests (testCtx)); - group->addChild(createDepthClampTests (testCtx)); - group->addChild(createAhbTests (testCtx)); + group->addChild(new ConcurrentDrawTests (testCtx)); + group->addChild(new SimpleDrawTests (testCtx)); + group->addChild(new DrawIndexedTests (testCtx)); + group->addChild(new IndirectDrawTests (testCtx)); + group->addChild(createBasicDrawTests (testCtx)); + group->addChild(new InstancedTests (testCtx)); + group->addChild(new ShaderDrawParametersTests (testCtx)); + group->addChild(createNegativeViewportHeightTests (testCtx)); + group->addChild(createZeroViewportHeightTests (testCtx)); + group->addChild(createInvertedDepthRangesTests (testCtx)); + group->addChild(createDifferingInterpolationTests (testCtx)); + group->addChild(createShaderLayerTests (testCtx)); + group->addChild(createShaderViewportIndexTests (testCtx)); + group->addChild(createScissorTests (testCtx)); + group->addChild(createMultipleInterpolationTests (testCtx)); + group->addChild(createDiscardRectanglesTests (testCtx)); + group->addChild(createExplicitVertexParameterTests (testCtx)); + group->addChild(createOutputLocationTests (testCtx)); + group->addChild(createDepthClampTests (testCtx)); + group->addChild(createAhbTests (testCtx)); + group->addChild(new MultipleClearsWithinRenderPassTests (testCtx)); } } // anonymous diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt index 719277ac3..d409fecbe 100644 --- a/external/vulkancts/mustpass/master/vk-default.txt +++ b/external/vulkancts/mustpass/master/vk-default.txt @@ -516063,6 +516063,150 @@ dEQP-VK.draw.ahb.triangle_list dEQP-VK.draw.ahb.triangle_list_layers_3 dEQP-VK.draw.ahb.triangle_list_layers_5 dEQP-VK.draw.ahb.triangle_list_layers_8 +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_unorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d32_sfloat_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangle_strip +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_triangles +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_draw_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.load_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.draw_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle +dEQP-VK.draw.multiple_clears_within_render_pass.clear_clear_c_r8g8b8a8_snorm_d_d16_unorm_big_triangle dEQP-VK.compute.basic.empty_shader dEQP-VK.compute.basic.concurrent_compute dEQP-VK.compute.basic.max_local_size_x |