Merge branch 'vulkan-cts-1.2.5' into vulkan-cts-1.2.6
Change-Id: Ia705e141206a3751d4abc2d6eccd958d7e3f2f0e
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..95a2004
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,7 @@
+# Set the default behavior, in case people don't have core.autocrlf set.
+* text=auto
+
+# Explicitly declare text files you want to always be normalized
+# and converted to native line endings on checkout.
+*.txt text diff=text
+
diff --git a/AndroidGen.mk b/AndroidGen.mk
index f00dc29..33d0559 100644
--- a/AndroidGen.mk
+++ b/AndroidGen.mk
@@ -118,6 +118,7 @@
external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp \
external/vulkancts/modules/vulkan/device_group/vktDeviceGroupRendering.cpp \
external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp \
+ external/vulkancts/modules/vulkan/draw/vktDrawAhbTests.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawBaseClass.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawBufferObjectUtil.cpp \
external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp \
@@ -131,6 +132,7 @@
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 \
@@ -142,8 +144,10 @@
external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp \
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateBaseClass.cpp \
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateCBTests.cpp \
+ external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateComputeTests.cpp \
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp \
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateGeneralTests.cpp \
+ external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.cpp \
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp \
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTests.cpp \
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.cpp \
@@ -155,6 +159,7 @@
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 \
@@ -173,6 +178,7 @@
external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.cpp \
external/vulkancts/modules/vulkan/image/vktImageMisalignedCubeTests.cpp \
external/vulkancts/modules/vulkan/image/vktImageMismatchedFormatsTests.cpp \
+ external/vulkancts/modules/vulkan/image/vktImageMismatchedWriteOpTests.cpp \
external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp \
external/vulkancts/modules/vulkan/image/vktImageMutableTests.cpp \
external/vulkancts/modules/vulkan/image/vktImageQualifiersTests.cpp \
@@ -199,10 +205,13 @@
external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderUtil.cpp \
external/vulkancts/modules/vulkan/multiview/vktMultiViewTests.cpp \
external/vulkancts/modules/vulkan/pch.cpp \
+ external/vulkancts/modules/vulkan/pipeline/vktPipelineBindPointTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendOperationAdvancedTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineClearUtil.cpp \
+ external/vulkancts/modules/vulkan/pipeline/vktPipelineColorWriteEnableTests.cpp \
+ external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationCacheControlTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationFeedbackTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthRangeUnrestrictedTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthTests.cpp \
@@ -217,9 +226,11 @@
external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp \
+ external/vulkancts/modules/vulkan/pipeline/vktPipelineLogicOpTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMakeUtil.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMatchedAttachmentsTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMaxVaryingsTests.cpp \
+ external/vulkancts/modules/vulkan/pipeline/vktPipelineMiscTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp \
@@ -231,6 +242,7 @@
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleShaderFragmentMaskTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTestsUtil.cpp \
+ external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelinePushConstantTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineReferenceRenderer.cpp \
@@ -244,7 +256,6 @@
external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexInputTests.cpp \
- external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.cpp \
external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexUtil.cpp \
external/vulkancts/modules/vulkan/postmortem/vktPostmortemShaderTimeoutTests.cpp \
external/vulkancts/modules/vulkan/postmortem/vktPostmortemTests.cpp \
@@ -277,13 +288,18 @@
external/vulkancts/modules/vulkan/rasterization/vktRasterizationFragShaderSideEffectsTests.cpp \
external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp \
external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp \
+ external/vulkancts/modules/vulkan/ray_query/vktRayQueryBarycentricCoordinatesTests.cpp \
external/vulkancts/modules/vulkan/ray_query/vktRayQueryBuiltinTests.cpp \
external/vulkancts/modules/vulkan/ray_query/vktRayQueryCullRayFlagsTests.cpp \
+ external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.cpp \
+ external/vulkancts/modules/vulkan/ray_query/vktRayQueryMiscTests.cpp \
+ external/vulkancts/modules/vulkan/ray_query/vktRayQueryProceduralGeometryTests.cpp \
external/vulkancts/modules/vulkan/ray_query/vktRayQueryTests.cpp \
external/vulkancts/modules/vulkan/ray_query/vktRayQueryTraversalControlTests.cpp \
external/vulkancts/modules/vulkan/ray_query/vktRayQueryWatertightnessTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarrierTests.cpp \
+ external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarycentricCoordinatesTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuildIndirectTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuildLargeTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuildTests.cpp \
@@ -291,10 +307,13 @@
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingCallableShadersTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingCaptureReplayTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp \
+ external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDataSpillTests.cpp \
+ external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingMemGuaranteeTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingMiscTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingNullASTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingPipelineLibraryTests.cpp \
+ external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingProceduralGeometryTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingShaderBindingTableTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp \
external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.cpp \
@@ -681,7 +700,6 @@
framework/opengl/wrapper/glwWrapper.cpp \
framework/platform/android/tcuAndroidAssets.cpp \
framework/platform/android/tcuAndroidExecService.cpp \
- framework/platform/android/tcuAndroidInternals.cpp \
framework/platform/android/tcuAndroidJNI.cpp \
framework/platform/android/tcuAndroidMain.cpp \
framework/platform/android/tcuAndroidNativeActivity.cpp \
@@ -1136,6 +1154,7 @@
modules/gles31/tes31TestCase.cpp \
modules/gles31/tes31TestPackage.cpp \
modules/gles31/tes31TestPackageEntry.cpp \
+ modules/gles31/tgl45TestPackage.cpp \
modules/glshared/glsAttributeLocationTests.cpp \
modules/glshared/glsBufferTestUtil.cpp \
modules/glshared/glsBuiltinPrecisionTests.cpp \
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ecb1da9..4365ada 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,7 @@
# dEQP cmake file
# Module FindGit requires cmake >= 2.8.2
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10.2)
find_package(Git)
find_package(PythonInterp 3)
diff --git a/android/cts/master/gles3-master-2021-03-01.txt b/android/cts/master/gles3-master-2021-03-01.txt
index 4b7b366..768570b 100644
--- a/android/cts/master/gles3-master-2021-03-01.txt
+++ b/android/cts/master/gles3-master-2021-03-01.txt
@@ -1,3 +1,195 @@
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.points.1
dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.points.2
dEQP-GLES3.functional.transform_feedback.random_full_array_capture.separate.points.3
diff --git a/android/cts/master/gles3-master.txt b/android/cts/master/gles3-master.txt
index 0820dbe..c00b7b5 100644
--- a/android/cts/master/gles3-master.txt
+++ b/android/cts/master/gles3-master.txt
@@ -33837,6 +33837,198 @@
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_vertex
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_fragment
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_vertex
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_fragment
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_both
diff --git a/android/cts/master/src/vk-master-2019-03-01.txt b/android/cts/master/src/vk-master-2019-03-01.txt
index 64af791..9fc179a 100644
--- a/android/cts/master/src/vk-master-2019-03-01.txt
+++ b/android/cts/master/src/vk-master-2019-03-01.txt
@@ -314869,230 +314869,230 @@
dEQP-VK.image.image_size.buffer.readonly_writeonly_12
dEQP-VK.image.image_size.buffer.readonly_writeonly_1
dEQP-VK.image.image_size.buffer.readonly_writeonly_7
-dEQP-VK.image.atomic_operations.add.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.add.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.add.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.add.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.add.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.add.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.add.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.add.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.min.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.min.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.min.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.min.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.min.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.min.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.min.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.max.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.max.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.max.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.max.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.max.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.max.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.max.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.and.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.and.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.and.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.and.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.and.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.and.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.and.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.or.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.or.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.or.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.or.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.or.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.or.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.or.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
dEQP-VK.image.texel_view_compatible.compute.basic.1d_image.image_load.bc1_rgb_unorm_block.r16g16b16a16_unorm
dEQP-VK.image.texel_view_compatible.compute.basic.1d_image.image_load.bc1_rgb_unorm_block.r16g16b16a16_snorm
dEQP-VK.image.texel_view_compatible.compute.basic.1d_image.image_load.bc1_rgb_unorm_block.r16g16b16a16_uscaled
@@ -396054,12 +396054,12 @@
dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_expect_noop_inverted.draw_indexed_indirect
dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_expect_noop_inverted.draw_indirect_count
dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_expect_noop_inverted.draw_indexed_indirect_count
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indexed
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indirect
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indexed_indirect
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indirect_count
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indexed_indirect_count
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indexed
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indirect
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indexed_indirect
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indirect_count
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indexed_indirect_count
dEQP-VK.conditional_rendering.dispatch.condition_expect_execution.dispatch
dEQP-VK.conditional_rendering.dispatch.condition_expect_execution.dispatch_indirect
dEQP-VK.conditional_rendering.dispatch.condition_expect_execution.dispatch_base
@@ -396084,9 +396084,9 @@
dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_expect_noop_inverted.dispatch
dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_expect_noop_inverted.dispatch_indirect
dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_expect_noop_inverted.dispatch_base
-dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_expect_execution.dispatch
-dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_expect_execution.dispatch_indirect
-dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_expect_execution.dispatch_base
+dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_inherited_expect_execution.dispatch
+dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_inherited_expect_execution.dispatch_indirect
+dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_inherited_expect_execution.dispatch_base
dEQP-VK.conditional_rendering.clear_attachments.condition_expect_execution.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_expect_noop.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_expect_execution_inverted.clear_attachments
@@ -396095,7 +396095,7 @@
dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_expect_noop.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_expect_execution_inverted.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_expect_noop_inverted.clear_attachments
-dEQP-VK.conditional_rendering.clear_attachments.no_condition_secondary_buffer_expect_execution.clear_attachments
+dEQP-VK.conditional_rendering.clear_attachments.no_condition_secondary_buffer_inherited_expect_execution.clear_attachments
dEQP-VK.conditional_rendering.draw_clear.clear.color.no_discard_no_invert_full_no_offset
dEQP-VK.conditional_rendering.draw_clear.clear.color.discard_no_invert_full_no_offset
dEQP-VK.conditional_rendering.draw_clear.clear.color.no_discard_invert_full_no_offset
diff --git a/android/cts/master/src/vk-master-2020-03-01.txt b/android/cts/master/src/vk-master-2020-03-01.txt
index 4b8566f..64453b2 100644
--- a/android/cts/master/src/vk-master-2020-03-01.txt
+++ b/android/cts/master/src/vk-master-2020-03-01.txt
@@ -77898,7 +77898,7 @@
dEQP-VK.pipeline.executable_properties.compute.compute_stage_statistics
dEQP-VK.pipeline.executable_properties.compute.compute_stage_internal_representations
dEQP-VK.pipeline.executable_properties.compute.compute_stage_statistics_internal_representations
-dEQP-VK.pipeline.vertex_only.position_to_ssbo
+dEQP-VK.pipeline.misc.position_to_ssbo
dEQP-VK.pipeline.max_varyings.test_vertex_io_between_vertex_fragment
dEQP-VK.pipeline.max_varyings.test_fragment_io_between_vertex_fragment
dEQP-VK.pipeline.max_varyings.test_tess_eval_io_between_tess_eval_fragment
diff --git a/android/cts/master/vk-master-2019-03-01.txt b/android/cts/master/vk-master-2019-03-01.txt
index 44b4807..2a26d0f 100644
--- a/android/cts/master/vk-master-2019-03-01.txt
+++ b/android/cts/master/vk-master-2019-03-01.txt
@@ -314869,230 +314869,230 @@
dEQP-VK.image.image_size.buffer.readonly_writeonly_12
dEQP-VK.image.image_size.buffer.readonly_writeonly_1
dEQP-VK.image.image_size.buffer.readonly_writeonly_7
-dEQP-VK.image.atomic_operations.add.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.add.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.add.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.add.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.add.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.add.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.add.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.add.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.add.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.min.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.min.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.min.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.min.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.min.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.min.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.min.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.min.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.max.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.max.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.max.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.max.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.max.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.max.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.max.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.max.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.and.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.and.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.and.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.and.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.and.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.and.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.and.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.and.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.or.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.or.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.or.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.or.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.or.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.or.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.or.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.or.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.xor.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.xor.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
dEQP-VK.image.texel_view_compatible.compute.basic.1d_image.image_load.bc1_rgb_unorm_block.r16g16b16a16_unorm
dEQP-VK.image.texel_view_compatible.compute.basic.1d_image.image_load.bc1_rgb_unorm_block.r16g16b16a16_snorm
dEQP-VK.image.texel_view_compatible.compute.basic.1d_image.image_load.bc1_rgb_unorm_block.r16g16b16a16_uscaled
@@ -396054,12 +396054,12 @@
dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_expect_noop_inverted.draw_indexed_indirect
dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_expect_noop_inverted.draw_indirect_count
dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_expect_noop_inverted.draw_indexed_indirect_count
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indexed
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indirect
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indexed_indirect
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indirect_count
-dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_expect_execution.draw_indexed_indirect_count
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indexed
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indirect
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indexed_indirect
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indirect_count
+dEQP-VK.conditional_rendering.draw.no_condition_secondary_buffer_inherited_expect_execution.draw_indexed_indirect_count
dEQP-VK.conditional_rendering.dispatch.condition_expect_execution.dispatch
dEQP-VK.conditional_rendering.dispatch.condition_expect_execution.dispatch_indirect
dEQP-VK.conditional_rendering.dispatch.condition_expect_execution.dispatch_base
@@ -396084,9 +396084,9 @@
dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_expect_noop_inverted.dispatch
dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_expect_noop_inverted.dispatch_indirect
dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_expect_noop_inverted.dispatch_base
-dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_expect_execution.dispatch
-dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_expect_execution.dispatch_indirect
-dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_expect_execution.dispatch_base
+dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_inherited_expect_execution.dispatch
+dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_inherited_expect_execution.dispatch_indirect
+dEQP-VK.conditional_rendering.dispatch.no_condition_secondary_buffer_inherited_expect_execution.dispatch_base
dEQP-VK.conditional_rendering.clear_attachments.condition_expect_execution.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_expect_noop.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_expect_execution_inverted.clear_attachments
@@ -396095,7 +396095,7 @@
dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_expect_noop.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_expect_execution_inverted.clear_attachments
dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_expect_noop_inverted.clear_attachments
-dEQP-VK.conditional_rendering.clear_attachments.no_condition_secondary_buffer_expect_execution.clear_attachments
+dEQP-VK.conditional_rendering.clear_attachments.no_condition_secondary_buffer_inherited_expect_execution.clear_attachments
dEQP-VK.conditional_rendering.draw_clear.clear.color.no_discard_no_invert_full_no_offset
dEQP-VK.conditional_rendering.draw_clear.clear.color.discard_no_invert_full_no_offset
dEQP-VK.conditional_rendering.draw_clear.clear.color.no_discard_invert_full_no_offset
diff --git a/android/cts/master/vk-master-2020-03-01.txt b/android/cts/master/vk-master-2020-03-01.txt
index 22668fe..8bb9cfc 100644
--- a/android/cts/master/vk-master-2020-03-01.txt
+++ b/android/cts/master/vk-master-2020-03-01.txt
@@ -77898,7 +77898,7 @@
dEQP-VK.pipeline.executable_properties.compute.compute_stage_statistics
dEQP-VK.pipeline.executable_properties.compute.compute_stage_internal_representations
dEQP-VK.pipeline.executable_properties.compute.compute_stage_statistics_internal_representations
-dEQP-VK.pipeline.vertex_only.position_to_ssbo
+dEQP-VK.pipeline.misc.position_to_ssbo
dEQP-VK.pipeline.max_varyings.test_vertex_io_between_vertex_fragment
dEQP-VK.pipeline.max_varyings.test_fragment_io_between_vertex_fragment
dEQP-VK.pipeline.max_varyings.test_tess_eval_io_between_tess_eval_fragment
diff --git a/android/cts/master/vk-master-2021-03-01.txt b/android/cts/master/vk-master-2021-03-01.txt
index 138289e..44f956f 100644
--- a/android/cts/master/vk-master-2021-03-01.txt
+++ b/android/cts/master/vk-master-2021-03-01.txt
@@ -1,3 +1,23 @@
+dEQP-VK.api.info.format_properties.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.api.info.format_properties.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.format_properties.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.format_properties.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties.2d.optimal.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties.2d.optimal.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties.2d.optimal.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties.2d.optimal.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties.2d.linear.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties.2d.linear.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties.2d.linear.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties.2d.linear.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties2.2d.optimal.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties2.2d.optimal.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties2.2d.optimal.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties2.2d.optimal.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties2.2d.linear.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.api.info.image_format_properties2.2d.linear.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties2.2d.linear.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.api.info.image_format_properties2.2d.linear.g16_b16r16_2plane_444_unorm_ext
dEQP-VK.api.device_init.enumerate_devices_alloc_leak
dEQP-VK.api.device_init.create_device_global_priority
dEQP-VK.api.object_management.private_data.device_memory_small
@@ -41,6 +61,10 @@
dEQP-VK.api.object_management.private_data.command_buffer_primary
dEQP-VK.api.object_management.private_data.command_buffer_secondary
dEQP-VK.api.buffer.basic.size_max_uint64
+dEQP-VK.api.command_buffers.record_many_draws_primary_1
+dEQP-VK.api.command_buffers.record_many_draws_primary_2
+dEQP-VK.api.command_buffers.record_many_draws_secondary_1
+dEQP-VK.api.command_buffers.record_many_draws_secondary_2
dEQP-VK.api.command_buffers.render_pass_continue_no_fb
dEQP-VK.api.command_buffers.bad_inheritance_info_random
dEQP-VK.api.command_buffers.bad_inheritance_info_random_cont
@@ -51,6 +75,7 @@
dEQP-VK.api.command_buffers.executable_to_ininitial
dEQP-VK.api.command_buffers.recording_to_invalid
dEQP-VK.api.command_buffers.executable_to_invalid
+dEQP-VK.api.copy_and_blit.core.image_to_image.simple_tests.partial_image_npot_diff_format_clear
dEQP-VK.api.copy_and_blit.core.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal
dEQP-VK.api.copy_and_blit.core.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general
dEQP-VK.api.copy_and_blit.core.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal
@@ -24540,887 +24565,3971 @@
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.1d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.1d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uint.r8g8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uint.r8g8b8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uint.b8g8r8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uint.r8g8b8a8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uint.b8g8r8a8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uint_pack32.a8b8g8r8_uint_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uint_pack32.a2r10g10b10_uint_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uint_pack32.a2b10g10r10_uint_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uint.r16_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uint.r16g16_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uint.r16g16b16_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uint.r16g16b16a16_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_uint.r32_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_uint.r32g32_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_linear_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_linear_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_linear_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_uint.r32g32b32_uint.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_linear_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_linear_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_linear_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_uint.r32g32b32a32_uint.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sint.r8g8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sint.r8g8b8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sint.b8g8r8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sint.r8g8b8a8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sint.b8g8r8a8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sint_pack32.a8b8g8r8_sint_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sint_pack32.a2r10g10b10_sint_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sint_pack32.a2b10g10r10_sint_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sint.r16_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sint.r16g16_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sint.r16g16b16_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sint.r16g16b16a16_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sint.r32_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sint.r32g32_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sint.r32g32b32_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sint.r32g32b32a32_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r4g4b4a4_unorm_pack16.r4g4b4a4_unorm_pack16.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b4g4r4a4_unorm_pack16.b4g4r4a4_unorm_pack16.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g6b5_unorm_pack16.r5g6b5_unorm_pack16.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g6r5_unorm_pack16.b5g6r5_unorm_pack16.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r5g5b5a1_unorm_pack16.r5g5b5a1_unorm_pack16.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b5g5r5a1_unorm_pack16.b5g5r5a1_unorm_pack16.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a1r5g5b5_unorm_pack16.a1r5g5b5_unorm_pack16.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_unorm.r8_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_snorm.r8_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_uscaled.r8_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_sscaled.r8_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_unorm.r8g8_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_snorm.r8g8_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_uscaled.r8g8_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_sscaled.r8g8_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_unorm.r8g8b8_unorm.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_snorm.r8g8b8_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_uscaled.r8g8b8_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_sscaled.r8g8b8_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_unorm.b8g8r8_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_snorm.b8g8r8_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_uscaled.b8g8r8_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_sscaled.b8g8r8_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_unorm.r8g8b8a8_unorm.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_snorm.r8g8b8a8_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_uscaled.r8g8b8a8_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_sscaled.r8g8b8a8_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_unorm.b8g8r8a8_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_snorm.b8g8r8a8_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_uscaled.b8g8r8a8_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_sscaled.b8g8r8a8_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_unorm_pack32.a8b8g8r8_unorm_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_snorm_pack32.a8b8g8r8_snorm_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_uscaled_pack32.a8b8g8r8_uscaled_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_sscaled_pack32.a8b8g8r8_sscaled_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_unorm_pack32.a2r10g10b10_unorm_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_snorm_pack32.a2r10g10b10_snorm_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_uscaled_pack32.a2r10g10b10_uscaled_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2r10g10b10_sscaled_pack32.a2r10g10b10_sscaled_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_unorm_pack32.a2b10g10r10_unorm_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_snorm_pack32.a2b10g10r10_snorm_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_uscaled_pack32.a2b10g10r10_uscaled_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a2b10g10r10_sscaled_pack32.a2b10g10r10_sscaled_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_unorm.r16_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_snorm.r16_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_uscaled.r16_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sscaled.r16_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16_sfloat.r16_sfloat.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_unorm.r16g16_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_snorm.r16g16_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_uscaled.r16g16_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sscaled.r16g16_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16_sfloat.r16g16_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_unorm.r16g16b16_unorm.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_snorm.r16g16b16_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_uscaled.r16g16b16_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sscaled.r16g16b16_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16_sfloat.r16g16b16_sfloat.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_unorm.r16g16b16a16_unorm.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_snorm.r16g16b16a16_snorm.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_uscaled.r16g16b16a16_uscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sscaled.r16g16b16a16_sscaled.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r16g16b16a16_sfloat.r16g16b16a16_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32_sfloat.r32_sfloat.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32_sfloat.r32g32_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32_sfloat.r32g32b32_sfloat.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r32g32b32a32_sfloat.r32g32b32a32_sfloat.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b10g11r11_ufloat_pack32.b10g11r11_ufloat_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8_srgb.r8g8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8_srgb.r8g8b8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8_srgb.b8g8r8_srgb.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.r8g8b8a8_srgb.r8g8b8a8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.b8g8r8a8_srgb.b8g8r8a8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.optimal_general_nearest
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.general_optimal_nearest
@@ -26645,6 +29754,7 @@
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.generate_mipmaps.from_previous_level.layercount_6.a8b8g8r8_srgb_pack32.optimal_general_cubic
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.generate_mipmaps.from_previous_level.layercount_6.a8b8g8r8_srgb_pack32.general_optimal_cubic
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.generate_mipmaps.from_previous_level.layercount_6.a8b8g8r8_srgb_pack32.general_general_cubic
+dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_image.simple_tests.partial_image_npot_diff_format_clear
dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal
dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general
dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal
@@ -28522,65 +31632,269 @@
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.1d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.1d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.optimal_general_nearest
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.general_optimal_nearest
@@ -29805,6 +33119,7 @@
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.generate_mipmaps.from_previous_level.layercount_6.a8b8g8r8_srgb_pack32.optimal_general_cubic
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.generate_mipmaps.from_previous_level.layercount_6.a8b8g8r8_srgb_pack32.general_optimal_cubic
dEQP-VK.api.copy_and_blit.dedicated_allocation.blit_image.all_formats.generate_mipmaps.from_previous_level.layercount_6.a8b8g8r8_srgb_pack32.general_general_cubic
+dEQP-VK.api.copy_and_blit.copy_commands2.image_to_image.simple_tests.partial_image_npot_diff_format_clear
dEQP-VK.api.copy_and_blit.copy_commands2.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal
dEQP-VK.api.copy_and_blit.copy_commands2.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general
dEQP-VK.api.copy_and_blit.copy_commands2.image_to_image.all_formats.color.1d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal
@@ -31682,65 +34997,269 @@
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.1d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.1d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_uint.r8_uint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_sint.r8_sint.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r4g4_unorm_pack8.r4g4_unorm_pack8.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.e5b9g9r9_ufloat_pack32.e5b9g9r9_ufloat_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.optimal_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.general_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.r8_srgb.r8_srgb.linear_linear_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.optimal_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_optimal_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_x
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_y
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_linear_stripes_z
+dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.color.3d.a8b8g8r8_srgb_pack32.a8b8g8r8_srgb_pack32.general_general_nearest_stripes_z
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.optimal_optimal_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.optimal_general_nearest
dEQP-VK.api.copy_and_blit.copy_commands2.blit_image.all_formats.depth_stencil.1d.d16_unorm_s8_uint_d16_unorm_s8_uint_separate_layouts.general_optimal_nearest
@@ -46959,10 +50478,15 @@
dEQP-VK.api.external.memory.android_hardware_buffer.image_formats.d32_sfloat_s8_uint
dEQP-VK.api.external.memory.android_hardware_buffer.image_formats.s8_uint
dEQP-VK.api.external.fence.sync_fd.import_signaled_temporary
+dEQP-VK.api.descriptor_set.descriptor_set_layout_binding.update_subsequent_binding
+dEQP-VK.api.descriptor_set.descriptor_set_layout_binding.layout_binding_order
dEQP-VK.api.pipeline.pipeline_layout.lifetime.destroy_after_end
dEQP-VK.api.tooling_info.validate_getter
dEQP-VK.api.tooling_info.validate_tools_properties
dEQP-VK.api.tooling_info.validate_instance_layers
+dEQP-VK.memory.mapping.suballocation.full.variable.implicit_unmap
+dEQP-VK.memory.mapping.dedicated_alloc.buffer.full.variable.implicit_unmap
+dEQP-VK.memory.mapping.dedicated_alloc.image.full.variable.implicit_unmap
dEQP-VK.memory.device_memory_report.create_and_destroy_object.device
dEQP-VK.memory.device_memory_report.create_and_destroy_object.device_memory_small
dEQP-VK.memory.device_memory_report.create_and_destroy_object.buffer_uniform_small
@@ -59973,6 +63497,216 @@
dEQP-VK.pipeline.sampler.separate_stencil_usage.view_type.cube_array.format.d32_sfloat_s8_uint.mag_reduce.comp_r_zero_zero_zero.average
dEQP-VK.pipeline.sampler.separate_stencil_usage.view_type.cube_array.format.d32_sfloat_s8_uint.mag_reduce.comp_r_zero_zero_zero.min
dEQP-VK.pipeline.sampler.separate_stencil_usage.view_type.cube_array.format.d32_sfloat_s8_uint.mag_reduce.comp_r_zero_zero_zero.max
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
dEQP-VK.pipeline.image_view.view_type.1d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.r_g_b_a
dEQP-VK.pipeline.image_view.view_type.1d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.g_b_a_r
dEQP-VK.pipeline.image_view.view_type.1d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.b_a_r_g
@@ -60003,6 +63737,258 @@
dEQP-VK.pipeline.image_view.view_type.1d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_remaining_levels
dEQP-VK.pipeline.image_view.view_type.1d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.array_layer_last_remaining_layers
dEQP-VK.pipeline.image_view.view_type.1d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.1d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
dEQP-VK.pipeline.image_view.view_type.1d_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.r_g_b_a
dEQP-VK.pipeline.image_view.view_type.1d_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.g_b_a_r
dEQP-VK.pipeline.image_view.view_type.1d_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.b_a_r_g
@@ -60039,6 +64025,216 @@
dEQP-VK.pipeline.image_view.view_type.1d_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_remaining_levels
dEQP-VK.pipeline.image_view.view_type.1d_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.base_array_layer_remaining_layers
dEQP-VK.pipeline.image_view.view_type.1d_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
dEQP-VK.pipeline.image_view.view_type.2d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.r_g_b_a
dEQP-VK.pipeline.image_view.view_type.2d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.g_b_a_r
dEQP-VK.pipeline.image_view.view_type.2d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.b_a_r_g
@@ -60069,6 +64265,258 @@
dEQP-VK.pipeline.image_view.view_type.2d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_remaining_levels
dEQP-VK.pipeline.image_view.view_type.2d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.array_layer_last_remaining_layers
dEQP-VK.pipeline.image_view.view_type.2d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.2d_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
dEQP-VK.pipeline.image_view.view_type.2d_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.r_g_b_a
dEQP-VK.pipeline.image_view.view_type.2d_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.g_b_a_r
dEQP-VK.pipeline.image_view.view_type.2d_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.b_a_r_g
@@ -60105,6 +64553,132 @@
dEQP-VK.pipeline.image_view.view_type.2d_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_remaining_levels
dEQP-VK.pipeline.image_view.view_type.2d_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.base_array_layer_remaining_layers
dEQP-VK.pipeline.image_view.view_type.2d_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_uint.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_sint.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.subresource_range.single_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.3d.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
dEQP-VK.pipeline.image_view.view_type.3d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.r_g_b_a
dEQP-VK.pipeline.image_view.view_type.3d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.g_b_a_r
dEQP-VK.pipeline.image_view.view_type.3d.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.b_a_r_g
@@ -60123,6 +64697,216 @@
dEQP-VK.pipeline.image_view.view_type.3d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_remaining_levels
dEQP-VK.pipeline.image_view.view_type.3d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.single_array_layer_remaining_layers
dEQP-VK.pipeline.image_view.view_type.3d.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_single_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_layer_second
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_layer_last
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.array_layer_last_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
dEQP-VK.pipeline.image_view.view_type.cube.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.r_g_b_a
dEQP-VK.pipeline.image_view.view_type.cube.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.g_b_a_r
dEQP-VK.pipeline.image_view.view_type.cube.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.b_a_r_g
@@ -60153,6 +64937,258 @@
dEQP-VK.pipeline.image_view.view_type.cube.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_remaining_levels
dEQP-VK.pipeline.image_view.view_type.cube.format.a4b4g4r4_unorm_pack16_ext.subresource_range.array_layer_last_remaining_layers
dEQP-VK.pipeline.image_view.view_type.cube.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_array_layer_last_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_unorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_snorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_uint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_sint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8_srgb.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_unorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_snorm.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sscaled.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_uint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_sint.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.component_swizzle.r_g_b_a
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.component_swizzle.g_b_a_r
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.component_swizzle.b_a_r_g
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.component_swizzle.a_r_g_b
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_base_array_layer
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_mip_levels_array_base_and_size
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_remaining_levels
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.base_array_layer_remaining_layers
+dEQP-VK.pipeline.image_view.view_type.cube_array.format.b8g8r8a8_srgb.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
dEQP-VK.pipeline.image_view.view_type.cube_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.r_g_b_a
dEQP-VK.pipeline.image_view.view_type.cube_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.g_b_a_r
dEQP-VK.pipeline.image_view.view_type.cube_array.format.a4r4g4b4_unorm_pack16_ext.component_swizzle.b_a_r_g
@@ -60189,6 +65225,232 @@
dEQP-VK.pipeline.image_view.view_type.cube_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_remaining_levels
dEQP-VK.pipeline.image_view.view_type.cube_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.base_array_layer_remaining_layers
dEQP-VK.pipeline.image_view.view_type.cube_array.format.a4b4g4r4_unorm_pack16_ext.subresource_range.lod_base_mip_level_base_array_layer_remaining_levels_and_layers
+dEQP-VK.pipeline.logic_op.r8_uint.clear
+dEQP-VK.pipeline.logic_op.r8_uint.and
+dEQP-VK.pipeline.logic_op.r8_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r8_uint.copy
+dEQP-VK.pipeline.logic_op.r8_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r8_uint.no_op
+dEQP-VK.pipeline.logic_op.r8_uint.xor
+dEQP-VK.pipeline.logic_op.r8_uint.or
+dEQP-VK.pipeline.logic_op.r8_uint.nor
+dEQP-VK.pipeline.logic_op.r8_uint.equivalent
+dEQP-VK.pipeline.logic_op.r8_uint.invert
+dEQP-VK.pipeline.logic_op.r8_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r8_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r8_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r8_uint.nand
+dEQP-VK.pipeline.logic_op.r8_uint.set
+dEQP-VK.pipeline.logic_op.r8g8_uint.clear
+dEQP-VK.pipeline.logic_op.r8g8_uint.and
+dEQP-VK.pipeline.logic_op.r8g8_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r8g8_uint.copy
+dEQP-VK.pipeline.logic_op.r8g8_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r8g8_uint.no_op
+dEQP-VK.pipeline.logic_op.r8g8_uint.xor
+dEQP-VK.pipeline.logic_op.r8g8_uint.or
+dEQP-VK.pipeline.logic_op.r8g8_uint.nor
+dEQP-VK.pipeline.logic_op.r8g8_uint.equivalent
+dEQP-VK.pipeline.logic_op.r8g8_uint.invert
+dEQP-VK.pipeline.logic_op.r8g8_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r8g8_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r8g8_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r8g8_uint.nand
+dEQP-VK.pipeline.logic_op.r8g8_uint.set
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.clear
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.and
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.copy
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.no_op
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.xor
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.or
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.nor
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.equivalent
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.invert
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.nand
+dEQP-VK.pipeline.logic_op.r8g8b8_uint.set
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.clear
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.and
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.and_reverse
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.copy
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.and_inverted
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.no_op
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.xor
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.or
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.nor
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.equivalent
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.invert
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.or_reverse
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.or_inverted
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.nand
+dEQP-VK.pipeline.logic_op.b8g8r8_uint.set
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.clear
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.and
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.copy
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.no_op
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.xor
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.or
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.nor
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.equivalent
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.invert
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.nand
+dEQP-VK.pipeline.logic_op.r8g8b8a8_uint.set
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.clear
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.and
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.and_reverse
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.copy
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.and_inverted
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.no_op
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.xor
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.or
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.nor
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.equivalent
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.invert
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.or_reverse
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.or_inverted
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.nand
+dEQP-VK.pipeline.logic_op.b8g8r8a8_uint.set
+dEQP-VK.pipeline.logic_op.r16_uint.clear
+dEQP-VK.pipeline.logic_op.r16_uint.and
+dEQP-VK.pipeline.logic_op.r16_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r16_uint.copy
+dEQP-VK.pipeline.logic_op.r16_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r16_uint.no_op
+dEQP-VK.pipeline.logic_op.r16_uint.xor
+dEQP-VK.pipeline.logic_op.r16_uint.or
+dEQP-VK.pipeline.logic_op.r16_uint.nor
+dEQP-VK.pipeline.logic_op.r16_uint.equivalent
+dEQP-VK.pipeline.logic_op.r16_uint.invert
+dEQP-VK.pipeline.logic_op.r16_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r16_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r16_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r16_uint.nand
+dEQP-VK.pipeline.logic_op.r16_uint.set
+dEQP-VK.pipeline.logic_op.r16g16_uint.clear
+dEQP-VK.pipeline.logic_op.r16g16_uint.and
+dEQP-VK.pipeline.logic_op.r16g16_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r16g16_uint.copy
+dEQP-VK.pipeline.logic_op.r16g16_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r16g16_uint.no_op
+dEQP-VK.pipeline.logic_op.r16g16_uint.xor
+dEQP-VK.pipeline.logic_op.r16g16_uint.or
+dEQP-VK.pipeline.logic_op.r16g16_uint.nor
+dEQP-VK.pipeline.logic_op.r16g16_uint.equivalent
+dEQP-VK.pipeline.logic_op.r16g16_uint.invert
+dEQP-VK.pipeline.logic_op.r16g16_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r16g16_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r16g16_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r16g16_uint.nand
+dEQP-VK.pipeline.logic_op.r16g16_uint.set
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.clear
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.and
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.copy
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.no_op
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.xor
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.or
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.nor
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.equivalent
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.invert
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.nand
+dEQP-VK.pipeline.logic_op.r16g16b16_uint.set
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.clear
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.and
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.copy
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.no_op
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.xor
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.or
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.nor
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.equivalent
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.invert
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.nand
+dEQP-VK.pipeline.logic_op.r16g16b16a16_uint.set
+dEQP-VK.pipeline.logic_op.r32_uint.clear
+dEQP-VK.pipeline.logic_op.r32_uint.and
+dEQP-VK.pipeline.logic_op.r32_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r32_uint.copy
+dEQP-VK.pipeline.logic_op.r32_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r32_uint.no_op
+dEQP-VK.pipeline.logic_op.r32_uint.xor
+dEQP-VK.pipeline.logic_op.r32_uint.or
+dEQP-VK.pipeline.logic_op.r32_uint.nor
+dEQP-VK.pipeline.logic_op.r32_uint.equivalent
+dEQP-VK.pipeline.logic_op.r32_uint.invert
+dEQP-VK.pipeline.logic_op.r32_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r32_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r32_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r32_uint.nand
+dEQP-VK.pipeline.logic_op.r32_uint.set
+dEQP-VK.pipeline.logic_op.r32g32_uint.clear
+dEQP-VK.pipeline.logic_op.r32g32_uint.and
+dEQP-VK.pipeline.logic_op.r32g32_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r32g32_uint.copy
+dEQP-VK.pipeline.logic_op.r32g32_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r32g32_uint.no_op
+dEQP-VK.pipeline.logic_op.r32g32_uint.xor
+dEQP-VK.pipeline.logic_op.r32g32_uint.or
+dEQP-VK.pipeline.logic_op.r32g32_uint.nor
+dEQP-VK.pipeline.logic_op.r32g32_uint.equivalent
+dEQP-VK.pipeline.logic_op.r32g32_uint.invert
+dEQP-VK.pipeline.logic_op.r32g32_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r32g32_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r32g32_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r32g32_uint.nand
+dEQP-VK.pipeline.logic_op.r32g32_uint.set
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.clear
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.and
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.copy
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.no_op
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.xor
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.or
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.nor
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.equivalent
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.invert
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.nand
+dEQP-VK.pipeline.logic_op.r32g32b32_uint.set
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.clear
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.and
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.and_reverse
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.copy
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.and_inverted
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.no_op
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.xor
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.or
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.nor
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.equivalent
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.invert
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.or_reverse
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.copy_inverted
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.or_inverted
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.nand
+dEQP-VK.pipeline.logic_op.r32g32b32a32_uint.set
+dEQP-VK.pipeline.push_constant.graphics_pipeline.overwrite
+dEQP-VK.pipeline.push_constant.compute_pipeline.overwrite
dEQP-VK.pipeline.push_constant.lifetime.push_range0_bind_layout1
dEQP-VK.pipeline.push_constant.lifetime.push_range1_bind_layout1_push_range0
dEQP-VK.pipeline.push_constant.lifetime.push_range0_bind_layout0_push_range1_push_range0
@@ -60570,6 +65832,18 @@
dEQP-VK.pipeline.spec_constant.compute.basic.double_2_packed
dEQP-VK.pipeline.spec_constant.compute.basic.mixed_packed
dEQP-VK.pipeline.spec_constant.compute.basic.mixed_reversed_packed
+dEQP-VK.pipeline.multisample.standardsampleposition.r8g8b8a8_unorm.samples_2
+dEQP-VK.pipeline.multisample.standardsampleposition.r8g8b8a8_unorm.samples_4
+dEQP-VK.pipeline.multisample.standardsampleposition.r8g8b8a8_unorm.samples_8
+dEQP-VK.pipeline.multisample.standardsampleposition.r8g8b8a8_unorm.samples_16
+dEQP-VK.pipeline.multisample.standardsampleposition.r8g8b8a8_unorm.samples_32
+dEQP-VK.pipeline.multisample.standardsampleposition.r8g8b8a8_unorm.samples_64
+dEQP-VK.pipeline.multisample.standardsampleposition.r32g32b32a32_sfloat.samples_2
+dEQP-VK.pipeline.multisample.standardsampleposition.r32g32b32a32_sfloat.samples_4
+dEQP-VK.pipeline.multisample.standardsampleposition.r32g32b32a32_sfloat.samples_8
+dEQP-VK.pipeline.multisample.standardsampleposition.r32g32b32a32_sfloat.samples_16
+dEQP-VK.pipeline.multisample.standardsampleposition.r32g32b32a32_sfloat.samples_32
+dEQP-VK.pipeline.multisample.standardsampleposition.r32g32b32a32_sfloat.samples_64
dEQP-VK.pipeline.multisample.variable_rate.1_2
dEQP-VK.pipeline.multisample.variable_rate.1_4
dEQP-VK.pipeline.multisample.variable_rate.1_8
@@ -61775,6 +67049,7 @@
dEQP-VK.pipeline.multisample_shader_builtin.write_sample_mask.16_samples
dEQP-VK.pipeline.shader_stencil_export.d24_unorm_s8_uint.op_replace
dEQP-VK.pipeline.shader_stencil_export.d32_sfloat_s8_uint.op_replace
+dEQP-VK.pipeline.misc.primitive_id_from_tess
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.cull_none
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.cull_back
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.cull_front
@@ -61783,6 +67058,11 @@
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.front_face_ccw
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.front_face_cw_reversed
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.front_face_ccw_reversed
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.disable_raster
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.enable_raster
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.logic_op_or
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.prim_restart_enable
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.patch_control_points
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_line
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle_geom
@@ -61798,10 +67078,15 @@
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.stride
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.large_stride_with_offset_and_padding
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_write_disable
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_bias_enable
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_bias_disable
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_compare_never
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_compare_less
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.depth_compare_greater
@@ -63148,6 +68433,7 @@
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_0_depthfail
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_pass
dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_depthfail
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.vertex_input
dEQP-VK.pipeline.extended_dynamic_state.before_draw.cull_none
dEQP-VK.pipeline.extended_dynamic_state.before_draw.cull_back
dEQP-VK.pipeline.extended_dynamic_state.before_draw.cull_front
@@ -63156,6 +68442,11 @@
dEQP-VK.pipeline.extended_dynamic_state.before_draw.front_face_ccw
dEQP-VK.pipeline.extended_dynamic_state.before_draw.front_face_cw_reversed
dEQP-VK.pipeline.extended_dynamic_state.before_draw.front_face_ccw_reversed
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.disable_raster
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.enable_raster
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.logic_op_or
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.prim_restart_enable
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.patch_control_points
dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle
dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_line
dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle_geom
@@ -63171,10 +68462,15 @@
dEQP-VK.pipeline.extended_dynamic_state.before_draw.stride
dEQP-VK.pipeline.extended_dynamic_state.before_draw.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_draw.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.large_stride_with_offset_and_padding
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_write_disable
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_bias_enable
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_bias_disable
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_compare_never
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_compare_less
dEQP-VK.pipeline.extended_dynamic_state.before_draw.depth_compare_greater
@@ -64521,6 +69817,7 @@
dEQP-VK.pipeline.extended_dynamic_state.before_draw.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_0_depthfail
dEQP-VK.pipeline.extended_dynamic_state.before_draw.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_pass
dEQP-VK.pipeline.extended_dynamic_state.before_draw.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_depthfail
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.vertex_input
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.cull_none
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.cull_back
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.cull_front
@@ -64529,6 +69826,11 @@
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.front_face_ccw
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.front_face_cw_reversed
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.front_face_ccw_reversed
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.disable_raster
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.enable_raster
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.logic_op_or
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.prim_restart_enable
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.patch_control_points
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_line
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle_geom
@@ -64544,10 +69846,15 @@
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.stride
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.large_stride_with_offset_and_padding
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_write_disable
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_bias_enable
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_bias_disable
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_compare_never
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_compare_less
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.depth_compare_greater
@@ -65894,6 +71201,7 @@
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_0_depthfail
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_pass
dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_depthfail
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.vertex_input
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.cull_none
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.cull_back
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.cull_front
@@ -65902,6 +71210,11 @@
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.front_face_ccw
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.front_face_cw_reversed
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.front_face_ccw_reversed
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.disable_raster
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.enable_raster
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.logic_op_or
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.prim_restart_enable
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.patch_control_points
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_line
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle_geom
@@ -65917,10 +71230,15 @@
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.stride
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.large_stride_with_offset_and_padding
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_write_disable
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_bias_enable
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_bias_disable
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_compare_never
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_compare_less
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.depth_compare_greater
@@ -67267,6 +72585,7 @@
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_0_depthfail
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_pass
dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_depthfail
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.vertex_input
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.cull_none
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.cull_back
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.cull_front
@@ -67275,6 +72594,11 @@
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.front_face_ccw
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.front_face_cw_reversed
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.front_face_ccw_reversed
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.disable_raster
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.enable_raster
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.logic_op_or
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.prim_restart_enable
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.patch_control_points
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_line
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle_geom
@@ -67290,10 +72614,15 @@
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.stride
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.large_stride_with_offset_and_padding
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_write_disable
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_bias_enable
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_bias_disable
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_compare_never
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_compare_less
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.depth_compare_greater
@@ -68640,6 +73969,7 @@
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_0_depthfail
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_pass
dEQP-VK.pipeline.extended_dynamic_state.before_good_static.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_depthfail
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.vertex_input
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.cull_none
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.cull_back
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.cull_front
@@ -68648,6 +73978,11 @@
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.front_face_ccw
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.front_face_cw_reversed
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.front_face_ccw_reversed
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.disable_raster
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.enable_raster
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.logic_op_or
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.prim_restart_enable
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.patch_control_points
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_line
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle_geom
@@ -68663,10 +73998,15 @@
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.stride
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.stride_with_offset
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.stride_with_offset_and_padding
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.large_stride_with_offset_and_padding
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_write_disable
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_bias_enable
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_bias_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_compare_never
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_compare_less
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_compare_greater
@@ -70013,6 +75353,7 @@
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_0_depthfail
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_pass
dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_depthfail
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.vertex_input
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.cull_none
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.cull_back
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.cull_front
@@ -70021,6 +75362,11 @@
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.front_face_ccw
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.front_face_cw_reversed
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.front_face_ccw_reversed
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.disable_raster
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.enable_raster
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.logic_op_or
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.prim_restart_enable
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.patch_control_points
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_line
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle_geom
@@ -70040,6 +75386,8 @@
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_test_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_write_enable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_write_disable
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_bias_enable
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_bias_disable
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_compare_never
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_compare_less
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.depth_compare_greater
@@ -71386,15 +76734,1674 @@
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_0_depthfail
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_pass
dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.stencil_state_face_both_dual_xt_dec_wrap_clear_0_ref_1_depthfail
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.vertex_input
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.single_pipeline_no_compile
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.batch_pipelines_early_return
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.duplicate_single_recreate_explicit_caching
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.duplicate_single_recreate_no_caching
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.duplicate_single_recreate_derivative
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.duplicate_batch_pipelines_explicit_cache
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.duplicate_batch_pipelines_no_cache
+dEQP-VK.pipeline.creation_cache_control.graphics_pipelines.duplicate_batch_pipelines_derivative_index
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.single_pipeline_no_compile
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.batch_pipelines_early_return
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_single_recreate_explicit_caching
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_single_recreate_no_caching
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_single_recreate_derivative
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_batch_pipelines_explicit_cache
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_batch_pipelines_no_cache
+dEQP-VK.pipeline.creation_cache_control.compute_pipelines.duplicate_batch_pipelines_derivative_index
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.basic.multiview.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.implicit_declarations.ssbo_writes.multiview.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.basic.multiview.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.single_view.v1_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e0_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e1_g0
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e0_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c0_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v0_c1_e1_g1
+dEQP-VK.pipeline.no_position.explicit_declarations.ssbo_writes.multiview.v1_c1_e1_g1
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_write.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_push.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.write_template_push.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_write.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_push.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.push_template_push.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_write.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_push.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_gs_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_gs_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_gs_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_gs_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cs_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cs_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cs_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gp_cs_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gp_gs_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gp_gs_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gp_cs_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gp_cs_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gs_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gs_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gs_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_gs_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_cs_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_cs_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_cs_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cp_cs_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_gp_cp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_gp_cp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_gp_cs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_gp_cs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cp_gp_cs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cp_gp_cs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cp_cs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cp_cs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_gs_cs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gp_cp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gp_cp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gp_gs_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gp_gs_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_cp_gp_gs.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_cp_gp_gs.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_cp_gs_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_cp_gs_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gs_gp_cp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gs_gp_cp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gs_cp_gp.cmd_draw_dispatch
+dEQP-VK.pipeline.bind_point.graphics_compute.template_push_template_push.setup_cs_gs_cp_gp.cmd_dispatch_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_write.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_push.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.write_template_push.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_write.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_push.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.push_template_push.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_write.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_push.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_gs_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_gs_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_gs_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_gs_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rs_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rs_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rs_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gp_rs_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gp_gs_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gp_gs_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gp_rs_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gp_rs_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gs_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gs_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gs_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_gs_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_rs_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_rs_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_rs_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rp_rs_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_gp_rp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_gp_rp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_gp_rs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_gp_rs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rp_gp_rs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rp_gp_rs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rp_rs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rp_rs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_gs_rs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gp_rp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gp_rp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gp_gs_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gp_gs_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_rp_gp_gs.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_rp_gp_gs.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_rp_gs_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_rp_gs_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gs_gp_rp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gs_gp_rp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gs_rp_gp.cmd_draw_tracerays
+dEQP-VK.pipeline.bind_point.graphics_raytracing.template_push_template_push.setup_rs_gs_rp_gp.cmd_tracerays_draw
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_write.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_push.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.write_template_push.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_write.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_push.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.push_template_push.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_write.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_push.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_cs_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_cs_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_cs_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_cs_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rs_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rs_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rs_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cp_rs_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cp_cs_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cp_cs_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cp_rs_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cp_rs_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cs_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cs_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cs_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_cs_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_rs_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_rs_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_rs_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rp_rs_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_cp_rp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_cp_rp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_cp_rs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_cp_rs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rp_cp_rs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rp_cp_rs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rp_rs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rp_rs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_cs_rs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cp_rp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cp_rp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cp_cs_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cp_cs_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_rp_cp_cs.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_rp_cp_cs.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_rp_cs_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_rp_cs_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cs_cp_rp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cs_cp_rp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cs_rp_cp.cmd_dispatch_tracerays
+dEQP-VK.pipeline.bind_point.compute_raytracing.template_push_template_push.setup_rs_cs_rp_cp.cmd_tracerays_dispatch
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.enable_all
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.enable_first
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.enable_second
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.enable_last
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.disable_all
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.disable_first
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.disable_second
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.disable_last
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.cmd_buffer_start.disable_second_and_last
+dEQP-VK.pipeline.color_write_enable.before_draw.enable_all
+dEQP-VK.pipeline.color_write_enable.before_draw.enable_first
+dEQP-VK.pipeline.color_write_enable.before_draw.enable_second
+dEQP-VK.pipeline.color_write_enable.before_draw.enable_last
+dEQP-VK.pipeline.color_write_enable.before_draw.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.before_draw.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.before_draw.disable_all
+dEQP-VK.pipeline.color_write_enable.before_draw.disable_first
+dEQP-VK.pipeline.color_write_enable.before_draw.disable_second
+dEQP-VK.pipeline.color_write_enable.before_draw.disable_last
+dEQP-VK.pipeline.color_write_enable.before_draw.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.before_draw.disable_second_and_last
+dEQP-VK.pipeline.color_write_enable.between_pipelines.enable_all
+dEQP-VK.pipeline.color_write_enable.between_pipelines.enable_first
+dEQP-VK.pipeline.color_write_enable.between_pipelines.enable_second
+dEQP-VK.pipeline.color_write_enable.between_pipelines.enable_last
+dEQP-VK.pipeline.color_write_enable.between_pipelines.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.between_pipelines.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.between_pipelines.disable_all
+dEQP-VK.pipeline.color_write_enable.between_pipelines.disable_first
+dEQP-VK.pipeline.color_write_enable.between_pipelines.disable_second
+dEQP-VK.pipeline.color_write_enable.between_pipelines.disable_last
+dEQP-VK.pipeline.color_write_enable.between_pipelines.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.between_pipelines.disable_second_and_last
+dEQP-VK.pipeline.color_write_enable.after_pipelines.enable_all
+dEQP-VK.pipeline.color_write_enable.after_pipelines.enable_first
+dEQP-VK.pipeline.color_write_enable.after_pipelines.enable_second
+dEQP-VK.pipeline.color_write_enable.after_pipelines.enable_last
+dEQP-VK.pipeline.color_write_enable.after_pipelines.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.after_pipelines.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.after_pipelines.disable_all
+dEQP-VK.pipeline.color_write_enable.after_pipelines.disable_first
+dEQP-VK.pipeline.color_write_enable.after_pipelines.disable_second
+dEQP-VK.pipeline.color_write_enable.after_pipelines.disable_last
+dEQP-VK.pipeline.color_write_enable.after_pipelines.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.after_pipelines.disable_second_and_last
+dEQP-VK.pipeline.color_write_enable.before_good_static.enable_all
+dEQP-VK.pipeline.color_write_enable.before_good_static.enable_first
+dEQP-VK.pipeline.color_write_enable.before_good_static.enable_second
+dEQP-VK.pipeline.color_write_enable.before_good_static.enable_last
+dEQP-VK.pipeline.color_write_enable.before_good_static.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.before_good_static.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.before_good_static.disable_all
+dEQP-VK.pipeline.color_write_enable.before_good_static.disable_first
+dEQP-VK.pipeline.color_write_enable.before_good_static.disable_second
+dEQP-VK.pipeline.color_write_enable.before_good_static.disable_last
+dEQP-VK.pipeline.color_write_enable.before_good_static.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.before_good_static.disable_second_and_last
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.enable_all
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.enable_first
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.enable_second
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.enable_last
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.disable_all
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.disable_first
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.disable_second
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.disable_last
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.two_draws_dynamic.disable_second_and_last
+dEQP-VK.pipeline.color_write_enable.two_draws_static.enable_all
+dEQP-VK.pipeline.color_write_enable.two_draws_static.enable_first
+dEQP-VK.pipeline.color_write_enable.two_draws_static.enable_second
+dEQP-VK.pipeline.color_write_enable.two_draws_static.enable_last
+dEQP-VK.pipeline.color_write_enable.two_draws_static.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.two_draws_static.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.two_draws_static.disable_all
+dEQP-VK.pipeline.color_write_enable.two_draws_static.disable_first
+dEQP-VK.pipeline.color_write_enable.two_draws_static.disable_second
+dEQP-VK.pipeline.color_write_enable.two_draws_static.disable_last
+dEQP-VK.pipeline.color_write_enable.two_draws_static.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.two_draws_static.disable_second_and_last
+dEQP-VK.pipeline.color_write_enable.static.enable_all
+dEQP-VK.pipeline.color_write_enable.static.enable_first
+dEQP-VK.pipeline.color_write_enable.static.enable_second
+dEQP-VK.pipeline.color_write_enable.static.enable_last
+dEQP-VK.pipeline.color_write_enable.static.enable_first_and_second
+dEQP-VK.pipeline.color_write_enable.static.enable_second_and_last
+dEQP-VK.pipeline.color_write_enable.static.disable_all
+dEQP-VK.pipeline.color_write_enable.static.disable_first
+dEQP-VK.pipeline.color_write_enable.static.disable_second
+dEQP-VK.pipeline.color_write_enable.static.disable_last
+dEQP-VK.pipeline.color_write_enable.static.disable_first_and_second
+dEQP-VK.pipeline.color_write_enable.static.disable_second_and_last
dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_zero
+dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_zero_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_one
+dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_one_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_destroyed
+dEQP-VK.binding_model.descriptor_update.samplerless.sampled_img_sampler_destroyed_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.storage_img_sampler_zero
+dEQP-VK.binding_model.descriptor_update.samplerless.storage_img_sampler_zero_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.storage_img_sampler_one
+dEQP-VK.binding_model.descriptor_update.samplerless.storage_img_sampler_one_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.storage_img_sampler_destroyed
+dEQP-VK.binding_model.descriptor_update.samplerless.storage_img_sampler_destroyed_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.input_attachment_sampler_zero
+dEQP-VK.binding_model.descriptor_update.samplerless.input_attachment_sampler_zero_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.input_attachment_sampler_one
+dEQP-VK.binding_model.descriptor_update.samplerless.input_attachment_sampler_one_set_1
dEQP-VK.binding_model.descriptor_update.samplerless.input_attachment_sampler_destroyed
+dEQP-VK.binding_model.descriptor_update.samplerless.input_attachment_sampler_destroyed_set_1
+dEQP-VK.binding_model.descriptor_update.random.uniform_buffer
dEQP-VK.binding_model.descriptorset_random.sets4.noarray.ubolimitlow.sbolimitlow.sampledimglow.outimgonly.noiub.nouab.frag.ialimitlow.1
dEQP-VK.binding_model.descriptorset_random.sets4.noarray.ubolimitlow.sbolimitlow.sampledimglow.outimgonly.noiub.nouab.frag.ialimitlow.2
dEQP-VK.binding_model.descriptorset_random.sets4.noarray.ubolimitlow.sbolimitlow.sampledimglow.outimgonly.noiub.nouab.frag.ialimitlow.3
@@ -96157,10 +103164,15 @@
dEQP-VK.spirv_assembly.instruction.compute.composite_insert.undef_mat3x4
dEQP-VK.spirv_assembly.instruction.compute.composite_insert.undef_mat4x4
dEQP-VK.spirv_assembly.instruction.compute.composite_insert.undef_nested_struct
+dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.dynamic_offset.select_descriptor_array
dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_1.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_1.frexpstruct
dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_2.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_2.frexpstruct
dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_3.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_3.frexpstruct
dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_4.modfstruct
+dEQP-VK.spirv_assembly.instruction.compute.float32.comparison_4.frexpstruct
dEQP-VK.spirv_assembly.instruction.compute.signed_op.glsl_int_findumsb
dEQP-VK.spirv_assembly.instruction.compute.signed_op.glsl_int_uclamp
dEQP-VK.spirv_assembly.instruction.compute.signed_op.glsl_int_umax
@@ -97624,21 +104636,41 @@
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_tese
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_geom
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.frexpstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.frexpstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.frexpstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.frexpstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_1.frexpstruct_frag
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_vert
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tesc
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_tese
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_geom
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.frexpstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.frexpstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.frexpstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.frexpstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_2.frexpstruct_frag
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_vert
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tesc
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_tese
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_geom
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.frexpstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.frexpstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.frexpstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.frexpstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_3.frexpstruct_frag
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_vert
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tesc
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_tese
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_geom
dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.modfstruct_frag
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.frexpstruct_vert
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.frexpstruct_tesc
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.frexpstruct_tese
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.frexpstruct_geom
+dEQP-VK.spirv_assembly.instruction.graphics.float32.comparison_4.frexpstruct_frag
dEQP-VK.spirv_assembly.instruction.spirv1p4.hlsl_functionality1.member_decorate_string
dEQP-VK.spirv_assembly.instruction.function_params.sampler_param
dEQP-VK.spirv_assembly.instruction.amd_trinary_minmax.min3.i8.scalar
@@ -97892,6 +104924,22 @@
dEQP-VK.glsl.invariance.lowp.user_defined.loop_2
dEQP-VK.glsl.invariance.lowp.user_defined.loop_3
dEQP-VK.glsl.invariance.lowp.user_defined.loop_4
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dms_fixed_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dms_fixed_fragment
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dms_float_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dms_float_fragment
+dEQP-VK.glsl.texture_functions.query.texturesizems.isampler2dms_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.isampler2dms_fragment
+dEQP-VK.glsl.texture_functions.query.texturesizems.usampler2dms_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.usampler2dms_fragment
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dmsarray_fixed_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dmsarray_fixed_fragment
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dmsarray_float_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.sampler2dmsarray_float_fragment
+dEQP-VK.glsl.texture_functions.query.texturesizems.isampler2dmsarray_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.isampler2dmsarray_fragment
+dEQP-VK.glsl.texture_functions.query.texturesizems.usampler2dmsarray_vertex
+dEQP-VK.glsl.texture_functions.query.texturesizems.usampler2dmsarray_fragment
dEQP-VK.glsl.texture_gather.basic.2d.rgba8.base_level.level_1_amd_bias
dEQP-VK.glsl.texture_gather.basic.2d.rgba8.base_level.sparse_level_1_amd_bias
dEQP-VK.glsl.texture_gather.basic.2d.rgba8.base_level.level_1_amd_lod
@@ -98108,6 +105156,13 @@
dEQP-VK.glsl.texture_gather.offsets.min_required_offset.2d_array.rgba8i.base_level.sparse_level_2_amd_bias
dEQP-VK.glsl.texture_gather.offsets.min_required_offset.2d_array.rgba8i.base_level.level_2_amd_lod
dEQP-VK.glsl.texture_gather.offsets.min_required_offset.2d_array.rgba8i.base_level.sparse_level_2_amd_lod
+dEQP-VK.glsl.builtin_var.fragcoord_msaa_input.1_bit
+dEQP-VK.glsl.builtin_var.fragcoord_msaa_input.2_bit
+dEQP-VK.glsl.builtin_var.fragcoord_msaa_input.4_bit
+dEQP-VK.glsl.builtin_var.fragcoord_msaa_input.8_bit
+dEQP-VK.glsl.builtin_var.fragcoord_msaa_input.16_bit
+dEQP-VK.glsl.builtin_var.fragcoord_msaa_input.32_bit
+dEQP-VK.glsl.builtin_var.fragcoord_msaa_input.64_bit
dEQP-VK.glsl.builtin.function.common.isnan.double_compute
dEQP-VK.glsl.builtin.function.common.isnan.dvec2_compute
dEQP-VK.glsl.builtin.function.common.isnan.dvec3_compute
@@ -100235,6 +107290,136 @@
dEQP-VK.renderpass2.fragment_density_map.properties.8_subsampled_samplers
dEQP-VK.renderpass2.fragment_density_map.properties.subsampled_loads
dEQP-VK.renderpass2.fragment_density_map.properties.subsampled_coarse_reconstruction
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.compute_transfer.multi.compute.before
+dEQP-VK.dynamic_state.compute_transfer.multi.compute.after
+dEQP-VK.dynamic_state.compute_transfer.multi.transfer.before
+dEQP-VK.dynamic_state.compute_transfer.multi.transfer.after
+dEQP-VK.dynamic_state.inheritance.baseline
+dEQP-VK.dynamic_state.inheritance.primary
+dEQP-VK.dynamic_state.inheritance.secondary
+dEQP-VK.dynamic_state.inheritance.split
+dEQP-VK.dynamic_state.inheritance.primary_with_count
+dEQP-VK.dynamic_state.inheritance.secondary_with_count
dEQP-VK.ssbo.layout.single_basic_type.std140.row_major_lowp_mat2_store_cols
dEQP-VK.ssbo.layout.single_basic_type.std140.row_major_lowp_mat2_comp_access_store_cols
dEQP-VK.ssbo.layout.single_basic_type.std140.row_major_mediump_mat2_store_cols
@@ -102562,6 +109747,10 @@
dEQP-VK.draw.indirect_draw.indexed.indirect_draw_param_count_instanced.no_first_instance.triangle_strip
dEQP-VK.draw.indirect_draw.indexed.indirect_draw_param_count_instanced.first_instance.triangle_list
dEQP-VK.draw.indirect_draw.indexed.indirect_draw_param_count_instanced.first_instance.triangle_strip
+dEQP-VK.draw.inverted_depth_ranges.depthclamp_deltaone_bias_clamp_neg
+dEQP-VK.draw.inverted_depth_ranges.depthclamp_deltasmall_bias_clamp_pos
+dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltaone_bias_clamp_neg
+dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltasmall_bias_clamp_pos
dEQP-VK.draw.shader_viewport_index.fragment_shader_implicit
dEQP-VK.draw.shader_viewport_index.fragment_shader_1
dEQP-VK.draw.shader_viewport_index.fragment_shader_2
@@ -102694,6 +109883,154 @@
dEQP-VK.draw.depth_clamp.d32_sfloat_s8_uint_depth_bias_clamp_input_positive
dEQP-VK.draw.depth_clamp.d32_sfloat_s8_uint_depth_range_unrestricted_negative
dEQP-VK.draw.depth_clamp.d32_sfloat_s8_uint_depth_range_unrestricted_positive
+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.max_local_size_x
dEQP-VK.compute.basic.max_local_size_y
dEQP-VK.compute.basic.max_local_size_z
@@ -107161,430 +114498,3278 @@
dEQP-VK.compute.workgroup_memory_explicit_layout.copy_memory.basic
dEQP-VK.compute.workgroup_memory_explicit_layout.copy_memory.two_invocations
dEQP-VK.compute.workgroup_memory_explicit_layout.copy_memory.variable_pointers
-dEQP-VK.image.atomic_operations.add.1d.r32f_end_result
-dEQP-VK.image.atomic_operations.add.1d.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.add.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.add.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d_array.r32f_end_result
-dEQP-VK.image.atomic_operations.add.1d_array.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.add.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.add.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d.r32f_end_result
-dEQP-VK.image.atomic_operations.add.2d.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.add.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.add.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d_array.r32f_end_result
-dEQP-VK.image.atomic_operations.add.2d_array.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.add.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.add.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.add.3d.r32f_end_result
-dEQP-VK.image.atomic_operations.add.3d.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.add.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.add.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.add.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube.r32f_end_result
-dEQP-VK.image.atomic_operations.add.cube.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.add.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.add.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube_array.r32f_end_result
-dEQP-VK.image.atomic_operations.add.cube_array.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.add.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.add.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.add.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.add.buffer.r32f_end_result
-dEQP-VK.image.atomic_operations.add.buffer.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.sub.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.sub.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.sub.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.sub.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.sub.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.sub.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.sub.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.sub.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.sub.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.sub.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.sub.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.sub.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.sub.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.sub.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.sub.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.sub.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.sub.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.sub.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.sub.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.sub.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.sub.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.sub.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.sub.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.sub.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.sub.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.sub.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.sub.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.sub.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.sub.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.inc.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.inc.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.inc.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.inc.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.inc.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.inc.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.inc.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.inc.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.inc.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.inc.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.inc.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.inc.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.inc.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.inc.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.inc.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.inc.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.inc.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.inc.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.inc.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.inc.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.inc.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.inc.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.inc.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.inc.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.inc.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.inc.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.inc.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.inc.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.inc.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d.r32ui_end_result
-dEQP-VK.image.atomic_operations.dec.1d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d.r32i_end_result
-dEQP-VK.image.atomic_operations.dec.1d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.dec.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.dec.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.dec.1d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.dec.1d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.dec.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.dec.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d.r32ui_end_result
-dEQP-VK.image.atomic_operations.dec.2d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d.r32i_end_result
-dEQP-VK.image.atomic_operations.dec.2d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.dec.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.dec.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.dec.2d_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d_array.r32i_end_result
-dEQP-VK.image.atomic_operations.dec.2d_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.dec.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.dec.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.3d.r32ui_end_result
-dEQP-VK.image.atomic_operations.dec.3d.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.3d.r32i_end_result
-dEQP-VK.image.atomic_operations.dec.3d.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.dec.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.dec.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube.r32ui_end_result
-dEQP-VK.image.atomic_operations.dec.cube.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube.r32i_end_result
-dEQP-VK.image.atomic_operations.dec.cube.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.dec.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.dec.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube_array.r32ui_end_result
-dEQP-VK.image.atomic_operations.dec.cube_array.r32ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube_array.r32i_end_result
-dEQP-VK.image.atomic_operations.dec.cube_array.r32i_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.dec.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.dec.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.dec.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.min.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.min.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.min.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.min.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.min.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.min.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.min.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.min.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.min.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.min.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.min.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.min.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.min.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.min.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.min.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.min.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.max.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.max.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.max.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.max.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.max.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.max.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.max.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.max.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.max.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.max.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.max.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.max.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.max.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.max.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.max.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.max.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.and.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.and.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.and.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.and.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.and.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.and.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.and.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.and.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.and.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.and.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.and.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.and.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.and.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.and.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.and.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.and.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.or.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.or.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.or.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.or.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.or.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.or.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.or.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.or.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.or.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.or.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.or.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.or.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.or.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.or.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.or.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.or.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.xor.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.xor.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.xor.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.xor.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.xor.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.xor.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.xor.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.xor.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.xor.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.xor.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.xor.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.xor.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.xor.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.xor.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.xor.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.1d.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.exchange.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.exchange.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.1d_array.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.exchange.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.exchange.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.2d.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.exchange.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.exchange.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.2d_array.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.exchange.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.exchange.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.3d.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.3d.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.exchange.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.exchange.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.cube.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.exchange.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.exchange.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.cube_array.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.exchange.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.exchange.cube_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.exchange.buffer.r32f_end_result
-dEQP-VK.image.atomic_operations.exchange.buffer.r32f_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r64ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r64i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.1d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r64ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r64i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r64i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.2d_array.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r64ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r64i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.3d.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r64ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r64i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube.r64i_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r64ui_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r64ui_intermediate_values
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r64i_end_result
-dEQP-VK.image.atomic_operations.compare_exchange.cube_array.r64i_intermediate_values
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_unorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_snorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.r8g8b8a8_srgb_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_unorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_snorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d.b8g8r8a8_srgb_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_unorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_snorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.r8g8b8a8_srgb_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_unorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_b8g8r8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_b8g8r8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_snorm_b8g8r8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_unorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_clear_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_clear_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_copy_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_copy_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_store_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_store_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_store_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_draw_load_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_snorm_draw_texture_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_srgb_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_srgb_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_r8g8b8a8_srgb_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_b8g8r8a8_unorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_b8g8r8a8_unorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_b8g8r8a8_unorm_draw_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_b8g8r8a8_snorm_clear_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_b8g8r8a8_snorm_copy_copy_format_list
+dEQP-VK.image.swapchain_mutable.headless.2d_array.b8g8r8a8_srgb_b8g8r8a8_snorm_draw_copy_format_list
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.add.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.add.buffer.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.buffer.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.add.buffer.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.add.buffer.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.sub.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.inc.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.dec.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.min.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.max.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.and.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.or.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.xor.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.exchange.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.buffer.notransfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.buffer.notransfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.exchange.buffer.transfer.normal_read.normal_img.r32f_end_result
+dEQP-VK.image.atomic_operations.exchange.buffer.transfer.normal_read.normal_img.r32f_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.1d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.2d_array.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.3d.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube.transfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.normal_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.notransfer.sparse_read.sparse_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.normal_img.r64i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r32ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r32ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r32i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r32i_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r64ui_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r64ui_intermediate_values
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r64i_end_result
+dEQP-VK.image.atomic_operations.compare_exchange.cube_array.transfer.normal_read.sparse_img.r64i_intermediate_values
dEQP-VK.image.load_store_lod.with_format.1d_array.r32g32b32a32_sfloat
dEQP-VK.image.load_store_lod.with_format.1d_array.r32g32b32a32_sfloat_single_layer
dEQP-VK.image.load_store_lod.with_format.1d_array.r16g16b16a16_sfloat
@@ -110045,6 +120230,114 @@
dEQP-VK.image.mismatched_formats.sparse_image_read.d16_unorm_with_r16
dEQP-VK.image.mismatched_formats.sparse_image_read.d32_sfloat_with_r32f
dEQP-VK.image.mismatched_formats.sparse_image_read.s8_uint_with_r8ui
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba32f_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba16f_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32f_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32f_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32f_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32f_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba8_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba8snorm_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32f_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32f_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32f_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16f_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16f_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16f_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r11fg11fb10f_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r11fg11fb10f_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16f_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16f_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16f_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16f_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba16_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgb10a2_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba16snorm_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16snorm_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16snorm_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16snorm_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8snorm_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8snorm_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8snorm_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16snorm_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16snorm_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16snorm_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16snorm_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8snorm_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8snorm_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8snorm_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8snorm_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba32i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba16i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba8i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32i_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32i_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32i_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32i_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32i_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16i_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16i_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8i_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8i_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16i_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16i_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16i_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8i_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8i_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8i_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba32ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba16ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgba8ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32ui_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32ui_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r32ui_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rgb10a2ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32ui_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg32ui_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16ui_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg16ui_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8ui_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.rg8ui_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16ui_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16ui_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r16ui_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8ui_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8ui_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r8ui_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64ui_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64ui_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64ui_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64ui_from_scalar
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64i_from_vec4
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64i_from_vec3
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64i_from_vec2
+dEQP-VK.image.mismatched_write_op.mismatched_vector_sizes.r64i_from_scalar
dEQP-VK.wsi.android.swapchain.acquire.too_many
dEQP-VK.wsi.android.swapchain.acquire.too_many_timeout
dEQP-VK.wsi.android.swapchain.private_data.min_image_count
@@ -110056,6 +120349,12 @@
dEQP-VK.wsi.android.swapchain.private_data.composite_alpha
dEQP-VK.wsi.android.swapchain.private_data.present_mode
dEQP-VK.wsi.android.swapchain.private_data.clipped
+dEQP-VK.wsi.android.colorspace_compare.b8g8r8a8_unorm
+dEQP-VK.wsi.android.colorspace_compare.r8g8b8a8_unorm
+dEQP-VK.wsi.android.colorspace_compare.r8g8b8a8_srgb
+dEQP-VK.wsi.android.colorspace_compare.r5g6b5_unorm_pack16
+dEQP-VK.wsi.android.colorspace_compare.a2b10g10r10_unorm_pack32
+dEQP-VK.wsi.android.colorspace_compare.r16g16b16a16_sfloat
dEQP-VK.wsi.android.full_screen_exclusive.default
dEQP-VK.wsi.android.full_screen_exclusive.allowed
dEQP-VK.wsi.android.full_screen_exclusive.disallowed
@@ -110071,10 +120370,457 @@
dEQP-VK.wsi.macos.swapchain.private_data.composite_alpha
dEQP-VK.wsi.macos.swapchain.private_data.present_mode
dEQP-VK.wsi.macos.swapchain.private_data.clipped
+dEQP-VK.wsi.macos.colorspace_compare.b8g8r8a8_unorm
+dEQP-VK.wsi.macos.colorspace_compare.r8g8b8a8_unorm
+dEQP-VK.wsi.macos.colorspace_compare.r8g8b8a8_srgb
+dEQP-VK.wsi.macos.colorspace_compare.r5g6b5_unorm_pack16
+dEQP-VK.wsi.macos.colorspace_compare.a2b10g10r10_unorm_pack32
+dEQP-VK.wsi.macos.colorspace_compare.r16g16b16a16_sfloat
dEQP-VK.wsi.macos.full_screen_exclusive.default
dEQP-VK.wsi.macos.full_screen_exclusive.allowed
dEQP-VK.wsi.macos.full_screen_exclusive.disallowed
dEQP-VK.wsi.macos.full_screen_exclusive.application_controlled
+dEQP-VK.wsi.headless.surface.create
+dEQP-VK.wsi.headless.surface.create_custom_allocator
+dEQP-VK.wsi.headless.surface.create_simulate_oom
+dEQP-VK.wsi.headless.surface.query_support
+dEQP-VK.wsi.headless.surface.query_presentation_support
+dEQP-VK.wsi.headless.surface.query_capabilities
+dEQP-VK.wsi.headless.surface.query_capabilities2
+dEQP-VK.wsi.headless.surface.query_protected_capabilities
+dEQP-VK.wsi.headless.surface.query_surface_counters
+dEQP-VK.wsi.headless.surface.query_formats
+dEQP-VK.wsi.headless.surface.query_formats2
+dEQP-VK.wsi.headless.surface.query_present_modes
+dEQP-VK.wsi.headless.surface.query_devgroup_present_capabilities
+dEQP-VK.wsi.headless.surface.query_devgroup_present_modes
+dEQP-VK.wsi.headless.surface.destroy_null_handle
+dEQP-VK.wsi.headless.swapchain.create.min_image_count
+dEQP-VK.wsi.headless.swapchain.create.image_format
+dEQP-VK.wsi.headless.swapchain.create.image_extent
+dEQP-VK.wsi.headless.swapchain.create.image_array_layers
+dEQP-VK.wsi.headless.swapchain.create.image_usage
+dEQP-VK.wsi.headless.swapchain.create.image_sharing_mode
+dEQP-VK.wsi.headless.swapchain.create.pre_transform
+dEQP-VK.wsi.headless.swapchain.create.composite_alpha
+dEQP-VK.wsi.headless.swapchain.create.present_mode
+dEQP-VK.wsi.headless.swapchain.create.clipped
+dEQP-VK.wsi.headless.swapchain.create.image_swapchain_create_info
+dEQP-VK.wsi.headless.swapchain.simulate_oom.min_image_count
+dEQP-VK.wsi.headless.swapchain.simulate_oom.image_format
+dEQP-VK.wsi.headless.swapchain.simulate_oom.image_extent
+dEQP-VK.wsi.headless.swapchain.simulate_oom.image_array_layers
+dEQP-VK.wsi.headless.swapchain.simulate_oom.image_usage
+dEQP-VK.wsi.headless.swapchain.simulate_oom.image_sharing_mode
+dEQP-VK.wsi.headless.swapchain.simulate_oom.pre_transform
+dEQP-VK.wsi.headless.swapchain.simulate_oom.composite_alpha
+dEQP-VK.wsi.headless.swapchain.simulate_oom.present_mode
+dEQP-VK.wsi.headless.swapchain.simulate_oom.clipped
+dEQP-VK.wsi.headless.swapchain.simulate_oom.image_swapchain_create_info
+dEQP-VK.wsi.headless.swapchain.render.basic
+dEQP-VK.wsi.headless.swapchain.render.basic2
+dEQP-VK.wsi.headless.swapchain.render.device_group
+dEQP-VK.wsi.headless.swapchain.render.device_group2
+dEQP-VK.wsi.headless.swapchain.render.2swapchains
+dEQP-VK.wsi.headless.swapchain.render.2swapchains2
+dEQP-VK.wsi.headless.swapchain.render.10swapchains
+dEQP-VK.wsi.headless.swapchain.render.10swapchains2
+dEQP-VK.wsi.headless.swapchain.modify.resize
+dEQP-VK.wsi.headless.swapchain.destroy.null_handle
+dEQP-VK.wsi.headless.swapchain.get_images.incomplete
+dEQP-VK.wsi.headless.swapchain.get_images.count
+dEQP-VK.wsi.headless.swapchain.acquire.too_many
+dEQP-VK.wsi.headless.swapchain.acquire.too_many_timeout
+dEQP-VK.wsi.headless.swapchain.private_data.min_image_count
+dEQP-VK.wsi.headless.swapchain.private_data.image_format
+dEQP-VK.wsi.headless.swapchain.private_data.image_array_layers
+dEQP-VK.wsi.headless.swapchain.private_data.image_usage
+dEQP-VK.wsi.headless.swapchain.private_data.image_sharing_mode
+dEQP-VK.wsi.headless.swapchain.private_data.pre_transform
+dEQP-VK.wsi.headless.swapchain.private_data.composite_alpha
+dEQP-VK.wsi.headless.swapchain.private_data.present_mode
+dEQP-VK.wsi.headless.swapchain.private_data.clipped
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.identity.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.horizontal_mirror_rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.immediate.inherit.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.identity.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.horizontal_mirror_rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.mailbox.inherit.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.identity.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.horizontal_mirror_rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo.inherit.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.identity.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_90.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_180.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.horizontal_mirror_rotate_270.inherit.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.opaque.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.opaque.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.pre_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.pre_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.post_multiplied.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.post_multiplied.incremental_present
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.inherit.reference
+dEQP-VK.wsi.headless.incremental_present.scale_none.fifo_relaxed.inherit.inherit.incremental_present
+dEQP-VK.wsi.headless.display_timing.fifo.reference
+dEQP-VK.wsi.headless.display_timing.fifo.display_timing
+dEQP-VK.wsi.headless.display_timing.fifo_relaxed.reference
+dEQP-VK.wsi.headless.display_timing.fifo_relaxed.display_timing
+dEQP-VK.wsi.headless.display_timing.immediate.reference
+dEQP-VK.wsi.headless.display_timing.immediate.display_timing
+dEQP-VK.wsi.headless.display_timing.mailbox.reference
+dEQP-VK.wsi.headless.display_timing.mailbox.display_timing
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.identity.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_90.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_180.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.rotate_270.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_90.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_180.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.horizontal_mirror_rotate_270.inherit.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.opaque.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.opaque.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.pre_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.pre_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.post_multiplied.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.post_multiplied.continuous
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.inherit.demand
+dEQP-VK.wsi.headless.shared_presentable_image.scale_none.inherit.inherit.continuous
+dEQP-VK.wsi.headless.colorspace.extensions
+dEQP-VK.wsi.headless.colorspace.basic
+dEQP-VK.wsi.headless.colorspace.hdr
+dEQP-VK.wsi.headless.colorspace_compare.b8g8r8a8_unorm
+dEQP-VK.wsi.headless.colorspace_compare.r8g8b8a8_unorm
+dEQP-VK.wsi.headless.colorspace_compare.r8g8b8a8_srgb
+dEQP-VK.wsi.headless.colorspace_compare.r5g6b5_unorm_pack16
+dEQP-VK.wsi.headless.colorspace_compare.a2b10g10r10_unorm_pack32
+dEQP-VK.wsi.headless.colorspace_compare.r16g16b16a16_sfloat
+dEQP-VK.wsi.headless.full_screen_exclusive.default
+dEQP-VK.wsi.headless.full_screen_exclusive.allowed
+dEQP-VK.wsi.headless.full_screen_exclusive.disallowed
+dEQP-VK.wsi.headless.full_screen_exclusive.application_controlled
dEQP-VK.synchronization.timeline_semaphore.wait.poll_signal_from_device
dEQP-VK.synchronization.timeline_semaphore.wait.poll_signal_from_host
dEQP-VK.synchronization.timeline_semaphore.sparse_bind.no_sems
@@ -110082,6 +120828,7 @@
dEQP-VK.synchronization.timeline_semaphore.sparse_bind.wait_no_sig
dEQP-VK.synchronization.timeline_semaphore.sparse_bind.wait_and_sig
dEQP-VK.synchronization.timeline_semaphore.sparse_bind.wait_and_sig_2
+dEQP-VK.synchronization.basic.timeline_semaphore.two_threads
dEQP-VK.synchronization.op.single_queue.fence.write_image_compute_multisample_read_resolve_image.image_64x64_r32_uint
dEQP-VK.synchronization.op.single_queue.fence.write_update_index_buffer_read_index_input.buffer_20
dEQP-VK.synchronization.op.single_queue.binary_semaphore.write_image_compute_multisample_read_resolve_image.image_64x64_r32_uint
@@ -168010,12 +178757,36 @@
dEQP-VK.sparse_resources.image_sparse_binding.2d.r64ui.512_256_1
dEQP-VK.sparse_resources.image_sparse_binding.2d.r64ui.1024_128_1
dEQP-VK.sparse_resources.image_sparse_binding.2d.r64ui.11_137_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g8_b8r8_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g8_b8r8_2plane_444_unorm_ext.11_137_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g16_b16r16_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_binding.2d.g16_b16r16_2plane_444_unorm_ext.11_137_1
dEQP-VK.sparse_resources.image_sparse_binding.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.image_sparse_binding.2d_array.r64i.1024_128_8
dEQP-VK.sparse_resources.image_sparse_binding.2d_array.r64i.11_137_3
dEQP-VK.sparse_resources.image_sparse_binding.2d_array.r64ui.512_256_6
dEQP-VK.sparse_resources.image_sparse_binding.2d_array.r64ui.1024_128_8
dEQP-VK.sparse_resources.image_sparse_binding.2d_array.r64ui.11_137_3
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g8_b8r8_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g8_b8r8_2plane_444_unorm_ext.11_137_3
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g16_b16r16_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_binding.2d_array.g16_b16r16_2plane_444_unorm_ext.11_137_3
dEQP-VK.sparse_resources.image_sparse_binding.3d.r64i.512_256_6
dEQP-VK.sparse_resources.image_sparse_binding.3d.r64i.1024_128_8
dEQP-VK.sparse_resources.image_sparse_binding.3d.r64i.11_137_3
@@ -168052,12 +178823,36 @@
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.r64ui.512_256_1
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.r64ui.1024_128_1
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.r64ui.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g8_b8r8_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g8_b8r8_2plane_444_unorm_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g16_b16r16_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d.g16_b16r16_2plane_444_unorm_ext.11_137_1
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.r64i.1024_128_8
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.r64i.11_137_3
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.r64ui.512_256_6
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.r64ui.1024_128_8
dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.r64ui.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g8_b8r8_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g8_b8r8_2plane_444_unorm_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g16_b16r16_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_binding.2d_array.g16_b16r16_2plane_444_unorm_ext.11_137_3
dEQP-VK.sparse_resources.device_group_image_sparse_binding.3d.r64i.512_256_6
dEQP-VK.sparse_resources.device_group_image_sparse_binding.3d.r64i.1024_128_8
dEQP-VK.sparse_resources.device_group_image_sparse_binding.3d.r64i.11_137_3
@@ -168082,12 +178877,36 @@
dEQP-VK.sparse_resources.image_sparse_residency.2d.r64ui.512_256_1
dEQP-VK.sparse_resources.image_sparse_residency.2d.r64ui.1024_128_1
dEQP-VK.sparse_resources.image_sparse_residency.2d.r64ui.11_137_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.11_137_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.image_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.11_137_1
dEQP-VK.sparse_resources.image_sparse_residency.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.image_sparse_residency.2d_array.r64i.1024_128_8
dEQP-VK.sparse_resources.image_sparse_residency.2d_array.r64i.11_137_3
dEQP-VK.sparse_resources.image_sparse_residency.2d_array.r64ui.512_256_6
dEQP-VK.sparse_resources.image_sparse_residency.2d_array.r64ui.1024_128_8
dEQP-VK.sparse_resources.image_sparse_residency.2d_array.r64ui.11_137_3
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.11_137_3
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.image_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.11_137_3
dEQP-VK.sparse_resources.image_sparse_residency.cube.r64i.256_256_1
dEQP-VK.sparse_resources.image_sparse_residency.cube.r64i.128_128_1
dEQP-VK.sparse_resources.image_sparse_residency.cube.r64i.137_137_1
@@ -168108,8 +178927,16 @@
dEQP-VK.sparse_resources.image_sparse_residency.3d.r64ui.11_137_3
dEQP-VK.sparse_resources.aligned_mip_size.2d.r64i
dEQP-VK.sparse_resources.aligned_mip_size.2d.r64ui
+dEQP-VK.sparse_resources.aligned_mip_size.2d.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.sparse_resources.aligned_mip_size.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.sparse_resources.aligned_mip_size.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.sparse_resources.aligned_mip_size.2d.g16_b16r16_2plane_444_unorm_ext
dEQP-VK.sparse_resources.aligned_mip_size.2d_array.r64i
dEQP-VK.sparse_resources.aligned_mip_size.2d_array.r64ui
+dEQP-VK.sparse_resources.aligned_mip_size.2d_array.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.sparse_resources.aligned_mip_size.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.sparse_resources.aligned_mip_size.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.sparse_resources.aligned_mip_size.2d_array.g16_b16r16_2plane_444_unorm_ext
dEQP-VK.sparse_resources.aligned_mip_size.cube.r64i
dEQP-VK.sparse_resources.aligned_mip_size.cube.r64ui
dEQP-VK.sparse_resources.aligned_mip_size.cube_array.r64i
@@ -168126,6 +178953,26 @@
dEQP-VK.sparse_resources.image_block_shapes.2d.r64ui.samples_4
dEQP-VK.sparse_resources.image_block_shapes.2d.r64ui.samples_8
dEQP-VK.sparse_resources.image_block_shapes.2d.r64ui.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d.g8_b8r8_2plane_444_unorm_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d.g8_b8r8_2plane_444_unorm_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d.g8_b8r8_2plane_444_unorm_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d.g8_b8r8_2plane_444_unorm_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d.g8_b8r8_2plane_444_unorm_ext.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d.g16_b16r16_2plane_444_unorm_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d.g16_b16r16_2plane_444_unorm_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d.g16_b16r16_2plane_444_unorm_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d.g16_b16r16_2plane_444_unorm_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d.g16_b16r16_2plane_444_unorm_ext.samples_16
dEQP-VK.sparse_resources.image_block_shapes.2d_array.r64i.samples_1
dEQP-VK.sparse_resources.image_block_shapes.2d_array.r64i.samples_2
dEQP-VK.sparse_resources.image_block_shapes.2d_array.r64i.samples_4
@@ -168136,6 +178983,26 @@
dEQP-VK.sparse_resources.image_block_shapes.2d_array.r64ui.samples_4
dEQP-VK.sparse_resources.image_block_shapes.2d_array.r64ui.samples_8
dEQP-VK.sparse_resources.image_block_shapes.2d_array.r64ui.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g8_b8r8_2plane_444_unorm_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g8_b8r8_2plane_444_unorm_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g8_b8r8_2plane_444_unorm_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g8_b8r8_2plane_444_unorm_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g8_b8r8_2plane_444_unorm_ext.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.samples_16
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g16_b16r16_2plane_444_unorm_ext.samples_1
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g16_b16r16_2plane_444_unorm_ext.samples_2
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g16_b16r16_2plane_444_unorm_ext.samples_4
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g16_b16r16_2plane_444_unorm_ext.samples_8
+dEQP-VK.sparse_resources.image_block_shapes.2d_array.g16_b16r16_2plane_444_unorm_ext.samples_16
dEQP-VK.sparse_resources.image_block_shapes.cube.r64i.samples_1
dEQP-VK.sparse_resources.image_block_shapes.cube.r64i.samples_2
dEQP-VK.sparse_resources.image_block_shapes.cube.r64i.samples_4
@@ -168172,12 +179039,36 @@
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.r64ui.512_256_1
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.r64ui.1024_128_1
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.r64ui.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.11_137_1
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.r64i.1024_128_8
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.r64i.11_137_3
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.r64ui.512_256_6
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.r64ui.1024_128_8
dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.r64ui.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.11_137_3
dEQP-VK.sparse_resources.device_group_image_sparse_residency.cube.r64i.256_256_1
dEQP-VK.sparse_resources.device_group_image_sparse_residency.cube.r64i.128_128_1
dEQP-VK.sparse_resources.device_group_image_sparse_residency.cube.r64i.137_137_1
@@ -168202,12 +179093,36 @@
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.r64ui.512_256_1
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.r64ui.1024_128_1
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.r64ui.11_137_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.11_137_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.11_137_1
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.r64i.1024_128_8
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.r64i.11_137_3
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.r64ui.512_256_6
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.r64ui.1024_128_8
dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.r64ui.11_137_3
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.11_137_3
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.mipmap_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.11_137_3
dEQP-VK.sparse_resources.mipmap_sparse_residency.cube.r64i.256_256_1
dEQP-VK.sparse_resources.mipmap_sparse_residency.cube.r64i.128_128_1
dEQP-VK.sparse_resources.mipmap_sparse_residency.cube.r64i.137_137_1
@@ -168232,12 +179147,36 @@
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.r64ui.512_256_1
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.r64ui.1024_128_1
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.r64ui.11_137_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g8_b8r8_2plane_444_unorm_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.1024_128_1
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d.g16_b16r16_2plane_444_unorm_ext.11_137_1
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.r64i.1024_128_8
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.r64i.11_137_3
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.r64ui.512_256_6
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.r64ui.1024_128_8
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.r64ui.11_137_3
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g8_b8r8_2plane_444_unorm_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_137_3
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.1024_128_8
+dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.2d_array.g16_b16r16_2plane_444_unorm_ext.11_137_3
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.cube.r64i.256_256_1
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.cube.r64i.128_128_1
dEQP-VK.sparse_resources.device_group_mipmap_sparse_residency.cube.r64i.137_137_1
@@ -168264,6 +179203,22 @@
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.r64ui.128_128_1
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.r64ui.503_137_1
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.r64ui.11_37_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.11_37_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.11_37_1
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.r64i.128_128_8
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.r64i.503_137_3
@@ -168272,6 +179227,22 @@
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.r64ui.128_128_8
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.r64ui.503_137_3
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.r64ui.11_37_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.11_37_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.11_37_3
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.cube.r64i.256_256_1
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.cube.r64i.128_128_1
dEQP-VK.sparse_resources.image_sparse_memory_aliasing.cube.r64i.137_137_1
@@ -168304,6 +179275,22 @@
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.r64ui.128_128_1
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.r64ui.503_137_1
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.r64ui.11_37_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g8_b8r8_2plane_444_unorm_ext.11_37_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d.g16_b16r16_2plane_444_unorm_ext.11_37_1
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.r64i.512_256_6
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.r64i.128_128_8
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.r64i.503_137_3
@@ -168312,6 +179299,22 @@
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.r64ui.128_128_8
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.r64ui.503_137_3
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.r64ui.11_37_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g8_b8r8_2plane_444_unorm_ext.11_37_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.2d_array.g16_b16r16_2plane_444_unorm_ext.11_37_3
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.cube.r64i.256_256_1
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.cube.r64i.128_128_1
dEQP-VK.sparse_resources.device_group_image_sparse_memory_aliasing.cube.r64i.137_137_1
@@ -168344,6 +179347,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.r64ui.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.r64ui.503_137_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.r64ui.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.11_37_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.r64i.512_256_6
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.r64i.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.r64i.503_137_3
@@ -168352,6 +179371,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.r64ui.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.r64ui.503_137_3
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.r64ui.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g8_b8r8_2plane_444_unorm_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_fetch.g16_b16r16_2plane_444_unorm_ext.11_37_3
dEQP-VK.sparse_resources.shader_intrinsics.3d_sparse_fetch.r64i.256_256_16
dEQP-VK.sparse_resources.shader_intrinsics.3d_sparse_fetch.r64i.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.3d_sparse_fetch.r64i.503_137_3
@@ -168368,6 +179403,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r64ui.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r64ui.503_137_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r64ui.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g8_b8r8_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g8_b8r8_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g8_b8r8_2plane_444_unorm_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g16_b16r16_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g16_b16r16_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.g16_b16r16_2plane_444_unorm_ext.11_37_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.r64i.512_256_6
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.r64i.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.r64i.503_137_3
@@ -168376,6 +179427,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.r64ui.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.r64ui.503_137_3
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.r64ui.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g8_b8r8_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g8_b8r8_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g8_b8r8_2plane_444_unorm_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g16_b16r16_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g16_b16r16_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_read.g16_b16r16_2plane_444_unorm_ext.11_37_3
dEQP-VK.sparse_resources.shader_intrinsics.cube_sparse_read.r64i.256_256_1
dEQP-VK.sparse_resources.shader_intrinsics.cube_sparse_read.r64i.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.cube_sparse_read.r64i.137_137_1
@@ -168408,6 +179475,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.r64ui.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.r64ui.503_137_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.r64ui.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.11_37_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.r64i.512_256_6
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.r64i.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.r64i.503_137_3
@@ -168416,6 +179499,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.r64ui.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.r64ui.503_137_3
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.r64ui.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g8_b8r8_2plane_444_unorm_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_explicit_lod.g16_b16r16_2plane_444_unorm_ext.11_37_3
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.r64i.512_256_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.r64i.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.r64i.503_137_1
@@ -168424,6 +179523,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.r64ui.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.r64ui.503_137_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.r64ui.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.11_37_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.r64i.512_256_6
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.r64i.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.r64i.503_137_3
@@ -168432,6 +179547,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.r64ui.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.r64ui.503_137_3
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.r64ui.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g8_b8r8_2plane_444_unorm_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_sample_implicit_lod.g16_b16r16_2plane_444_unorm_ext.11_37_3
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.r64i.512_256_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.r64i.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.r64i.503_137_1
@@ -168440,6 +179571,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.r64ui.128_128_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.r64ui.503_137_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.r64ui.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g8_b8r8_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g8_b8r8_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g8_b8r8_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g8_b8r8_2plane_444_unorm_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g16_b16r16_2plane_444_unorm_ext.512_256_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g16_b16r16_2plane_444_unorm_ext.128_128_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g16_b16r16_2plane_444_unorm_ext.503_137_1
+dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_gather.g16_b16r16_2plane_444_unorm_ext.11_37_1
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.r64i.512_256_6
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.r64i.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.r64i.503_137_3
@@ -168448,6 +179595,22 @@
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.r64ui.128_128_8
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.r64ui.503_137_3
dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.r64ui.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g8_b8r8_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g8_b8r8_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g8_b8r8_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g8_b8r8_2plane_444_unorm_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.11_37_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g16_b16r16_2plane_444_unorm_ext.512_256_6
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g16_b16r16_2plane_444_unorm_ext.128_128_8
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g16_b16r16_2plane_444_unorm_ext.503_137_3
+dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g16_b16r16_2plane_444_unorm_ext.11_37_3
dEQP-VK.tessellation.tesscoord.triangles_equal_spacing_execution_mode_in_tesc
dEQP-VK.tessellation.tesscoord.triangles_fractional_odd_spacing_execution_mode_in_tesc
dEQP-VK.tessellation.tesscoord.triangles_fractional_even_spacing_execution_mode_in_tesc
@@ -168468,6 +179631,349 @@
dEQP-VK.rasterization.primitives.stride_zero.single_point
dEQP-VK.rasterization.primitives.stride_zero.four_points
dEQP-VK.rasterization.primitives.stride_zero.many_points
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_1.triangles.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_1.lines.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_1.points.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_2.triangles.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_2.lines.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_2.points.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_4.triangles.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_4.lines.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_4.points.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_8.triangles.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_8.lines.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_8.points.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_16.triangles.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_16.lines.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_16.points.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_32.triangles.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_32.lines.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_32.points.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_64.triangles.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.normal.max
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.degenerate.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.degenerate.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.degenerate.min
+dEQP-VK.rasterization.conservative.overestimate.samples_64.lines.degenerate.max
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.0_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.0_25
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.0_50
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.0_75
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.1_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.2_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.4_00
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.min
+dEQP-VK.rasterization.conservative.overestimate.samples_64.points.normal.max
+dEQP-VK.rasterization.conservative.underestimate.samples_1.triangles.normal.test
+dEQP-VK.rasterization.conservative.underestimate.samples_1.triangles.degenerate.test
+dEQP-VK.rasterization.conservative.underestimate.samples_1.lines.normal.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_1.lines.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_1.lines.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_1.lines.degenerate.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_1.lines.degenerate.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_1.lines.degenerate.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_1.points.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_1.points.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_1.points.normal.2_00
+dEQP-VK.rasterization.conservative.underestimate.samples_1.points.normal.3_00
+dEQP-VK.rasterization.conservative.underestimate.samples_1.points.normal.4_00
+dEQP-VK.rasterization.conservative.underestimate.samples_1.points.normal.8_00
+dEQP-VK.rasterization.conservative.underestimate.samples_2.triangles.normal.test
+dEQP-VK.rasterization.conservative.underestimate.samples_2.triangles.degenerate.test
+dEQP-VK.rasterization.conservative.underestimate.samples_2.lines.normal.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_2.lines.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_2.lines.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_2.lines.degenerate.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_2.lines.degenerate.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_2.lines.degenerate.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_2.points.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_2.points.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_2.points.normal.2_00
+dEQP-VK.rasterization.conservative.underestimate.samples_2.points.normal.3_00
+dEQP-VK.rasterization.conservative.underestimate.samples_2.points.normal.4_00
+dEQP-VK.rasterization.conservative.underestimate.samples_2.points.normal.8_00
+dEQP-VK.rasterization.conservative.underestimate.samples_4.triangles.normal.test
+dEQP-VK.rasterization.conservative.underestimate.samples_4.triangles.degenerate.test
+dEQP-VK.rasterization.conservative.underestimate.samples_4.lines.normal.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_4.lines.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_4.lines.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_4.lines.degenerate.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_4.lines.degenerate.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_4.lines.degenerate.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_4.points.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_4.points.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_4.points.normal.2_00
+dEQP-VK.rasterization.conservative.underestimate.samples_4.points.normal.3_00
+dEQP-VK.rasterization.conservative.underestimate.samples_4.points.normal.4_00
+dEQP-VK.rasterization.conservative.underestimate.samples_4.points.normal.8_00
+dEQP-VK.rasterization.conservative.underestimate.samples_8.triangles.normal.test
+dEQP-VK.rasterization.conservative.underestimate.samples_8.triangles.degenerate.test
+dEQP-VK.rasterization.conservative.underestimate.samples_8.lines.normal.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_8.lines.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_8.lines.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_8.lines.degenerate.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_8.lines.degenerate.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_8.lines.degenerate.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_8.points.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_8.points.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_8.points.normal.2_00
+dEQP-VK.rasterization.conservative.underestimate.samples_8.points.normal.3_00
+dEQP-VK.rasterization.conservative.underestimate.samples_8.points.normal.4_00
+dEQP-VK.rasterization.conservative.underestimate.samples_8.points.normal.8_00
+dEQP-VK.rasterization.conservative.underestimate.samples_16.triangles.normal.test
+dEQP-VK.rasterization.conservative.underestimate.samples_16.triangles.degenerate.test
+dEQP-VK.rasterization.conservative.underestimate.samples_16.lines.normal.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_16.lines.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_16.lines.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_16.lines.degenerate.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_16.lines.degenerate.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_16.lines.degenerate.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_16.points.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_16.points.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_16.points.normal.2_00
+dEQP-VK.rasterization.conservative.underestimate.samples_16.points.normal.3_00
+dEQP-VK.rasterization.conservative.underestimate.samples_16.points.normal.4_00
+dEQP-VK.rasterization.conservative.underestimate.samples_16.points.normal.8_00
+dEQP-VK.rasterization.conservative.underestimate.samples_32.triangles.normal.test
+dEQP-VK.rasterization.conservative.underestimate.samples_32.triangles.degenerate.test
+dEQP-VK.rasterization.conservative.underestimate.samples_32.lines.normal.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_32.lines.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_32.lines.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_32.lines.degenerate.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_32.lines.degenerate.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_32.lines.degenerate.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_32.points.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_32.points.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_32.points.normal.2_00
+dEQP-VK.rasterization.conservative.underestimate.samples_32.points.normal.3_00
+dEQP-VK.rasterization.conservative.underestimate.samples_32.points.normal.4_00
+dEQP-VK.rasterization.conservative.underestimate.samples_32.points.normal.8_00
+dEQP-VK.rasterization.conservative.underestimate.samples_64.triangles.normal.test
+dEQP-VK.rasterization.conservative.underestimate.samples_64.triangles.degenerate.test
+dEQP-VK.rasterization.conservative.underestimate.samples_64.lines.normal.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_64.lines.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_64.lines.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_64.lines.degenerate.0_50
+dEQP-VK.rasterization.conservative.underestimate.samples_64.lines.degenerate.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_64.lines.degenerate.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_64.points.normal.1_00
+dEQP-VK.rasterization.conservative.underestimate.samples_64.points.normal.1_50
+dEQP-VK.rasterization.conservative.underestimate.samples_64.points.normal.2_00
+dEQP-VK.rasterization.conservative.underestimate.samples_64.points.normal.3_00
+dEQP-VK.rasterization.conservative.underestimate.samples_64.points.normal.4_00
+dEQP-VK.rasterization.conservative.underestimate.samples_64.points.normal.8_00
dEQP-VK.rasterization.interpolation.basic.strict_lines
dEQP-VK.rasterization.interpolation.basic.strict_line_strip
dEQP-VK.rasterization.interpolation.basic.strict_lines_wide
@@ -168542,8 +180048,12 @@
dEQP-VK.rasterization.interpolation_multisample_64_bit.non_strict_lines_wide
dEQP-VK.rasterization.line_continuity.line-strip
dEQP-VK.rasterization.line_continuity.polygon-mode-lines
+dEQP-VK.rasterization.depth_bias.d16_unorm
+dEQP-VK.rasterization.depth_bias.d32_sfloat
+dEQP-VK.rasterization.depth_bias.d24_unorm
dEQP-VK.rasterization.frag_side_effects.color_at_beginning.kill
dEQP-VK.rasterization.frag_side_effects.color_at_beginning.demote
+dEQP-VK.rasterization.frag_side_effects.color_at_beginning.terminate_invocation
dEQP-VK.rasterization.frag_side_effects.color_at_beginning.sample_mask_before
dEQP-VK.rasterization.frag_side_effects.color_at_beginning.sample_mask_after
dEQP-VK.rasterization.frag_side_effects.color_at_beginning.stencil_never
@@ -168553,6 +180063,7 @@
dEQP-VK.rasterization.frag_side_effects.color_at_beginning.depth_bounds
dEQP-VK.rasterization.frag_side_effects.color_at_end.kill
dEQP-VK.rasterization.frag_side_effects.color_at_end.demote
+dEQP-VK.rasterization.frag_side_effects.color_at_end.terminate_invocation
dEQP-VK.rasterization.frag_side_effects.color_at_end.sample_mask_before
dEQP-VK.rasterization.frag_side_effects.color_at_end.sample_mask_after
dEQP-VK.rasterization.frag_side_effects.color_at_end.stencil_never
@@ -228668,10 +240179,6183 @@
dEQP-VK.subgroups.size_control.framebuffer.geometry_required_subgroup_size_min
dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_max
dEQP-VK.subgroups.size_control.framebuffer.fragment_required_subgroup_size_min
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_optimal
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_optimal_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_optimal_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear_array_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.vertex_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_optimal
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_optimal_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_optimal_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear_array_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.fragment_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_optimal
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_optimal_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_optimal_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear_array_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.geometry_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_optimal
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_optimal_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_optimal_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear_array_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_control_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_optimal
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_optimal_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_optimal_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear_array_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.tess_eval_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_optimal
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_optimal_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_optimal_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear_array
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear_array_disjoint
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear_array_mapped
+dEQP-VK.ycbcr.format.g8_b8r8_2plane_444_unorm_ext.compute_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_optimal
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_optimal_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_optimal_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear_array_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.vertex_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_optimal
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_optimal_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_optimal_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear_array_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_optimal
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_optimal_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_optimal_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear_array_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.geometry_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_optimal
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_optimal_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_optimal_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear_array_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_control_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_optimal
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_optimal_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_optimal_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear_array_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.tess_eval_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_optimal
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_optimal_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_optimal_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear_array
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear_array_disjoint
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear_array_mapped
+dEQP-VK.ycbcr.format.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_optimal
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_optimal_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_optimal_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear_array_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.vertex_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_optimal
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_optimal_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_optimal_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear_array_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_optimal
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_optimal_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_optimal_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear_array_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.geometry_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_optimal
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_optimal_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_optimal_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear_array_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_control_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_optimal
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_optimal_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_optimal_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear_array_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.tess_eval_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_optimal
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_optimal_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_optimal_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear_array
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear_array_disjoint
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear_array_mapped
+dEQP-VK.ycbcr.format.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_optimal
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_optimal_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_optimal_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear_array_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.vertex_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_optimal
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_optimal_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_optimal_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear_array_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.fragment_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_optimal
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_optimal_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_optimal_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear_array_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.geometry_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_optimal
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_optimal_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_optimal_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear_array_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_control_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_optimal
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_optimal_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_optimal_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear_array_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.tess_eval_linear_array_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_optimal
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_optimal_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_optimal_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_optimal_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear_disjoint_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear_array
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear_array_disjoint
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear_array_mapped
+dEQP-VK.ycbcr.format.g16_b16r16_2plane_444_unorm_ext.compute_linear_array_disjoint_mapped
dEQP-VK.ycbcr.filtering.linear_sampler_g8_b8_r8_3plane_420_unorm
dEQP-VK.ycbcr.filtering.linear_sampler_with_chroma_linear_filtering_g8_b8_r8_3plane_420_unorm
dEQP-VK.ycbcr.filtering.linear_sampler_g8_b8r8_2plane_420_unorm
dEQP-VK.ycbcr.filtering.linear_sampler_with_chroma_linear_filtering_g8_b8r8_2plane_420_unorm
+dEQP-VK.ycbcr.plane_view.image_view.g8_b8r8_2plane_444_unorm_ext_plane_0
+dEQP-VK.ycbcr.plane_view.image_view.g8_b8r8_2plane_444_unorm_ext_plane_1
+dEQP-VK.ycbcr.plane_view.image_view.g8_b8r8_2plane_444_unorm_ext_disjoint_plane_0
+dEQP-VK.ycbcr.plane_view.image_view.g8_b8r8_2plane_444_unorm_ext_disjoint_plane_1
+dEQP-VK.ycbcr.plane_view.image_view.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_plane_0
+dEQP-VK.ycbcr.plane_view.image_view.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_plane_1
+dEQP-VK.ycbcr.plane_view.image_view.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint_plane_0
+dEQP-VK.ycbcr.plane_view.image_view.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint_plane_1
+dEQP-VK.ycbcr.plane_view.image_view.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_plane_0
+dEQP-VK.ycbcr.plane_view.image_view.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_plane_1
+dEQP-VK.ycbcr.plane_view.image_view.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint_plane_0
+dEQP-VK.ycbcr.plane_view.image_view.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint_plane_1
+dEQP-VK.ycbcr.plane_view.memory_alias.g8_b8r8_2plane_444_unorm_ext_plane_0
+dEQP-VK.ycbcr.plane_view.memory_alias.g8_b8r8_2plane_444_unorm_ext_plane_1
+dEQP-VK.ycbcr.plane_view.memory_alias.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_plane_0
+dEQP-VK.ycbcr.plane_view.memory_alias.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_plane_1
+dEQP-VK.ycbcr.plane_view.memory_alias.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_plane_0
+dEQP-VK.ycbcr.plane_view.memory_alias.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_plane_1
+dEQP-VK.ycbcr.query.size_lod.vertex.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.vertex.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.vertex.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.vertex.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.vertex.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.vertex.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.vertex.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.vertex.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.fragment.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.fragment.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.fragment.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.fragment.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.fragment.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.fragment.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.fragment.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.fragment.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.geometry.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.geometry.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.geometry.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.geometry.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.geometry.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.geometry.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.geometry.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.geometry.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_control.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.tess_control.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_control.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.tess_control.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_control.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.tess_control.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_control.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.tess_control.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.tess_eval.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.compute.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.compute.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.compute.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.compute.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.compute.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.size_lod.compute.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.size_lod.compute.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.size_lod.compute.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.lod.fragment.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.lod.fragment.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.lod.fragment.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.lod.fragment.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.lod.fragment.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.lod.fragment.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.lod.fragment.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.lod.fragment.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.vertex.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.vertex.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.vertex.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.vertex.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.vertex.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.vertex.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.vertex.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.vertex.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.fragment.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.fragment.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.fragment.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.fragment.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.fragment.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.fragment.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.fragment.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.fragment.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.geometry.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.geometry.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.geometry.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.geometry.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.geometry.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.geometry.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.geometry.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.geometry.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_control.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.tess_control.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_control.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.tess_control.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_control.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.tess_control.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_control.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.tess_control.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_eval.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.tess_eval.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_eval.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.tess_eval.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_eval.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.tess_eval.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.tess_eval.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.tess_eval.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.compute.g8_b8r8_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.compute.g8_b8r8_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.query.levels.compute.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.compute.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.compute.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext
+dEQP-VK.ycbcr.query.levels.compute.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext_disjoint
+dEQP-VK.ycbcr.query.levels.compute.g16_b16r16_2plane_444_unorm_ext
+dEQP-VK.ycbcr.query.levels.compute.g16_b16r16_2plane_444_unorm_ext_disjoint
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g8_b8r8_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.rgb_identity.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.sampler_array.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.rgb_identity.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_identity.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_709.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_601.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_full.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.ycbcr_2020.itu_narrow.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.linear_tiling_optimal_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_linear_binding_31
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal_binding_7
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal_binding_15
+dEQP-VK.ycbcr.conversion.g16_b16r16_2plane_444_unorm_ext.sampler_array.nearest_tiling_optimal_binding_31
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4_unorm_pack8.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r4g4b4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b4g4r4a4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g6b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g6r5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r5g5b5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b5g5r5a1_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a1r5g5b5_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r8g8b8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b8g8r8a8_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a8b8g8r8_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.a2r10g10b10_unorm_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r16g16_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.b10g11r11_ufloat_pack32.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8_r8_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r10x6g10x6_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4_unorm_pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.r12x4g12x4_unorm_2pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_420_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_422_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16_r16_3plane_444_unorm.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4_unorm_pack8.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8_r8_3plane_444_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g8_b8r8_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r8g8b8a8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b8g8r8a8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r16g16_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.b10g11r11_ufloat_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r4g4b4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b4g4r4a4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g6b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g6r5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r5g5b5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b5g5r5a1_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a1r5g5b5_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r8g8b8a8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b8g8r8a8_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a8b8g8r8_unorm_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.a2r10g10b10_unorm_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r16g16_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.b10g11r11_ufloat_pack32.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r10x6g10x6_unorm_2pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6_r10x6_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4_unorm_pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.r12x4g12x4_unorm_2pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_420_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_422_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4_r12x4_3plane_444_unorm_3pack16.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_420_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_422_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16_r16_3plane_444_unorm.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g8_b8r8_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.linear_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_linear_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_optimal_disjoint
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal
+dEQP-VK.ycbcr.copy.g16_b16r16_2plane_444_unorm_ext.g16_b16r16_2plane_444_unorm_ext.optimal_disjoint_optimal_disjoint
+dEQP-VK.ycbcr.storage_image_write.g8_b8r8_2plane_444_unorm_ext.512_512_1.joint
+dEQP-VK.ycbcr.storage_image_write.g8_b8r8_2plane_444_unorm_ext.512_512_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g8_b8r8_2plane_444_unorm_ext.1024_128_1.joint
+dEQP-VK.ycbcr.storage_image_write.g8_b8r8_2plane_444_unorm_ext.1024_128_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g8_b8r8_2plane_444_unorm_ext.66_32_1.joint
+dEQP-VK.ycbcr.storage_image_write.g8_b8r8_2plane_444_unorm_ext.66_32_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_512_1.joint
+dEQP-VK.ycbcr.storage_image_write.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.512_512_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1.joint
+dEQP-VK.ycbcr.storage_image_write.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.1024_128_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.66_32_1.joint
+dEQP-VK.ycbcr.storage_image_write.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.66_32_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_512_1.joint
+dEQP-VK.ycbcr.storage_image_write.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.512_512_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1.joint
+dEQP-VK.ycbcr.storage_image_write.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.1024_128_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.66_32_1.joint
+dEQP-VK.ycbcr.storage_image_write.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.66_32_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g16_b16r16_2plane_444_unorm_ext.512_512_1.joint
+dEQP-VK.ycbcr.storage_image_write.g16_b16r16_2plane_444_unorm_ext.512_512_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g16_b16r16_2plane_444_unorm_ext.1024_128_1.joint
+dEQP-VK.ycbcr.storage_image_write.g16_b16r16_2plane_444_unorm_ext.1024_128_1.disjoint
+dEQP-VK.ycbcr.storage_image_write.g16_b16r16_2plane_444_unorm_ext.66_32_1.joint
+dEQP-VK.ycbcr.storage_image_write.g16_b16r16_2plane_444_unorm_ext.66_32_1.disjoint
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.min_image_count
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.image_format
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.image_extent
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.image_array_layers
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.image_usage
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.image_sharing_mode
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.pre_transform
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.composite_alpha
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.present_mode
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.create.clipped
+dEQP-VK.protected_memory.interaction.wsi.headless.swapchain.render.basic
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g8_b8r8_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g10x6_b10x6r10x6_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g12x4_b12x4r12x4_2plane_444_unorm_3pack16_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.fragment.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.rgb_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_identity.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_709.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_601.itu_narrow.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_full.tiling_optimal_midpoint_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_cosited_disjoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint
+dEQP-VK.protected_memory.interaction.ycbcr.g16_b16r16_2plane_444_unorm_ext.compute.ycbcr_2020.itu_narrow.tiling_optimal_midpoint_disjoint
dEQP-VK.memory_model.message_passing.ext.f32.coherent.atomic_atomic.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.comp
dEQP-VK.memory_model.message_passing.ext.f32.coherent.atomic_atomic.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.vert
dEQP-VK.memory_model.message_passing.ext.f32.coherent.atomic_atomic.atomicwrite.device.payload_nonlocal.buffer.guard_nonlocal.buffer.frag
@@ -233536,6 +251220,66 @@
dEQP-VK.memory_model.write_after_read.ext.f64.noncoherent.atomic_atomic.atomicrmw.subgroup.payload_local.physbuffer.guard_local.physbuffer.comp
dEQP-VK.memory_model.write_after_read.ext.f64.noncoherent.atomic_atomic.atomicrmw.subgroup.payload_local.physbuffer.guard_local.physbuffer.vert
dEQP-VK.memory_model.write_after_read.ext.f64.noncoherent.atomic_atomic.atomicrmw.subgroup.payload_local.physbuffer.guard_local.physbuffer.frag
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution.draw
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution.draw_indexed
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution.draw_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution.draw_indexed_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution.draw_indirect_count
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution.draw_indexed_indirect_count
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop.draw
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop.draw_indexed
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop.draw_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop.draw_indexed_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop.draw_indirect_count
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop.draw_indexed_indirect_count
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop_inverted.draw
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop_inverted.draw_indexed
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop_inverted.draw_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop_inverted.draw_indexed_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop_inverted.draw_indirect_count
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_noop_inverted.draw_indexed_indirect_count
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution_inverted.draw
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution_inverted.draw_indexed
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution_inverted.draw_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution_inverted.draw_indexed_indirect
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution_inverted.draw_indirect_count
+dEQP-VK.conditional_rendering.draw.condition_secondary_buffer_inherited_expect_execution_inverted.draw_indexed_indirect_count
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_execution.dispatch
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_execution.dispatch_indirect
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_execution.dispatch_base
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_noop.dispatch
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_noop.dispatch_indirect
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_noop.dispatch_base
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_noop_inverted.dispatch
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_noop_inverted.dispatch_indirect
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_noop_inverted.dispatch_base
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_execution_inverted.dispatch
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_execution_inverted.dispatch_indirect
+dEQP-VK.conditional_rendering.dispatch.condition_secondary_buffer_inherited_expect_execution_inverted.dispatch_base
+dEQP-VK.conditional_rendering.dispatch.condition_size.primary.first_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.primary.second_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.primary.third_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.primary.fourth_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.primary.padded_zero
+dEQP-VK.conditional_rendering.dispatch.condition_size.inherited.first_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.inherited.second_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.inherited.third_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.inherited.fourth_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.inherited.padded_zero
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary.first_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary.second_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary.third_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary.fourth_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary.padded_zero
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary_inherited.first_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary_inherited.second_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary_inherited.third_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary_inherited.fourth_byte
+dEQP-VK.conditional_rendering.dispatch.condition_size.secondary_inherited.padded_zero
+dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_inherited_expect_execution.clear_attachments
+dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_inherited_expect_noop.clear_attachments
+dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_inherited_expect_noop_inverted.clear_attachments
+dEQP-VK.conditional_rendering.clear_attachments.condition_secondary_buffer_inherited_expect_execution_inverted.clear_attachments
dEQP-VK.graphicsfuzz.always-discarding-function
dEQP-VK.graphicsfuzz.arr-value-set-to-arr-value-squared
dEQP-VK.graphicsfuzz.array-idx-multiplied-by-for-loop-idx
@@ -233544,14 +251288,29 @@
dEQP-VK.graphicsfuzz.call-function-with-discard
dEQP-VK.graphicsfuzz.color-set-in-for-loop
dEQP-VK.graphicsfuzz.cosh-return-inf-unused
+dEQP-VK.graphicsfuzz.cov-access-array-dot
dEQP-VK.graphicsfuzz.cov-analysis-reachable-from-many
dEQP-VK.graphicsfuzz.cov-apfloat-acos-ldexp
dEQP-VK.graphicsfuzz.cov-apfloat-determinant
+dEQP-VK.graphicsfuzz.cov-apfloat-mix-nan
+dEQP-VK.graphicsfuzz.cov-apfloat-mod-zero
+dEQP-VK.graphicsfuzz.cov-apfloat-negative-step-func
+dEQP-VK.graphicsfuzz.cov-apfloat-sinh-negative-log2
dEQP-VK.graphicsfuzz.cov-apfloat-tanh
+dEQP-VK.graphicsfuzz.cov-apfloat-undefined-matrix-mul
+dEQP-VK.graphicsfuzz.cov-apfloat-determinant-for-if
+dEQP-VK.graphicsfuzz.cov-apfloat-reflect-denorm
+dEQP-VK.graphicsfuzz.cov-apfloat-unpackunorm-loop
+dEQP-VK.graphicsfuzz.cov-asin-undefined-smoothstep
dEQP-VK.graphicsfuzz.cov-basic-block-discard-in-function
+dEQP-VK.graphicsfuzz.cov-bitfieldExtract-undefined
+dEQP-VK.graphicsfuzz.cov-bitfieldinsert-undefined
+dEQP-VK.graphicsfuzz.cov-bitfieldreverse-left-shift-findmsb
dEQP-VK.graphicsfuzz.cov-blockfrequency-several-for-loops
dEQP-VK.graphicsfuzz.cov-branch-probability-identity-matrix
dEQP-VK.graphicsfuzz.cov-combine-and-or-xor-gt-lt
+dEQP-VK.graphicsfuzz.cov-const-folding-bitfieldinsert-div-one
+dEQP-VK.graphicsfuzz.cov-color-overwrite-identity-matrix-multiply
dEQP-VK.graphicsfuzz.cov-const-folding-ceil-vec4
dEQP-VK.graphicsfuzz.cov-const-folding-clamp
dEQP-VK.graphicsfuzz.cov-const-folding-clamp-inside-while
@@ -233563,21 +251322,28 @@
dEQP-VK.graphicsfuzz.cov-const-folding-dot-determinant
dEQP-VK.graphicsfuzz.cov-const-folding-gte-const-first
dEQP-VK.graphicsfuzz.cov-const-folding-min-as-loop-range
+dEQP-VK.graphicsfuzz.cov-const-folding-mod-one-one-lte
+dEQP-VK.graphicsfuzz.cov-const-folding-pow-large-exp
dEQP-VK.graphicsfuzz.cov-const-folding-same-condition
dEQP-VK.graphicsfuzz.cov-const-folding-sinh-inf
dEQP-VK.graphicsfuzz.cov-const-folding-vector-shuffle
dEQP-VK.graphicsfuzz.cov-constant-folding-atan-over-tanh
+dEQP-VK.graphicsfuzz.cov-constants-combine-add-sub
dEQP-VK.graphicsfuzz.cov-constants-mix-uniform
dEQP-VK.graphicsfuzz.cov-copy-prop-arrays-func-argument
dEQP-VK.graphicsfuzz.cov-copy-prop-arrays-no-stores
dEQP-VK.graphicsfuzz.cov-copy-prop-arrays-param-uniform
+dEQP-VK.graphicsfuzz.cov-dag-combiner-clamp-undefined-access-array
dEQP-VK.graphicsfuzz.cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop
dEQP-VK.graphicsfuzz.cov-dag-combiner-findmsb-loop
dEQP-VK.graphicsfuzz.cov-dag-combiner-increment-color
+dEQP-VK.graphicsfuzz.cov-dag-combiner-glf_color
+dEQP-VK.graphicsfuzz.cov-dag-combiner-loop-bitfieldreverse
dEQP-VK.graphicsfuzz.cov-dag-combiner-neg-div-pow2
dEQP-VK.graphicsfuzz.cov-dag-combiner-same-cond-nested
dEQP-VK.graphicsfuzz.cov-dead-branch-func-return-arg
dEQP-VK.graphicsfuzz.cov-dead-code-unreachable-merge
+dEQP-VK.graphicsfuzz.cov-findlsb-division-by-zero
dEQP-VK.graphicsfuzz.cov-fold-and-in-for-loop-range
dEQP-VK.graphicsfuzz.cov-fold-bitwise-and-zero
dEQP-VK.graphicsfuzz.cov-fold-bitwise-or-full-mask
@@ -233610,7 +251376,10 @@
dEQP-VK.graphicsfuzz.cov-folding-rules-shuffle-mix
dEQP-VK.graphicsfuzz.cov-folding-rules-split-vector-init
dEQP-VK.graphicsfuzz.cov-folding-rules-vec-mix-uniform
+dEQP-VK.graphicsfuzz.cov-fract-smoothstep-undefined
+dEQP-VK.graphicsfuzz.cov-fragcoord-clamp-array-access
dEQP-VK.graphicsfuzz.cov-if-conversion-identical-branches
+dEQP-VK.graphicsfuzz.cov-inc-array-element-loop-lsb
dEQP-VK.graphicsfuzz.cov-inc-inside-switch-and-for
dEQP-VK.graphicsfuzz.cov-increment-inside-clamp
dEQP-VK.graphicsfuzz.cov-inline-pass-empty-block
@@ -233629,46 +251398,91 @@
dEQP-VK.graphicsfuzz.cov-instruction-simplify-mod-sqrt-undefined
dEQP-VK.graphicsfuzz.cov-instruction-simplify-sqrt
dEQP-VK.graphicsfuzz.cov-instructions-first-value-phi
+dEQP-VK.graphicsfuzz.cov-inst-combine-add-sub-determinant
+dEQP-VK.graphicsfuzz.cov-inst-combine-add-sub-increase-negative
+dEQP-VK.graphicsfuzz.cov-inst-combine-add-sub-neg-func-arg
+dEQP-VK.graphicsfuzz.cov-inst-combine-and-or-xor-pack-unpack
+dEQP-VK.graphicsfuzz.cov-inst-combine-and-or-xor-switch
+dEQP-VK.graphicsfuzz.cov-inst-combine-and-or-xor-xor-add
+dEQP-VK.graphicsfuzz.cov-inst-combine-compares-combine-select-uaddcarry
+dEQP-VK.graphicsfuzz.cov-inst-combine-compares-isnan
+dEQP-VK.graphicsfuzz.cov-inst-combine-compares-ldexp
+dEQP-VK.graphicsfuzz.cov-inst-combine-compares-ternary-vector-access
+dEQP-VK.graphicsfuzz.cov-inst-combine-shifts-bitfield-bitcount
+dEQP-VK.graphicsfuzz.cov-inst-combine-shifts-mix-mix-clamp
+dEQP-VK.graphicsfuzz.cov-instr-info-det-mat-min
+dEQP-VK.graphicsfuzz.cov-instructions-for-if-less-than-equal
+dEQP-VK.graphicsfuzz.cov-inst-combine-and-or-xor-for-bitfieldinsert
+dEQP-VK.graphicsfuzz.cov-inst-combine-compares-pre-increment-clamp
+dEQP-VK.graphicsfuzz.cov-inst-combine-mul-div-rem-if-undefined-divide-mix
+dEQP-VK.graphicsfuzz.cov-inst-combine-pack-unpack
+dEQP-VK.graphicsfuzz.cov-inst-combine-select-findlsb-uaddcarry
+dEQP-VK.graphicsfuzz.cov-inst-combine-simplify-demanded-pack-unpack
+dEQP-VK.graphicsfuzz.cov-inst-combine-simplify-demanded-packsnorm-unpackunorm
+dEQP-VK.graphicsfuzz.cov-inst-combine-simplify-demanded-switch-or-xor
+dEQP-VK.graphicsfuzz.cov-inst-combine-vector-ops-asin
+dEQP-VK.graphicsfuzz.cov-integer-modulo-negative
dEQP-VK.graphicsfuzz.cov-intervalmap-set-stop
dEQP-VK.graphicsfuzz.cov-ir-builder-constant-fold-inst-combine-calls-value-tracking-findmsb-incr-if
dEQP-VK.graphicsfuzz.cov-irbuilder-matrix-cell-uniform
+dEQP-VK.graphicsfuzz.cov-ldexp-undefined-mat-vec-multiply
dEQP-VK.graphicsfuzz.cov-liveinterval-different-dest
dEQP-VK.graphicsfuzz.cov-loop-findmsb-findlsb
+dEQP-VK.graphicsfuzz.cov-machine-scheduler-for-if-pow
+dEQP-VK.graphicsfuzz.cov-machine-basic-block-for-for-for-less-than
dEQP-VK.graphicsfuzz.cov-machinevaluetype-one-iter-loop
dEQP-VK.graphicsfuzz.cov-max-clamp-same-minval
dEQP-VK.graphicsfuzz.cov-mem-pass-sum-struct-members
dEQP-VK.graphicsfuzz.cov-mem-pass-unused-component
dEQP-VK.graphicsfuzz.cov-merge-return-condition-twice
+dEQP-VK.graphicsfuzz.cov-mod-acosh
+dEQP-VK.graphicsfuzz.cov-modf-clamp-for
dEQP-VK.graphicsfuzz.cov-modf-integer-to-private
dEQP-VK.graphicsfuzz.cov-optimize-phis-for
dEQP-VK.graphicsfuzz.cov-optimize-phis-for-for-do-while-if-if
+dEQP-VK.graphicsfuzz.cov-not-clamp-matrix-access
dEQP-VK.graphicsfuzz.cov-pattern-match-signum
dEQP-VK.graphicsfuzz.cov-pattern-match-single-bit
dEQP-VK.graphicsfuzz.cov-peephole-optimizer-target-instr-info-for-if-if-if
+dEQP-VK.graphicsfuzz.cov-pow-undefined
dEQP-VK.graphicsfuzz.cov-reduce-load-replace-extract
+dEQP-VK.graphicsfuzz.cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard
dEQP-VK.graphicsfuzz.cov-replace-copy-object
+dEQP-VK.graphicsfuzz.cov-return-after-do-while
dEQP-VK.graphicsfuzz.cov-scaled-number-nested-loops
dEQP-VK.graphicsfuzz.cov-selection-dag-assign-back-and-forth
dEQP-VK.graphicsfuzz.cov-selection-dag-lt-gt
+dEQP-VK.graphicsfuzz.cov-scaled-number-nested-loops-array-access
+dEQP-VK.graphicsfuzz.cov-schedule-dag-rrlist-mix-log-cos
+dEQP-VK.graphicsfuzz.cov-selection-dag-inverse-clamp
dEQP-VK.graphicsfuzz.cov-selection-dag-same-cond-twice
dEQP-VK.graphicsfuzz.cov-set-vector-cos-fragcoord
dEQP-VK.graphicsfuzz.cov-simplification-unused-struct
dEQP-VK.graphicsfuzz.cov-simplification-while-inside-for
dEQP-VK.graphicsfuzz.cov-simplify-clamp-max-itself
+dEQP-VK.graphicsfuzz.cov-simplify-combine-compares-max-max-one
dEQP-VK.graphicsfuzz.cov-simplify-component-uniform-idx
dEQP-VK.graphicsfuzz.cov-simplify-div-by-uint-one
+dEQP-VK.graphicsfuzz.cov-simplify-for-bitwise-condition
dEQP-VK.graphicsfuzz.cov-simplify-ldexp-exponent-zero
+dEQP-VK.graphicsfuzz.cov-simplify-max-multiplied-values
+dEQP-VK.graphicsfuzz.cov-simplify-modulo-1
dEQP-VK.graphicsfuzz.cov-simplify-mul-identity
dEQP-VK.graphicsfuzz.cov-simplify-not-less-than-neg
+dEQP-VK.graphicsfuzz.cov-simplify-right-shift-greater-than-zero
dEQP-VK.graphicsfuzz.cov-simplify-select-fragcoord
dEQP-VK.graphicsfuzz.cov-simplify-sign-cosh
dEQP-VK.graphicsfuzz.cov-simplify-smoothstep-undef
dEQP-VK.graphicsfuzz.cov-single-block-elim-self-assign
dEQP-VK.graphicsfuzz.cov-single-store-elim-assume-store
+dEQP-VK.graphicsfuzz.cov-sinh-ldexp
dEQP-VK.graphicsfuzz.cov-ssa-rewrite-case-with-default
+dEQP-VK.graphicsfuzz.cov-tail-duplicator-for-for-for
+dEQP-VK.graphicsfuzz.cov-tail-duplicator-infinite-loops
dEQP-VK.graphicsfuzz.cov-target-lowering-dfdx-cos
dEQP-VK.graphicsfuzz.cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal
dEQP-VK.graphicsfuzz.cov-types-return-in-main-never-hit
+dEQP-VK.graphicsfuzz.cov-undefined-inversesqrt-reflect
dEQP-VK.graphicsfuzz.cov-val-cfg-case-fallthrough
dEQP-VK.graphicsfuzz.cov-value-inst-combine-select-value-tracking-flip-bits
dEQP-VK.graphicsfuzz.cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator
@@ -233684,10 +251498,17 @@
dEQP-VK.graphicsfuzz.cov-vector-log2-cosh
dEQP-VK.graphicsfuzz.cov-wrap-op-kill-for-loop
dEQP-VK.graphicsfuzz.cov-wrap-op-kill-two-branches
+dEQP-VK.graphicsfuzz.cov-x86-isel-lowering-determinant-exp-acos
+dEQP-VK.graphicsfuzz.cov-x86-isel-lowering-machine-value-type-uint-to-float
+dEQP-VK.graphicsfuzz.cov-x86-isel-lowering-selection-dag-struct-array-clamp-index
+dEQP-VK.graphicsfuzz.cov-x86-isel-lowering-apfloat-nan-cos-cos
+dEQP-VK.graphicsfuzz.cov-x86-isel-lowering-negative-left-shift
dEQP-VK.graphicsfuzz.create-color-in-do-while-for-loop
dEQP-VK.graphicsfuzz.do-while-false-loops
+dEQP-VK.graphicsfuzz.do-while-if-return
dEQP-VK.graphicsfuzz.do-while-with-if-condition
dEQP-VK.graphicsfuzz.find-msb-from-lsb
+dEQP-VK.graphicsfuzz.flag-always-false-if
dEQP-VK.graphicsfuzz.frag-coord-func-call-and-ifs
dEQP-VK.graphicsfuzz.function-with-float-comparison
dEQP-VK.graphicsfuzz.function-with-uniform-return
@@ -233712,14 +251533,35 @@
dEQP-VK.graphicsfuzz.spv-double-branch-to-same-block3
dEQP-VK.graphicsfuzz.spv-load-from-frag-color
dEQP-VK.graphicsfuzz.spv-null-in-phi-and-unroll
+dEQP-VK.graphicsfuzz.spv-stable-bifurcation-Os-mutate-var-vector-shuffle
+dEQP-VK.graphicsfuzz.spv-stable-collatz-O-mutate-composite-construct-extract
+dEQP-VK.graphicsfuzz.spv-stable-colorgrid-modulo-O-move-block-down
+dEQP-VK.graphicsfuzz.spv-stable-maze-flatten-copy-composite
+dEQP-VK.graphicsfuzz.spv-stable-mergesort-O-prop-up-mutate-var
+dEQP-VK.graphicsfuzz.spv-stable-mergesort-flatten-selection-dead-continues
+dEQP-VK.graphicsfuzz.spv-stable-mergesort-func-inline-mutate-var
+dEQP-VK.graphicsfuzz.spv-stable-orbit-O-mutate-variable
+dEQP-VK.graphicsfuzz.spv-stable-orbit-Os-access-chain-mutate-pointer
+dEQP-VK.graphicsfuzz.spv-stable-pillars-O-op-select-to-op-phi
+dEQP-VK.graphicsfuzz.spv-stable-quicksort-mat-func-param
+dEQP-VK.graphicsfuzz.spv-stable-rects-Os-mutate-var-push-through-var
+dEQP-VK.graphicsfuzz.stable-binarysearch-tree-false-if-discard-loop
+dEQP-VK.graphicsfuzz.stable-binarysearch-tree-fragcoord-less-than-zero
+dEQP-VK.graphicsfuzz.stable-binarysearch-tree-nested-if-and-conditional
dEQP-VK.graphicsfuzz.stable-binarysearch-tree-with-loop-read-write-global
+dEQP-VK.graphicsfuzz.stable-collatz-push-constant-with-nested-min-max
+dEQP-VK.graphicsfuzz.stable-colorgrid-modulo-double-always-false-discard
dEQP-VK.graphicsfuzz.stable-colorgrid-modulo-injected-conditional-true
dEQP-VK.graphicsfuzz.stable-colorgrid-modulo-true-conditional-simple-loop
dEQP-VK.graphicsfuzz.stable-colorgrid-modulo-vec3-values-from-matrix
+dEQP-VK.graphicsfuzz.stable-mergesort-for-always-false-if-discard
+dEQP-VK.graphicsfuzz.stable-mergesort-reversed-for-loop
dEQP-VK.graphicsfuzz.stable-quicksort-for-loop-with-injection
dEQP-VK.graphicsfuzz.stable-quicksort-if-false-else-return
dEQP-VK.graphicsfuzz.stable-quicksort-max-value-as-index
dEQP-VK.graphicsfuzz.stable-rects-vec4-clamp-conditional-min-mix
+dEQP-VK.graphicsfuzz.stable-triangle-array-nested-loop
+dEQP-VK.graphicsfuzz.stable-triangle-nested-for-loop-and-true-if
dEQP-VK.graphicsfuzz.struct-array-data-as-loop-iterator
dEQP-VK.graphicsfuzz.switch-case-with-undefined-expression
dEQP-VK.graphicsfuzz.switch-inside-while-always-return
@@ -233727,6 +251569,7 @@
dEQP-VK.graphicsfuzz.switch-with-fall-through-cases
dEQP-VK.graphicsfuzz.two-loops-mat-add
dEQP-VK.graphicsfuzz.uv-value-comparison-as-boolean
+dEQP-VK.graphicsfuzz.vec2-modf
dEQP-VK.graphicsfuzz.vector-values-multiplied-by-fragcoord
dEQP-VK.graphicsfuzz.vectors-and-discard-in-function
dEQP-VK.transform_feedback.simple.winding_line_list_6
@@ -233766,6 +251609,17 @@
dEQP-VK.transform_feedback.simple.winding_patch_list_10
dEQP-VK.transform_feedback.simple.winding_patch_list_12
dEQP-VK.transform_feedback.simple.backward_dependency_no_offset_array
+dEQP-VK.transform_feedback.simple.multiquery_1
+dEQP-VK.transform_feedback.simple.multiquery_3
+dEQP-VK.transform_feedback.simple.multiquery_6
+dEQP-VK.transform_feedback.simple.multiquery_14
+dEQP-VK.descriptor_indexing.storage_buffer_minNonUniform
+dEQP-VK.descriptor_indexing.storage_texel_buffer_minNonUniform
+dEQP-VK.descriptor_indexing.uniform_texel_buffer_minNonUniform
+dEQP-VK.descriptor_indexing.uniform_buffer_minNonUniform
+dEQP-VK.descriptor_indexing.combined_image_sampler_minNonUniform
+dEQP-VK.descriptor_indexing.combined_image_sampler_with_lod_minNonUniform
+dEQP-VK.descriptor_indexing.storage_image_minNonUniform
dEQP-VK.drm_format_modifiers.list_modifiers.r4g4_unorm_pack8
dEQP-VK.drm_format_modifiers.list_modifiers.r4g4b4a4_unorm_pack16
dEQP-VK.drm_format_modifiers.list_modifiers.b4g4r4a4_unorm_pack16
@@ -242163,6 +260017,7 @@
dEQP-VK.ray_tracing_pipeline.acceleration_structures.instance_triangle_culling.gpu_built.index_uint32.notransform_ccw
dEQP-VK.ray_tracing_pipeline.acceleration_structures.instance_triangle_culling.gpu_built.index_uint32.notransform_nocull
dEQP-VK.ray_tracing_pipeline.acceleration_structures.instance_triangle_culling.gpu_built.index_uint32.notransform_ccw_nocull
+dEQP-VK.ray_tracing_pipeline.acceleration_structures.dynamic_indexing.dynamic_indexing
dEQP-VK.ray_tracing_pipeline.acceleration_structures.empty.cpu_built.index_none.inactive_triangles
dEQP-VK.ray_tracing_pipeline.acceleration_structures.empty.cpu_built.index_none.inactive_instances
dEQP-VK.ray_tracing_pipeline.acceleration_structures.empty.cpu_built.index_none.no_geometries_bottom
@@ -242201,6 +260056,8 @@
dEQP-VK.ray_tracing_pipeline.acceleration_structures.instance_index.gpu_built.ahit
dEQP-VK.ray_tracing_pipeline.acceleration_structures.instance_index.gpu_built.chit
dEQP-VK.ray_tracing_pipeline.acceleration_structures.instance_index.gpu_built.isec
+dEQP-VK.ray_tracing_pipeline.procedural_geometry.object_behind_bounding_boxes
+dEQP-VK.ray_tracing_pipeline.procedural_geometry.triangle_in_between
dEQP-VK.ray_tracing_pipeline.indirect.build_structure
dEQP-VK.ray_tracing_pipeline.watertightness.0.4
dEQP-VK.ray_tracing_pipeline.watertightness.0.16
@@ -242438,6 +260295,7 @@
dEQP-VK.ray_tracing_pipeline.misc.shaderRecordExplicitSTD430Offset_4
dEQP-VK.ray_tracing_pipeline.misc.shaderRecordExplicitSTD430Offset_5
dEQP-VK.ray_tracing_pipeline.misc.shaderRecordExplicitSTD430Offset_6
+dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_AABB_0
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_AABB_1
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_AABB_2
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_AABB_3
@@ -242453,6 +260311,7 @@
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_AABB_13
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_AABB_14
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_AABB_15
+dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_tri_0
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_tri_1
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_tri_2
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_tri_3
@@ -242468,6 +260327,12 @@
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_tri_13
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_tri_14
dEQP-VK.ray_tracing_pipeline.misc.recursiveTraces_tri_15
+dEQP-VK.ray_tracing_pipeline.misc.OpIgnoreIntersectionKHR_AnyHitStatically
+dEQP-VK.ray_tracing_pipeline.misc.OpIgnoreIntersectionKHR_AnyHitDynamically
+dEQP-VK.ray_tracing_pipeline.misc.OpTerminateRayKHR_AnyHitStatically
+dEQP-VK.ray_tracing_pipeline.misc.OpTerminateRayKHR_AnyHitDynamically
+dEQP-VK.ray_tracing_pipeline.misc.OpTerminateRayKHR_IntersectionStatically
+dEQP-VK.ray_tracing_pipeline.misc.OpTerminateRayKHR_IntersectionDynamically
dEQP-VK.ray_tracing_pipeline.complexcontrolflow.if.execute_callable.rgen
dEQP-VK.ray_tracing_pipeline.complexcontrolflow.if.execute_callable.chit
dEQP-VK.ray_tracing_pipeline.complexcontrolflow.if.execute_callable.miss
@@ -242884,6 +260749,360 @@
dEQP-VK.ray_tracing_pipeline.barrier.simg.specific_barrier.from_frag_to_chit
dEQP-VK.ray_tracing_pipeline.barrier.simg.specific_barrier.from_frag_to_miss
dEQP-VK.ray_tracing_pipeline.barrier.simg.specific_barrier.from_frag_to_call
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.int32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2int32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3int32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4int32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5int32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.int64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2int64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3int64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4int64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5int64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.int16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2int16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3int16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4int16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5int16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.int8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2int8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3int8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4int8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5int8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.float32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2float32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3float32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4float32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5float32
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.float64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2float64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3float64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4float64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5float64
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.float16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v2float16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v3float16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.v4float16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.a5float16
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.struct
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.sampler
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.image
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.combined
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.ptr_image
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.ptr_sampler
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.ptr_combined
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.ptr_texel
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.op_null
+dEQP-VK.ray_tracing_pipeline.data_spill.execute_callable.op_undef
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.int32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2int32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3int32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4int32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5int32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.int64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2int64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3int64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4int64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5int64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.int16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2int16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3int16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4int16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5int16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.int8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2int8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3int8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4int8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5int8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.float32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2float32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3float32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4float32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5float32
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.float64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2float64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3float64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4float64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5float64
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.float16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v2float16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v3float16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.v4float16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.a5float16
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.struct
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.sampler
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.image
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.combined
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.ptr_image
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.ptr_sampler
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.ptr_combined
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.ptr_texel
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.op_null
+dEQP-VK.ray_tracing_pipeline.data_spill.trace_ray.op_undef
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.int32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2int32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3int32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4int32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5int32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5uint32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.int64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2int64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3int64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4int64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5int64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5uint64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.int16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2int16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3int16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4int16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5int16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5uint16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.int8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2int8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3int8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4int8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5int8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5uint8
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.float32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2float32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3float32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4float32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5float32
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.float64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2float64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3float64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4float64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5float64
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.float16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v2float16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v3float16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.v4float16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.a5float16
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.struct
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.sampler
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.image
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.combined
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.ptr_image
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.ptr_sampler
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.ptr_combined
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.ptr_texel
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.op_null
+dEQP-VK.ray_tracing_pipeline.data_spill.report_intersection.op_undef
+dEQP-VK.ray_tracing_pipeline.data_spill.pipeline_interface.ray_payload
+dEQP-VK.ray_tracing_pipeline.data_spill.pipeline_interface.callable_data
+dEQP-VK.ray_tracing_pipeline.data_spill.pipeline_interface.hit_attributes
+dEQP-VK.ray_tracing_pipeline.data_spill.pipeline_interface.shader_record_buffer_rgen
+dEQP-VK.ray_tracing_pipeline.data_spill.pipeline_interface.shader_record_buffer_call
+dEQP-VK.ray_tracing_pipeline.data_spill.pipeline_interface.shader_record_buffer_miss
+dEQP-VK.ray_tracing_pipeline.data_spill.pipeline_interface.shader_record_buffer_hit
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_0.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_0.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_0.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_0.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_0.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_1.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_1.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_1.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_1.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_1.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_2.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_2.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_2.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_2.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_2.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_3.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_3.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_3.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_3.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_3.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_4.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_4.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_4.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_4.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_4.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_5.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_5.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_5.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_5.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.triangles.scaling_factor_5.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_0.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_0.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_0.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_0.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_0.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_1.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_1.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_1.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_1.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_1.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_2.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_2.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_2.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_2.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_2.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_3.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_3.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_3.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_3.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_3.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_4.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_4.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_4.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_4.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_4.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_5.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_5.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_5.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_5.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.chit.aabbs.scaling_factor_5.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_0.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_0.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_0.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_0.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_0.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_1.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_1.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_1.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_1.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_1.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_2.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_2.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_2.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_2.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_2.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_3.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_3.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_3.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_3.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_3.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_4.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_4.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_4.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_4.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_4.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_5.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_5.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_5.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_5.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.triangles.scaling_factor_5.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_0.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_0.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_0.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_0.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_0.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_1.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_1.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_1.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_1.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_1.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_2.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_2.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_2.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_2.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_2.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_3.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_3.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_3.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_3.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_3.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_4.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_4.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_4.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_4.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_4.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_5.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_5.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_5.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_5.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.ahit.aabbs.scaling_factor_5.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_0.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_0.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_0.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_0.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_0.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_1.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_1.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_1.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_1.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_1.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_2.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_2.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_2.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_2.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_2.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_3.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_3.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_3.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_3.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_3.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_4.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_4.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_4.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_4.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_4.rotation_4
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_5.rotation_0
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_5.rotation_1
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_5.rotation_2
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_5.rotation_3
+dEQP-VK.ray_tracing_pipeline.direction_length.isec.aabbs.scaling_factor_5.rotation_4
+dEQP-VK.ray_tracing_pipeline.barycentric_coordinates.ahit
+dEQP-VK.ray_tracing_pipeline.barycentric_coordinates.chit
dEQP-VK.ray_query.builtin.flow.vert.triangles
dEQP-VK.ray_query.builtin.flow.vert.aabbs
dEQP-VK.ray_query.builtin.flow.tesc.triangles
@@ -265482,6 +283701,7 @@
dEQP-VK.ray_query.acceleration_structures.instance_triangle_culling.call_shader.gpu_built.index_uint32.notransform_ccw
dEQP-VK.ray_query.acceleration_structures.instance_triangle_culling.call_shader.gpu_built.index_uint32.notransform_nocull
dEQP-VK.ray_query.acceleration_structures.instance_triangle_culling.call_shader.gpu_built.index_uint32.notransform_ccw_nocull
+dEQP-VK.ray_query.acceleration_structures.dynamic_indexing.dynamic_indexing
dEQP-VK.ray_query.acceleration_structures.empty.vertex_shader.cpu_built.index_none.inactive_triangles
dEQP-VK.ray_query.acceleration_structures.empty.vertex_shader.cpu_built.index_none.inactive_instances
dEQP-VK.ray_query.acceleration_structures.empty.vertex_shader.cpu_built.index_none.no_geometries_bottom
@@ -265842,6 +284062,8 @@
dEQP-VK.ray_query.acceleration_structures.empty.call_shader.gpu_built.index_uint32.no_geometries_bottom
dEQP-VK.ray_query.acceleration_structures.empty.call_shader.gpu_built.index_uint32.no_primitives_top
dEQP-VK.ray_query.acceleration_structures.empty.call_shader.gpu_built.index_uint32.no_primitives_bottom
+dEQP-VK.ray_query.procedural_geometry.object_behind_bounding_boxes
+dEQP-VK.ray_query.procedural_geometry.triangle_in_between
dEQP-VK.ray_query.advanced.null_as.vert.triangles
dEQP-VK.ray_query.advanced.null_as.vert.aabbs
dEQP-VK.ray_query.advanced.null_as.tesc.triangles
@@ -266120,6 +284342,68 @@
dEQP-VK.ray_query.ray_flags.call_shader.skip_geometry.triangles.skipaabb
dEQP-VK.ray_query.ray_flags.call_shader.skip_geometry.aabbs.skiptriangles
dEQP-VK.ray_query.ray_flags.call_shader.skip_geometry.aabbs.skipaabb
+dEQP-VK.ray_query.misc.dynamic_indexing
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_0.rotation_0
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_0.rotation_1
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_0.rotation_2
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_0.rotation_3
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_0.rotation_4
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_1.rotation_0
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_1.rotation_1
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_1.rotation_2
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_1.rotation_3
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_1.rotation_4
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_2.rotation_0
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_2.rotation_1
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_2.rotation_2
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_2.rotation_3
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_2.rotation_4
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_3.rotation_0
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_3.rotation_1
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_3.rotation_2
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_3.rotation_3
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_3.rotation_4
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_4.rotation_0
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_4.rotation_1
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_4.rotation_2
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_4.rotation_3
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_4.rotation_4
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_5.rotation_0
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_5.rotation_1
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_5.rotation_2
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_5.rotation_3
+dEQP-VK.ray_query.direction_length.triangles.scaling_factor_5.rotation_4
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_0.rotation_0
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_0.rotation_1
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_0.rotation_2
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_0.rotation_3
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_0.rotation_4
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_1.rotation_0
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_1.rotation_1
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_1.rotation_2
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_1.rotation_3
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_1.rotation_4
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_2.rotation_0
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_2.rotation_1
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_2.rotation_2
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_2.rotation_3
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_2.rotation_4
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_3.rotation_0
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_3.rotation_1
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_3.rotation_2
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_3.rotation_3
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_3.rotation_4
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_4.rotation_0
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_4.rotation_1
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_4.rotation_2
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_4.rotation_3
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_4.rotation_4
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_5.rotation_0
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_5.rotation_1
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_5.rotation_2
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_5.rotation_3
+dEQP-VK.ray_query.direction_length.aabbs.scaling_factor_5.rotation_4
+dEQP-VK.ray_query.barycentric_coordinates.compute
dEQP-VK.fragment_shading_rate.basic.dynamic.noattachment.noshaderrate.keep.keep.1x1.samples1.vs
dEQP-VK.fragment_shading_rate.basic.dynamic.noattachment.noshaderrate.keep.keep.1x1.samples2.vs
dEQP-VK.fragment_shading_rate.basic.dynamic.noattachment.noshaderrate.keep.keep.1x1.samples4.vs
@@ -279070,3 +297354,228 @@
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
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index cb51473..1b5eb58 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
Binary files differ
diff --git a/external/fetch_sources.py b/external/fetch_sources.py
index 7933780..b37ae1d 100644
--- a/external/fetch_sources.py
+++ b/external/fetch_sources.py
@@ -70,7 +70,7 @@
Source.clean(self)
self.removeArchives()
- def update (self, cmdProtocol = None):
+ def update (self, cmdProtocol = None, force = False):
if not self.isArchiveUpToDate():
self.fetchAndVerifyArchive()
@@ -182,7 +182,7 @@
self.filename = filename
self.checksum = checksum
- def update (self, cmdProtocol = None):
+ def update (self, cmdProtocol = None, force = False):
if not self.isFileUpToDate():
Source.clean(self)
self.fetchAndVerifyFile()
@@ -273,7 +273,7 @@
assert url != None
return url
- def update (self, cmdProtocol = None):
+ def update (self, cmdProtocol = None, force = False):
fullDstPath = os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir)
url = self.selectUrl(cmdProtocol)
@@ -287,8 +287,9 @@
(stdout, stderr) = proc.communicate()
if proc.returncode == 0:
execute(["git", "tag", "-d",tag])
- execute(["git", "fetch", "--tags", url, "+refs/heads/*:refs/remotes/origin/*"])
- execute(["git", "checkout", self.revision])
+ force_arg = ['--force'] if force else []
+ execute(["git", "fetch"] + force_arg + ["--tags", url, "+refs/heads/*:refs/remotes/origin/*"])
+ execute(["git", "checkout"] + force_arg + [self.revision])
finally:
popWorkingDir()
@@ -316,7 +317,7 @@
GitRepo(
"https://github.com/KhronosGroup/SPIRV-Tools.git",
None,
- "c91a25af13e112729be7272d58b0df25e772c3e0",
+ "f11f7434815838bbad349124767b258ce7df41f0",
"spirv-tools"),
GitRepo(
"https://github.com/KhronosGroup/glslang.git",
@@ -348,6 +349,8 @@
" Minimum python version required " + versionsForInsecureStr)
parser.add_argument('--protocol', dest='protocol', default=None, choices=['ssh', 'https'],
help="Select protocol to checkout git repositories.")
+ parser.add_argument('--force', dest='force', action='store_true', default=False,
+ help="Pass --force to git fetch and checkout commands")
args = parser.parse_args()
@@ -368,4 +371,4 @@
if args.clean:
pkg.clean()
else:
- pkg.update(args.protocol)
+ pkg.update(args.protocol, args.force)
diff --git a/external/openglcts/README.md b/external/openglcts/README.md
index d748ffb..81665fa 100644
--- a/external/openglcts/README.md
+++ b/external/openglcts/README.md
@@ -247,7 +247,7 @@
Requirements:
- Visual Studio (2015 or newer recommended) or Windows SDK
-- CMake 2.8.x Windows native version (i.e. not Cygwin version)
+- CMake 3.10.2 Windows native version (i.e. not Cygwin version)
- For GL/ES2/ES3.x tests: OpengGL, OpenGL ES 2 or ES 3.x libraries and headers
To choose the backend build system for CMake, choose one of the following Generator Names for the
@@ -294,7 +294,7 @@
Required tools:
- Standard build utilities (make, gcc, etc.)
-- CMake 2.8.x
+- CMake 3.10.2
- Necessary API libraries (OpenGL, GLES, EGL depending on configuration)
Building ES2 or ES3.x conformance tests:
diff --git a/external/openglcts/data/mustpass/egl/aosp_mustpass/master/src/egl-driver-issues.txt b/external/openglcts/data/mustpass/egl/aosp_mustpass/master/src/egl-driver-issues.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/external/openglcts/data/mustpass/egl/aosp_mustpass/master/src/egl-driver-issues.txt
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl30-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl30-master.txt
index 232f2c1..68db298 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl30-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl30-master.txt
@@ -192,6 +192,654 @@
KHR-GL30.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL30.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL30.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL30.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL30.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL30.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL30.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl31-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl31-master.txt
index 71e3fe0..6e3536e 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl31-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl31-master.txt
@@ -192,6 +192,654 @@
KHR-GL31.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL31.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL31.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL31.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL31.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL31.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL31.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl32-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl32-master.txt
index a02f65f..bb66176 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl32-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl32-master.txt
@@ -192,6 +192,654 @@
KHR-GL32.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL32.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL32.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL32.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL32.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL32.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL32.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl33-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl33-master.txt
index 716d41e..e78436b 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl33-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl33-master.txt
@@ -192,6 +192,654 @@
KHR-GL33.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL33.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL33.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL33.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL33.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL33.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL33.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl40-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl40-master.txt
index 1e10f49..436bb39 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl40-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl40-master.txt
@@ -192,6 +192,654 @@
KHR-GL40.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL40.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL40.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL40.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL40.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL40.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL40.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl41-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl41-master.txt
index 63788f9..4d3a715 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl41-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl41-master.txt
@@ -192,6 +192,654 @@
KHR-GL41.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL41.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL41.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL41.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL41.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL41.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL41.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl42-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl42-master.txt
index 3c6a7e0..73d5dc5 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl42-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl42-master.txt
@@ -192,6 +192,654 @@
KHR-GL42.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL42.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL42.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL42.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL42.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL42.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL42.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl43-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl43-master.txt
index 6dacc8c..8202342 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl43-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl43-master.txt
@@ -192,6 +192,654 @@
KHR-GL43.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL43.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL43.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL43.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL43.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL43.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL43.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl44-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl44-master.txt
index 1c65c05..b570572 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl44-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl44-master.txt
@@ -192,6 +192,654 @@
KHR-GL44.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL44.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL44.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL44.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL44.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL44.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL44.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt
index da3ade4..e2d5d15 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl45-master.txt
@@ -192,6 +192,654 @@
KHR-GL45.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL45.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL45.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL45.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL45.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL45.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL45.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt
index d543bb5..3cb57bd 100644
--- a/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt
+++ b/external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.1.x/gl46-master.txt
@@ -192,6 +192,654 @@
KHR-GL46.texture_repeat_mode.depth24_stencil8_11x131_2_mirrored_repeat
KHR-GL46.shaders30.declarations.declarations.redeclare_gl_FragColor
KHR-GL46.shaders30.declarations.declarations.redeclare_gl_FragData
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GL46.shaders30.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GL46.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GL46.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GL46.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.5.x/gles3-master.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.5.x/gles3-master.txt
index 5f55fe1..ccc6e6a 100644
--- a/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.5.x/gles3-master.txt
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.5.x/gles3-master.txt
@@ -35240,6 +35240,198 @@
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_vertex
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_fragment
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_vertex
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_fragment
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_both
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.6.x/gles3-master.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.6.x/gles3-master.txt
index 5f55fe1..ccc6e6a 100644
--- a/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.6.x/gles3-master.txt
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/3.2.6.x/gles3-master.txt
@@ -35240,6 +35240,198 @@
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_vertex
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_fragment
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_vertex
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_fragment
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_both
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles2-master.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles2-master.txt
index b1cb55c..c63235c 100644
--- a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles2-master.txt
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles2-master.txt
@@ -149,10 +149,6 @@
dEQP-GLES2.functional.shaders.preprocessor.definitions.define_value_and_function_fragment
dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_object_invalid_syntax_vertex
dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_object_invalid_syntax_fragment
-dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_1_vertex
-dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_1_fragment
-dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_2_vertex
-dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_2_fragment
dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_3_vertex
dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_3_fragment
dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_4_vertex
@@ -195,8 +191,6 @@
dEQP-GLES2.functional.shaders.preprocessor.object_redefinitions.redefine_object_comment_fragment
dEQP-GLES2.functional.shaders.preprocessor.object_redefinitions.redefine_object_multiline_comment_vertex
dEQP-GLES2.functional.shaders.preprocessor.object_redefinitions.redefine_object_multiline_comment_fragment
-dEQP-GLES2.functional.shaders.preprocessor.invalid_redefinitions.invalid_identifier_2_vertex
-dEQP-GLES2.functional.shaders.preprocessor.invalid_redefinitions.invalid_identifier_2_fragment
dEQP-GLES2.functional.shaders.preprocessor.comments.multiline_comment_define_vertex
dEQP-GLES2.functional.shaders.preprocessor.comments.multiline_comment_define_fragment
dEQP-GLES2.functional.shaders.preprocessor.comments.nested_comment_vertex
@@ -283,8 +277,6 @@
dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.gl_es_2_fragment
dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.line_1_vertex
dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.line_1_fragment
-dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.line_2_vertex
-dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.line_2_fragment
dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.file_vertex
dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.file_fragment
dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.if_gl_es_vertex
@@ -451,12 +443,8 @@
dEQP-GLES2.functional.shaders.preprocessor.directive.error_with_no_tokens_fragment
dEQP-GLES2.functional.shaders.preprocessor.directive.error_vertex
dEQP-GLES2.functional.shaders.preprocessor.directive.error_fragment
-dEQP-GLES2.functional.shaders.preprocessor.builtin.line_vertex
-dEQP-GLES2.functional.shaders.preprocessor.builtin.line_fragment
dEQP-GLES2.functional.shaders.preprocessor.builtin.line_and_file_vertex
dEQP-GLES2.functional.shaders.preprocessor.builtin.line_and_file_fragment
-dEQP-GLES2.functional.shaders.preprocessor.builtin.line_defined_1_vertex
-dEQP-GLES2.functional.shaders.preprocessor.builtin.line_defined_1_fragment
dEQP-GLES2.functional.shaders.preprocessor.builtin.line_defined_2_vertex
dEQP-GLES2.functional.shaders.preprocessor.builtin.line_defined_2_fragment
dEQP-GLES2.functional.shaders.preprocessor.builtin.empty_line_vertex
@@ -499,8 +487,6 @@
dEQP-GLES2.functional.shaders.preprocessor.extensions.invalid_char_in_behavior_fragment
dEQP-GLES2.functional.shaders.preprocessor.extensions.unterminated_comment_vertex
dEQP-GLES2.functional.shaders.preprocessor.extensions.unterminated_comment_fragment
-dEQP-GLES2.functional.shaders.preprocessor.extensions.after_non_preprocessing_tokens_vertex
-dEQP-GLES2.functional.shaders.preprocessor.extensions.after_non_preprocessing_tokens_fragment
dEQP-GLES2.functional.shaders.preprocessor.expressions.shift_left_vertex
dEQP-GLES2.functional.shaders.preprocessor.expressions.shift_left_fragment
dEQP-GLES2.functional.shaders.preprocessor.expressions.shift_right_vertex
@@ -724,8 +710,6 @@
dEQP-GLES2.functional.shaders.constants.const_float_assign_uniform_vertex
dEQP-GLES2.functional.shaders.constants.const_float_assign_uniform_fragment
dEQP-GLES2.functional.shaders.constants.const_float_assign_varying
-dEQP-GLES2.functional.shaders.constants.const_float_function_gotcha_vertex
-dEQP-GLES2.functional.shaders.constants.const_float_function_gotcha_fragment
dEQP-GLES2.functional.shaders.constants.const_float_from_int_vertex
dEQP-GLES2.functional.shaders.constants.const_float_from_int_fragment
dEQP-GLES2.functional.shaders.constants.const_float_from_vec2_vertex
@@ -757,9 +741,7 @@
dEQP-GLES2.functional.shaders.linkage.varying_differing_precision_1
dEQP-GLES2.functional.shaders.linkage.varying_differing_precision_2
dEQP-GLES2.functional.shaders.linkage.varying_differing_precision_3
-dEQP-GLES2.functional.shaders.linkage.varying_type_mismatch_1
dEQP-GLES2.functional.shaders.linkage.varying_type_mismatch_2
-dEQP-GLES2.functional.shaders.linkage.varying_illegal_usage_1
dEQP-GLES2.functional.shaders.linkage.invalid_varying_type_int
dEQP-GLES2.functional.shaders.linkage.invalid_varying_type_bool
dEQP-GLES2.functional.shaders.linkage.invalid_varying_type_struct
@@ -789,13 +771,6 @@
dEQP-GLES2.functional.shaders.linkage.uniform_struct_partial_bvec2_vec2
dEQP-GLES2.functional.shaders.linkage.uniform_struct_partial_ivec2_vec2
dEQP-GLES2.functional.shaders.linkage.uniform_struct_partial_ivec2_ivec2
-dEQP-GLES2.functional.shaders.linkage.uniform_struct_type_conflict_1
-dEQP-GLES2.functional.shaders.linkage.uniform_struct_type_conflict_2
-dEQP-GLES2.functional.shaders.linkage.uniform_struct_type_conflict_3
-dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_1
-dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_2
-dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_3
-dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_4
dEQP-GLES2.functional.shaders.linkage.uniform_struct_use_case_rip
dEQP-GLES2.functional.shaders.linkage.uniform_struct_use_case_rip_sans_highp
dEQP-GLES2.functional.shaders.conversions.scalar_to_scalar.float_to_float_vertex
@@ -1369,8 +1344,6 @@
dEQP-GLES2.functional.shaders.declarations.invalid_declarations.uniform_in_fragment_main
dEQP-GLES2.functional.shaders.declarations.invalid_declarations.varying_in_vertex_main
dEQP-GLES2.functional.shaders.declarations.invalid_declarations.varying_in_fragment_main
-dEQP-GLES2.functional.shaders.declarations.invalid_declarations.invariant_attribute
-dEQP-GLES2.functional.shaders.declarations.invalid_declarations.invariant_uniform
dEQP-GLES2.functional.shaders.swizzles.vector_swizzles.mediump_vec2_x_vertex
dEQP-GLES2.functional.shaders.swizzles.vector_swizzles.mediump_vec2_x_fragment
dEQP-GLES2.functional.shaders.swizzles.vector_swizzles.mediump_vec2_xx_vertex
@@ -2246,8 +2219,6 @@
dEQP-GLES2.functional.shaders.functions.invalid.return_type_const_overload_fragment
dEQP-GLES2.functional.shaders.functions.invalid.return_without_value_vertex
dEQP-GLES2.functional.shaders.functions.invalid.return_without_value_fragment
-dEQP-GLES2.functional.shaders.functions.invalid.local_function_prototype_vertex
-dEQP-GLES2.functional.shaders.functions.invalid.local_function_prototype_fragment
dEQP-GLES2.functional.shaders.functions.invalid.local_function_definition_vertex
dEQP-GLES2.functional.shaders.functions.invalid.local_function_definition_fragment
dEQP-GLES2.functional.shaders.functions.invalid.name_type_conflict_vertex
@@ -2263,10 +2234,6 @@
dEQP-GLES2.functional.shaders.functions.invalid.uniform_argument_vertex
dEQP-GLES2.functional.shaders.functions.invalid.uniform_argument_fragment
dEQP-GLES2.functional.shaders.functions.invalid.attribute_argument_fragment
-dEQP-GLES2.functional.shaders.functions.invalid.uniform_return_type_vertex
-dEQP-GLES2.functional.shaders.functions.invalid.uniform_return_type_fragment
-dEQP-GLES2.functional.shaders.functions.invalid.varying_return_type_vertex
-dEQP-GLES2.functional.shaders.functions.invalid.varying_return_type_fragment
dEQP-GLES2.functional.shaders.functions.invalid.attribute_return_type_vertex
dEQP-GLES2.functional.shaders.functions.invalid.attribute_return_type_fragment
dEQP-GLES2.functional.shaders.functions.invalid.main_invalid_return_type_vertex
@@ -2281,12 +2248,6 @@
dEQP-GLES2.functional.shaders.functions.invalid.write_const_array_arg_fragment
dEQP-GLES2.functional.shaders.functions.invalid.modify_const_arg_vertex
dEQP-GLES2.functional.shaders.functions.invalid.modify_const_arg_fragment
-dEQP-GLES2.functional.shaders.functions.invalid.init_const_local_from_const_arg_vertex
-dEQP-GLES2.functional.shaders.functions.invalid.init_const_local_from_const_arg_fragment
-dEQP-GLES2.functional.shaders.functions.invalid.array_size_from_const_arg_vertex
-dEQP-GLES2.functional.shaders.functions.invalid.array_size_from_const_arg_fragment
-dEQP-GLES2.functional.shaders.functions.invalid.double_declare_vertex
-dEQP-GLES2.functional.shaders.functions.invalid.double_declare_fragment
dEQP-GLES2.functional.shaders.keywords.keywords.attribute_vertex
dEQP-GLES2.functional.shaders.keywords.keywords.attribute_fragment
dEQP-GLES2.functional.shaders.keywords.keywords.const_vertex
@@ -2323,10 +2284,6 @@
dEQP-GLES2.functional.shaders.keywords.keywords.void_fragment
dEQP-GLES2.functional.shaders.keywords.keywords.bool_vertex
dEQP-GLES2.functional.shaders.keywords.keywords.bool_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.true_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.true_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.false_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.false_fragment
dEQP-GLES2.functional.shaders.keywords.keywords.lowp_vertex
dEQP-GLES2.functional.shaders.keywords.keywords.lowp_fragment
dEQP-GLES2.functional.shaders.keywords.keywords.mediump_vertex
@@ -2341,52 +2298,19 @@
dEQP-GLES2.functional.shaders.keywords.keywords.discard_fragment
dEQP-GLES2.functional.shaders.keywords.keywords.return_vertex
dEQP-GLES2.functional.shaders.keywords.keywords.return_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.mat2_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.mat2_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.mat3_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.mat3_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.mat4_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.mat4_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.vec2_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.vec2_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.vec3_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.vec3_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.vec4_vertex
dEQP-GLES2.functional.shaders.keywords.keywords.vec4_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.ivec2_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.ivec2_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.ivec3_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.ivec3_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.ivec4_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.ivec4_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.bvec2_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.bvec2_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.bvec3_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.bvec3_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.bvec4_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.bvec4_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.sampler2D_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.sampler2D_fragment
-dEQP-GLES2.functional.shaders.keywords.keywords.samplerCube_vertex
-dEQP-GLES2.functional.shaders.keywords.keywords.samplerCube_fragment
dEQP-GLES2.functional.shaders.keywords.keywords.struct_vertex
dEQP-GLES2.functional.shaders.keywords.keywords.struct_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.asm_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.asm_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.class_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.class_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.union_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.union_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.enum_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.enum_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.typedef_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.typedef_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.template_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.template_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.this_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.this_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.packed_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.packed_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.goto_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.goto_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.switch_vertex
@@ -2395,80 +2319,24 @@
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.default_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.inline_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.inline_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.noinline_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.noinline_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.volatile_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.volatile_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.public_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.public_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.static_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.static_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.extern_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.extern_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.external_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.external_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.interface_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.interface_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.flat_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.flat_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.long_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.long_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.short_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.short_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.double_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.double_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.half_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.half_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fixed_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fixed_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.unsigned_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.unsigned_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.superp_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.superp_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.input_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.input_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.output_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.output_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec2_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec2_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec3_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec3_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec4_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec4_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec2_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec2_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec3_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec3_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec4_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec4_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec2_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec2_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec3_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec3_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec4_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec4_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1D_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1D_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3D_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3D_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1DShadow_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1DShadow_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DShadow_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DShadow_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRect_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRect_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3DRect_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3DRect_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRectShadow_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRectShadow_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sizeof_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sizeof_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.cast_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.cast_fragment
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.namespace_vertex
dEQP-GLES2.functional.shaders.keywords.reserved_keywords.namespace_fragment
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.using_vertex
-dEQP-GLES2.functional.shaders.keywords.reserved_keywords.using_fragment
dEQP-GLES2.functional.shaders.keywords.invalid_identifiers.gl_begin_vertex
dEQP-GLES2.functional.shaders.keywords.invalid_identifiers.gl_begin_fragment
dEQP-GLES2.functional.shaders.keywords.invalid_identifiers.digit_vertex
@@ -2477,8 +2345,6 @@
dEQP-GLES2.functional.shaders.keywords.invalid_identifiers.digit_begin_fragment
dEQP-GLES2.functional.shaders.reserved_operators.operator_modulo_vertex
dEQP-GLES2.functional.shaders.reserved_operators.operator_modulo_fragment
-dEQP-GLES2.functional.shaders.reserved_operators.operator_bitwise_not_vertex
-dEQP-GLES2.functional.shaders.reserved_operators.operator_bitwise_not_fragment
dEQP-GLES2.functional.shaders.reserved_operators.operator_bitwise_shift_left_vertex
dEQP-GLES2.functional.shaders.reserved_operators.operator_bitwise_shift_left_fragment
dEQP-GLES2.functional.shaders.reserved_operators.operator_bitwise_shift_right_vertex
@@ -2567,8 +2433,6 @@
dEQP-GLES2.functional.shaders.scoping.valid.function_parameter_hides_function_fragment
dEQP-GLES2.functional.shaders.scoping.valid.local_variable_in_inner_scope_hides_function_parameter_vertex
dEQP-GLES2.functional.shaders.scoping.valid.local_variable_in_inner_scope_hides_function_parameter_fragment
-dEQP-GLES2.functional.shaders.scoping.valid.local_variable_hides_function_parameter_vertex
-dEQP-GLES2.functional.shaders.scoping.valid.local_variable_hides_function_parameter_fragment
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_global_variable_vertex
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_global_variable_fragment
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_local_variable_vertex
@@ -2581,14 +2445,10 @@
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_for_init_statement_variable_in_for_condition_fragment
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_while_condition_variable_vertex
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_while_condition_variable_fragment
-dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_function_vertex
-dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_function_fragment
dEQP-GLES2.functional.shaders.scoping.invalid.redefine_function_vertex
dEQP-GLES2.functional.shaders.scoping.invalid.redefine_function_fragment
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_builtin_vertex
dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_builtin_fragment
-dEQP-GLES2.functional.shaders.scoping.invalid.redefine_builtin_vertex
-dEQP-GLES2.functional.shaders.scoping.invalid.redefine_builtin_fragment
dEQP-GLES2.functional.shaders.scoping.invalid.conflict_function_struct_vertex
dEQP-GLES2.functional.shaders.scoping.invalid.conflict_function_struct_fragment
dEQP-GLES2.functional.shaders.scoping.invalid.conflict_function_variable_vertex
@@ -10739,30 +10599,14 @@
dEQP-GLES2.functional.texture.filtering.cube.nearest_mipmap_linear_linear_clamp_etc1
dEQP-GLES2.functional.texture.filtering.cube.linear_mipmap_linear_nearest_clamp_etc1
dEQP-GLES2.functional.texture.filtering.cube.linear_mipmap_linear_linear_clamp_etc1
-dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_clamp
-dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_clamp_non_square
-dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_repeat
-dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_repeat_non_square
-dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_mirror_non_square
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_clamp
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_clamp_non_square
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_repeat
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_repeat_non_square
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_mirror_non_square
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_clamp
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_clamp_non_square
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_repeat
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_repeat_non_square
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_mirror
dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_linear_mirror_non_square
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_clamp
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_clamp_non_square
dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_repeat
dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_repeat_non_square
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_mirror_non_square
dEQP-GLES2.functional.texture.mipmap.2d.affine.nearest_nearest_clamp
dEQP-GLES2.functional.texture.mipmap.2d.affine.nearest_nearest_repeat
dEQP-GLES2.functional.texture.mipmap.2d.affine.nearest_nearest_mirror
@@ -10772,25 +10616,11 @@
dEQP-GLES2.functional.texture.mipmap.2d.affine.nearest_linear_clamp
dEQP-GLES2.functional.texture.mipmap.2d.affine.nearest_linear_repeat
dEQP-GLES2.functional.texture.mipmap.2d.affine.nearest_linear_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.affine.linear_linear_clamp
dEQP-GLES2.functional.texture.mipmap.2d.affine.linear_linear_repeat
-dEQP-GLES2.functional.texture.mipmap.2d.affine.linear_linear_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_nearest_clamp
-dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_nearest_repeat
-dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_nearest_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_nearest_clamp
-dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_nearest_repeat
-dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_nearest_mirror
dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_linear_clamp
dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_linear_repeat
dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_linear_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_linear_clamp
dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_linear_repeat
-dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_linear_mirror
-dEQP-GLES2.functional.texture.mipmap.2d.bias.nearest_nearest
-dEQP-GLES2.functional.texture.mipmap.2d.bias.linear_nearest
-dEQP-GLES2.functional.texture.mipmap.2d.bias.nearest_linear
-dEQP-GLES2.functional.texture.mipmap.2d.bias.linear_linear
dEQP-GLES2.functional.texture.mipmap.2d.generate.a8_fastest
dEQP-GLES2.functional.texture.mipmap.2d.generate.a8_nicest
dEQP-GLES2.functional.texture.mipmap.2d.generate.a8_non_square_fastest
@@ -10823,17 +10653,11 @@
dEQP-GLES2.functional.texture.mipmap.2d.generate.rgba8888_nicest
dEQP-GLES2.functional.texture.mipmap.2d.generate.rgba8888_non_square_fastest
dEQP-GLES2.functional.texture.mipmap.2d.generate.rgba8888_non_square_nicest
-dEQP-GLES2.functional.texture.mipmap.cube.basic.nearest_nearest
dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_nearest
-dEQP-GLES2.functional.texture.mipmap.cube.basic.nearest_linear
dEQP-GLES2.functional.texture.mipmap.cube.basic.linear_linear
-dEQP-GLES2.functional.texture.mipmap.cube.projected.nearest_nearest
dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_nearest
-dEQP-GLES2.functional.texture.mipmap.cube.projected.nearest_linear
dEQP-GLES2.functional.texture.mipmap.cube.projected.linear_linear
-dEQP-GLES2.functional.texture.mipmap.cube.bias.nearest_nearest
dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_nearest
-dEQP-GLES2.functional.texture.mipmap.cube.bias.nearest_linear
dEQP-GLES2.functional.texture.mipmap.cube.bias.linear_linear
dEQP-GLES2.functional.texture.mipmap.cube.generate.a8_fastest
dEQP-GLES2.functional.texture.mipmap.cube.generate.a8_nicest
@@ -11279,518 +11103,6 @@
dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_depth_funcs.no_stencil_depth_greater
dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_depth_funcs.no_stencil_depth_notequal
dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_depth_funcs.no_stencil_no_depth
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.keep_decr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.zero_decr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.replace_decr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_decr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_decr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.invert_decr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.incr_wrap_decr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_keep_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_zero_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_replace_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_invert_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_incr_wrap_decr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_keep
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_zero
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_replace
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_incr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_decr
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_invert
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_incr_wrap
-dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.decr_wrap_decr_wrap_decr_wrap
dEQP-GLES2.functional.fragment_ops.depth_stencil.write_mask.depth
dEQP-GLES2.functional.fragment_ops.depth_stencil.write_mask.stencil
dEQP-GLES2.functional.fragment_ops.depth_stencil.write_mask.both
@@ -14625,28 +13937,21 @@
dEQP-GLES2.functional.attribute_location.bind_max_attributes.mat3
dEQP-GLES2.functional.attribute_location.bind_max_attributes.mat4
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_float
-dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_float
dEQP-GLES2.functional.attribute_location.bind_aliasing.max_inactive_float
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_vec2
-dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_vec2
dEQP-GLES2.functional.attribute_location.bind_aliasing.max_inactive_vec2
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_vec3
-dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_vec3
dEQP-GLES2.functional.attribute_location.bind_aliasing.max_inactive_vec3
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_vec4
-dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_vec4
dEQP-GLES2.functional.attribute_location.bind_aliasing.max_inactive_vec4
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat2
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat2_offset_1
-dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_mat2
dEQP-GLES2.functional.attribute_location.bind_aliasing.max_inactive_mat2
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat3
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat3_offset_1
-dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_mat3
dEQP-GLES2.functional.attribute_location.bind_aliasing.max_inactive_mat3
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat4
dEQP-GLES2.functional.attribute_location.bind_aliasing.cond_mat4_offset_1
-dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond_mat4
dEQP-GLES2.functional.attribute_location.bind_aliasing.max_inactive_mat4
dEQP-GLES2.functional.attribute_location.bind_hole.float
dEQP-GLES2.functional.attribute_location.bind_hole.vec2
@@ -14806,9 +14111,7 @@
dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.float_vec4_vertex
dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.float_vec4_fragment
dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.float_vec4_both
-dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.mat4_mat2_vertex
dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.mat4_mat2_fragment
-dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.mat4_mat2_both
dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.int_ivec4_vertex
dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.int_ivec4_fragment
dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.int_ivec4_both
@@ -14983,9 +14286,7 @@
dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.float_vec4_vertex
dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.float_vec4_fragment
dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.float_vec4_both
-dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.mat4_mat2_vertex
dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.mat4_mat2_fragment
-dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.mat4_mat2_both
dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.int_ivec4_vertex
dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.int_ivec4_fragment
dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.int_ivec4_both
@@ -15118,9 +14419,7 @@
dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.float_vec4_vertex
dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.float_vec4_fragment
dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.float_vec4_both
-dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.mat4_mat2_vertex
dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.mat4_mat2_fragment
-dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.mat4_mat2_both
dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.int_ivec4_vertex
dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.int_ivec4_fragment
dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.int_ivec4_both
@@ -15307,9 +14606,7 @@
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.float_vec4_vertex
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.float_vec4_fragment
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.float_vec4_both
-dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_vertex
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_fragment
-dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_both
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.int_ivec4_vertex
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.int_ivec4_fragment
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.int_ivec4_both
@@ -15451,9 +14748,7 @@
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.float_vec4_vertex
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.float_vec4_fragment
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.float_vec4_both
-dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.mat4_mat2_vertex
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.mat4_mat2_fragment
-dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.mat4_mat2_both
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.int_ivec4_vertex
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.int_ivec4_fragment
dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.int_ivec4_both
@@ -17006,18 +16301,12 @@
dEQP-GLES2.functional.clipping.triangle_vertex.clip_three.clip_neg_x_pos_y_pos_z_and_pos_x_neg_y_neg_z_and_pos_x_pos_y_neg_z
dEQP-GLES2.functional.polygon_offset.default_enable
dEQP-GLES2.functional.polygon_offset.default_displacement_with_units
-dEQP-GLES2.functional.polygon_offset.default_render_with_units
-dEQP-GLES2.functional.polygon_offset.default_result_depth_clamp
dEQP-GLES2.functional.polygon_offset.default_render_with_factor
dEQP-GLES2.functional.polygon_offset.default_factor_0_slope
-dEQP-GLES2.functional.polygon_offset.default_factor_1_slope
dEQP-GLES2.functional.polygon_offset.fixed16_enable
dEQP-GLES2.functional.polygon_offset.fixed16_displacement_with_units
-dEQP-GLES2.functional.polygon_offset.fixed16_render_with_units
-dEQP-GLES2.functional.polygon_offset.fixed16_result_depth_clamp
dEQP-GLES2.functional.polygon_offset.fixed16_render_with_factor
dEQP-GLES2.functional.polygon_offset.fixed16_factor_0_slope
-dEQP-GLES2.functional.polygon_offset.fixed16_factor_1_slope
dEQP-GLES2.functional.draw.draw_arrays.first.first_0
dEQP-GLES2.functional.draw.draw_arrays.first.first_1
dEQP-GLES2.functional.draw.draw_arrays.first.first_17
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-master.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-master.txt
index 488144d..ccc6e6a 100644
--- a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-master.txt
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-master.txt
@@ -951,8 +951,6 @@
dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.gl_es_2_fragment
dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.line_1_vertex
dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.line_1_fragment
-dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.line_2_vertex
-dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.line_2_fragment
dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.file_vertex
dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.file_fragment
dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.if_gl_es_vertex
@@ -25095,9 +25093,7 @@
dEQP-GLES3.functional.texture.mipmap.cube.min_lod.nearest_linear
dEQP-GLES3.functional.texture.mipmap.cube.min_lod.linear_linear
dEQP-GLES3.functional.texture.mipmap.cube.max_lod.nearest_nearest
-dEQP-GLES3.functional.texture.mipmap.cube.max_lod.linear_nearest
dEQP-GLES3.functional.texture.mipmap.cube.max_lod.nearest_linear
-dEQP-GLES3.functional.texture.mipmap.cube.max_lod.linear_linear
dEQP-GLES3.functional.texture.mipmap.cube.base_level.nearest_nearest
dEQP-GLES3.functional.texture.mipmap.cube.base_level.linear_nearest
dEQP-GLES3.functional.texture.mipmap.cube.base_level.nearest_linear
@@ -32092,20 +32088,6 @@
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_dst_y
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_x
dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_y
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_x
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_y
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_dst_x
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_dst_y
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_dst_x
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_dst_y
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_x
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_y
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_dst_x
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_dst_y
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_dst_x
-dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_dst_y
dEQP-GLES3.functional.fbo.blit.conversion.rgba32i_to_rgba32i
dEQP-GLES3.functional.fbo.blit.conversion.rgba32i_to_rgba16i
dEQP-GLES3.functional.fbo.blit.conversion.rgba32i_to_rgba8i
@@ -35258,6 +35240,198 @@
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_vertex
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_fragment
dEQP-GLES3.functional.ubo.single_nested_struct.single_buffer.std140_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.per_block_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.shared_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.packed_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_row_major_matrix_column_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_row_major_matrixarray_column_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_row_major_instance_array_both
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_vertex
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_fragment
+dEQP-GLES3.functional.ubo.single_nested_struct_mixed_matrix_packing.single_buffer.std140_block_column_major_matrix_column_major_matrixarray_column_major_instance_array_both
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_vertex
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_fragment
dEQP-GLES3.functional.ubo.single_nested_struct_array.per_block_buffer.shared_both
@@ -43704,31 +43878,23 @@
dEQP-GLES3.functional.polygon_offset.default_enable
dEQP-GLES3.functional.polygon_offset.default_displacement_with_units
dEQP-GLES3.functional.polygon_offset.default_render_with_units
-dEQP-GLES3.functional.polygon_offset.default_result_depth_clamp
dEQP-GLES3.functional.polygon_offset.default_render_with_factor
dEQP-GLES3.functional.polygon_offset.default_factor_0_slope
-dEQP-GLES3.functional.polygon_offset.default_factor_1_slope
dEQP-GLES3.functional.polygon_offset.fixed16_enable
dEQP-GLES3.functional.polygon_offset.fixed16_displacement_with_units
dEQP-GLES3.functional.polygon_offset.fixed16_render_with_units
-dEQP-GLES3.functional.polygon_offset.fixed16_result_depth_clamp
dEQP-GLES3.functional.polygon_offset.fixed16_render_with_factor
dEQP-GLES3.functional.polygon_offset.fixed16_factor_0_slope
-dEQP-GLES3.functional.polygon_offset.fixed16_factor_1_slope
dEQP-GLES3.functional.polygon_offset.fixed24_enable
dEQP-GLES3.functional.polygon_offset.fixed24_displacement_with_units
dEQP-GLES3.functional.polygon_offset.fixed24_render_with_units
-dEQP-GLES3.functional.polygon_offset.fixed24_result_depth_clamp
dEQP-GLES3.functional.polygon_offset.fixed24_render_with_factor
dEQP-GLES3.functional.polygon_offset.fixed24_factor_0_slope
-dEQP-GLES3.functional.polygon_offset.fixed24_factor_1_slope
dEQP-GLES3.functional.polygon_offset.float32_enable
dEQP-GLES3.functional.polygon_offset.float32_displacement_with_units
dEQP-GLES3.functional.polygon_offset.float32_render_with_units
-dEQP-GLES3.functional.polygon_offset.float32_result_depth_clamp
dEQP-GLES3.functional.polygon_offset.float32_render_with_factor
dEQP-GLES3.functional.polygon_offset.float32_factor_0_slope
-dEQP-GLES3.functional.polygon_offset.float32_factor_1_slope
dEQP-GLES3.functional.draw.draw_arrays.first.first_1
dEQP-GLES3.functional.draw.draw_arrays.first.first_3
dEQP-GLES3.functional.draw.draw_arrays.first.first_17
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-multisample.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-multisample.txt
index e47f0aa..6ab9344 100644
--- a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-multisample.txt
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles3-multisample.txt
@@ -4631,7 +4631,5 @@
dEQP-GLES3.functional.polygon_offset.default_enable
dEQP-GLES3.functional.polygon_offset.default_displacement_with_units
dEQP-GLES3.functional.polygon_offset.default_render_with_units
-dEQP-GLES3.functional.polygon_offset.default_result_depth_clamp
dEQP-GLES3.functional.polygon_offset.default_render_with_factor
dEQP-GLES3.functional.polygon_offset.default_factor_0_slope
-dEQP-GLES3.functional.polygon_offset.default_factor_1_slope
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-master.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-master.txt
index 0695f2a..8f6b995 100644
--- a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-master.txt
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-master.txt
@@ -2585,10 +2585,6 @@
dEQP-GLES31.functional.shaders.builtin_functions.precision.min.mediump_compute.vec2
dEQP-GLES31.functional.shaders.builtin_functions.precision.min.mediump_compute.vec3
dEQP-GLES31.functional.shaders.builtin_functions.precision.min.mediump_compute.vec4
-dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.scalar
-dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.vec2
-dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.vec3
-dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.vec4
dEQP-GLES31.functional.shaders.builtin_functions.precision.max.lowp_compute.scalar
dEQP-GLES31.functional.shaders.builtin_functions.precision.max.lowp_compute.vec2
dEQP-GLES31.functional.shaders.builtin_functions.precision.max.lowp_compute.vec3
@@ -2597,10 +2593,6 @@
dEQP-GLES31.functional.shaders.builtin_functions.precision.max.mediump_compute.vec2
dEQP-GLES31.functional.shaders.builtin_functions.precision.max.mediump_compute.vec3
dEQP-GLES31.functional.shaders.builtin_functions.precision.max.mediump_compute.vec4
-dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.scalar
-dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.vec2
-dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.vec3
-dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.vec4
dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.lowp_compute.scalar
dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.lowp_compute.vec2
dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.lowp_compute.vec3
@@ -2609,10 +2601,6 @@
dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.mediump_compute.vec2
dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.mediump_compute.vec3
dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.mediump_compute.vec4
-dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.scalar
-dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.vec2
-dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.vec3
-dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.vec4
dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute.scalar
dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute.vec2
dEQP-GLES31.functional.shaders.builtin_functions.precision.mix.lowp_compute.vec3
@@ -13273,18 +13261,6 @@
dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.filter_mode.min_nearest_mipmap_nearest_mag_nearest
dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.base_level.level_1
dEQP-GLES31.functional.texture.gather.basic.cube.rgba8i.base_level.level_2
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.clamp_to_edge_repeat
dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.repeat_mirrored_repeat
dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_pot.compare_less.mirrored_repeat_clamp_to_edge
@@ -13297,13 +13273,6 @@
dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.clamp_to_edge_repeat
dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.repeat_mirrored_repeat
dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.no_corners.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_linear_mag_linear
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.base_level.level_1
-dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.base_level.level_2
dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.clamp_to_edge_repeat
dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.repeat_mirrored_repeat
dEQP-GLES31.functional.texture.gather.offset.min_required_offset.2d.rgba8.size_pot.mirrored_repeat_clamp_to_edge
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-multisample.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-multisample.txt
index 44d4428..970680d 100644
--- a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-multisample.txt
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/gles31-multisample.txt
@@ -44,7 +44,6 @@
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_100x100_drawcount_200
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_200x200_drawcount_800
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_500x500_drawcount_2500
-dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_1000x1000_drawcount_5000
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_100x100_drawcount_1
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_200x200_drawcount_1
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_500x500_drawcount_1
@@ -60,7 +59,6 @@
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_100x100_drawcount_200
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_200x200_drawcount_800
dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_500x500_drawcount_2500
-dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_1000x1000_drawcount_5000
dEQP-GLES31.functional.image_load_store.early_fragment_tests.no_early_fragment_tests_depth
dEQP-GLES31.functional.image_load_store.early_fragment_tests.no_early_fragment_tests_stencil
dEQP-GLES31.functional.image_load_store.early_fragment_tests.early_fragment_tests_depth
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles2-driver-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles2-driver-issues.txt
new file mode 100644
index 0000000..359ea69
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles2-driver-issues.txt
@@ -0,0 +1,196 @@
+#VK-GL-CTS 231
+dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_1_vertex
+dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_1_fragment
+dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_2_vertex
+dEQP-GLES2.functional.shaders.preprocessor.definitions.undefine_invalid_object_2_fragment
+dEQP-GLES2.functional.shaders.preprocessor.invalid_redefinitions.invalid_identifier_2_vertex
+dEQP-GLES2.functional.shaders.preprocessor.invalid_redefinitions.invalid_identifier_2_fragment
+dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.line_2_vertex
+dEQP-GLES2.functional.shaders.preprocessor.predefined_macros.line_2_fragment
+dEQP-GLES2.functional.shaders.preprocessor.builtin.line_vertex
+dEQP-GLES2.functional.shaders.preprocessor.builtin.line_fragment
+dEQP-GLES2.functional.shaders.preprocessor.builtin.line_defined_1_vertex
+dEQP-GLES2.functional.shaders.preprocessor.builtin.line_defined_1_fragment
+dEQP-GLES2.functional.shaders.preprocessor.extensions.after_non_preprocessing_tokens_vertex
+dEQP-GLES2.functional.shaders.preprocessor.extensions.after_non_preprocessing_tokens_fragment
+
+#VK-GL-CTS 232
+dEQP-GLES2.functional.shaders.constants.const_float_function_gotcha_vertex
+dEQP-GLES2.functional.shaders.constants.const_float_function_gotcha_fragment
+
+#VK-GL-CTS 233
+dEQP-GLES2.functional.shaders.linkage.varying_type_mismatch_1
+dEQP-GLES2.functional.shaders.linkage.varying_illegal_usage_1
+dEQP-GLES2.functional.shaders.linkage.uniform_struct_type_conflict_1
+dEQP-GLES2.functional.shaders.linkage.uniform_struct_type_conflict_2
+dEQP-GLES2.functional.shaders.linkage.uniform_struct_type_conflict_3
+dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_1
+dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_2
+dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_3
+dEQP-GLES2.functional.shaders.linkage.uniform_struct_precision_conflict_4
+
+#VK-GL-CTS 234
+dEQP-GLES2.functional.shaders.declarations.invalid_declarations.invariant_attribute
+dEQP-GLES2.functional.shaders.declarations.invalid_declarations.invariant_uniform
+
+#VK-GL-CTS 235
+dEQP-GLES2.functional.shaders.functions.invalid.local_function_prototype_vertex
+dEQP-GLES2.functional.shaders.functions.invalid.local_function_prototype_fragment
+dEQP-GLES2.functional.shaders.functions.invalid.uniform_return_type_vertex
+dEQP-GLES2.functional.shaders.functions.invalid.uniform_return_type_fragment
+dEQP-GLES2.functional.shaders.functions.invalid.varying_return_type_vertex
+dEQP-GLES2.functional.shaders.functions.invalid.varying_return_type_fragment
+dEQP-GLES2.functional.shaders.functions.invalid.init_const_local_from_const_arg_vertex
+dEQP-GLES2.functional.shaders.functions.invalid.init_const_local_from_const_arg_fragment
+dEQP-GLES2.functional.shaders.functions.invalid.array_size_from_const_arg_vertex
+dEQP-GLES2.functional.shaders.functions.invalid.array_size_from_const_arg_fragment
+dEQP-GLES2.functional.shaders.functions.invalid.double_declare_vertex
+dEQP-GLES2.functional.shaders.functions.invalid.double_declare_fragment
+
+#VK-GL-CTS 236
+dEQP-GLES2.functional.shaders.keywords.keywords.true_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.true_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.false_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.false_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.mat2_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.mat2_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.mat3_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.mat3_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.mat4_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.mat4_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.vec2_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.vec2_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.vec3_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.vec3_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.vec4_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.ivec2_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.ivec2_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.ivec3_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.ivec3_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.ivec4_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.ivec4_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.bvec2_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.bvec2_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.bvec3_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.bvec3_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.bvec4_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.bvec4_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.sampler2D_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.sampler2D_fragment
+dEQP-GLES2.functional.shaders.keywords.keywords.samplerCube_vertex
+dEQP-GLES2.functional.shaders.keywords.keywords.samplerCube_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.union_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.union_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.enum_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.enum_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.packed_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.packed_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.noinline_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.noinline_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.public_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.public_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.external_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.external_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.long_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.long_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.double_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.double_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.half_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.half_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fixed_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fixed_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.input_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.input_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.output_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.output_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec2_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec2_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec3_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec3_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec4_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.hvec4_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec2_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec2_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec3_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec3_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec4_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.dvec4_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec2_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec2_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec3_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec3_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec4_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.fvec4_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1D_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1D_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3D_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3D_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1DShadow_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler1DShadow_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DShadow_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DShadow_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRect_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRect_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3DRect_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler3DRect_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRectShadow_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sampler2DRectShadow_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sizeof_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.sizeof_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.cast_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.cast_fragment
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.using_vertex
+dEQP-GLES2.functional.shaders.keywords.reserved_keywords.using_fragment
+
+#VK-GL-CTS 239
+dEQP-GLES2.functional.shaders.scoping.valid.local_variable_hides_function_parameter_vertex
+dEQP-GLES2.functional.shaders.scoping.valid.local_variable_hides_function_parameter_fragment
+dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_function_vertex
+dEQP-GLES2.functional.shaders.scoping.invalid.redeclare_function_fragment
+dEQP-GLES2.functional.shaders.scoping.invalid.redefine_builtin_vertex
+dEQP-GLES2.functional.shaders.scoping.invalid.redefine_builtin_fragment
+
+#VK-GL-CTS 240
+dEQP-GLES2.functional.shaders.reserved_operators.operator_bitwise_not_vertex
+dEQP-GLES2.functional.shaders.reserved_operators.operator_bitwise_not_fragment
+
+#VK-GL-CTS 295
+dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_clamp
+dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_clamp_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_repeat
+dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_repeat_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_mirror
+dEQP-GLES2.functional.texture.mipmap.2d.basic.nearest_nearest_mirror_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_clamp
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_clamp_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_repeat
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_repeat_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_mirror
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_nearest_mirror_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_clamp
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_clamp_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_mirror
+dEQP-GLES2.functional.texture.mipmap.2d.basic.linear_linear_mirror_non_square
+dEQP-GLES2.functional.texture.mipmap.2d.affine.linear_linear_clamp
+dEQP-GLES2.functional.texture.mipmap.2d.affine.linear_linear_mirror
+dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_nearest_clamp
+dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_nearest_repeat
+dEQP-GLES2.functional.texture.mipmap.2d.projected.nearest_nearest_mirror
+dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_nearest_clamp
+dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_nearest_repeat
+dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_nearest_mirror
+dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_linear_clamp
+dEQP-GLES2.functional.texture.mipmap.2d.projected.linear_linear_mirror
+dEQP-GLES2.functional.texture.mipmap.2d.bias.nearest_nearest
+dEQP-GLES2.functional.texture.mipmap.2d.bias.linear_nearest
+dEQP-GLES2.functional.texture.mipmap.2d.bias.nearest_linear
+dEQP-GLES2.functional.texture.mipmap.2d.bias.linear_linear
+dEQP-GLES2.functional.texture.mipmap.cube.basic.nearest_nearest
+dEQP-GLES2.functional.texture.mipmap.cube.basic.nearest_linear
+dEQP-GLES2.functional.texture.mipmap.cube.projected.nearest_nearest
+dEQP-GLES2.functional.texture.mipmap.cube.projected.nearest_linear
+dEQP-GLES2.functional.texture.mipmap.cube.bias.nearest_nearest
+dEQP-GLES2.functional.texture.mipmap.cube.bias.nearest_linear
+
+#VK-GL-CTS 372
+dEQP-GLES2.functional.attribute_location.bind_aliasing.max_cond*
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles2-hw-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles2-hw-issues.txt
new file mode 100644
index 0000000..0824791
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles2-hw-issues.txt
@@ -0,0 +1,24 @@
+#VK-GL-CTS 309
+dEQP-GLES2.functional.polygon_offset.default_result_depth_clamp
+dEQP-GLES2.functional.polygon_offset.default_factor_1_slope
+dEQP-GLES2.functional.polygon_offset.fixed16_result_depth_clamp
+dEQP-GLES2.functional.polygon_offset.fixed16_factor_1_slope
+
+#VK-GL-CTS 370
+dEQP-GLES2.functional.fragment_ops.depth_stencil.stencil_ops.*
+
+#VK-GL-CTS 373
+dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.mat4_mat2_vertex
+dEQP-GLES2.functional.uniform_api.info_query.nested_structs_arrays.mat4_mat2_both
+dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.mat4_mat2_vertex
+dEQP-GLES2.functional.uniform_api.value.initial.get_uniform.nested_structs_arrays.mat4_mat2_both
+dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.mat4_mat2_vertex
+dEQP-GLES2.functional.uniform_api.value.initial.render.nested_structs_arrays.mat4_mat2_both
+dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_vertex
+dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.nested_structs_arrays.mat4_mat2_both
+dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.mat4_mat2_vertex
+dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.nested_structs_arrays.mat4_mat2_both
+
+#VK-GL-CTS 374
+dEQP-GLES2.functional.polygon_offset.default_render_with_units
+dEQP-GLES2.functional.polygon_offset.fixed16_render_with_units
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-driver-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-driver-issues.txt
new file mode 100644
index 0000000..a77c07e
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-driver-issues.txt
@@ -0,0 +1,19 @@
+#VK-GL-CTS 231
+dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.line_2_vertex
+dEQP-GLES3.functional.shaders.preprocessor.predefined_macros.line_2_fragment
+
+#VK-GL-CTS 349
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_x
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_y
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_dst_x
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_dst_y
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_dst_x
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_mag_reverse_src_dst_y
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_x
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_y
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_dst_x
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_dst_y
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_dst_x
+dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_out_of_bounds_min_reverse_src_dst_y
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-hw-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-hw-issues.txt
new file mode 100644
index 0000000..ef22feb
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-hw-issues.txt
@@ -0,0 +1,13 @@
+#VK-GL-CTS 309
+dEQP-GLES3.functional.polygon_offset.default_result_depth_clamp
+dEQP-GLES3.functional.polygon_offset.default_factor_1_slope
+dEQP-GLES3.functional.polygon_offset.fixed16_result_depth_clamp
+dEQP-GLES3.functional.polygon_offset.fixed16_factor_1_slope
+dEQP-GLES3.functional.polygon_offset.fixed24_result_depth_clamp
+dEQP-GLES3.functional.polygon_offset.fixed24_factor_1_slope
+dEQP-GLES3.functional.polygon_offset.float32_result_depth_clamp
+dEQP-GLES3.functional.polygon_offset.float32_factor_1_slope
+
+#VK-GL-CTS 310
+dEQP-GLES3.functional.texture.mipmap.cube.max_lod.linear_nearest
+dEQP-GLES3.functional.texture.mipmap.cube.max_lod.linear_linear
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-multisample-hw-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-multisample-hw-issues.txt
new file mode 100644
index 0000000..152c720
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles3-multisample-hw-issues.txt
@@ -0,0 +1,3 @@
+#VK-GL-CTS 309
+dEQP-GLES3.functional.polygon_offset.default_result_depth_clamp
+dEQP-GLES3.functional.polygon_offset.default_factor_1_slope
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-driver-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-driver-issues.txt
new file mode 100644
index 0000000..a680171
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-driver-issues.txt
@@ -0,0 +1,13 @@
+#VK-GL-CTS 307
+dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.min.highp_compute.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.max.highp_compute.vec4
+dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.scalar
+dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.vec2
+dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.vec3
+dEQP-GLES31.functional.shaders.builtin_functions.precision.clamp.highp_compute.vec4
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-hw-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-hw-issues.txt
new file mode 100644
index 0000000..3f08e66
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-hw-issues.txt
@@ -0,0 +1,20 @@
+#VK-GL-CTS 312
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_less.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_pot.compare_greater.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_less.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.clamp_to_edge_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.repeat_mirrored_repeat
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.size_npot.compare_greater.mirrored_repeat_clamp_to_edge
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_nearest_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_nearest_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.filter_mode.min_linear_mipmap_linear_mag_linear
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.base_level.level_1
+dEQP-GLES31.functional.texture.gather.basic.cube.depth32f.base_level.level_2
diff --git a/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-multisample-test-issues.txt b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-multisample-test-issues.txt
new file mode 100644
index 0000000..8b9a183
--- /dev/null
+++ b/external/openglcts/data/mustpass/gles/aosp_mustpass/master/src/gles31-multisample-test-issues.txt
@@ -0,0 +1,7 @@
+#VK-GL-CTS 293
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_separate_grid_1000x1000_drawcount_5000
+dEQP-GLES31.functional.draw_indirect.compute_interop.large.drawelements_combined_grid_1000x1000_drawcount_5000
+
+# Bug 20453509
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.consistency.*
+dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_centroid.array_element.*
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles3-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles3-khr-master.txt
index abf2826..96f2957 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles3-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles3-khr-master.txt
@@ -2579,6 +2579,654 @@
KHR-GLES3.shaders.uniform_block.random.all_shared_buffer.19
KHR-GLES3.shaders.uniform_block.common.precision_matching
KHR-GLES3.shaders.uniform_block.common.name_matching
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GLES3.shaders.shader_integer_mix.define
KHR-GLES3.shaders.shader_integer_mix.prototypes-extension
KHR-GLES3.shaders.shader_integer_mix.prototypes
@@ -3252,19 +3900,68 @@
KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES3.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES3.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES3.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES3.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES3.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES3.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES3.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES3.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES3.core.internalformat.texture2d.red_float_r32f
+KHR-GLES3.core.internalformat.texture2d.red_float_r16f
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES3.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES3.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES3.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES3.core.internalformat.copy_tex_image.rgb
KHR-GLES3.core.internalformat.copy_tex_image.rgba
KHR-GLES3.core.internalformat.copy_tex_image.alpha
@@ -3275,9 +3972,15 @@
KHR-GLES3.core.internalformat.copy_tex_image.rgb565
KHR-GLES3.core.internalformat.copy_tex_image.rgba8
KHR-GLES3.core.internalformat.copy_tex_image.rgb8
+KHR-GLES3.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES3.core.internalformat.copy_tex_image.srgb8
+KHR-GLES3.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES3.core.internalformat.renderbuffer.rgba8
KHR-GLES3.core.internalformat.renderbuffer.rgb8
KHR-GLES3.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES3.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES3.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES3.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES3.core.nearest_edge.offset_left
KHR-GLES3.core.nearest_edge.offset_right
KHR-GLES3.parallel_shader_compile.simple_queries
@@ -3479,6 +4182,20 @@
KHR-GLES3.packed_depth_stencil.blit.depth32f_stencil8
KHR-GLES3.packed_depth_stencil.stencil_texturing.depth24_stencil8
KHR-GLES3.packed_depth_stencil.stencil_texturing.depth32f_stencil8
+KHR-GLES3.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES3.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES3.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES3.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES3.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES3.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES3.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES3.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES3.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES3.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES3.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES3.framebuffer_completeness.status_tracking
+KHR-GLES3.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES3.framebuffer_completeness.immutable_texture_any_level_as_attachment
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_texture2d
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_cubemap_negx
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_cubemap_negy
@@ -3619,3 +4336,21 @@
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posx
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posy
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posz
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_decimal
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_base8
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_base16
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_decimal
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_base8
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_base16
+KHR-GLES3.number_parsing.unsigned_integer_max_value_decimal
+KHR-GLES3.number_parsing.unsigned_integer_max_value_base8
+KHR-GLES3.number_parsing.unsigned_integer_max_value_base16
+KHR-GLES3.number_parsing.unsigned_integer_too_large_value_invalid
+KHR-GLES3.number_parsing.unsigned_integer_negative_value_as_uint
+KHR-GLES3.number_parsing.float_out_of_range_as_infinity
+KHR-GLES3.number_parsing.float_out_of_range_as_zero
+KHR-GLES3.number_parsing.float_no_limit_on_number_of_digits_positive_exponent
+KHR-GLES3.number_parsing.float_no_limit_on_number_of_digits_negative_exponent
+KHR-GLES3.number_parsing.float_slightly_out_of_range_exponent_as_positive_infinity
+KHR-GLES3.number_parsing.float_overflow_to_positive_infinity
+KHR-GLES3.number_parsing.float_overflow_to_negative_infinity
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles31-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles31-khr-master.txt
index 67bc003..bda186f 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles31-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles31-khr-master.txt
@@ -2282,19 +2282,68 @@
KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES31.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES31.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES31.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES31.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES31.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES31.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES31.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES31.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES31.core.internalformat.texture2d.red_float_r32f
+KHR-GLES31.core.internalformat.texture2d.red_float_r16f
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES31.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES31.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES31.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES31.core.internalformat.copy_tex_image.rgb
KHR-GLES31.core.internalformat.copy_tex_image.rgba
KHR-GLES31.core.internalformat.copy_tex_image.alpha
@@ -2305,11 +2354,32 @@
KHR-GLES31.core.internalformat.copy_tex_image.rgb565
KHR-GLES31.core.internalformat.copy_tex_image.rgba8
KHR-GLES31.core.internalformat.copy_tex_image.rgb8
+KHR-GLES31.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES31.core.internalformat.copy_tex_image.srgb8
+KHR-GLES31.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES31.core.internalformat.renderbuffer.rgba8
KHR-GLES31.core.internalformat.renderbuffer.rgb8
KHR-GLES31.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES31.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES31.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES31.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES31.core.nearest_edge.offset_left
KHR-GLES31.core.nearest_edge.offset_right
+KHR-GLES31.core.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES31.core.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES31.core.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES31.core.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES31.core.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES31.core.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES31.core.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES31.core.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES31.core.framebuffer_completeness.expect_equal_numsamples
+KHR-GLES31.core.framebuffer_completeness.status_tracking
+KHR-GLES31.core.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES31.core.framebuffer_completeness.immutable_texture_any_level_as_attachment
KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles32-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles32-khr-master.txt
index aeda3ad..9070aec 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles32-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.5.x/gles32-khr-master.txt
@@ -1048,19 +1048,68 @@
KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES32.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES32.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES32.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES32.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES32.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES32.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES32.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES32.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES32.core.internalformat.texture2d.red_float_r32f
+KHR-GLES32.core.internalformat.texture2d.red_float_r16f
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES32.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES32.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES32.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES32.core.internalformat.copy_tex_image.rgb
KHR-GLES32.core.internalformat.copy_tex_image.rgba
KHR-GLES32.core.internalformat.copy_tex_image.alpha
@@ -1071,9 +1120,15 @@
KHR-GLES32.core.internalformat.copy_tex_image.rgb565
KHR-GLES32.core.internalformat.copy_tex_image.rgba8
KHR-GLES32.core.internalformat.copy_tex_image.rgb8
+KHR-GLES32.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES32.core.internalformat.copy_tex_image.srgb8
+KHR-GLES32.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES32.core.internalformat.renderbuffer.rgba8
KHR-GLES32.core.internalformat.renderbuffer.rgb8
KHR-GLES32.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES32.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES32.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES32.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES32.core.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GLES32.core.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GLES32.core.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
@@ -1091,3 +1146,18 @@
KHR-GLES32.core.ext_texture_shadow_lod.texturelodoffset.sampler2darrayshadow_fragment
KHR-GLES32.core.nearest_edge.offset_left
KHR-GLES32.core.nearest_edge.offset_right
+KHR-GLES32.core.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES32.core.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES32.core.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES32.core.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES32.core.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES32.core.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES32.core.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES32.core.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES32.core.framebuffer_completeness.expect_equal_numsamples
+KHR-GLES32.core.framebuffer_completeness.status_tracking
+KHR-GLES32.core.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES32.core.framebuffer_completeness.immutable_texture_any_level_as_attachment
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles3-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles3-khr-master.txt
index abf2826..96f2957 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles3-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles3-khr-master.txt
@@ -2579,6 +2579,654 @@
KHR-GLES3.shaders.uniform_block.random.all_shared_buffer.19
KHR-GLES3.shaders.uniform_block.common.precision_matching
KHR-GLES3.shaders.uniform_block.common.name_matching
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GLES3.shaders.shader_integer_mix.define
KHR-GLES3.shaders.shader_integer_mix.prototypes-extension
KHR-GLES3.shaders.shader_integer_mix.prototypes
@@ -3252,19 +3900,68 @@
KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES3.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES3.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES3.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES3.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES3.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES3.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES3.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES3.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES3.core.internalformat.texture2d.red_float_r32f
+KHR-GLES3.core.internalformat.texture2d.red_float_r16f
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES3.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES3.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES3.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES3.core.internalformat.copy_tex_image.rgb
KHR-GLES3.core.internalformat.copy_tex_image.rgba
KHR-GLES3.core.internalformat.copy_tex_image.alpha
@@ -3275,9 +3972,15 @@
KHR-GLES3.core.internalformat.copy_tex_image.rgb565
KHR-GLES3.core.internalformat.copy_tex_image.rgba8
KHR-GLES3.core.internalformat.copy_tex_image.rgb8
+KHR-GLES3.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES3.core.internalformat.copy_tex_image.srgb8
+KHR-GLES3.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES3.core.internalformat.renderbuffer.rgba8
KHR-GLES3.core.internalformat.renderbuffer.rgb8
KHR-GLES3.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES3.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES3.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES3.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES3.core.nearest_edge.offset_left
KHR-GLES3.core.nearest_edge.offset_right
KHR-GLES3.parallel_shader_compile.simple_queries
@@ -3479,6 +4182,20 @@
KHR-GLES3.packed_depth_stencil.blit.depth32f_stencil8
KHR-GLES3.packed_depth_stencil.stencil_texturing.depth24_stencil8
KHR-GLES3.packed_depth_stencil.stencil_texturing.depth32f_stencil8
+KHR-GLES3.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES3.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES3.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES3.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES3.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES3.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES3.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES3.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES3.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES3.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES3.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES3.framebuffer_completeness.status_tracking
+KHR-GLES3.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES3.framebuffer_completeness.immutable_texture_any_level_as_attachment
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_texture2d
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_cubemap_negx
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_cubemap_negy
@@ -3619,3 +4336,21 @@
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posx
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posy
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posz
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_decimal
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_base8
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_base16
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_decimal
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_base8
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_base16
+KHR-GLES3.number_parsing.unsigned_integer_max_value_decimal
+KHR-GLES3.number_parsing.unsigned_integer_max_value_base8
+KHR-GLES3.number_parsing.unsigned_integer_max_value_base16
+KHR-GLES3.number_parsing.unsigned_integer_too_large_value_invalid
+KHR-GLES3.number_parsing.unsigned_integer_negative_value_as_uint
+KHR-GLES3.number_parsing.float_out_of_range_as_infinity
+KHR-GLES3.number_parsing.float_out_of_range_as_zero
+KHR-GLES3.number_parsing.float_no_limit_on_number_of_digits_positive_exponent
+KHR-GLES3.number_parsing.float_no_limit_on_number_of_digits_negative_exponent
+KHR-GLES3.number_parsing.float_slightly_out_of_range_exponent_as_positive_infinity
+KHR-GLES3.number_parsing.float_overflow_to_positive_infinity
+KHR-GLES3.number_parsing.float_overflow_to_negative_infinity
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles31-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles31-khr-master.txt
index 67bc003..bda186f 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles31-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles31-khr-master.txt
@@ -2282,19 +2282,68 @@
KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES31.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES31.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES31.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES31.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES31.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES31.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES31.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES31.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES31.core.internalformat.texture2d.red_float_r32f
+KHR-GLES31.core.internalformat.texture2d.red_float_r16f
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES31.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES31.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES31.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES31.core.internalformat.copy_tex_image.rgb
KHR-GLES31.core.internalformat.copy_tex_image.rgba
KHR-GLES31.core.internalformat.copy_tex_image.alpha
@@ -2305,11 +2354,32 @@
KHR-GLES31.core.internalformat.copy_tex_image.rgb565
KHR-GLES31.core.internalformat.copy_tex_image.rgba8
KHR-GLES31.core.internalformat.copy_tex_image.rgb8
+KHR-GLES31.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES31.core.internalformat.copy_tex_image.srgb8
+KHR-GLES31.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES31.core.internalformat.renderbuffer.rgba8
KHR-GLES31.core.internalformat.renderbuffer.rgb8
KHR-GLES31.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES31.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES31.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES31.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES31.core.nearest_edge.offset_left
KHR-GLES31.core.nearest_edge.offset_right
+KHR-GLES31.core.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES31.core.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES31.core.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES31.core.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES31.core.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES31.core.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES31.core.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES31.core.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES31.core.framebuffer_completeness.expect_equal_numsamples
+KHR-GLES31.core.framebuffer_completeness.status_tracking
+KHR-GLES31.core.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES31.core.framebuffer_completeness.immutable_texture_any_level_as_attachment
KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles32-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles32-khr-master.txt
index aeda3ad..9070aec 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles32-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/3.2.6.x/gles32-khr-master.txt
@@ -1048,19 +1048,68 @@
KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES32.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES32.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES32.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES32.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES32.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES32.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES32.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES32.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES32.core.internalformat.texture2d.red_float_r32f
+KHR-GLES32.core.internalformat.texture2d.red_float_r16f
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES32.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES32.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES32.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES32.core.internalformat.copy_tex_image.rgb
KHR-GLES32.core.internalformat.copy_tex_image.rgba
KHR-GLES32.core.internalformat.copy_tex_image.alpha
@@ -1071,9 +1120,15 @@
KHR-GLES32.core.internalformat.copy_tex_image.rgb565
KHR-GLES32.core.internalformat.copy_tex_image.rgba8
KHR-GLES32.core.internalformat.copy_tex_image.rgb8
+KHR-GLES32.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES32.core.internalformat.copy_tex_image.srgb8
+KHR-GLES32.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES32.core.internalformat.renderbuffer.rgba8
KHR-GLES32.core.internalformat.renderbuffer.rgb8
KHR-GLES32.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES32.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES32.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES32.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES32.core.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GLES32.core.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GLES32.core.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
@@ -1091,3 +1146,18 @@
KHR-GLES32.core.ext_texture_shadow_lod.texturelodoffset.sampler2darrayshadow_fragment
KHR-GLES32.core.nearest_edge.offset_left
KHR-GLES32.core.nearest_edge.offset_right
+KHR-GLES32.core.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES32.core.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES32.core.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES32.core.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES32.core.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES32.core.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES32.core.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES32.core.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES32.core.framebuffer_completeness.expect_equal_numsamples
+KHR-GLES32.core.framebuffer_completeness.status_tracking
+KHR-GLES32.core.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES32.core.framebuffer_completeness.immutable_texture_any_level_as_attachment
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles3-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles3-khr-master.txt
index abf2826..96f2957 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles3-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles3-khr-master.txt
@@ -2579,6 +2579,654 @@
KHR-GLES3.shaders.uniform_block.random.all_shared_buffer.19
KHR-GLES3.shaders.uniform_block.common.precision_matching
KHR-GLES3.shaders.uniform_block.common.name_matching
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec2_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec3_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat2x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat3x4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x2_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_float_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.vec4_from_float_mat4x3_float_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec2_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec3_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat2x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat3x4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x2_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.ivec4_from_int_mat4x3_int_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec2_from_bool_mat4x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec3_from_bool_mat4x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_mat2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2_mat2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x3_mat2x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat2x4_mat2x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_mat3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3_mat3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x2_mat3x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat3x4_mat3x4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_mat4_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4_mat4_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x2_mat4x2_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_mat4x3_mat4x3_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat2x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat3x4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x2_bool_invalid_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_fs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_vs
+KHR-GLES3.shaders.glsl_constructors.bvec4_from_bool_mat4x3_bool_invalid_fs
KHR-GLES3.shaders.shader_integer_mix.define
KHR-GLES3.shaders.shader_integer_mix.prototypes-extension
KHR-GLES3.shaders.shader_integer_mix.prototypes
@@ -3252,19 +3900,68 @@
KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES3.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES3.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES3.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES3.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES3.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES3.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES3.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES3.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES3.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES3.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES3.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES3.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES3.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES3.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES3.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES3.core.internalformat.texture2d.red_float_r32f
+KHR-GLES3.core.internalformat.texture2d.red_float_r16f
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES3.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES3.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES3.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES3.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES3.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES3.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES3.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES3.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES3.core.internalformat.copy_tex_image.rgb
KHR-GLES3.core.internalformat.copy_tex_image.rgba
KHR-GLES3.core.internalformat.copy_tex_image.alpha
@@ -3275,9 +3972,15 @@
KHR-GLES3.core.internalformat.copy_tex_image.rgb565
KHR-GLES3.core.internalformat.copy_tex_image.rgba8
KHR-GLES3.core.internalformat.copy_tex_image.rgb8
+KHR-GLES3.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES3.core.internalformat.copy_tex_image.srgb8
+KHR-GLES3.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES3.core.internalformat.renderbuffer.rgba8
KHR-GLES3.core.internalformat.renderbuffer.rgb8
KHR-GLES3.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES3.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES3.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES3.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES3.core.nearest_edge.offset_left
KHR-GLES3.core.nearest_edge.offset_right
KHR-GLES3.parallel_shader_compile.simple_queries
@@ -3479,6 +4182,20 @@
KHR-GLES3.packed_depth_stencil.blit.depth32f_stencil8
KHR-GLES3.packed_depth_stencil.stencil_texturing.depth24_stencil8
KHR-GLES3.packed_depth_stencil.stencil_texturing.depth32f_stencil8
+KHR-GLES3.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES3.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES3.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES3.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES3.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES3.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES3.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES3.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES3.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES3.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES3.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES3.framebuffer_completeness.status_tracking
+KHR-GLES3.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES3.framebuffer_completeness.immutable_texture_any_level_as_attachment
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_texture2d
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_cubemap_negx
KHR-GLES3.copy_tex_image_conversions.forbidden.texture2d_cubemap_negy
@@ -3619,3 +4336,21 @@
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posx
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posy
KHR-GLES3.copy_tex_image_conversions.required.renderbuffer_cubemap_posz
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_decimal
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_base8
+KHR-GLES3.number_parsing.unsigned_integer_above_signed_range_base16
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_decimal
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_base8
+KHR-GLES3.number_parsing.unsigned_integer_smallest_value_above_signed_range_base16
+KHR-GLES3.number_parsing.unsigned_integer_max_value_decimal
+KHR-GLES3.number_parsing.unsigned_integer_max_value_base8
+KHR-GLES3.number_parsing.unsigned_integer_max_value_base16
+KHR-GLES3.number_parsing.unsigned_integer_too_large_value_invalid
+KHR-GLES3.number_parsing.unsigned_integer_negative_value_as_uint
+KHR-GLES3.number_parsing.float_out_of_range_as_infinity
+KHR-GLES3.number_parsing.float_out_of_range_as_zero
+KHR-GLES3.number_parsing.float_no_limit_on_number_of_digits_positive_exponent
+KHR-GLES3.number_parsing.float_no_limit_on_number_of_digits_negative_exponent
+KHR-GLES3.number_parsing.float_slightly_out_of_range_exponent_as_positive_infinity
+KHR-GLES3.number_parsing.float_overflow_to_positive_infinity
+KHR-GLES3.number_parsing.float_overflow_to_negative_infinity
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles31-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles31-khr-master.txt
index 67bc003..bda186f 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles31-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles31-khr-master.txt
@@ -2282,19 +2282,68 @@
KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES31.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES31.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES31.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES31.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES31.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES31.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES31.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES31.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES31.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES31.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES31.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES31.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES31.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES31.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES31.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES31.core.internalformat.texture2d.red_float_r32f
+KHR-GLES31.core.internalformat.texture2d.red_float_r16f
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES31.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES31.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES31.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES31.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES31.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES31.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES31.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES31.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES31.core.internalformat.copy_tex_image.rgb
KHR-GLES31.core.internalformat.copy_tex_image.rgba
KHR-GLES31.core.internalformat.copy_tex_image.alpha
@@ -2305,11 +2354,32 @@
KHR-GLES31.core.internalformat.copy_tex_image.rgb565
KHR-GLES31.core.internalformat.copy_tex_image.rgba8
KHR-GLES31.core.internalformat.copy_tex_image.rgb8
+KHR-GLES31.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES31.core.internalformat.copy_tex_image.srgb8
+KHR-GLES31.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES31.core.internalformat.renderbuffer.rgba8
KHR-GLES31.core.internalformat.renderbuffer.rgb8
KHR-GLES31.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES31.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES31.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES31.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES31.core.nearest_edge.offset_left
KHR-GLES31.core.nearest_edge.offset_right
+KHR-GLES31.core.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES31.core.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES31.core.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES31.core.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES31.core.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES31.core.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES31.core.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES31.core.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES31.core.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES31.core.framebuffer_completeness.expect_equal_numsamples
+KHR-GLES31.core.framebuffer_completeness.status_tracking
+KHR-GLES31.core.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES31.core.framebuffer_completeness.immutable_texture_any_level_as_attachment
KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_lines
KHR-GLES31.core.geometry_shader.adjacency.adjacency_indiced_lines
KHR-GLES31.core.geometry_shader.adjacency.adjacency_non_indiced_line_strip
diff --git a/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles32-khr-master.txt b/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles32-khr-master.txt
index aeda3ad..9070aec 100644
--- a/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles32-khr-master.txt
+++ b/external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles32-khr-master.txt
@@ -1048,19 +1048,68 @@
KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba32f
KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb32f_linear
KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba32f_linear
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
-KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
-KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba8
-KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgb5_a1
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_rgba4
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_byte_srgb8_alpha8
+KHR-GLES32.core.internalformat.texture2d.rgba_byte_rgba8_snorm
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_4_4_4_4_rgba4
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgb5_a1
KHR-GLES32.core.internalformat.texture2d.rgba_half_float_rgba16f
+KHR-GLES32.core.internalformat.texture2d.rgba_float_rgba16f
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_byte_rgba8ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_byte_rgba8i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_short_rgba16ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_short_rgba16i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_int_rgba32ui
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_int_rgba32i
+KHR-GLES32.core.internalformat.texture2d.rgba_integer_unsigned_int_2_10_10_10_rev_rgb10_a2ui
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb8
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_rgb565
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_byte_srgb8
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb565
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_int_10f_11f_11f_rev_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_int_5_9_9_9_rev_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_half_float_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb16f
+KHR-GLES32.core.internalformat.texture2d.rgb_float_r11f_g11f_b10f
+KHR-GLES32.core.internalformat.texture2d.rgb_float_rgb9_e5
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_byte_rgb8ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_byte_rgb8i
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_short_rgb16ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_short_rgb16i
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_unsigned_int_rgb32ui
+KHR-GLES32.core.internalformat.texture2d.rgb_integer_int_rgb32i
+KHR-GLES32.core.internalformat.texture2d.rg_unsigned_byte_rg8
+KHR-GLES32.core.internalformat.texture2d.rg_half_float_rg16f
+KHR-GLES32.core.internalformat.texture2d.rg_float_rg32f
+KHR-GLES32.core.internalformat.texture2d.rg_float_rg16f
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_byte_rg8ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_byte_rg8i
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_short_rg16ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_short_rg16i
+KHR-GLES32.core.internalformat.texture2d.rg_integer_unsigned_int_rg32ui
+KHR-GLES32.core.internalformat.texture2d.rg_integer_int_rg32i
+KHR-GLES32.core.internalformat.texture2d.red_unsigned_byte_r8
+KHR-GLES32.core.internalformat.texture2d.red_half_float_r16f
+KHR-GLES32.core.internalformat.texture2d.red_float_r32f
+KHR-GLES32.core.internalformat.texture2d.red_float_r16f
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_byte_r8ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_byte_r8i
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_short_r16ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_short_r16i
+KHR-GLES32.core.internalformat.texture2d.red_integer_unsigned_int_r32ui
+KHR-GLES32.core.internalformat.texture2d.red_integer_int_r32i
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_short_depth_component16
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_int_depth_component24
+KHR-GLES32.core.internalformat.texture2d.depth_component_unsigned_int_depth_component16
+KHR-GLES32.core.internalformat.texture2d.depth_component_float_depth_component32f
KHR-GLES32.core.internalformat.texture2d.depth_stencil_unsigned_int_24_8_depth24_stencil8
+KHR-GLES32.core.internalformat.texture2d.depth_stencil_float_32_unsigned_int_24_8_rev_depth32f_stencil8
+KHR-GLES32.core.internalformat.texture2d.rgba_unsigned_short_5_5_5_1_rgba
+KHR-GLES32.core.internalformat.texture2d.rgb_unsigned_short_5_6_5_rgb
KHR-GLES32.core.internalformat.copy_tex_image.rgb
KHR-GLES32.core.internalformat.copy_tex_image.rgba
KHR-GLES32.core.internalformat.copy_tex_image.alpha
@@ -1071,9 +1120,15 @@
KHR-GLES32.core.internalformat.copy_tex_image.rgb565
KHR-GLES32.core.internalformat.copy_tex_image.rgba8
KHR-GLES32.core.internalformat.copy_tex_image.rgb8
+KHR-GLES32.core.internalformat.copy_tex_image.srgb8_alpha8
+KHR-GLES32.core.internalformat.copy_tex_image.srgb8
+KHR-GLES32.core.internalformat.copy_tex_image.r11f_g11f_b10f
KHR-GLES32.core.internalformat.renderbuffer.rgba8
KHR-GLES32.core.internalformat.renderbuffer.rgb8
KHR-GLES32.core.internalformat.renderbuffer.rgb5_a1
+KHR-GLES32.core.internalformat.renderbuffer.srgb8_alpha8
+KHR-GLES32.core.internalformat.renderbuffer.depth_component32f
+KHR-GLES32.core.internalformat.renderbuffer.depth32f_stencil8
KHR-GLES32.core.ext_texture_shadow_lod.texture.sampler2darrayshadow_fragment
KHR-GLES32.core.ext_texture_shadow_lod.texture.sampler2darrayshadow_bias_fragment
KHR-GLES32.core.ext_texture_shadow_lod.texture.samplercubearrayshadow_vertex
@@ -1091,3 +1146,18 @@
KHR-GLES32.core.ext_texture_shadow_lod.texturelodoffset.sampler2darrayshadow_fragment
KHR-GLES32.core.nearest_edge.offset_left
KHR-GLES32.core.nearest_edge.offset_right
+KHR-GLES32.core.framebuffer_completeness.incomplete_missing_attachment
+KHR-GLES32.core.framebuffer_completeness.incomplete_image_zero_width
+KHR-GLES32.core.framebuffer_completeness.incomplete_image_zero_height
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_3d_layer_oob
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_2d_layer_oob
+KHR-GLES32.core.framebuffer_completeness.incomplete_texture_2d_mm_layer_oob
+KHR-GLES32.core.framebuffer_completeness.mutable_nbl_texture_expect_mipmap_complete
+KHR-GLES32.core.framebuffer_completeness.mutable_nbl_texture_expect_cube_complete
+KHR-GLES32.core.framebuffer_completeness.expect_renderable_internal_format
+KHR-GLES32.core.framebuffer_completeness.all_rbos_expect_same_numsamples
+KHR-GLES32.core.framebuffer_completeness.rbo_and_texture_expect_zero_numsamples
+KHR-GLES32.core.framebuffer_completeness.expect_equal_numsamples
+KHR-GLES32.core.framebuffer_completeness.status_tracking
+KHR-GLES32.core.framebuffer_completeness.mutable_texture_missing_attachment_level
+KHR-GLES32.core.framebuffer_completeness.immutable_texture_any_level_as_attachment
diff --git a/external/openglcts/data/mustpass/waivers/waivers.xml b/external/openglcts/data/mustpass/waivers/waivers.xml
index a0136d1a..0237556 100644
--- a/external/openglcts/data/mustpass/waivers/waivers.xml
+++ b/external/openglcts/data/mustpass/waivers/waivers.xml
@@ -17,6 +17,7 @@
*/-->
<!--/*
Each <waiver> entry must contain vendor and url string attributes.
+ Vendor string can use wildcard *.
Url should be a full path to gitlab issue(s).
Waiver tag should contain one <description> child that describes issue.
Waiver tag should containing one <renderer_list> child.
@@ -64,8 +65,7 @@
<t>KHR-GL45.texture_view.view_classes</t>
<t>KHR-GL46.texture_view.view_classes</t>
</waiver>
-
- <waiver vendor="Google Inc." url="https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/2237">
+ <waiver vendor="Google*" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/2237">
<description>ANGLE is unable to capture individual array elements in transform feedback using VK_EXT_transform_feedback revision 1.</description>
<renderer_list>
<r>ANGLE (Vulkan*</r>
@@ -76,7 +76,6 @@
<t>dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.*.array.*</t>
<t>KHR-GLES31.core.program_interface_query.transform-feedback-types</t>
</waiver>
-
<waiver vendor="Intel" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/2601">
<description>Testing of wide-line attribute interpolation is too strict</description>
<renderer_list>
@@ -98,16 +97,4 @@
<t>dEQP-GLES3.functional.rasterization.interpolation.projected.lines_wide</t>
</waiver>
- <waiver vendor="Google Inc." url="https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/2237">
- <description>ANGLE is unable to capture individual array elements in transform feedback using VK_EXT_transform_feedback revision 1.</description>
- <renderer_list>
- <r>ANGLE (Vulkan*</r>
- </renderer_list>
- <t>dEQP-GLES3.functional.transform_feedback.array_element.*</t>
- <t>dEQP-GLES3.functional.transform_feedback.random.*</t>
- <t>dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.*_array_element</t>
- <t>dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.*.array.*</t>
- <t>KHR-GLES31.core.program_interface_query.transform-feedback-types</t>
- </waiver>
-
</waiver_list>
diff --git a/external/openglcts/modules/common/CMakeLists.txt b/external/openglcts/modules/common/CMakeLists.txt
index fb9c37d..51741f7 100644
--- a/external/openglcts/modules/common/CMakeLists.txt
+++ b/external/openglcts/modules/common/CMakeLists.txt
@@ -115,6 +115,10 @@
glcLimitTest.inl
glcLimitTest.hpp
glcWaiver.hpp
+ glcGLSLVectorConstructorTests.cpp
+ glcGLSLVectorConstructorTests.hpp
+ glcFramebufferCompleteness.cpp
+ glcFramebufferCompleteness.hpp
)
set(GLCTS_COMMON_LIBS
diff --git a/external/openglcts/modules/common/glcFramebufferCompleteness.cpp b/external/openglcts/modules/common/glcFramebufferCompleteness.cpp
new file mode 100644
index 0000000..ec13254
--- /dev/null
+++ b/external/openglcts/modules/common/glcFramebufferCompleteness.cpp
@@ -0,0 +1,1338 @@
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2021 Google Inc.
+ * Copyright (c) 2021 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 glcFramebuffercompleteness.cpp
+ * \brief Tests for OpenGL ES frame buffer completeness
+ *//*--------------------------------------------------------------------*/
+#include "glcFramebufferCompleteness.hpp"
+#include "deInt32.h"
+#include "gluDefs.hpp"
+#include "gluContextInfo.hpp"
+#include "glwEnums.hpp"
+#include "glwFunctions.hpp"
+#include "tcuStringTemplate.hpp"
+
+#include <algorithm>
+#include <functional>
+#include <map>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <vector>
+
+namespace glcts
+{
+namespace
+{
+
+using namespace glw;
+using namespace std;
+
+struct TestContext
+{
+ const glu::RenderContext& renderContext;
+ const glw::Functions& gl;
+ vector<GLuint>& fboIds;
+ vector<GLuint>& texIds;
+ vector<GLuint>& rboIds;
+
+ void texParameteri (GLuint texId, GLenum target, GLenum pname, GLint parameter);
+ void bindTexture (GLenum target, GLuint texId);
+ void texImage2D (GLenum target, GLuint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border,
+ GLenum format, GLenum type, const void* data);
+ void texImage2D (GLuint texId, GLenum target, GLuint level, GLint internalFormat, GLsizei width, GLsizei height,
+ GLint border, GLenum format, GLenum type, const void* data);
+ void texImage3D (GLuint texId, GLenum target, GLuint level, GLint internalFormat, GLsizei width, GLsizei height,
+ GLsizei depth, GLint border, GLenum format, GLenum type, const void* data);
+ void renderbufferStorage (GLuint rboId, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height);
+ void renderbufferStorageMultisample (GLuint rboId, GLenum target, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height);
+ void bindFramebuffer (GLenum target, GLuint fboId);
+ void framebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texId, GLint level);
+ void framebufferTextureLayer (GLenum target, GLenum attachment, GLuint texId, GLint level, GLint layer);
+ void framebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint rboId);
+};
+
+void TestContext::texParameteri(GLuint texId, GLenum target, GLenum pname, GLint parameter)
+{
+ bindTexture(target, texId);
+ gl.texParameteri(target, pname, parameter);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri() failed");
+ bindTexture(target, 0);
+}
+
+void TestContext::bindTexture(GLenum target, GLuint texId)
+{
+ gl.bindTexture(target, texId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed");
+}
+
+void TestContext::texImage2D(GLenum target, GLuint level, GLint internalFormat, GLsizei width, GLsizei height,
+ GLint border, GLenum format, GLenum type, const void* data)
+{
+ gl.texImage2D(target, level, internalFormat, width, height, border, format, type, data);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D() failed");
+}
+
+void TestContext::texImage2D(GLuint texId, GLenum target, GLuint level, GLint internalFormat, GLsizei width,
+ GLsizei height, GLint border, GLenum format, GLenum type, const void* data)
+{
+ bindTexture(target, texId);
+ texImage2D(target, level, internalFormat, width, height, border, format, type, data);
+ bindTexture(target, 0);
+}
+
+void TestContext::texImage3D(GLuint texId, GLenum target, GLuint level, GLint internalFormat, GLsizei width,
+ GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* data)
+{
+ bindTexture(target, texId);
+ gl.texImage3D(target, level, internalFormat, width, height, depth, border, format, type, data);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D() failed");
+ bindTexture(target, 0);
+}
+
+void TestContext::renderbufferStorage(GLuint rboId, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height)
+{
+ gl.bindRenderbuffer(GL_RENDERBUFFER, rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer() failed");
+ gl.renderbufferStorage(target, internalFormat, width, height);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glRenderbufferStorage() failed");
+ gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer() failed");
+}
+
+void TestContext::renderbufferStorageMultisample(GLuint rboId, GLenum target, GLsizei samples, GLenum internalFormat,
+ GLsizei width, GLsizei height)
+{
+ gl.bindRenderbuffer(GL_RENDERBUFFER, rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer() failed");
+ gl.renderbufferStorageMultisample(target, samples, internalFormat, width, height);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glRenderbufferStorageMultisample() failed");
+ gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer() failed");
+}
+
+void TestContext::bindFramebuffer(GLenum target, GLuint fboId)
+{
+ gl.bindFramebuffer(target, fboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer() failed");
+}
+
+void TestContext::framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texId, GLint level)
+{
+ gl.framebufferTexture2D(target, attachment, textarget, texId, level);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D() failed");
+}
+
+void TestContext::framebufferTextureLayer(GLenum target, GLenum attachment, GLuint texId, GLint level, GLint layer)
+{
+ gl.framebufferTextureLayer(target, attachment, texId, level, layer);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTextureLayer() failed");
+}
+
+void TestContext::framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint rboId)
+{
+ gl.framebufferRenderbuffer(target, attachment, renderbuffertarget, rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferRenderbuffer() failed");
+}
+
+typedef function<GLenum(const glu::ContextInfo& contextInfo)> ExpectedStatusFn;
+typedef function<void(TestContext& context)> TestFn;
+
+ExpectedStatusFn expectedStatusConstant(GLenum expectedStatus)
+{
+ return [expectedStatus] (const glu::ContextInfo&) { return expectedStatus; };
+}
+
+ExpectedStatusFn expectedStatusWithExtension(const string& extension, GLenum statusIfSupported, GLenum statusIfNotSupported)
+{
+ return [extension, statusIfSupported, statusIfNotSupported](const glu::ContextInfo &contextInfo)
+ {
+ if (contextInfo.isExtensionSupported(extension.c_str()))
+ return statusIfSupported;
+ else
+ return statusIfNotSupported;
+ };
+}
+
+struct TestStep
+{
+ TestFn testFn;
+ ExpectedStatusFn expectedFbStatus;
+};
+
+typedef function<void(vector<TestStep>&, TestContext& context)> StepsGeneratorFn;
+
+struct ExtensionEntry
+{
+ string name;
+ bool supportedStatus;
+};
+
+struct TestParams
+{
+ string name;
+ string description;
+ glu::ApiType apiType;
+ size_t numFboIds;
+ size_t numTexIds;
+ size_t numRboIds;
+ vector<TestStep> initialSteps;
+ StepsGeneratorFn stepsGenerator;
+};
+
+const GLuint TEXTURE_WIDTH = 16;
+const GLuint TEXTURE_HEIGHT = 16;
+const GLuint TEXTURE_DEPTH = 16;
+
+static const GLenum cubemapTextureTargets[] =
+{
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_Z
+};
+
+const glu::ApiType apiES30 = glu::ApiType::es(3, 0);
+const glu::ApiType apiES31 = glu::ApiType::es(3, 1);
+
+bool isDifferentRboSampleCountsSupported(TestContext& testContext, GLint& maxSamples)
+{
+ const auto& gl = testContext.gl;
+ gl.getIntegerv(GL_MAX_SAMPLES, &maxSamples);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed");
+
+ if (maxSamples < 4)
+ TCU_FAIL("GL_MAX_SAMPLES needs to be >= 4");
+
+ testContext.renderbufferStorageMultisample(testContext.rboIds[0], GL_RENDERBUFFER, 1, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ gl.bindRenderbuffer(GL_RENDERBUFFER, testContext.rboIds[0]);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer() failed");
+
+ GLint minSamplesRbo;
+ gl.getRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &minSamplesRbo);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "getRenderbufferParameteriv() failed");
+ gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer() failed");
+
+ return minSamplesRbo < maxSamples;
+}
+
+bool isDifferentTextureSampleCountsSupported(TestContext& testContext, GLint& maxSamples)
+{
+ if (glu::contextSupports(testContext.renderContext.getType(), apiES31))
+ {
+ const auto& gl = testContext.gl;
+ GLint maxColorSamples;
+ gl.getIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &maxColorSamples);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed");
+
+ GLint maxDepthSamples;
+ gl.getIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &maxDepthSamples);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed");
+
+ maxSamples = min(maxColorSamples, maxDepthSamples);
+
+ GLuint tempTexId;
+ gl.genTextures(1, &tempTexId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed");
+
+ testContext.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, tempTexId);
+ gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_TRUE);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2DMultisample() failed");
+
+ GLint minSamplesTex;
+ gl.getTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_SAMPLES, &minSamplesTex);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv() failed");
+
+ testContext.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
+ gl.deleteTextures(1, &tempTexId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteTextures() failed");
+
+ return minSamplesTex < maxSamples;
+ }
+ return false;
+}
+
+/* Tests are defined as ordered series of steps that each expect a specific current framebuffer status
+ after being executed. A new TestContext instance (parameter) is created for each test but all steps
+ within a test use the same context. No code in addition to the framebuffer status check is executed
+ between steps. */
+const TestParams tests[] =
+{
+ {
+ "incomplete_missing_attachment", // string name
+ "No attachments", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 0, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context) {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "incomplete_image_zero_width", // string name
+ "Zero width attachment image", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 0, TEXTURE_HEIGHT, 0,
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, DE_NULL);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "incomplete_image_zero_height", // string name
+ "Zero height attachment image", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 0, TEXTURE_WIDTH, 0,
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, DE_NULL);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "incomplete_texture_3d_layer_oob", // string name
+ "3D texture layer out of bounds", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.texImage3D(context.texIds[0], GL_TEXTURE_3D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT,
+ TEXTURE_DEPTH, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.framebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, context.texIds[0], 0,
+ TEXTURE_DEPTH + 1);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "incomplete_texture_2d_layer_oob", // string name
+ "2D texture layer out of bounds", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 1);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "incomplete_texture_2d_mm_layer_oob", // string name
+ "2D mipmapped texture layer out of bounds", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 1, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 1);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ [](TestContext& context)
+ {
+ const deUint32 maxMipmapLevel = deLog2Floor32(de::max(TEXTURE_WIDTH, TEXTURE_HEIGHT));
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0],
+ maxMipmapLevel + 2);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "mutable_nbl_texture_expect_mipmap_complete", // string name
+ "Mutable non base level texture as framebuffer attachment must be mipmap complete", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ DE_ASSERT(TEXTURE_WIDTH >= 8 && TEXTURE_HEIGHT >= 8);
+
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 1, GL_RGBA8, TEXTURE_WIDTH >> 1,
+ TEXTURE_HEIGHT >> 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 3, GL_RGBA8, TEXTURE_WIDTH >> 3,
+ TEXTURE_HEIGHT >> 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 1);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 2, GL_RGBA8, TEXTURE_WIDTH >> 2,
+ TEXTURE_HEIGHT >> 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "mutable_nbl_texture_expect_cube_complete", // string name
+ "Mutable non base level texture as framebuffer attachment must be cube complete", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.texParameteri(context.texIds[0], GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 1);
+ context.texParameteri(context.texIds[0], GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+
+ context.bindTexture(GL_TEXTURE_CUBE_MAP, context.texIds[0]);
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(cubemapTextureTargets); ++i)
+ {
+ if (i % 2)
+ continue;
+ context.texImage2D(cubemapTextureTargets[i], 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, DE_NULL);
+ context.texImage2D(cubemapTextureTargets[i], 1, GL_RGBA8, TEXTURE_WIDTH >> 1, TEXTURE_HEIGHT >> 1, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, DE_NULL);
+ }
+ context.bindTexture(GL_TEXTURE_CUBE_MAP, 0);
+
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, cubemapTextureTargets[0],
+ context.texIds[0], 1);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.bindTexture(GL_TEXTURE_CUBE_MAP, context.texIds[0]);
+ for (size_t i = 0; i < DE_LENGTH_OF_ARRAY(cubemapTextureTargets); ++i)
+ {
+ if (i % 2 == 0)
+ continue;
+ context.texImage2D(cubemapTextureTargets[i], 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, DE_NULL);
+ context.texImage2D(cubemapTextureTargets[i], 1, GL_RGBA8, TEXTURE_WIDTH >> 1, TEXTURE_HEIGHT >> 1, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, DE_NULL);
+ }
+ context.bindTexture(GL_TEXTURE_CUBE_MAP, 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "expect_renderable_internal_format", // string name
+ "Color/Depth/Stencil attachment texture must have a color/depth/stencil" // string description
+ " renderable internal format",
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 3, // size_t numTexIds
+ 0, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.texImage2D(context.texIds[1], GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, DE_NULL);
+ context.texImage2D(context.texIds[2], GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, TEXTURE_WIDTH, TEXTURE_HEIGHT,
+ 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, DE_NULL);
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, context.texIds[1], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, context.texIds[2], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ }
+ },
+ [](vector<TestStep>& steps, TestContext& testContext) // StepsGeneratorFn stepsGenerator
+ {
+ GLint maxColorAttachmentsCount;
+ testContext.gl.getIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachmentsCount);
+ GLU_EXPECT_NO_ERROR(testContext.gl.getError(), "glGetInteger() failed");
+
+ steps.reserve(steps.size() + 2 * maxColorAttachmentsCount);
+ for (GLint i = 0; i < maxColorAttachmentsCount; ++i)
+ {
+ steps.push_back(
+ {
+ [i](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D,
+ context.texIds[1], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ });
+ steps.push_back(
+ {
+ [i](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D,
+ context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ });
+ }
+ },
+ },
+ {
+ "all_rbos_expect_same_numsamples", // string name
+ "Same value of FRAMEBUFFER_SAMPLES for all attached render buffers", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 0, // size_t numTexIds
+ 2, // size_t numRboIds
+ {}, // vector<TestStep> initialSteps
+ [](vector<TestStep>& steps, TestContext& testContext) // StepsGeneratorFn stepsGenerator
+ {
+ GLint maxSamples;
+ if (!isDifferentRboSampleCountsSupported(testContext, maxSamples))
+ return;
+
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.renderbufferStorage(context.rboIds[0], GL_RENDERBUFFER, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ context.renderbufferStorage(context.rboIds[1], GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT);
+
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+ context.rboIds[0]);
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
+ context.rboIds[1]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ });
+ steps.push_back(
+ {
+ [maxSamples](TestContext& context)
+ {
+ context.renderbufferStorageMultisample(context.rboIds[0], GL_RENDERBUFFER, maxSamples, GL_RGBA8, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT);
+ context.renderbufferStorageMultisample(context.rboIds[1], GL_RENDERBUFFER, 1, GL_DEPTH24_STENCIL8,
+ TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
+ });
+ },
+ },
+ {
+ "rbo_and_texture_expect_zero_numsamples", // string name
+ "When using mixed renderbuffer and texture attachments, the value of" // string description
+ " FRAMEBUFFER_SAMPLES needs to be zero for all attached renderbuffers",
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 2, // size_t numTexIds
+ 2, // size_t u numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.renderbufferStorage(context.rboIds[0], GL_RENDERBUFFER, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ context.texImage2D(context.texIds[1], GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, DE_NULL);
+
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+ context.rboIds[0]);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
+ context.texIds[1], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.renderbufferStorage(context.rboIds[1], GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 0);
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
+ context.rboIds[1]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.renderbufferStorageMultisample(context.rboIds[1], GL_RENDERBUFFER, 2, GL_DEPTH24_STENCIL8,
+ TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ },
+ expectedStatusWithExtension("GL_NV_framebuffer_mixed_samples", GL_FRAMEBUFFER_COMPLETE, GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.renderbufferStorageMultisample(context.rboIds[0], GL_RENDERBUFFER, 3, GL_RGBA8, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT);
+
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+ context.rboIds[0]);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
+ context.texIds[1], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
+ },
+ {
+ [](TestContext& context)
+ {
+ context.renderbufferStorageMultisample(context.rboIds[0], GL_RENDERBUFFER, 0, GL_RGBA8, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "expect_equal_numsamples", // string name
+ "The value of samples for each attached target must be equal", // string description
+ apiES31, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 4, // size_t numTexIds
+ 2, // size_t numRboIds
+ {}, // vector<TestStep> initialSteps
+ [](vector<TestStep>& steps, TestContext& testContext) // StepsGeneratorFn stepsGenerator
+ {
+ GLint maxRboSamples, maxTextureSamples;
+ if (!isDifferentRboSampleCountsSupported(testContext, maxRboSamples) || !isDifferentTextureSampleCountsSupported(testContext, maxTextureSamples))
+ return;
+
+ steps.push_back(
+ {
+ [maxRboSamples, maxTextureSamples](TestContext& context)
+ {
+ // Set up textures and renderbuffers for all following steps, complete = (tex0, rbo1) or (tex1, rbo0) */
+ context.renderbufferStorageMultisample(context.rboIds[0], GL_RENDERBUFFER, maxRboSamples, GL_RGBA8,
+ TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ context.renderbufferStorageMultisample(context.rboIds[1], GL_RENDERBUFFER, 1, GL_DEPTH24_STENCIL8,
+ TEXTURE_WIDTH, TEXTURE_HEIGHT);
+
+ const auto& gl = context.gl;
+ context.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, context.texIds[0]);
+ gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_TRUE);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2DMultisample() failed");
+
+ context.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, context.texIds[1]);
+ gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_DEPTH24_STENCIL8, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_TRUE);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2DMultisample() failed");
+
+ context.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, context.texIds[2]);
+ gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxTextureSamples, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_TRUE);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2DMultisample() failed");
+
+ context.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, context.texIds[3]);
+ gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxTextureSamples, GL_DEPTH24_STENCIL8, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_TRUE);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2DMultisample() failed");
+
+ context.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
+
+ // Framebuffer binding for rest of this test
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
+ context.texIds[0], 0);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
+ context.texIds[1], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
+ context.texIds[3], 0);
+ },
+ expectedStatusWithExtension("GL_NV_framebuffer_mixed_samples", GL_FRAMEBUFFER_COMPLETE, GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
+ context.rboIds[1]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+ context.rboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
+ context.texIds[2], 0);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
+ context.texIds[3], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ const auto& gl = context.gl;
+ gl.deleteTextures(1, &context.texIds[0]);
+ GLU_EXPECT_NO_ERROR(context.gl.getError(), "glDeleteTextures() failed");
+ gl.genTextures(1, &context.texIds[0]);
+ GLU_EXPECT_NO_ERROR(context.gl.getError(), "glGenTextures() failed");
+ context.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, context.texIds[0]);
+ gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_FALSE);
+ GLU_EXPECT_NO_ERROR(context.gl.getError(), "glTexStorage2DMultisample() failed");
+ context.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
+ context.texIds[0], 0);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE,
+ context.texIds[1], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
+ });
+ }, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "status_tracking", // string name
+ "Modifying framebuffer attached objects correctly updates the fbo status", // string description
+ apiES30, // glu::ApiType apiType
+ 3, // size_t numFboIds
+ 2, // size_t numTexIds
+ 1, // size_t numRboIds
+ { // vector<TestStep> initialSteps
+ {
+ // Initial status -> missing_attachment
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ // Allocate and attach texture -> complete
+ [](TestContext& context)
+ {
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ // Detach texture from fbo -> missing_attachment
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ // Allocate and attach renderbuffer -> complete
+ [](TestContext& context)
+ {
+ context.renderbufferStorage(context.rboIds[0], GL_RENDERBUFFER, GL_RGBA8, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT);
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+ context.rboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ // Detach renderbuffer -> incomplete
+ [](TestContext& context)
+ {
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ // Switch to incomplete fb -> missing_attachment
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[1]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ // Attach texture to fbo -> complete
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ // Change image format of attached texture -> incomplete_attachment
+ [](TestContext& context)
+ {
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, DE_NULL);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ // Change image format (tex storage) -> complete
+ [](TestContext& context)
+ {
+ context.bindTexture(GL_TEXTURE_2D, context.texIds[0]);
+ context.gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ GLU_EXPECT_NO_ERROR(context.gl.getError(), "glTexStorage2D() failed");
+ context.bindTexture(GL_TEXTURE_2D, 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ // Delete image -> missing_attachment
+ [](TestContext& context)
+ {
+ context.gl.deleteTextures(1, &context.texIds[0]);
+ GLU_EXPECT_NO_ERROR(context.gl.getError(), "glDeleteTextures() failed");
+ context.texIds.erase(context.texIds.begin());
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ },
+ {
+ // Recreate image in wrong format, attach to color attachment -> incomplete_attachment
+ [](TestContext& context)
+ {
+ const auto& gl = context.gl;
+ GLuint texId;
+ gl.genTextures(1, &texId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed");
+ context.texIds.push_back(texId);
+
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, DE_NULL);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ // Format to rgba8 using copyTexImage2D from compatible fbo -> framebuffer_complete
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[2]);
+ context.texImage2D(context.texIds[1], GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[1], 0);
+
+ context.bindTexture(GL_TEXTURE_2D, context.texIds[0]);
+ const auto& gl = context.gl;
+ gl.copyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glCopyTexImage2D() failed");
+
+ context.bindTexture(GL_TEXTURE_2D, 0);
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ // Change currently attached texture's format to compressed tex image -> incomplete_attachment (non color renderable)
+ [](TestContext& context)
+ {
+ DE_ASSERT(TEXTURE_WIDTH == 16 && TEXTURE_HEIGHT == 16);
+ static const glw::GLubyte textureDataETC2[] = // 16x16 all black RGBA8 texture in ETC2 format
+ {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00
+ };
+ const auto& gl = context.gl;
+ context.bindTexture(GL_TEXTURE_2D, context.texIds[0]);
+
+ gl.compressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, TEXTURE_WIDTH, TEXTURE_HEIGHT,
+ 0, DE_LENGTH_OF_ARRAY(textureDataETC2), textureDataETC2);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D() failed");
+
+ context.bindTexture(GL_TEXTURE_2D, 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ // Re-attach rbo0 -> complete
+ [](TestContext& context)
+ {
+ context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+ context.rboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE)
+ },
+ {
+ // Rbo storage to non renderable format -> incomplete_attachment
+ [](TestContext& context)
+ {
+ context.renderbufferStorage(context.rboIds[0], GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, TEXTURE_WIDTH,
+ TEXTURE_HEIGHT);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ },
+ {
+ // Delete rbo -> missing_attachment
+ [](TestContext& context)
+ {
+ context.gl.deleteRenderbuffers(1, &context.rboIds[0]);
+ GLU_EXPECT_NO_ERROR(context.gl.getError(), "glDeleteRenderbuffers() failed");
+ context.rboIds.erase(context.rboIds.begin());
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ }
+ },
+ DE_NULL, // StepsGeneratorFn stepsGenerator
+ },
+ {
+ "mutable_texture_missing_attachment_level", // string name
+ "Attaching a mutable texture with undefined image for attachment level"
+ " should be invalid", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ {}, // vector<TestStep> initialSteps
+ [](vector<TestStep>& steps, TestContext&) // StepsGeneratorFn stepsGenerator
+ {
+ DE_ASSERT(TEXTURE_WIDTH >= 16 && TEXTURE_HEIGHT >= 16);
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 1, GL_RGBA8, TEXTURE_WIDTH >> 1, TEXTURE_HEIGHT >> 1, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+ context.texImage2D(context.texIds[0], GL_TEXTURE_2D, 3, GL_RGBA8, TEXTURE_WIDTH >> 3, TEXTURE_HEIGHT >> 3, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
+
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
+
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 2);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
+ });
+ }
+ },
+ {
+ "immutable_texture_any_level_as_attachment", // string name
+ "Any level of immutable texture as attachment should be valid", // string description
+ apiES30, // glu::ApiType apiType
+ 1, // size_t numFboIds
+ 1, // size_t numTexIds
+ 0, // size_t numRboIds
+ {}, // vector<TestStep> initialSteps
+ [](vector<TestStep>& steps, TestContext&) // StepsGeneratorFn stepsGenerator
+ {
+ DE_ASSERT(TEXTURE_WIDTH >= 8 && TEXTURE_HEIGHT >= 8);
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.bindFramebuffer(GL_FRAMEBUFFER, context.fboIds[0]);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ context.bindTexture(GL_TEXTURE_2D, context.texIds[0]);
+ const auto& gl = context.gl;
+ gl.texStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glTexStorage2D() failed");
+ context.bindTexture(GL_TEXTURE_2D, 0);
+
+ context.texParameteri(context.texIds[0], GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1);
+
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 2);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE),
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 1);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE),
+ });
+ steps.push_back(
+ {
+ [](TestContext& context)
+ {
+ context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, context.texIds[0], 0);
+ },
+ expectedStatusConstant(GL_FRAMEBUFFER_COMPLETE),
+ });
+ }
+ },
+};
+
+class FramebufferCompletenessTestCase : public deqp::TestCase
+{
+public:
+ FramebufferCompletenessTestCase (deqp::Context& context, const TestParams& params);
+ virtual ~FramebufferCompletenessTestCase ();
+
+ virtual void init (void);
+ virtual void deinit (void);
+ TestNode::IterateResult iterate (void);
+
+private:
+ bool verifyFramebufferStatus (const glw::Functions& gl, const ExpectedStatusFn expectedStatusFn, const size_t stepIndex);
+
+ const TestParams m_params;
+ vector<GLuint> m_fboIds;
+ vector<GLuint> m_texIds;
+ vector<GLuint> m_rboIds;
+};
+
+FramebufferCompletenessTestCase::FramebufferCompletenessTestCase(deqp::Context& context, const TestParams& params)
+ : deqp::TestCase(context, params.name.c_str(), params.description.c_str()), m_params(params)
+{
+}
+
+FramebufferCompletenessTestCase::~FramebufferCompletenessTestCase()
+{
+}
+
+void FramebufferCompletenessTestCase::init(void)
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+
+ if (m_params.numFboIds > 0)
+ {
+ m_fboIds.resize(m_params.numFboIds);
+ gl.genFramebuffers(m_params.numFboIds, m_fboIds.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers() failed");
+ }
+ if (m_params.numTexIds > 0)
+ {
+ m_texIds.resize(m_params.numTexIds);
+ gl.genTextures(m_params.numTexIds, m_texIds.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed");
+ }
+ if (m_params.numRboIds > 0)
+ {
+ m_rboIds.resize(m_params.numRboIds);
+ gl.genRenderbuffers(m_params.numRboIds, m_rboIds.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGenRenderbuffers() failed");
+ }
+}
+
+void FramebufferCompletenessTestCase::deinit(void)
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+
+ if (!m_rboIds.empty())
+ {
+ gl.deleteRenderbuffers(m_params.numRboIds, m_rboIds.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteRenderbuffers() failed");
+ m_rboIds.clear();
+ }
+ if (!m_texIds.empty())
+ {
+ gl.deleteTextures(m_params.numTexIds, m_texIds.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteTextures() failed");
+ m_texIds.clear();
+ }
+ if (!m_fboIds.empty())
+ {
+ gl.deleteFramebuffers(m_params.numFboIds, m_fboIds.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteFramebufers() failed");
+ m_fboIds.clear();
+ }
+}
+
+tcu::TestNode::IterateResult FramebufferCompletenessTestCase::iterate(void)
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+ TestContext context =
+ {
+ renderContext, // const glu::RenderContext& renderContext
+ gl, // const glw::Functions& gl
+ m_fboIds, // vector<GLuint>& fboIds
+ m_texIds, // vector<GLuint>& texIds
+ m_rboIds // vector<GLuint>& rboIds
+ };
+ auto steps = vector<TestStep>(m_params.initialSteps);
+ if (m_params.stepsGenerator != DE_NULL)
+ m_params.stepsGenerator(steps, context);
+
+ if (steps.empty())
+ {
+ m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
+ return STOP;
+ }
+
+ size_t stepIndex = 0;
+ for (const auto& step : steps)
+ {
+ step.testFn(context);
+
+ if (!verifyFramebufferStatus(gl, step.expectedFbStatus, stepIndex++))
+ return STOP;
+ }
+ return STOP;
+}
+
+bool FramebufferCompletenessTestCase::verifyFramebufferStatus(const glw::Functions& gl, const ExpectedStatusFn expectedStatusFn,
+ const size_t stepIndex)
+{
+ static const map<GLenum, string> statusNames =
+ {
+ { GL_FRAMEBUFFER_COMPLETE , "GL_FRAMEBUFFER_COMPLETE" },
+ { GL_FRAMEBUFFER_UNDEFINED , "GL_FRAMEBUFFER_UNDEFINED" },
+ { GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT , "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT" },
+ { GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT , "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" },
+ { GL_FRAMEBUFFER_UNSUPPORTED , "GL_FRAMEBUFFER_UNSUPPORTED" },
+ { GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE , "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" },
+ { GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS , "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS" }
+ };
+ const auto expectedStatus = expectedStatusFn(m_context.getContextInfo());
+ const auto fboStatus = gl.checkFramebufferStatus(GL_FRAMEBUFFER);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glCheckFramebufferStatus() failed");
+ if (fboStatus != expectedStatus)
+ {
+ ostringstream msg;
+ const auto& fboStatusName = statusNames.find(fboStatus);
+ const auto& expectedStatusName = statusNames.find(expectedStatus);
+ msg << "Frame buffer status ("
+ << ((fboStatusName != statusNames.end()) ? fboStatusName->second : std::to_string(fboStatus))
+ << ") does not match the expected status ("
+ << ((expectedStatusName != statusNames.end()) ? expectedStatusName->second : std::to_string(expectedStatus))
+ << ") after step " << stepIndex;
+ TCU_FAIL(msg.str().c_str());
+ return false;
+ }
+ m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
+ return true;
+}
+
+} // namespace
+
+FramebufferCompletenessTests::FramebufferCompletenessTests(deqp::Context& context)
+ : deqp::TestCaseGroup(context, "framebuffer_completeness", "Tests for frame buffer completeness")
+{
+}
+
+void FramebufferCompletenessTests::init(void)
+{
+ const auto& renderContext = m_context.getRenderContext();
+ for (const auto& test : tests)
+ {
+ if (!glu::contextSupports(renderContext.getType(), test.apiType))
+ continue;
+
+ addChild(new FramebufferCompletenessTestCase(m_context, test));
+ }
+}
+
+} // namespace es3cts
diff --git a/external/openglcts/modules/common/glcFramebufferCompleteness.hpp b/external/openglcts/modules/common/glcFramebufferCompleteness.hpp
new file mode 100644
index 0000000..3b9f2a8
--- /dev/null
+++ b/external/openglcts/modules/common/glcFramebufferCompleteness.hpp
@@ -0,0 +1,48 @@
+#ifndef _GLCFRAMEBUFFERCOMPLETENESS_HPP
+#define _GLCFRAMEBUFFERCOMPLETENESS_HPP
+
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2021 Google Inc.
+ * Copyright (c) 2021 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 glcFramebufferCompleteness.hpp
+ * \brief Tests for OpenGL ES frame buffer completeness
+ *//*--------------------------------------------------------------------*/
+
+#include "glcTestCase.hpp"
+#include "glwDefs.hpp"
+#include "tcuDefs.hpp"
+
+namespace glcts
+{
+
+class FramebufferCompletenessTests : public deqp::TestCaseGroup
+{
+public:
+ FramebufferCompletenessTests (deqp::Context& context);
+ virtual void init (void);
+
+private:
+ FramebufferCompletenessTests (const FramebufferCompletenessTests& other) = delete;
+ FramebufferCompletenessTests& operator= (const FramebufferCompletenessTests& other) = delete;
+};
+
+} // namespace glcts
+
+#endif // _GLCFRAMEBUFFERCOMPLETENESS_HPP
diff --git a/external/openglcts/modules/common/glcGLSLVectorConstructorTests.cpp b/external/openglcts/modules/common/glcGLSLVectorConstructorTests.cpp
new file mode 100644
index 0000000..39cf0f6
--- /dev/null
+++ b/external/openglcts/modules/common/glcGLSLVectorConstructorTests.cpp
@@ -0,0 +1,592 @@
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2016 Google Inc.
+ * Copyright (c) 2016 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 GLSL vector constructor tests.
+ */ /*-------------------------------------------------------------------*/
+#include "glcGLSLVectorConstructorTests.hpp"
+
+#include "gluDefs.hpp"
+#include "gluTextureUtil.hpp"
+#include "gluDrawUtil.hpp"
+#include "gluShaderProgram.hpp"
+
+#include "glwDefs.hpp"
+#include "glwFunctions.hpp"
+#include "glwEnums.hpp"
+
+#include "tcuTestLog.hpp"
+#include "tcuRenderTarget.hpp"
+#include "tcuStringTemplate.hpp"
+
+#include <functional>
+#include <map>
+#include <vector>
+#include <sstream>
+#include <string>
+#include <tuple>
+
+namespace deqp
+{
+
+namespace
+{
+using std::string;
+
+using std::map;
+using std::vector;
+
+using std::function;
+using std::bind;
+using namespace std::placeholders;
+
+using std::ostringstream;
+
+enum struct TestType
+{
+ VERTEX_SHADER_ERROR = 0,
+ FRAGMENT_SHADER_ERROR,
+ VERTEX_SHADER,
+ FRAGMENT_SHADER
+};
+
+struct TestDefinition
+{
+ vector<string> outputTypes;
+ vector<vector<string>> inputTypeLists;
+ string extraFields;
+};
+
+const TestDefinition tests[] =
+{
+ {
+ { "vec2", "vec3", "vec4" }, // vector<string> outputTypes
+ { // vector<vector<string>> inputTypeLists
+ { "mat2" },
+ { "mat2x3" },
+ { "mat2x4" },
+ { "mat3" },
+ { "mat3x2" },
+ { "mat3x4" },
+ { "mat4" },
+ { "mat4x2" },
+ { "mat4x3" },
+ { "float", "mat2" },
+ { "float", "mat2x3" },
+ { "float", "mat2x4" },
+ { "float", "mat3" },
+ { "float", "mat3x2" },
+ { "float", "mat3x4" },
+ { "float", "mat4" },
+ { "float", "mat4x2" },
+ { "float", "mat4x3" },
+ },
+ "const float errorBound = 1.0E-5;\n" // deUint32 extraFields;
+ },
+ {
+ { "ivec2", "ivec3", "ivec4" }, // vector<string> outputTypes
+ { // vector<vector<string>> inputTypeLists
+ { "mat2" },
+ { "mat2x3" },
+ { "mat2x4" },
+ { "mat3" },
+ { "mat3x2" },
+ { "mat3x4" },
+ { "mat4" },
+ { "mat4x2" },
+ { "mat4x3" },
+ { "int", "mat2" },
+ { "int", "mat2x3" },
+ { "int", "mat2x4" },
+ { "int", "mat3" },
+ { "int", "mat3x2" },
+ { "int", "mat3x4" },
+ { "int", "mat4" },
+ { "int", "mat4x2" },
+ { "int", "mat4x3" },
+ },
+ "" // deUint32 extraFields;
+ },
+ {
+ { "bvec2", "bvec3", "bvec4" }, // vector<string> outputTypes
+ { // vector<vector<string>> inputTypeLists
+ { "mat2" },
+ { "mat2x3" },
+ { "mat2x4" },
+ { "mat3" },
+ { "mat3x2" },
+ { "mat3x4" },
+ { "mat4" },
+ { "mat4x2" },
+ { "mat4x3" },
+ { "bool", "mat2" },
+ { "bool", "mat2x3" },
+ { "bool", "mat2x4" },
+ { "bool", "mat3" },
+ { "bool", "mat3x2" },
+ { "bool", "mat3x4" },
+ { "bool", "mat4" },
+ { "bool", "mat4x2" },
+ { "bool", "mat4x3" },
+ },
+ "" // deUint32 extraFields;
+ },
+};
+
+struct TestParams
+{
+ string name;
+ string description;
+ TestType testType;
+ string outputType;
+ vector<string> inputTypes;
+ string extraFields;
+};
+
+vector<TestParams> generateTestParams()
+{
+ vector<TestParams> result;
+ result.reserve(64);
+ for(const auto& test : tests)
+ {
+ for(const auto& outputType : test.outputTypes)
+ {
+ for(const auto& inputTypes : test.inputTypeLists)
+ {
+ ostringstream testNameVs, testNameFs;
+ ostringstream testDescriptionVs, testDescriptionFs;
+ testNameVs << outputType << "_from";
+ testNameFs << outputType << "_from";
+ testDescriptionVs << outputType << "(";
+ testDescriptionFs << outputType << "(";
+ for(vector<string>::size_type i = 0; i < inputTypes.size(); ++i)
+ {
+ const auto& inputType = inputTypes[i];
+ testNameVs << "_" << inputType;
+ testNameFs << "_" << inputType;
+ if (i > 0) {
+ testDescriptionVs << ",";
+ testDescriptionFs << ",";
+ }
+ testDescriptionVs << inputType;
+ }
+ ostringstream testNameInvalidVs, testNameInvalidFs;
+ testNameInvalidVs << testNameVs.str() << "_" << inputTypes[0] << "_invalid_vs";
+ testNameInvalidFs << testNameFs.str() << "_" << inputTypes[0] << "_invalid_fs";
+
+ testNameVs << "_vs";
+ testNameFs << "_fs";
+ testDescriptionVs << ") vertex shader";
+ testDescriptionFs << ") fragment shader";
+ result.push_back({ testNameVs.str(), testDescriptionVs.str(), TestType::VERTEX_SHADER, outputType, inputTypes, test.extraFields });
+ result.push_back({ testNameFs.str(), testDescriptionFs.str(), TestType::FRAGMENT_SHADER, outputType, inputTypes, test.extraFields });
+
+ vector<string> failInputTypes;
+ failInputTypes.insert(failInputTypes.end(), inputTypes.begin(), inputTypes.end());
+ failInputTypes.push_back(inputTypes[0]);
+ testDescriptionVs << " invalid";
+ testDescriptionFs << " invalid";
+ result.push_back({ testNameInvalidVs.str(), testDescriptionVs.str(), TestType::VERTEX_SHADER_ERROR, outputType, failInputTypes, test.extraFields });
+ result.push_back({ testNameInvalidFs.str(), testDescriptionFs.str(), TestType::FRAGMENT_SHADER_ERROR, outputType, failInputTypes, test.extraFields });
+
+ }
+ }
+ }
+ return result;
+}
+
+const string defaultVertexShader =
+ "${GLSL_VERSION}\n"
+ "in vec4 vPosition;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = vPosition;\n"
+ "}\n";
+
+const string defaultFragmentShader =
+ "${GLSL_VERSION}\n"
+ "precision mediump float;\n"
+ "in vec4 vColor;\n"
+ "out vec4 my_FragColor;\n"
+ "void main() {\n"
+ " my_FragColor = vColor;\n"
+ "}\n";
+
+const string vertexShaderTemplate =
+ "${GLSL_VERSION}\n"
+ "in vec4 vPosition;\n"
+ "precision mediump int;\n"
+ "precision mediump float;\n"
+ "const vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
+ "const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);\n"
+ "${TEST_CONSTANTS}"
+ "out vec4 vColor;\n"
+ "void main() {\n"
+ " ${TEST_CODE}\n"
+ " if ${TEST_CONDITION}\n"
+ " vColor = green;\n"
+ " else\n"
+ " vColor = red;\n"
+ " gl_Position = vPosition;\n"
+ "}\n";
+
+const string fragmentShaderTemplate =
+ "${GLSL_VERSION}\n"
+ "precision mediump int;\n"
+ "precision mediump float;\n"
+ "const vec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
+ "const vec4 red = vec4(1.0, 0.0, 0.0, 1.0);\n"
+ "${TEST_CONSTANTS}"
+ "out vec4 my_FragColor;\n"
+ "void main() {\n"
+ " ${TEST_CODE}\n"
+ " if ${TEST_CONDITION}\n"
+ " my_FragColor = green;\n"
+ " else\n"
+ " my_FragColor = red;\n"
+ "}\n";
+
+const map<string, string> testConditions =
+{
+ { "vec2" , "(abs(v[0] - 0.0) <= errorBound && abs(v[1] - 1.0) <= errorBound)" },
+ { "vec3" , "(abs(v[0] - 0.0) <= errorBound && abs(v[1] - 1.0) <= errorBound && abs(v[2] - 2.0) <= errorBound)" },
+ { "vec4" , "(abs(v[0] - 0.0) <= errorBound && abs(v[1] - 1.0) <= errorBound && abs(v[2] - 2.0) <= errorBound && abs(v[3] - 3.0) <= errorBound)" },
+ { "ivec2" , "(v[0] == 0 && v[1] == 1)" },
+ { "ivec3" , "(v[0] == 0 && v[1] == 1 && v[2] == 2)" },
+ { "ivec4" , "(v[0] == 0 && v[1] == 1 && v[2] == 2 && v[3] == 3)" },
+ { "bvec2" , "(v[0] == false && v[1] == true)" },
+ { "bvec3" , "(v[0] == false && v[1] == true && v[2] == true)" },
+ { "bvec4" , "(v[0] == false && v[1] == true && v[2] == true && v[3] == true)" }
+};
+
+typedef function<void (ostringstream&, size_t)> GeneratorFn;
+
+struct DataTypeInfo
+{
+ size_t numElements;
+ GeneratorFn valueFn;
+ GeneratorFn beforeValueFn;
+ GeneratorFn afterValueFn;
+};
+
+void generateValueFloat(ostringstream& out, const size_t index)
+{
+ out << index << ".0";
+}
+
+void generateValueInt(ostringstream& out, const size_t index)
+{
+ out << index;
+}
+
+void generateValueBool(ostringstream& out, const size_t index)
+{
+ out << ((index != 0) ? "true" : "false");
+}
+
+void generateCtorOpen(const char* className, ostringstream& out, const size_t)
+{
+ out << className << "(";
+}
+
+void generateCtorClose(ostringstream &out, const size_t)
+{
+ out << ")";
+}
+
+const map<string, DataTypeInfo> dataTypeInfos =
+{
+ // numElements , valueFn , beforeValueFn , afterValueFn
+ { "float" , { 1 , generateValueFloat, DE_NULL , DE_NULL } },
+ { "vec2" , { 2 , generateValueFloat, bind(generateCtorOpen, "vec2", _1, _2) , generateCtorClose } },
+ { "vec3" , { 3 , generateValueFloat, bind(generateCtorOpen, "vec3", _1, _2) , generateCtorClose } },
+ { "vec4" , { 4 , generateValueFloat, bind(generateCtorOpen, "vec4", _1, _2) , generateCtorClose } },
+ { "int" , { 1 , generateValueInt , DE_NULL , DE_NULL } },
+ { "ivec2" , { 2 , generateValueInt , bind(generateCtorOpen, "ivec2", _1, _2) , generateCtorClose } },
+ { "ivec3" , { 3 , generateValueInt , bind(generateCtorOpen, "ivec3", _1, _2) , generateCtorClose } },
+ { "ivec4" , { 4 , generateValueInt , bind(generateCtorOpen, "ivec4", _1, _2) , generateCtorClose } },
+ { "bool" , { 1 , generateValueBool , DE_NULL , DE_NULL } },
+ { "bvec2" , { 2 , generateValueBool , bind(generateCtorOpen, "bvec2", _1, _2) , generateCtorClose } },
+ { "bvec3" , { 3 , generateValueBool , bind(generateCtorOpen, "bvec3", _1, _2) , generateCtorClose } },
+ { "bvec4" , { 4 , generateValueBool , bind(generateCtorOpen, "bvec4", _1, _2) , generateCtorClose } },
+ { "mat2" , { 4 , generateValueFloat, bind(generateCtorOpen, "mat2", _1, _2) , generateCtorClose } },
+ { "mat2x3" , { 6 , generateValueFloat, bind(generateCtorOpen, "mat2x3", _1, _2) , generateCtorClose } },
+ { "mat2x4" , { 8 , generateValueFloat, bind(generateCtorOpen, "mat2x4", _1, _2) , generateCtorClose } },
+ { "mat3" , { 9 , generateValueFloat, bind(generateCtorOpen, "mat3", _1, _2) , generateCtorClose } },
+ { "mat3x2" , { 6 , generateValueFloat, bind(generateCtorOpen, "mat3x2", _1, _2) , generateCtorClose } },
+ { "mat3x4" , { 12 , generateValueFloat, bind(generateCtorOpen, "mat3x4", _1, _2) , generateCtorClose } },
+ { "mat4" , { 16 , generateValueFloat, bind(generateCtorOpen, "mat4", _1, _2) , generateCtorClose } },
+ { "mat4x2" , { 8 , generateValueFloat, bind(generateCtorOpen, "mat4x2", _1, _2) , generateCtorClose } },
+ { "mat4x3" , { 12 , generateValueFloat, bind(generateCtorOpen, "mat4x3", _1, _2) , generateCtorClose } },
+};
+
+string generateTestCode(const string& outputType, const vector<string>& inputTypes)
+{
+ ostringstream output;
+ const auto outputTypeInfo = dataTypeInfos.find(outputType);
+ DE_ASSERT(outputTypeInfo != dataTypeInfos.end());
+
+ output << outputType << " v = ";
+ if (outputTypeInfo->second.beforeValueFn != DE_NULL)
+ outputTypeInfo->second.beforeValueFn(output, -1);
+ int outputElementsRemaining = outputTypeInfo->second.numElements;
+ int outputElementIndex = 0;
+ for(size_t i = 0; i < inputTypes.size() && outputElementsRemaining > 0; ++i)
+ {
+ const auto& inputType = inputTypes[i];
+ const auto inputTypeInfo = dataTypeInfos.find(inputType);
+ DE_ASSERT(inputTypeInfo != dataTypeInfos.end());
+
+ if (outputElementIndex > 0)
+ output << ", ";
+ if (inputTypeInfo->second.beforeValueFn != DE_NULL)
+ inputTypeInfo->second.beforeValueFn(output, i);
+ for(size_t j = 0; j < inputTypeInfo->second.numElements; ++j)
+ {
+ if (j > 0)
+ output << ", ";
+
+ inputTypeInfo->second.valueFn(output, outputElementIndex++);
+ --outputElementsRemaining;
+ }
+ if (inputTypeInfo->second.afterValueFn != DE_NULL)
+ inputTypeInfo->second.afterValueFn(output, i);
+ }
+ if (outputTypeInfo->second.afterValueFn != DE_NULL)
+ outputTypeInfo->second.afterValueFn(output, -1);
+ output << ";";
+ return output.str();
+}
+
+string replacePlaceholders(const string& shaderTemplate, const TestParams& params, const glu::GLSLVersion glslVersion)
+{
+ const auto condition = testConditions.find(params.outputType);
+ return tcu::StringTemplate(shaderTemplate).specialize(
+ {
+ { "GLSL_VERSION" , glu::getGLSLVersionDeclaration(glslVersion) },
+ { "TEST_CONSTANTS" , params.extraFields },
+ { "TEST_CODE" , generateTestCode(params.outputType, params.inputTypes) },
+ { "TEST_CONDITION" , (condition != testConditions.end()) ? condition->second : "" }
+ });
+}
+
+const vector<float> positions =
+{
+ -1.0f, -1.0f,
+ 1.0f, -1.0f,
+ -1.0f, 1.0f,
+ 1.0f, 1.0f
+};
+
+const vector<deUint32> indices = { 0, 1, 2, 3 };
+
+const int RENDERTARGET_WIDTH = 16;
+const int RENDERTARGET_HEIGHT = 16;
+
+class GLSLVectorConstructorTestCase : public deqp::TestCase
+{
+public:
+ GLSLVectorConstructorTestCase(deqp::Context& context, glu::GLSLVersion glslVersion, const TestParams& params);
+
+ void init(void);
+ void deinit(void);
+ IterateResult iterate();
+
+private:
+ void setupRenderTarget();
+ void releaseRenderTarget();
+
+ const glu::GLSLVersion m_glslVersion;
+ const TestParams m_params;
+ glw::GLuint m_fboId;
+ glw::GLuint m_rboId;
+
+ string m_vertexShader;
+ string m_fragmentShader;
+};
+
+GLSLVectorConstructorTestCase::GLSLVectorConstructorTestCase(deqp::Context& context, glu::GLSLVersion glslVersion, const TestParams& params)
+ : TestCase(context, params.name.c_str(), params.description.c_str())
+ , m_glslVersion(glslVersion)
+ , m_params(params)
+{
+ switch(m_params.testType)
+ {
+ case TestType::VERTEX_SHADER_ERROR:
+ case TestType::VERTEX_SHADER:
+ m_vertexShader = replacePlaceholders(vertexShaderTemplate, m_params, m_glslVersion);
+ m_fragmentShader = replacePlaceholders(defaultFragmentShader, m_params, m_glslVersion);
+ break;
+ case TestType::FRAGMENT_SHADER_ERROR:
+ case TestType::FRAGMENT_SHADER:
+ m_vertexShader = replacePlaceholders(defaultVertexShader, m_params, m_glslVersion);
+ m_fragmentShader = replacePlaceholders(fragmentShaderTemplate, m_params, m_glslVersion);
+ break;
+ }
+}
+
+void GLSLVectorConstructorTestCase::init(void)
+{
+ deqp::TestCase::init();
+}
+
+void GLSLVectorConstructorTestCase::deinit(void)
+{
+ deqp::TestCase::deinit();
+}
+
+GLSLVectorConstructorTestCase::IterateResult GLSLVectorConstructorTestCase::iterate()
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+ const auto textureFormat = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
+ const auto transferFormat = glu::getTransferFormat(textureFormat);
+
+ setupRenderTarget();
+
+ glu::ShaderProgram program(renderContext, glu::makeVtxFragSources(m_vertexShader, m_fragmentShader));
+ if (!program.isOk())
+ {
+ switch(m_params.testType)
+ {
+ case TestType::VERTEX_SHADER_ERROR:
+ case TestType::FRAGMENT_SHADER_ERROR:
+ m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
+ return STOP;
+ default:
+ TCU_FAIL("Shader compilation failed:\nVertex shader:\n" + m_vertexShader + "\nFragment shader:\n" + m_fragmentShader);
+ break;
+ }
+ }
+
+ const vector<glu::VertexArrayBinding> vertexArrays =
+ {
+ glu::va::Float("vPosition", 2, positions.size(), 0, positions.data()),
+ };
+
+ gl.useProgram(program.getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram failed");
+
+ gl.clear(GL_COLOR_BUFFER_BIT);
+
+ glu::draw(renderContext, program.getProgram(),
+ static_cast<int>(vertexArrays.size()), vertexArrays.data(),
+ glu::pr::TriangleStrip(static_cast<int>(indices.size()), indices.data()));
+
+ const auto pixelSize = tcu::getPixelSize(textureFormat);
+ vector<deUint8> fbData (RENDERTARGET_WIDTH * RENDERTARGET_HEIGHT * pixelSize);
+
+ if (pixelSize < 4)
+ gl.pixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ gl.readPixels(0, 0, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT, transferFormat.format, transferFormat.dataType, fbData.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
+
+ tcu::ConstPixelBufferAccess fbAccess { textureFormat, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT, 1, fbData.data() };
+ const auto expectedColor = tcu::RGBA::green().toVec();
+ bool pass = true;
+ for(int y = 0; pass && y < RENDERTARGET_HEIGHT; ++y)
+ for(int x = 0; x < RENDERTARGET_WIDTH; ++x)
+ if (fbAccess.getPixel(x,y) != expectedColor)
+ {
+ pass = false;
+ break;
+ }
+
+ releaseRenderTarget();
+
+ const qpTestResult result = (pass ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL);
+ const char* desc = (pass ? "Pass" : "Pixel mismatch; vector initialization failed");
+
+ m_testCtx.setTestResult(result, desc);
+
+ return STOP;
+}
+
+void GLSLVectorConstructorTestCase::setupRenderTarget()
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+
+ gl.genFramebuffers(1, &m_fboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "GenFramebuffers");
+
+ gl.genRenderbuffers(1, &m_rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "GenRenderBuffers");
+
+ gl.bindRenderbuffer(GL_RENDERBUFFER, m_rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderBuffer");
+
+ gl.renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "RenderBufferStorage");
+
+ gl.bindFramebuffer(GL_FRAMEBUFFER, m_fboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "BindFrameBuffer");
+
+ gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "FrameBufferRenderBuffer");
+
+ glw::GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
+ gl.drawBuffers(1, &drawBuffer);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "DrawBuffers");
+
+ glw::GLfloat clearColor[4] = { 0, 0, 0, 0 };
+ gl.clearBufferfv(GL_COLOR, 0, clearColor);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "ClearBuffers");
+
+ gl.viewport(0, 0, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Viewport");
+}
+
+void GLSLVectorConstructorTestCase::releaseRenderTarget()
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+ if (m_fboId != 0)
+ {
+ gl.deleteFramebuffers(1, &m_fboId);
+ m_fboId = 0;
+ }
+ if (m_rboId != 0)
+ {
+ gl.deleteRenderbuffers(1, &m_rboId);
+ m_rboId = 0;
+ }
+}
+
+}
+
+GLSLVectorConstructorTests::GLSLVectorConstructorTests(Context& context, glu::GLSLVersion glslVersion)
+ : deqp::TestCaseGroup(context, "glsl_constructors", "GLSL vector constructor tests")
+ , m_glslVersion(glslVersion)
+{
+}
+
+GLSLVectorConstructorTests::~GLSLVectorConstructorTests()
+{
+}
+
+void GLSLVectorConstructorTests::init()
+{
+ for(const auto& params : generateTestParams())
+ addChild(new GLSLVectorConstructorTestCase(m_context, m_glslVersion, params));
+}
+
+} // deqp
diff --git a/external/openglcts/modules/common/glcGLSLVectorConstructorTests.hpp b/external/openglcts/modules/common/glcGLSLVectorConstructorTests.hpp
new file mode 100644
index 0000000..282840a
--- /dev/null
+++ b/external/openglcts/modules/common/glcGLSLVectorConstructorTests.hpp
@@ -0,0 +1,52 @@
+#ifndef _GLCGLSLVECTORCONSTRUCTORTESTS_HPP
+#define _GLCGLSLVECTORCONSTRUCTORTESTS_HPP
+
+/*-------------------------------------------------------------------------
+* OpenGL Conformance Test Suite
+* -----------------------------
+*
+* 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 glcGLSLVectorConstructorTests.hpp
+* \brief Tests for GLSL vector type constructors
+*/ /*-------------------------------------------------------------------*/
+
+#include "glcTestCase.hpp"
+#include "gluShaderUtil.hpp"
+#include "tcuDefs.hpp"
+
+namespace deqp
+{
+
+class GLSLVectorConstructorTests : public TestCaseGroup
+{
+public:
+ GLSLVectorConstructorTests(Context& context, glu::GLSLVersion glslVersion);
+ ~GLSLVectorConstructorTests();
+
+ void init();
+
+private:
+ GLSLVectorConstructorTests(const GLSLVectorConstructorTests& other) = delete;
+ GLSLVectorConstructorTests& operator=(const GLSLVectorConstructorTests& other) = delete;
+
+ glu::GLSLVersion m_glslVersion;
+};
+
+} // deqp
+
+#endif // _GLCGLSLVECTORCONSTRUCTORTESTS_HPP
diff --git a/external/openglcts/modules/common/glcInternalformatTests.cpp b/external/openglcts/modules/common/glcInternalformatTests.cpp
index 5798f47..2190d7b 100644
--- a/external/openglcts/modules/common/glcInternalformatTests.cpp
+++ b/external/openglcts/modules/common/glcInternalformatTests.cpp
@@ -40,7 +40,10 @@
#include "tcuTestLog.hpp"
#include "tcuTextureUtil.hpp"
+#include "glcMisc.hpp"
+
#include <algorithm>
+#include <functional>
#include <map>
using namespace glw;
@@ -161,7 +164,7 @@
private:
void generateTextureData(GLuint width, GLuint height, GLenum type, unsigned int pixelSize, unsigned int components,
- std::vector<unsigned char>& result) const;
+ bool isSRGB, std::vector<unsigned char>& result) const;
// color converting methods
static void convertByte(tcu::Vec4 inColor, unsigned char* dst, int components);
@@ -173,10 +176,13 @@
static void convertInt(tcu::Vec4 inColor, unsigned char* dst, int components);
static void convertUInt(tcu::Vec4 inColor, unsigned char* dst, int components);
static void convertUInt_24_8(tcu::Vec4 inColor, unsigned char* dst, int components);
+ static void convertFloat_32_Uint_24_8(tcu::Vec4 inColor, unsigned char* dst, int);
static void convertUShort_4_4_4_4(tcu::Vec4 inColor, unsigned char* dst, int);
static void convertUShort_5_5_5_1(tcu::Vec4 inColor, unsigned char* dst, int);
static void convertUShort_5_6_5(tcu::Vec4 inColor, unsigned char* dst, int);
static void convertUInt_2_10_10_10_rev(tcu::Vec4 inColor, unsigned char* dst, int);
+ static void convertUInt_10f_11f_11f_rev(tcu::Vec4 inColor, unsigned char* dst, int);
+ static void convertUint_5_9_9_9_rev(tcu::Vec4 inColor, unsigned char* dst, int);
static GLhalf floatToHalf(float f);
@@ -225,12 +231,14 @@
tcu::TextureFormat tcuTextureFormat = glu::mapGLTransferFormat(format, type);
unsigned int components = tcu::getNumUsedChannels(tcuTextureFormat.order);
unsigned int pixelSize = 4;
+ bool isSRGB = internalFormat == GL_SRGB8 || internalFormat == GL_SRGB8_ALPHA8;
// note: getPixelSize hits assertion for GL_UNSIGNED_INT_2_10_10_10_REV when format is RGB
if (type != GL_UNSIGNED_INT_2_10_10_10_REV)
pixelSize = tcu::getPixelSize(tcuTextureFormat);
- generateTextureData(m_renderWidth, m_renderHeight, type, pixelSize, components, textureData);
+ generateTextureData(m_renderWidth, m_renderHeight, type, pixelSize, components, isSRGB, textureData);
+
textureDataPtr = &textureData[0];
}
@@ -278,7 +286,8 @@
"}\n";
fs = "${VERSION}\n"
"precision highp float;\n"
- "uniform ${SAMPLER} sampler;\n"
+ "precision highp int;\n"
+ "uniform highp ${SAMPLER} sampler;\n"
"in vec2 texcoord;\n"
"out highp vec4 color;\n"
"void main()\n"
@@ -289,7 +298,8 @@
"}\n";
specializationMap["PROCESS_COLOR"] = "";
- if ((format == GL_RGB_INTEGER) || (format == GL_RGBA_INTEGER))
+ if ((format == GL_RED_INTEGER) || (format == GL_RG_INTEGER) || (format == GL_RGB_INTEGER) ||
+ (format == GL_RGBA_INTEGER))
{
specializationMap["SAMPLED_TYPE"] = "uvec4";
specializationMap["SAMPLER"] = "usampler2D";
@@ -311,13 +321,13 @@
}
else if (type == GL_UNSIGNED_SHORT)
{
- specializationMap["CALCULATE_COLOR"] = "vec4(v / 256) / 256.0";
+ specializationMap["CALCULATE_COLOR"] = "vec4(v / 256u) / 256.0";
}
else if (type == GL_INT)
{
specializationMap["SAMPLED_TYPE"] = "ivec4";
specializationMap["SAMPLER"] = "isampler2D";
- specializationMap["CALCULATE_COLOR"] = "vec4(v / 2097152u) / 1024.0";
+ specializationMap["CALCULATE_COLOR"] = "vec4(uvec4(v) / 2097152u) / 1024.0";
}
else // GL_UNSIGNED_INT
{
@@ -327,14 +337,18 @@
specializationMap["CALCULATE_COLOR"] = "vec4(v / 4194304u) / 1024.0";
}
- if (format == GL_RGB_INTEGER)
+ if (format == GL_RED_INTEGER)
+ specializationMap["PROCESS_COLOR"] = "color = vec4(color.r, 0.0, 0.0, 1.0);\n";
+ else if (format == GL_RG_INTEGER)
+ specializationMap["PROCESS_COLOR"] = "color = vec4(color.r, color.g, 0.0, 1.0);\n";
+ else if (format == GL_RGB_INTEGER)
specializationMap["PROCESS_COLOR"] = "color.a = 1.0;\n";
}
else
{
specializationMap["SAMPLED_TYPE"] = "vec4";
specializationMap["SAMPLER"] = "sampler2D";
- if (format == GL_DEPTH_STENCIL)
+ if (format == GL_DEPTH_STENCIL || format == GL_DEPTH_COMPONENT)
specializationMap["CALCULATE_COLOR"] = "vec4(v.r, 0.0, 0.0, 1.0)";
else
specializationMap["CALCULATE_COLOR"] = "v";
@@ -362,6 +376,8 @@
if ((internalFormat == GL_DEPTH_COMPONENT) || (internalFormat == GL_DEPTH_STENCIL))
specializationMap["CALCULATE_COLOR"] = "vec4(color.r, 0.0, 0.0, 1.0)";
+ else if (internalFormat == GL_DEPTH_COMPONENT32F)
+ specializationMap["CALCULATE_COLOR"] = "vec4(color.r, color.r, color.r, 1.0)";
else
specializationMap["CALCULATE_COLOR"] = "color";
}
@@ -393,6 +409,8 @@
case GL_RGB5_A1:
case GL_RGBA8:
case GL_RGB10_A2:
+ case GL_RGBA8_SNORM:
+ case GL_SRGB8_ALPHA8:
return GL_RGBA;
case GL_RGB10_A2UI:
case GL_RGBA8UI: //remove this
@@ -402,6 +420,8 @@
case GL_RGB8:
case GL_RGB10:
case GL_RGB9_E5:
+ case GL_R11F_G11F_B10F:
+ case GL_SRGB8:
return GL_RGB;
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE4_ALPHA4_OES:
@@ -416,8 +436,10 @@
case GL_DEPTH_COMPONENT16:
case GL_DEPTH_COMPONENT24:
case GL_DEPTH_COMPONENT32:
+ case GL_DEPTH_COMPONENT32F:
return GL_DEPTH_COMPONENT;
case GL_DEPTH24_STENCIL8:
+ case GL_DEPTH32F_STENCIL8:
return GL_DEPTH_STENCIL;
case GL_STENCIL_INDEX8:
return GL_STENCIL_INDEX;
@@ -435,45 +457,59 @@
case GL_RGB10_A2:
case GL_RGB10_A2UI:
return GL_UNSIGNED_INT_2_10_10_10_REV;
+ case GL_R11F_G11F_B10F:
+ return GL_UNSIGNED_INT_10F_11F_11F_REV;
case GL_DEPTH_COMPONENT16:
case GL_DEPTH_COMPONENT24:
return GL_UNSIGNED_SHORT;
case GL_DEPTH_COMPONENT32:
return GL_UNSIGNED_INT;
+ case GL_DEPTH_COMPONENT32F:
+ return GL_FLOAT;
+ case GL_DEPTH32F_STENCIL8:
+ return GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
}
return GL_UNSIGNED_BYTE;
}
void InternalformatCaseBase::generateTextureData(GLuint width, GLuint height, GLenum type, unsigned int pixelSize,
- unsigned int components, std::vector<unsigned char>& result) const
+ unsigned int components, bool isSRGB,
+ std::vector<unsigned char>& result) const
{
// colors are the 4 corner colors specified ( lower left, lower right, upper left, upper right )
static tcu::Vec4 colors[4] = { tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f),
tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), tcu::Vec4(0.0f, 1.0f, 1.0f, 1.0f) };
- typedef void (*ColorConversionFunc)(tcu::Vec4, unsigned char*, int);
+ typedef std::function<void(tcu::Vec4, unsigned char*, int)> ColorConversionFunc;
typedef std::map<GLenum, ColorConversionFunc> ColorConversionMap;
+ using namespace std::placeholders;
+
static ColorConversionMap colorConversionMap;
if (colorConversionMap.empty())
{
- colorConversionMap[GL_BYTE] = &convertByte;
- colorConversionMap[GL_UNSIGNED_BYTE] = &convertUByte;
- colorConversionMap[GL_HALF_FLOAT] = &convertHFloat;
- colorConversionMap[GL_HALF_FLOAT_OES] = &convertHFloat;
- colorConversionMap[GL_FLOAT] = &convertFloat;
- colorConversionMap[GL_SHORT] = &convertShort;
- colorConversionMap[GL_UNSIGNED_SHORT] = &convertUShort;
- colorConversionMap[GL_INT] = &convertInt;
- colorConversionMap[GL_UNSIGNED_INT] = &convertUInt;
- colorConversionMap[GL_UNSIGNED_INT_24_8] = &convertUInt_24_8;
- colorConversionMap[GL_UNSIGNED_SHORT_4_4_4_4] = &convertUShort_4_4_4_4;
- colorConversionMap[GL_UNSIGNED_SHORT_5_5_5_1] = &convertUShort_5_5_5_1;
- colorConversionMap[GL_UNSIGNED_SHORT_5_6_5] = &convertUShort_5_6_5;
- colorConversionMap[GL_UNSIGNED_INT_2_10_10_10_REV] = &convertUInt_2_10_10_10_rev;
+ colorConversionMap[GL_BYTE] = &convertByte;
+ colorConversionMap[GL_UNSIGNED_BYTE] = &convertUByte;
+ colorConversionMap[GL_HALF_FLOAT] = &convertHFloat;
+ colorConversionMap[GL_HALF_FLOAT_OES] = &convertHFloat;
+ colorConversionMap[GL_FLOAT] = &convertFloat;
+ colorConversionMap[GL_SHORT] = &convertShort;
+ colorConversionMap[GL_UNSIGNED_SHORT] = &convertUShort;
+ colorConversionMap[GL_INT] = &convertInt;
+ colorConversionMap[GL_UNSIGNED_INT] = &convertUInt;
+ colorConversionMap[GL_UNSIGNED_INT_24_8] = &convertUInt_24_8;
+ colorConversionMap[GL_FLOAT_32_UNSIGNED_INT_24_8_REV] = &convertFloat_32_Uint_24_8;
+ colorConversionMap[GL_UNSIGNED_SHORT_4_4_4_4] = &convertUShort_4_4_4_4;
+ colorConversionMap[GL_UNSIGNED_SHORT_5_5_5_1] = &convertUShort_5_5_5_1;
+ colorConversionMap[GL_UNSIGNED_SHORT_5_6_5] = &convertUShort_5_6_5;
+ colorConversionMap[GL_UNSIGNED_INT_2_10_10_10_REV] = &convertUInt_2_10_10_10_rev;
+ colorConversionMap[GL_UNSIGNED_INT_10F_11F_11F_REV] = &convertUInt_10f_11f_11f_rev;
+ colorConversionMap[GL_UNSIGNED_INT_5_9_9_9_REV] = &convertUint_5_9_9_9_rev;
}
ColorConversionFunc convertColor = colorConversionMap.at(type);
+ if (isSRGB)
+ convertColor = std::bind(convertColor, std::bind(tcu::linearToSRGB, _1), _2, _3);
float lwidth = static_cast<float>(width - 1);
float lheight = static_cast<float>(height - 1);
@@ -573,6 +609,15 @@
dstUint[0] = (d & 0xFFFFFF00) | (s & 0xFF);
}
+void InternalformatCaseBase::convertFloat_32_Uint_24_8(tcu::Vec4 inColor, unsigned char* dst, int)
+{
+ float* dstFloat = reinterpret_cast<float*>(dst);
+ unsigned int* dstUint = reinterpret_cast<unsigned int*>(dst);
+
+ dstFloat[0] = inColor[0];
+ dstUint[1] = static_cast<unsigned int>(inColor[1] * 255u) & 0xFF;
+}
+
void InternalformatCaseBase::convertUShort_4_4_4_4(tcu::Vec4 inColor, unsigned char* dst, int)
{
unsigned short* dstUShort = reinterpret_cast<unsigned short*>(dst);
@@ -622,6 +667,61 @@
dstUint[0] = (a & 0xC0000000) | (b & 0x3FF00000) | (g & 0x000FFC00) | (r & 0x000003FF);
}
+void InternalformatCaseBase::convertUInt_10f_11f_11f_rev(tcu::Vec4 inColor, unsigned char* dst, int)
+{
+ unsigned int* dstUint = reinterpret_cast<unsigned int*>(dst);
+
+ unsigned int b = floatToUnisgnedF10(inColor[2]);
+ unsigned int g = floatToUnisgnedF11(inColor[1]);
+ unsigned int r = floatToUnisgnedF11(inColor[0]);
+
+ dstUint[0] = (b << 22) | (g << 11) | r;
+}
+
+void InternalformatCaseBase::convertUint_5_9_9_9_rev(tcu::Vec4 inColor, unsigned char* dst, int)
+{
+ unsigned int* dstUint = reinterpret_cast<unsigned int*>(dst);
+
+ const int N = 9;
+ const int B = 15;
+ const int E_max = 31;
+
+ GLfloat red = inColor[0];
+ GLfloat green = inColor[1];
+ GLfloat blue = inColor[2];
+
+ GLfloat sharedExpMax =
+ (deFloatPow(2.0f, (float)N) - 1.0f) / deFloatPow(2.0f, (float)N) * deFloatPow(2.0f, (float)(E_max - B));
+
+ GLfloat red_c = deFloatMax(0, deFloatMin(sharedExpMax, red));
+ GLfloat green_c = deFloatMax(0, deFloatMin(sharedExpMax, green));
+ GLfloat blue_c = deFloatMax(0, deFloatMin(sharedExpMax, blue));
+
+ GLfloat max_c = deFloatMax(deFloatMax(red_c, green_c), blue_c);
+
+ GLfloat exp_p = deFloatMax(-B - 1, deFloatFloor(deFloatLog2(max_c))) + 1 + B;
+
+ GLfloat max_s = deFloatFloor(max_c / deFloatPow(2.0f, exp_p - (float)B - (float)N) + 0.5f);
+
+ GLfloat exp_s;
+
+ if (0 <= max_s && max_s < deFloatPow(2.0f, (float)N))
+ exp_s = exp_p;
+ else
+ exp_s = exp_p + 1;
+
+ GLfloat red_s = deFloatFloor(red_c / deFloatPow(2.0f, exp_s - (float)B - (float)N) + 0.5f);
+ GLfloat green_s = deFloatFloor(green_c / deFloatPow(2.0f, exp_s - (float)B - (float)N) + 0.5f);
+ GLfloat blue_s = deFloatFloor(blue_c / deFloatPow(2.0f, exp_s - (float)B - (float)N) + 0.5f);
+
+ GLuint c1 = (static_cast<GLuint>(red_s)) & 511;
+ GLuint c2 = (static_cast<GLuint>(green_s)) & 511;
+ GLuint c3 = (static_cast<GLuint>(blue_s)) & 511;
+ GLuint c4 = (static_cast<GLuint>(exp_s)) & 31;
+
+ dstUint[0] = (c1) | (c2 << 9) | (c3 << 18) | (c4 << 27);
+}
+
GLhalf InternalformatCaseBase::floatToHalf(float f)
{
const unsigned int HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP = 0x38000000;
@@ -705,17 +805,26 @@
formatMap[GL_RG] = TextureFormat(GL_RG, GL_UNSIGNED_BYTE, GL_RG);
formatMap[GL_RGB] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
formatMap[GL_RGBA] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
- formatMap[GL_RGBA_INTEGER] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
- formatMap[GL_RGB_INTEGER] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
+ formatMap[GL_RGBA_INTEGER] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
+ formatMap[GL_RGB_INTEGER] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
formatMap[GL_ALPHA] = TextureFormat(GL_ALPHA, GL_UNSIGNED_BYTE, GL_ALPHA);
formatMap[GL_LUMINANCE] = TextureFormat(GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE);
formatMap[GL_LUMINANCE_ALPHA] = TextureFormat(GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_LUMINANCE_ALPHA);
formatMap[GL_DEPTH_COMPONENT] = TextureFormat(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_DEPTH_COMPONENT);
- formatMap[GL_DEPTH_STENCIL] = TextureFormat(GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH_STENCIL);
+ formatMap[GL_DEPTH_STENCIL] = TextureFormat(GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH_STENCIL);
if (glu::IsES3Compatible(gl))
{
- formatMap[GL_DEPTH_STENCIL] = TextureFormat(GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH24_STENCIL8_OES);
+ formatMap[GL_RED] = TextureFormat(GL_RED, GL_UNSIGNED_BYTE, GL_R8);
+ formatMap[GL_RG] = TextureFormat(GL_RG, GL_UNSIGNED_BYTE, GL_RG8);
+ formatMap[GL_DEPTH_COMPONENT] =
+ TextureFormat(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_DEPTH_COMPONENT16);
+ formatMap[GL_DEPTH_STENCIL] =
+ TextureFormat(GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH24_STENCIL8_OES);
+ formatMap[GL_RED_INTEGER] = TextureFormat(GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_R8UI);
+ formatMap[GL_RG_INTEGER] = TextureFormat(GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_RG8UI);
+ formatMap[GL_SRGB] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
+ formatMap[GL_SRGB_ALPHA] = TextureFormat(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB);
}
}
@@ -730,6 +839,16 @@
const TextureFormat& referenceFormat = formatIterator->second;
+ auto referenceInternalFormat = referenceFormat.internalFormat;
+ auto referenceType = referenceFormat.type;
+
+ // Above lookup only considers m_testFormat.format
+ if (m_testFormat.internalFormat == GL_DEPTH_COMPONENT32F)
+ {
+ referenceInternalFormat = GL_DEPTH_COMPONENT24;
+ referenceType = GL_UNSIGNED_INT;
+ }
+
if (m_renderWidth > m_context.getRenderTarget().getWidth())
m_renderWidth = m_context.getRenderTarget().getWidth();
if (m_renderHeight > m_context.getRenderTarget().getHeight())
@@ -742,8 +861,8 @@
// Create test and reference texture
GLuint testTextureName = createTexture(m_testFormat.internalFormat, m_testFormat.format, m_testFormat.type,
m_testFormat.minFilter, m_testFormat.magFilter);
- GLuint referenceTextureName = createTexture(referenceFormat.internalFormat, referenceFormat.format,
- referenceFormat.type, m_testFormat.minFilter, m_testFormat.magFilter);
+ GLuint referenceTextureName = createTexture(referenceInternalFormat, referenceFormat.format, referenceType,
+ m_testFormat.minFilter, m_testFormat.magFilter);
// Create program that will render tested texture to screen
glu::ShaderProgram testProgram(
@@ -765,7 +884,7 @@
// Create program that will render reference texture to screen
glu::ProgramSources referenceSources =
- prepareTexturingProgramSources(referenceFormat.internalFormat, referenceFormat.format, referenceFormat.type);
+ prepareTexturingProgramSources(referenceInternalFormat, referenceFormat.format, referenceType);
glu::ShaderProgram referenceProgram(renderContext, referenceSources);
if (!referenceProgram.isOk())
{
@@ -823,9 +942,10 @@
const Functions& gl = renderContext.getFunctions();
// Determine texture format and type
- GLint textureInternalFormat = m_testFormat.internalFormat;
- GLuint textureType = getTypeFromInternalFormat(textureInternalFormat);
- GLuint textureFormat = getUnsizedFormatFromInternalFormat(textureInternalFormat);
+ GLint textureInternalFormat = m_testFormat.internalFormat;
+ GLuint textureType = getTypeFromInternalFormat(textureInternalFormat);
+ GLuint textureFormat = getUnsizedFormatFromInternalFormat(textureInternalFormat);
+ const bool isSRGB = textureInternalFormat == GL_SRGB8 || textureInternalFormat == GL_SRGB8_ALPHA8;
// Create program that will render texture to screen
glu::ShaderProgram program(renderContext,
@@ -849,7 +969,8 @@
GLuint mainFboId = 0;
gl.genFramebuffers(1, &mainFboId);
gl.bindFramebuffer(GL_FRAMEBUFFER, mainFboId);
- GLuint mainFboColorTextureId = createTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, GL_NEAREST, false);
+ GLuint mainFboColorTextureId =
+ createTexture(isSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GL_NEAREST, GL_NEAREST, false);
gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mainFboColorTextureId, 0);
// Render reference texture to main FBO and grab it
@@ -957,6 +1078,8 @@
void renderColoredQuad(GLuint programId, const float* positions) const;
glu::ProgramSources prepareColoringProgramSources(GLenum format, GLenum type) const;
void convertUInt(const tcu::PixelBufferAccess &src, const tcu::PixelBufferAccess &dst);
+ void convertsRGB(const tcu::PixelBufferAccess& src, const tcu::PixelBufferAccess& dst);
+ void convertsRGBA(const tcu::PixelBufferAccess& src, const tcu::PixelBufferAccess& dst);
void convertUInt_2_10_10_10_rev(const tcu::PixelBufferAccess &src, const tcu::PixelBufferAccess &dst);
private:
@@ -1008,6 +1131,7 @@
GLenum testFormat = getUnsizedFormatFromInternalFormat(m_testFormat.format);
GLenum testType = getTypeFromInternalFormat(m_testFormat.format);
+ const bool isSRGB = m_testFormat.format == GL_SRGB8 || m_testFormat.format == GL_SRGB8_ALPHA8;
// We need surfaces for depth testing and stencil testing, and also for
// storing the reference and the values for the format under testing
@@ -1045,7 +1169,8 @@
// Create two programs for rendering, one for rendering into default FB, and
// a second one to render in our created FB
- glu::ShaderProgram program0(renderContext, prepareColoringProgramSources(GL_RGBA, GL_UNSIGNED_BYTE));
+ glu::ShaderProgram program0(renderContext,
+ prepareColoringProgramSources(GL_RGBA, GL_UNSIGNED_BYTE));
glu::ShaderProgram program1(renderContext, prepareColoringProgramSources(testFormat, testType));
std::vector<glu::ShaderProgram*> programs;
@@ -1087,6 +1212,7 @@
}
gl.bindFramebuffer(GL_FRAMEBUFFER, loop ? m_fbo : m_context.getRenderContext().getDefaultFramebuffer());
+
gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
if (defaultFramebufferDepthBits)
@@ -1102,7 +1228,20 @@
// Draws large quad
renderColoredQuad(programs[loop]->getProgram(), bigQuadPositionsSet);
- if (loop && testFormat == GL_RGBA_INTEGER)
+ if (loop && isSRGB)
+ {
+ de::ArrayBuffer<deUint32> pixels;
+ pixels.setStorage(4 * m_renderWidth * m_renderHeight);
+ tcu::PixelBufferAccess pixelBuffer(tcu::TextureFormat(tcu::TextureFormat::sRGBA, tcu::TextureFormat::UNSIGNED_INT8),
+ m_renderWidth, m_renderHeight, 1, pixels.getPtr());
+ glu::readPixels(renderContext, 0, 0, pixelBuffer);
+ if (m_testFormat.format == GL_SRGB8_ALPHA8)
+ convertsRGBA(pixelBuffer, testSurface[0][loop].getAccess());
+ else
+ convertsRGB(pixelBuffer, testSurface[0][loop].getAccess());
+ }
+ else if (loop &&
+ (testFormat == GL_RGBA_INTEGER || testFormat == GL_RG_INTEGER || testFormat == GL_RED_INTEGER))
{
de::ArrayBuffer<deUint32> pixels;
pixels.setStorage(4 * m_renderWidth * m_renderHeight);
@@ -1382,7 +1521,7 @@
return glu::makeVtxFragSources(vs.c_str(), fs.c_str());
}
-typedef TextureFormat TF;
+typedef TextureFormat TF;
typedef CopyTexImageFormat CF;
typedef RenderbufferFormat RF;
@@ -1454,31 +1593,80 @@
if (glu::contextSupports(contextType, glu::ApiType::es(3, 0)))
{
TextureFormat es3Texture2DFormats[] = {
- TF(GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA4),
- TF(GL_RGBA, GL_UNSIGNED_BYTE, GL_RGB5_A1),
- TF(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB565),
- TF(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_RGBA4),
- TF(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_RGBA),
- TF(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_RGB5_A1),
- TF(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB),
- TF(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB565),
- TF(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB8),
TF(GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA8),
- TF(GL_RGB, GL_HALF_FLOAT, GL_RGB16F),
+ TF(GL_RGBA, GL_UNSIGNED_BYTE, GL_RGB5_A1),
+ TF(GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA4),
+ TF(GL_RGBA, GL_UNSIGNED_BYTE, GL_SRGB8_ALPHA8),
+ TF(GL_RGBA, GL_BYTE, GL_RGBA8_SNORM),
+ TF(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_RGBA4),
+ TF(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_RGB5_A1),
TF(GL_RGBA, GL_HALF_FLOAT, GL_RGBA16F),
+ TF(GL_RGBA, GL_FLOAT, GL_RGBA16F),
+ TF(GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_RGBA8UI),
+ TF(GL_RGBA_INTEGER, GL_BYTE, GL_RGBA8I),
+ TF(GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_RGBA16UI),
+ TF(GL_RGBA_INTEGER, GL_SHORT, GL_RGBA16I),
+ TF(GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_RGBA32UI),
+ TF(GL_RGBA_INTEGER, GL_INT, GL_RGBA32I),
+ TF(GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_RGB10_A2UI),
+ TF(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB8),
+ TF(GL_RGB, GL_UNSIGNED_BYTE, GL_RGB565),
+ TF(GL_RGB, GL_UNSIGNED_BYTE, GL_SRGB8),
+ TF(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB565),
+ TF(GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_R11F_G11F_B10F),
+ TF(GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_RGB9_E5),
+ TF(GL_RGB, GL_HALF_FLOAT, GL_RGB16F),
+ TF(GL_RGB, GL_HALF_FLOAT, GL_R11F_G11F_B10F),
+ TF(GL_RGB, GL_HALF_FLOAT, GL_RGB9_E5),
+ TF(GL_RGB, GL_FLOAT, GL_RGB16F),
+ TF(GL_RGB, GL_FLOAT, GL_R11F_G11F_B10F),
+ TF(GL_RGB, GL_FLOAT, GL_RGB9_E5),
+ TF(GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_RGB8UI),
+ TF(GL_RGB_INTEGER, GL_BYTE, GL_RGB8I),
+ TF(GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_RGB16UI),
+ TF(GL_RGB_INTEGER, GL_SHORT, GL_RGB16I),
+ TF(GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_RGB32UI),
+ TF(GL_RGB_INTEGER, GL_INT, GL_RGB32I),
+ TF(GL_RG, GL_UNSIGNED_BYTE, GL_RG8),
+ TF(GL_RG, GL_HALF_FLOAT, GL_RG16F),
+ TF(GL_RG, GL_FLOAT, GL_RG32F),
+ TF(GL_RG, GL_FLOAT, GL_RG16F),
+ TF(GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_RG8UI),
+ TF(GL_RG_INTEGER, GL_BYTE, GL_RG8I),
+ TF(GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_RG16UI),
+ TF(GL_RG_INTEGER, GL_SHORT, GL_RG16I),
+ TF(GL_RG_INTEGER, GL_UNSIGNED_INT, GL_RG32UI),
+ TF(GL_RG_INTEGER, GL_INT, GL_RG32I),
+ TF(GL_RED, GL_UNSIGNED_BYTE, GL_R8),
+ TF(GL_RED, GL_HALF_FLOAT, GL_R16F),
+ TF(GL_RED, GL_FLOAT, GL_R32F),
+ TF(GL_RED, GL_FLOAT, GL_R16F),
+ TF(GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_R8UI),
+ TF(GL_RED_INTEGER, GL_BYTE, GL_R8I),
+ TF(GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_R16UI),
+ TF(GL_RED_INTEGER, GL_SHORT, GL_R16I),
+ TF(GL_RED_INTEGER, GL_UNSIGNED_INT, GL_R32UI),
+ TF(GL_RED_INTEGER, GL_INT, GL_R32I),
+ TF(GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_DEPTH_COMPONENT16),
+ TF(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_DEPTH_COMPONENT24),
+ TF(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_DEPTH_COMPONENT16),
+ TF(GL_DEPTH_COMPONENT, GL_FLOAT, GL_DEPTH_COMPONENT32F),
TF(GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH24_STENCIL8),
+ TF(GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_DEPTH32F_STENCIL8),
+ TF(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_RGBA),
+ TF(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB),
};
CopyTexImageFormat es3CopyTexImageFormats[] = {
- CF(GL_RGBA4),
- CF(GL_RGB5_A1),
- CF(GL_RGB565),
- CF(GL_RGBA8),
- CF(GL_RGB8),
+ CF(GL_RGBA4), CF(GL_RGB5_A1), CF(GL_RGB565), CF(GL_RGBA8),
+ CF(GL_RGB8), CF(GL_SRGB8_ALPHA8), CF(GL_SRGB8), CF(GL_R11F_G11F_B10F),
};
RenderbufferFormat es3RenderbufferFormats[] = {
RF(GL_RGB5_A1, RENDERBUFFER_COLOR),
+ RF(GL_SRGB8_ALPHA8, RENDERBUFFER_COLOR),
+ RF(GL_DEPTH_COMPONENT32F, RENDERBUFFER_DEPTH),
+ RF(GL_DEPTH32F_STENCIL8, RENDERBUFFER_DEPTH_STENCIL),
};
append(testData.texture2DFormats, es3Texture2DFormats);
@@ -1582,12 +1770,9 @@
};
CopyTexImageFormat commonCopyTexImageFormats[] = {
- CF(GL_DEPTH_COMPONENT16, ARB_depth_texture),
- CF(GL_DEPTH_COMPONENT24, ARB_depth_texture),
- CF(GL_DEPTH_COMPONENT32, ARB_depth_texture),
- CF(GL_RGB9_E5, EXT_texture_shared_exponent),
- CF(GL_RGB10_A2UI, ARB_texture_rgb10_a2ui),
- CF(GL_RGB10_A2),
+ CF(GL_DEPTH_COMPONENT16, ARB_depth_texture), CF(GL_DEPTH_COMPONENT24, ARB_depth_texture),
+ CF(GL_DEPTH_COMPONENT32, ARB_depth_texture), CF(GL_RGB9_E5, EXT_texture_shared_exponent),
+ CF(GL_RGB10_A2UI, ARB_texture_rgb10_a2ui), CF(GL_RGB10_A2),
};
RenderbufferFormat commonRenderbufferFormats[] = {
@@ -1704,6 +1889,30 @@
}
}
+void RenderbufferCase::convertsRGB(const tcu::PixelBufferAccess& src, const tcu::PixelBufferAccess& dst)
+{
+ for (int z = 0; z < dst.getDepth(); ++z)
+ for (int y = 0; y < dst.getHeight(); ++y)
+ for (int x = 0; x < dst.getWidth(); ++x)
+ {
+ tcu::UVec4 srcPixel = src.getPixelUint(x, y, z);
+ tcu::Vec4 dstPixel = sRGB8ToLinear(srcPixel);
+ dst.setPixel(dstPixel, x, y, z);
+ }
+}
+
+void RenderbufferCase::convertsRGBA(const tcu::PixelBufferAccess& src, const tcu::PixelBufferAccess& dst)
+{
+ for (int z = 0; z < dst.getDepth(); ++z)
+ for (int y = 0; y < dst.getHeight(); ++y)
+ for (int x = 0; x < dst.getWidth(); ++x)
+ {
+ tcu::UVec4 srcPixel = src.getPixelUint(x, y, z);
+ tcu::Vec4 dstPixel = sRGBA8ToLinear(srcPixel);
+ dst.setPixel(dstPixel, x, y, z);
+ }
+}
+
void RenderbufferCase::convertUInt_2_10_10_10_rev(const tcu::PixelBufferAccess &src, const tcu::PixelBufferAccess &dst)
{
for (int z = 0; z < dst.getDepth(); ++z)
diff --git a/external/openglcts/modules/common/glcNearestEdgeTests.cpp b/external/openglcts/modules/common/glcNearestEdgeTests.cpp
index 14f63be..5eb7bba 100644
--- a/external/openglcts/modules/common/glcNearestEdgeTests.cpp
+++ b/external/openglcts/modules/common/glcNearestEdgeTests.cpp
@@ -74,7 +74,7 @@
static std::string getName (OffsetDirection direction);
static std::string getDesc (OffsetDirection direction);
- static tcu::TextureFormat toTextureFormat (const tcu::PixelFormat& pixelFmt);
+ static tcu::TextureFormat toTextureFormat (deqp::Context& context, const tcu::PixelFormat& pixelFmt);
private:
static const glw::GLenum kTextureType = GL_TEXTURE_2D;
@@ -124,7 +124,7 @@
// Translate pixel format in the frame buffer to texture format.
// Copied from sglrReferenceContext.cpp.
-tcu::TextureFormat NearestEdgeTestCase::toTextureFormat (const tcu::PixelFormat& pixelFmt)
+tcu::TextureFormat NearestEdgeTestCase::toTextureFormat (deqp::Context& context, const tcu::PixelFormat& pixelFmt)
{
static const struct
{
@@ -144,7 +144,22 @@
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(pixelFormatMap); ndx++)
{
if (pixelFormatMap[ndx].pixelFmt == pixelFmt)
+ {
+ // Some implementations treat GL_RGB8 as GL_RGBA8888,so the test should pass implementation format to ReadPixels.
+ if (pixelFmt == tcu::PixelFormat(8, 8, 8, 0))
+ {
+ const auto& gl = context.getRenderContext().getFunctions();
+
+ glw::GLint implFormat = GL_NONE;
+ glw::GLint implType = GL_NONE;
+ gl.getIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &implFormat);
+ gl.getIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &implType);
+ if (implFormat == GL_RGBA && implType == GL_UNSIGNED_BYTE)
+ return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
+ }
+
return pixelFormatMap[ndx].texFmt;
+ }
}
TCU_FAIL("Unable to map pixel format to texture format");
@@ -156,7 +171,7 @@
, m_width {context.getRenderTarget().getWidth()}
, m_height {context.getRenderTarget().getHeight()}
, m_format {context.getRenderTarget().getPixelFormat()}
- , m_texFormat {toTextureFormat(m_format)}
+ , m_texFormat {toTextureFormat(context, m_format)}
, m_texFormatInfo {tcu::getTextureFormatInfo(m_texFormat)}
, m_transFormat {glu::getTransferFormat(m_texFormat)}
{
@@ -172,32 +187,36 @@
TCU_THROW(NotSupportedError, "Render target size too small");
m_vertShaderText =
- "#version ${VERSION}\n"
- "\n"
- "in highp vec2 position;\n"
- "in highp vec2 inTexCoord;\n"
- "out highp vec2 commonTexCoord;\n"
- "\n"
- "void main()\n"
- "{\n"
- " commonTexCoord = inTexCoord;\n"
- " gl_Position = vec4(position, 0.0, 1.0);\n"
- "}\n"
- ;
-
- m_fragShaderText =
- "#version ${VERSION}\n"
- "\n"
- "in highp vec2 commonTexCoord;\n"
- "out highp vec4 fragColor;\n"
- "\n"
- "uniform highp sampler2D texSampler;\n"
- "\n"
- "void main()\n"
- "{\n"
- " fragColor = texture(texSampler, commonTexCoord);\n"
- "}\n"
- "\n";
+ "#version ${VERSION}\n"
+ "\n"
+ "in highp vec2 position;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = vec4(position, 0.0, 1.0);\n"
+ "}\n"
+ ;
+ m_fragShaderText =
+ "#version ${VERSION}\n"
+ "\n"
+ "precision highp float;\n"
+ "out highp vec4 fragColor;\n"
+ "\n"
+ "uniform highp sampler2D texSampler;\n"
+ "uniform float texOffset;\n"
+ "uniform float texWidth;\n"
+ "uniform float texHeight;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " float texCoordX;\n"
+ " float texCoordY;\n"
+ " texCoordX = (gl_FragCoord.x + texOffset) / texWidth;\n "
+ " texCoordY = (gl_FragCoord.y + texOffset) / texHeight;\n"
+ " vec2 sampleCoord = vec2(texCoordX, texCoordY);\n"
+ " fragColor = texture(texSampler, sampleCoord);\n"
+ "}\n"
+ "\n";
tcu::StringTemplate vertShaderTemplate{m_vertShaderText};
tcu::StringTemplate fragShaderTemplate{m_fragShaderText};
@@ -288,6 +307,7 @@
// Apply offset of almost half a texel to the texture coordinates.
DE_ASSERT(m_offsetSign == 1.0f || m_offsetSign == -1.0f);
+
const float offset = 0.5f - pow(2.0f, -8.0f);
const float offsetWidth = offset / static_cast<float>(m_width);
const float offsetHeight = offset / static_cast<float>(m_height);
@@ -303,8 +323,7 @@
const std::vector<glu::VertexArrayBinding> vertexArrays =
{
- glu::va::Float("position", 2, 4, 0, positions.data()),
- glu::va::Float("inTexCoord", 2, 4, 0, texCoords.data())
+ glu::va::Float("position", 2, 4, 0, positions.data())
};
glu::ShaderProgram program(m_context.getRenderContext(), glu::makeVtxFragSources(m_vertShaderText, m_fragShaderText));
@@ -317,6 +336,12 @@
gl.uniform1i(gl.getUniformLocation(program.getProgram(), "texSampler"), 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i failed");
+ gl.uniform1f(gl.getUniformLocation(program.getProgram(), "texOffset"), m_offsetSign * offset);
+ gl.uniform1f(gl.getUniformLocation(program.getProgram(), "texWidth"), float(m_width));
+ gl.uniform1f(gl.getUniformLocation(program.getProgram(), "texHeight"), float(m_height));
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i failed");
+
+ gl.disable(GL_DITHER);
gl.clear(GL_COLOR_BUFFER_BIT);
glu::draw(renderContext, program.getProgram(),
diff --git a/external/openglcts/modules/gl/gl3cCullDistanceTests.cpp b/external/openglcts/modules/gl/gl3cCullDistanceTests.cpp
index 3b82996..6673b26 100644
--- a/external/openglcts/modules/gl/gl3cCullDistanceTests.cpp
+++ b/external/openglcts/modules/gl/gl3cCullDistanceTests.cpp
@@ -746,9 +746,10 @@
std::string gs_body = gs_body_template;
static const glw::GLchar* tc_body_template =
- "#version 400\n"
+ "#version 150\n"
"\n"
"#extension GL_ARB_cull_distance : require\n"
+ "#extension GL_ARB_tessellation_shader : require\n"
"\n"
"layout(vertices = 1) out;\n"
"\n"
@@ -771,9 +772,10 @@
std::string tc_body = tc_body_template;
static const glw::GLchar* te_body_template =
- "#version 400\n"
+ "#version 150\n"
"\n"
"#extension GL_ARB_cull_distance : require\n"
+ "#extension GL_ARB_tessellation_shader : require\n"
"\n"
"flat in int INPUT_TE_NAME[];\n"
"flat out int out_te;\n"
diff --git a/external/openglcts/modules/gl/gl3cTestPackages.cpp b/external/openglcts/modules/gl/gl3cTestPackages.cpp
index 154d44a..576457c 100644
--- a/external/openglcts/modules/gl/gl3cTestPackages.cpp
+++ b/external/openglcts/modules/gl/gl3cTestPackages.cpp
@@ -48,6 +48,7 @@
#include "glcTextureRepeatModeTests.hpp"
#include "glcUniformBlockTests.hpp"
#include "glcNearestEdgeTests.hpp"
+#include "glcGLSLVectorConstructorTests.hpp"
#include "gluStateReset.hpp"
#include "tcuTestLog.hpp"
#include "tcuWaiverUtil.hpp"
@@ -144,6 +145,7 @@
void init(void)
{
addChild(new deqp::ShaderLibraryGroup(m_context, "declarations", "Declaration Tests", "gl30/declarations.test"));
+ addChild(new deqp::GLSLVectorConstructorTests(m_context, glu::GLSL_VERSION_330));
}
};
diff --git a/external/openglcts/modules/gl/gl3cTransformFeedbackTests.cpp b/external/openglcts/modules/gl/gl3cTransformFeedbackTests.cpp
index a461ac4..fb3f596 100644
--- a/external/openglcts/modules/gl/gl3cTransformFeedbackTests.cpp
+++ b/external/openglcts/modules/gl/gl3cTransformFeedbackTests.cpp
@@ -135,6 +135,7 @@
/* Initializations. */
bool is_at_least_gl_30 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(3, 0)));
+ bool is_at_least_gl_33 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(3, 3)));
bool is_at_least_gl_40 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 0)));
bool is_at_least_gl_42 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 2)));
@@ -142,7 +143,6 @@
bool is_arb_tf_2 = m_context.getContextInfo().isExtensionSupported("GL_ARB_transform_feedback2");
bool is_arb_tf_3 = m_context.getContextInfo().isExtensionSupported("GL_ARB_transform_feedback3");
bool is_arb_tf_instanced = m_context.getContextInfo().isExtensionSupported("GL_ARB_transform_feedback_instanced");
- bool is_tessellation = m_context.getContextInfo().isExtensionSupported("GL_ARB_tessellation_shader");
if (is_ext_tf_1)
{
@@ -226,14 +226,17 @@
gl, m_context.getTestContext().getLog(), NULL, NULL, NULL, s_vertex_shader_without_output,
s_fragment_shader, NULL, 0, GL_SEPARATE_ATTRIBS);
- m_program_id_with_geometry_shader = gl3cts::TransformFeedback::Utilities::buildProgram(
- gl, m_context.getTestContext().getLog(), m_geometry_shader, NULL, NULL, s_vertex_shader_without_output,
- s_fragment_shader, &m_varying_name, 1, GL_INTERLEAVED_ATTRIBS);
+ is_ok = is_ok && m_program_id_with_input_output && m_program_id_with_output && m_program_id_without_output;
- is_ok = is_ok && m_program_id_with_input_output && m_program_id_with_output && m_program_id_without_output &&
- m_program_id_with_geometry_shader;
+ if (is_at_least_gl_33) {
+ m_program_id_with_geometry_shader = gl3cts::TransformFeedback::Utilities::buildProgram(
+ gl, m_context.getTestContext().getLog(), m_geometry_shader, NULL, NULL, s_vertex_shader_without_output,
+ s_fragment_shader, &m_varying_name, 1, GL_INTERLEAVED_ATTRIBS);
- if (is_at_least_gl_40 || is_tessellation) {
+ is_ok = is_ok && m_program_id_with_geometry_shader;
+ }
+
+ if (is_at_least_gl_40) {
m_program_id_with_tessellation_shaders = gl3cts::TransformFeedback::Utilities::buildProgram(
gl, m_context.getTestContext().getLog(), NULL, m_tessellation_control_shader,
m_tessellation_evaluation_shader, s_vertex_shader_without_output, s_fragment_shader, &m_varying_name, 1,
@@ -1380,6 +1383,7 @@
GL_TRIANGLES,
GL_TRIANGLE_STRIP_ADJACENCY,
GL_TRIANGLES_ADJACENCY,
+ GL_QUADS,
GL_PATCHES };
std::set<glw::GLenum> supported_mode(_supported_mode,
@@ -1414,63 +1418,65 @@
return false;
}
- /* INVALID_OPERATION is generated by DrawTransformFeedbackInstanced and
- DrawTransformFeedbackStreamInstanced if <mode> does not match geometry
- shader */
+ if (m_program_id_with_geometry_shader != 0) {
+ /* INVALID_OPERATION is generated by DrawTransformFeedbackInstanced and
+ DrawTransformFeedbackStreamInstanced if <mode> does not match geometry
+ shader */
- gl.bindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_transform_feedback_object_0);
+ gl.bindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_transform_feedback_object_0);
- GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTransformFeedback call failed.");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTransformFeedback call failed.");
- gl.useProgram(m_program_id_with_geometry_shader);
+ gl.useProgram(m_program_id_with_geometry_shader);
- GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed.");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed.");
- gl.bindVertexArray(m_vertex_array_object);
+ gl.bindVertexArray(m_vertex_array_object);
- GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray call failed.");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray call failed.");
- gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer_0);
+ gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer_0);
- GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer call failed.");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer call failed.");
- gl.beginTransformFeedback(GL_POINTS);
+ gl.beginTransformFeedback(GL_POINTS);
- GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginTransformFeedback call failed.");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginTransformFeedback call failed.");
- gl.drawArrays(GL_POINTS, 0, 1);
+ gl.drawArrays(GL_POINTS, 0, 1);
- GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays call failed.");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays call failed.");
- gl.endTransformFeedback();
+ gl.endTransformFeedback();
- GLU_EXPECT_NO_ERROR(gl.getError(), "glEndTransformFeedback call failed.");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glEndTransformFeedback call failed.");
- gl.drawTransformFeedbackInstanced(GL_LINES, m_transform_feedback_object_0, 1);
+ gl.drawTransformFeedbackInstanced(GL_LINES, m_transform_feedback_object_0, 1);
- if (GL_INVALID_OPERATION != gl.getError())
- {
- m_context.getTestContext().getLog()
- << tcu::TestLog::Message << "INVALID_OPERATION was not generated by DrawTransformFeedbackInstanced and "
- "DrawTransformFeedbackStreamInstanced if <mode> did not match geometry shader."
- << tcu::TestLog::EndMessage;
- return false;
- }
+ if (GL_INVALID_OPERATION != gl.getError())
+ {
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message << "INVALID_OPERATION was not generated by DrawTransformFeedbackInstanced and "
+ "DrawTransformFeedbackStreamInstanced if <mode> did not match geometry shader."
+ << tcu::TestLog::EndMessage;
+ return false;
+ }
- gl.drawTransformFeedbackStreamInstanced(GL_LINES, m_transform_feedback_object_0, 0, 1);
+ gl.drawTransformFeedbackStreamInstanced(GL_LINES, m_transform_feedback_object_0, 0, 1);
- if (GL_INVALID_OPERATION != gl.getError())
- {
- m_context.getTestContext().getLog()
- << tcu::TestLog::Message << "INVALID_OPERATION was not generated by DrawTransformFeedbackInstanced and "
- "DrawTransformFeedbackStreamInstanced if <mode> did not match geometry shader."
- << tcu::TestLog::EndMessage;
- return false;
+ if (GL_INVALID_OPERATION != gl.getError())
+ {
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message << "INVALID_OPERATION was not generated by DrawTransformFeedbackInstanced and "
+ "DrawTransformFeedbackStreamInstanced if <mode> did not match geometry shader."
+ << tcu::TestLog::EndMessage;
+ return false;
+ }
}
/* All of the below tests concern themselves with GL_PATCHES and
* tessellation shaders */
- if (!has_patches)
+ if (m_program_id_with_tessellation_shaders == 0)
{
return true;
}
diff --git a/external/openglcts/modules/gl/gl4cComputeShaderTests.cpp b/external/openglcts/modules/gl/gl4cComputeShaderTests.cpp
index dd77f27..6b53f18 100644
--- a/external/openglcts/modules/gl/gl4cComputeShaderTests.cpp
+++ b/external/openglcts/modules/gl/gl4cComputeShaderTests.cpp
@@ -4774,6 +4774,8 @@
glDrawArrays(GL_TRIANGLES, 0, 3);
glEndTransformFeedback();
+ glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
+
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_xfb_buffer);
glUseProgram(m_program[1]);
glDispatchCompute(1, 1, 1);
diff --git a/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.cpp b/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.cpp
index 3649088..2827f36 100644
--- a/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.cpp
+++ b/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.cpp
@@ -85,6 +85,19 @@
"{\n"
" atomicCounterIncrement(test_counter);\n"
"}\n";
+const char* PipelineStatisticsQueryUtilities::dummy_cs_code_arb =
+ "#version 330\n"
+ "#extension GL_ARB_compute_shader : require\n"
+ "#extension GL_ARB_shader_atomic_counters : require\n"
+ "\n"
+ "layout(local_size_x=1, local_size_y = 1, local_size_z = 1) in;\n"
+ "\n"
+ "layout(binding = 0) uniform atomic_uint test_counter;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " atomicCounterIncrement(test_counter);\n"
+ "}\n";
const char* PipelineStatisticsQueryUtilities::dummy_fs_code = "#version 130\n"
"\n"
"out vec4 result;\n"
@@ -4322,15 +4335,25 @@
void PipelineStatisticsQueryTestFunctional8::initObjects()
{
const glw::Functions& gl = m_context.getRenderContext().getFunctions();
+ const char* cs_code = NULL;
/* This test should not execute if we don't have compute shaders */
- if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 3)) &&
- !m_context.getContextInfo().isExtensionSupported("GL_ARB_compute_shader"))
+ if (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 3)))
{
- throw tcu::NotSupportedError("OpenGL 4.3+ / compute shaders required to run this test.");
+ cs_code = PipelineStatisticsQueryUtilities::dummy_cs_code;
+ }
+ else if (m_context.getContextInfo().isExtensionSupported("GL_ARB_compute_shader") &&
+ m_context.getContextInfo().isExtensionSupported("GL_ARB_shader_atomic_counters"))
+ {
+ cs_code = PipelineStatisticsQueryUtilities::dummy_cs_code_arb;
+ }
+ else
+ {
+ throw tcu::NotSupportedError("OpenGL 4.3+ / compute shaders and atomic counters required to run this test.");
}
- buildProgram(PipelineStatisticsQueryUtilities::dummy_cs_code, DE_NULL, /* fs_body */
+ buildProgram(cs_code,
+ DE_NULL, /* fs_body */
DE_NULL, /* gs_body */
DE_NULL, /* tc_body */
DE_NULL, /* te_body */
diff --git a/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.hpp b/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.hpp
index 6bbb61b..af75940 100644
--- a/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.hpp
+++ b/external/openglcts/modules/gl/gl4cPipelineStatisticsQueryTests.hpp
@@ -221,6 +221,7 @@
* GL_COMPUTE_SHADER_INVOCATIONS_ARB query works correctly.
*/
static const char* dummy_cs_code;
+ static const char* dummy_cs_code_arb;
/* Code of a fragment shader used by a number of functional tests */
static const char* dummy_fs_code;
/* Code of a tessellation control shader used by a functional test that verifies
diff --git a/external/openglcts/modules/glcTestPackageRegistry.cpp b/external/openglcts/modules/glcTestPackageRegistry.cpp
index 0162907..55d5126 100644
--- a/external/openglcts/modules/glcTestPackageRegistry.cpp
+++ b/external/openglcts/modules/glcTestPackageRegistry.cpp
@@ -44,6 +44,7 @@
#include "es31cTestPackage.hpp"
#include "esextcTestPackage.hpp"
#include "tes31TestPackage.hpp"
+#include "tgl45TestPackage.hpp"
#if defined(DEQP_GTF_AVAILABLE)
#include "gtfES31TestPackage.hpp"
@@ -129,6 +130,10 @@
{
return new deqp::gles31::TestPackage(testCtx);
}
+static tcu::TestPackage* createdEQPGL45Package(tcu::TestContext& testCtx)
+{
+ return new deqp::gles31::TestPackageGL45(testCtx);
+}
#endif
static tcu::TestPackage* createES31Package(tcu::TestContext& testCtx)
{
@@ -292,6 +297,7 @@
#if DE_OS != DE_OS_ANDROID
registry->registerPackage("dEQP-GLES31", createdEQPES31Package);
+ registry->registerPackage("dEQP-GL45", createdEQPGL45Package);
#endif
registry->registerPackage("KHR-GLES31", createES31Package);
registry->registerPackage("KHR-GLESEXT", createESEXTPackage);
diff --git a/external/openglcts/modules/gles3/CMakeLists.txt b/external/openglcts/modules/gles3/CMakeLists.txt
index 0887c5f..7da83b6 100644
--- a/external/openglcts/modules/gles3/CMakeLists.txt
+++ b/external/openglcts/modules/gles3/CMakeLists.txt
@@ -5,6 +5,8 @@
es3cTestPackage.hpp
es3cCopyTexImageConversionsTests.cpp
es3cCopyTexImageConversionsTests.hpp
+ es3cNumberParsingTests.cpp
+ es3cNumberParsingTests.hpp
)
set(GLCTS_ES3_LIBS
diff --git a/external/openglcts/modules/gles3/es3cNumberParsingTests.cpp b/external/openglcts/modules/gles3/es3cNumberParsingTests.cpp
new file mode 100644
index 0000000..d0512fb
--- /dev/null
+++ b/external/openglcts/modules/gles3/es3cNumberParsingTests.cpp
@@ -0,0 +1,492 @@
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * 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 es3cNumberParsingTests.cpp
+ * \brief Tests for numeric value parsing in GLSL ES 3.0
+ */ /*-------------------------------------------------------------------*/
+
+#include "es3cNumberParsingTests.hpp"
+
+#include "gluDefs.hpp"
+#include "gluTextureUtil.hpp"
+#include "gluDrawUtil.hpp"
+#include "gluShaderProgram.hpp"
+
+#include "glwDefs.hpp"
+#include "glwFunctions.hpp"
+#include "glwEnums.hpp"
+
+#include "tcuTestLog.hpp"
+#include "tcuRenderTarget.hpp"
+#include "tcuStringTemplate.hpp"
+
+#include <string>
+#include <vector>
+#include <map>
+
+#include <functional>
+
+namespace es3cts
+{
+
+namespace
+{
+using std::string;
+using std::vector;
+using std::map;
+
+using std::function;
+using std::bind;
+using namespace std::placeholders;
+
+static const string defaultVertexShader =
+ "#version 300 es\n"
+ "in vec4 vPosition;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = vPosition;\n"
+ "}\n";
+
+static const string fragmentShaderTemplate =
+ "#version 300 es\n"
+ "precision highp float;\n"
+ "out vec4 my_FragColor;\n"
+ "${TEST_GLOBALS}"
+ "void main()\n"
+ "{\n"
+ "${TEST_CODE}"
+ " my_FragColor = vec4(0.0, correct, 0.0, 1.0);\n"
+ "}\n";
+
+typedef function<void (const glu::ShaderProgram&, const glw::Functions&)> SetupUniformsFn;
+
+enum struct TestType
+{
+ NORMAL = 0,
+ EXPECT_SHADER_FAIL
+};
+
+struct TestParams
+{
+ TestType testType;
+ string name;
+ string description;
+ string testGlobals;
+ string testCode;
+ SetupUniformsFn setupUniformsFn;
+};
+
+static void initializeExpectedValue(const glu::ShaderProgram& program, const glw::Functions& gl, const deUint32 value);
+static void initializeZeroValue(const glu::ShaderProgram& program, const glw::Functions& gl);
+
+static const TestParams tests[] =
+{
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_above_signed_range_decimal", // string name
+ "Test that uint value higher than INT_MAX is parsed correctly", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 3221225472u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 3221225472u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_above_signed_range_base8", // string name
+ "Test that uint value higher than INT_MAX is parsed correctly in base 8 (octal)", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 030000000000u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 3221225472u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_above_signed_range_base16", // string name
+ "Test that uint value higher than INT_MAX is parsed correctly in base 16 (hex)", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 0xc0000000u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 3221225472u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_smallest_value_above_signed_range_decimal", // string name
+ "Test that uint value equal to INT_MAX+1 is parsed correctly", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 2147483648u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 2147483648u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_smallest_value_above_signed_range_base8", // string name
+ "Test that uint value equal to INT_MAX+1 is parsed correctly in base 8 (octal)", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 020000000000u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 2147483648u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_smallest_value_above_signed_range_base16", // string name
+ "Test that uint value equal to INT_MAX+1 is parsed correctly in base 16 (hex)", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 0x80000000u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 2147483648u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_max_value_decimal", // string name
+ "Test that uint value equal to UINT_MAX is parsed correctly", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 4294967295u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 4294967295u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_max_value_base8", // string name
+ "Test that uint value equal to UINT_MAX is parsed correctly in base 8 (octal)", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 037777777777u;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 4294967295u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_max_value_base16", // string name
+ "Test that uint value equal to UINT_MAX is parsed correctly in base 16 (hex)", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = 0xffffffffu;\n"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 4294967295u) // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::EXPECT_SHADER_FAIL, // TestType testType
+ "unsigned_integer_too_large_value_invalid", // string name
+ "Test that uint value outside uint range fails to compile", // string description
+ "", // string testGlobals
+ " uint i = 0xfffffffffu;"
+ " float correct = 0.0;",
+ nullptr // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "unsigned_integer_negative_value_as_uint", // string name
+ "Test that -1u is parsed correctly", // string description
+ "uniform uint expected;\n", // string testGlobals
+ " uint i = -1u;"
+ " float correct = (i == expected) ? 1.0 : 0.0;\n",
+ bind(initializeExpectedValue, _1, _2, 0xffffffffu) // SetupUniformsFn setupUniformsFn
+ },
+ /* The following floating point parsing tests are taken from the Khronos WebGL conformance tests at:
+ * https://www.khronos.org/registry/webgl/sdk/tests/conformance2/glsl3/float-parsing.html */
+ {
+ TestType::NORMAL, // TestType testType
+ "float_out_of_range_as_infinity", // string name
+ "Floats of too large magnitude should be converted infinity", // string description
+ "", // string testGlobals
+ " // Out-of-range floats should overflow to infinity\n" // string testCode
+ " // GLSL ES 3.00.6 section 4.1.4 Floats:\n"
+ " // \"If the value of the floating point number is too large (small) to be stored as a single precision value, it is converted to positive (negative) infinity\"\n"
+ " float correct = isinf(1.0e40) ? 1.0 : 0.0;\n",
+ nullptr // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "float_out_of_range_as_zero", // string name
+ "Floats of too small magnitude should be converted to zero", // string description
+ "", // string testGlobals
+ " // GLSL ES 3.00.6 section 4.1.4 Floats:\n" // string testCode
+ " // \"A value with a magnitude too small to be represented as a mantissa and exponent is converted to zero.\"\n"
+ " // 1.0e-50 is small enough that it can't even be stored as subnormal.\n"
+ " float correct = (1.0e-50 == 0.0) ? 1.0 : 0.0;\n",
+ nullptr // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "float_no_limit_on_number_of_digits_positive_exponent", // string name
+ "Number of digits in any digit-sequence is not limited - test with a small mantissa and large exponent", // string description
+ "", // string testGlobals
+ " // GLSL ES 3.00.6 section 4.1.4 Floats:\n" // string testCode
+ " // \"There is no limit on the number of digits in any digit-sequence.\"\n"
+ " // The below float string has 100 zeros after the decimal point, but represents 1.0.\n"
+ " float x = 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e101;\n"
+ " float correct = (x == 1.0) ? 1.0 : 0.0;\n",
+ nullptr // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "float_no_limit_on_number_of_digits_negative_exponent", // string name
+ "Number of digits in any digit-sequence is not limited - test with a large mantissa and negative exponent", // string description
+ "", // string testGlobals
+ " // GLSL ES 3.00.6 section 4.1.4 Floats:\n" // string testCode
+ " // \"There is no limit on the number of digits in any digit-sequence.\"\n"
+ " // The below float string has 100 zeros, but represents 1.0.\n"
+ " float x = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0e-100;\n"
+ " float correct = (x == 1.0) ? 1.0 : 0.0;\n",
+ nullptr // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "float_slightly_out_of_range_exponent_as_positive_infinity", // string name
+ "Test that an exponent that slightly overflows signed 32-bit int range works", // string description
+ "", // string testGlobals
+ " // Out-of-range floats should overflow to infinity\n" // string testCode
+ " // GLSL ES 3.00.6 section 4.1.4 Floats:\n"
+ " // \"If the value of the floating point number is too large (small) to be stored as a single precision value, it is converted to positive (negative) infinity\"\n"
+ " float correct = isinf(1.0e2147483649) ? 1.0 : 0.0;\n",
+ nullptr // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "float_overflow_to_positive_infinity", // string name
+ "Out-of-range floats greater than zero should overflow to positive infinity", // string description
+ "uniform float zero;\n", // string testGlobals
+ " // Out-of-range floats should overflow to infinity\n" // string testCode
+ " // GLSL ES 3.00.6 section 4.1.4 Floats:\n"
+ " // \"If the value of the floating point number is too large (small) to be stored as a single precision value, it is converted to positive (negative) infinity\"\n"
+ " float f = 1.0e2048 - zero;\n"
+ " float correct = (isinf(f) && f > 0.0) ? 1.0 : 0.0;\n",
+ initializeZeroValue // SetupUniformsFn setupUniformsFn
+ },
+ {
+ TestType::NORMAL, // TestType testType
+ "float_overflow_to_negative_infinity", // string name
+ "Out-of-range floats less than zero should overflow to negative infinity", // string description
+ "uniform float zero;\n", // string testGlobals
+ " // Out-of-range floats should overflow to infinity\n" // string testCode
+ " // GLSL ES 3.00.6 section 4.1.4 Floats:\n"
+ " // \"If the value of the floating point number is too large (small) to be stored as a single precision value, it is converted to positive (negative) infinity\"\n"
+ " float f = -1.0e2048 + zero;\n"
+ " float correct = (isinf(f) && f < 0.0) ? 1.0 : 0.0;\n",
+ initializeZeroValue // SetupUniformsFn setupUniformsFn
+ }
+};
+
+static void initializeExpectedValue(const glu::ShaderProgram& program, const glw::Functions& gl, const deUint32 value)
+{
+ const auto location = gl.getUniformLocation(program.getProgram(), "expected");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "GetAttribLocation call failed");
+
+ gl.uniform1ui(location, value);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Set uniform value failed");
+}
+
+static void initializeZeroValue(const glu::ShaderProgram& program, const glw::Functions& gl)
+{
+ const auto location = gl.getUniformLocation(program.getProgram(), "zero");
+ GLU_EXPECT_NO_ERROR(gl.getError(), "GetAttribLocation call failed");
+
+ gl.uniform1f(location, 0.0f);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Set uniform value failed");
+}
+
+static string replacePlaceholders(const string& shaderTemplate, const TestParams& params)
+{
+ map<string,string> fields;
+ fields["TEST_GLOBALS"] = params.testGlobals;
+ fields["TEST_CODE"] = params.testCode;
+
+ tcu::StringTemplate output(shaderTemplate);
+ return output.specialize(fields);
+}
+
+static const std::vector<float> positions =
+{
+ -1.0f, -1.0f,
+ 1.0f, -1.0f,
+ -1.0f, 1.0f,
+ 1.0f, 1.0f
+};
+
+static const std::vector<deUint32> indices = { 0, 1, 2, 3 };
+
+const deInt32 RENDERTARGET_WIDTH = 16;
+const deInt32 RENDERTARGET_HEIGHT = 16;
+
+class NumberParsingCase : public deqp::TestCase
+{
+public:
+ NumberParsingCase(deqp::Context& context, const string& name, const TestParams& params, const string& vertexShader, const string& fragmentShader);
+
+ IterateResult iterate();
+
+private:
+ void setupRenderTarget();
+ void releaseRenderTarget();
+
+ glw::GLuint m_fboId;
+ glw::GLuint m_rboId;
+
+ const TestParams& m_params;
+ string m_vertexShader;
+ string m_fragmentShader;
+};
+
+NumberParsingCase::NumberParsingCase(deqp::Context& context, const string& name, const TestParams& params, const string& vertexShader, const string& fragmentShader)
+ : TestCase(context, name.c_str(), params.description.c_str())
+ , m_params(params)
+ , m_vertexShader(vertexShader)
+ , m_fragmentShader(fragmentShader)
+{
+}
+
+NumberParsingCase::IterateResult NumberParsingCase::iterate(void)
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+ const auto textureFormat = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
+ const auto transferFormat = glu::getTransferFormat(textureFormat);
+
+ setupRenderTarget();
+
+ glu::ShaderProgram program(renderContext, glu::makeVtxFragSources(m_vertexShader, m_fragmentShader));
+ if (!program.isOk())
+ switch(m_params.testType)
+ {
+ case TestType::EXPECT_SHADER_FAIL:
+ m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
+ return STOP;
+ default:
+ TCU_FAIL("Shader compilation failed:\nVertex shader:\n" + m_vertexShader + "\nFragment shader:\n" + m_fragmentShader);
+ break;
+ }
+
+ const std::vector<glu::VertexArrayBinding> vertexArrays =
+ {
+ glu::va::Float("vPosition", 2, positions.size(), 0, positions.data()),
+ };
+
+ gl.useProgram(program.getProgram());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram failed");
+
+ if (m_params.setupUniformsFn != DE_NULL)
+ m_params.setupUniformsFn(program, gl);
+
+ gl.clear(GL_COLOR_BUFFER_BIT);
+
+
+ glu::draw(renderContext, program.getProgram(),
+ static_cast<int>(vertexArrays.size()), vertexArrays.data(),
+ glu::pr::TriangleStrip(static_cast<int>(indices.size()), indices.data()));
+
+ const auto pixelSize = tcu::getPixelSize(textureFormat);
+ std::vector<deUint8> fbData (RENDERTARGET_WIDTH * RENDERTARGET_HEIGHT * pixelSize);
+
+ if (pixelSize < 4)
+ gl.pixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ gl.readPixels(0, 0, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT, transferFormat.format, transferFormat.dataType, fbData.data());
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
+
+ tcu::ConstPixelBufferAccess fbAccess { textureFormat, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT, 1, fbData.data() };
+ const auto expectedColor = tcu::RGBA::green().toVec();
+ bool pass = true;
+ for(int y = 0; pass && y < RENDERTARGET_HEIGHT; ++y)
+ for(int x = 0; x < RENDERTARGET_WIDTH; ++x)
+ if (fbAccess.getPixel(x,y) != expectedColor)
+ {
+ pass = false;
+ break;
+ }
+
+ releaseRenderTarget();
+
+ const qpTestResult result = (pass ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL);
+ const char* desc = (pass ? "Pass" : "Pixel mismatch; numeric value parsed incorrectly");
+
+ m_testCtx.setTestResult(result, desc);
+
+ return STOP;
+}
+
+void NumberParsingCase::setupRenderTarget()
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+
+ gl.genFramebuffers(1, &m_fboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "GenFramebuffers");
+
+ gl.genRenderbuffers(1, &m_rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "GenRenderBuffers");
+
+ gl.bindRenderbuffer(GL_RENDERBUFFER, m_rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderBuffer");
+
+ gl.renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "RenderBufferStorage");
+
+ gl.bindFramebuffer(GL_FRAMEBUFFER, m_fboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "BindFrameBuffer");
+
+ gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rboId);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "FrameBufferRenderBuffer");
+
+ glw::GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
+ gl.drawBuffers(1, &drawBuffer);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "DrawBuffers");
+
+ glw::GLfloat clearColor[4] = { 0, 0, 0, 0 };
+ gl.clearBufferfv(GL_COLOR, 0, clearColor);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "ClearBuffers");
+
+ gl.viewport(0, 0, RENDERTARGET_WIDTH, RENDERTARGET_HEIGHT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Viewport");
+}
+
+void NumberParsingCase::releaseRenderTarget()
+{
+ const auto& renderContext = m_context.getRenderContext();
+ const auto& gl = renderContext.getFunctions();
+ if (m_fboId != 0)
+ {
+ gl.deleteFramebuffers(1, &m_fboId);
+ m_fboId = 0;
+ }
+ if (m_rboId != 0)
+ {
+ gl.deleteRenderbuffers(1, &m_rboId);
+ m_rboId = 0;
+ }
+}
+
+}
+
+NumberParsingTests::NumberParsingTests(deqp::Context& context)
+ : deqp::TestCaseGroup(context, "number_parsing", "GLSL number parsing tests")
+{
+}
+
+NumberParsingTests::~NumberParsingTests(void)
+{
+}
+
+void NumberParsingTests::init(void)
+{
+ for(const auto& params : tests)
+ {
+ addChild(new NumberParsingCase(m_context, params.name, params, defaultVertexShader, replacePlaceholders(fragmentShaderTemplate, params)));
+ }
+}
+
+}
diff --git a/external/openglcts/modules/gles3/es3cNumberParsingTests.hpp b/external/openglcts/modules/gles3/es3cNumberParsingTests.hpp
new file mode 100644
index 0000000..d9b9e24
--- /dev/null
+++ b/external/openglcts/modules/gles3/es3cNumberParsingTests.hpp
@@ -0,0 +1,47 @@
+#ifndef _ES3CNUMBERPARSINGTESTS_HPP
+#define _ES3CNUMBERPARSINGTESTS_HPP
+
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * 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 es3cNumberParsingTests.hpp
+ * \brief Tests for numeric value parsing in GLSL ES 3.0
+ */ /*-------------------------------------------------------------------*/
+
+#include "glcTestCase.hpp"
+
+namespace es3cts
+{
+
+class NumberParsingTests : public deqp::TestCaseGroup
+{
+public:
+ NumberParsingTests(deqp::Context& context);
+ virtual ~NumberParsingTests(void);
+
+ void init(void);
+
+private:
+ NumberParsingTests(const NumberParsingTests& other) = delete;
+ NumberParsingTests& operator=(const NumberParsingTests& other) = delete;
+};
+
+}
+#endif // _ES3CNUMBERPARSINGTESTS_HPP
diff --git a/external/openglcts/modules/gles3/es3cTestPackage.cpp b/external/openglcts/modules/gles3/es3cTestPackage.cpp
index 1971b09..77bc353 100644
--- a/external/openglcts/modules/gles3/es3cTestPackage.cpp
+++ b/external/openglcts/modules/gles3/es3cTestPackage.cpp
@@ -24,9 +24,11 @@
#include "es3cTestPackage.hpp"
#include "es3cCopyTexImageConversionsTests.hpp"
+#include "es3cNumberParsingTests.hpp"
#include "glcAggressiveShaderOptimizationsTests.hpp"
#include "glcExposedExtensionsTests.hpp"
#include "glcFragDepthTests.hpp"
+#include "glcGLSLVectorConstructorTests.hpp"
#include "glcInfoTests.hpp"
#include "glcInternalformatTests.hpp"
#include "glcPackedDepthStencilTests.hpp"
@@ -45,6 +47,7 @@
#include "glcTextureRepeatModeTests.hpp"
#include "glcUniformBlockTests.hpp"
#include "glcNearestEdgeTests.hpp"
+#include "glcFramebufferCompleteness.hpp"
#include "gluStateReset.hpp"
#include "glwEnums.hpp"
#include "glwFunctions.hpp"
@@ -150,6 +153,7 @@
addChild(new deqp::ShaderStructTests(m_context, glu::GLSL_VERSION_300_ES));
addChild(new deqp::ShaderSwitchTests(m_context, glu::GLSL_VERSION_300_ES));
addChild(new deqp::UniformBlockTests(m_context, glu::GLSL_VERSION_300_ES));
+ addChild(new deqp::GLSLVectorConstructorTests(m_context, glu::GLSL_VERSION_300_ES));
addChild(new deqp::ShaderIntegerMixTests(m_context, glu::GLSL_VERSION_300_ES));
addChild(new deqp::ShaderNegativeTests(m_context, glu::GLSL_VERSION_300_ES));
addChild(new glcts::AggressiveShaderOptimizationsTests(m_context));
@@ -186,7 +190,9 @@
addChild(new glcts::ParallelShaderCompileTests(getContext()));
addChild(new glcts::PackedPixelsTests(getContext()));
addChild(new glcts::PackedDepthStencilTests(getContext()));
+ addChild(new glcts::FramebufferCompletenessTests(getContext()));
addChild(new es3cts::CopyTexImageConversionsTests(getContext()));
+ addChild(new es3cts::NumberParsingTests(getContext()));
}
catch (...)
{
diff --git a/external/openglcts/modules/gles31/es31cComputeShaderTests.cpp b/external/openglcts/modules/gles31/es31cComputeShaderTests.cpp
index 651b4a8..24821ad 100644
--- a/external/openglcts/modules/gles31/es31cComputeShaderTests.cpp
+++ b/external/openglcts/modules/gles31/es31cComputeShaderTests.cpp
@@ -4486,6 +4486,8 @@
glDrawArrays(GL_TRIANGLES, 0, 3);
glEndTransformFeedback();
+ glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
+
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_xfb_buffer);
glUseProgram(m_program[1]);
glDispatchCompute(1, 1, 1);
diff --git a/external/openglcts/modules/gles31/es31cTestPackage.cpp b/external/openglcts/modules/gles31/es31cTestPackage.cpp
index 4d3c0a4..2f93abe 100644
--- a/external/openglcts/modules/gles31/es31cTestPackage.cpp
+++ b/external/openglcts/modules/gles31/es31cTestPackage.cpp
@@ -56,6 +56,7 @@
#include "glcShaderMultisampleInterpolationTests.hpp"
#include "glcShaderNegativeTests.hpp"
#include "glcNearestEdgeTests.hpp"
+#include "glcFramebufferCompleteness.hpp"
#include "gluStateReset.hpp"
#include "gluContextInfo.hpp"
@@ -213,6 +214,7 @@
coreGroup->addChild(new glcts::ShaderGroupVote(getContext()));
coreGroup->addChild(new glcts::InternalformatTests(getContext()));
coreGroup->addChild(new glcts::NearestEdgeCases(getContext()));
+ coreGroup->addChild(new glcts::FramebufferCompletenessTests(getContext()));
glcts::ExtParameters extParams(glu::GLSL_VERSION_310_ES, glcts::EXTENSIONTYPE_OES);
coreGroup->addChild(new glcts::GeometryShaderTests(getContext(), extParams));
diff --git a/external/openglcts/modules/gles31/es31cVertexAttribBindingTests.cpp b/external/openglcts/modules/gles31/es31cVertexAttribBindingTests.cpp
index ab5515a..dfadb62 100644
--- a/external/openglcts/modules/gles31/es31cVertexAttribBindingTests.cpp
+++ b/external/openglcts/modules/gles31/es31cVertexAttribBindingTests.cpp
@@ -272,9 +272,14 @@
else if (exp <= HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP)
{
/* store a denorm half-float value or zero */
- exp = (HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP - exp) >> 23;
+ exp = ((HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP - exp) >> 23) + 14;
+ // handle 0.0 specially to avoid a right-shift by too many bits
+ if (exp >= 32)
+ {
+ return 0;
+ }
mantissa |= (1 << 23);
- mantissa >>= (14 + exp);
+ mantissa >>= exp;
hf = (GLhalf)((((GLhalf)sign) << 15) | (GLhalf)(mantissa));
}
else
diff --git a/external/openglcts/modules/gles32/es32cTestPackage.cpp b/external/openglcts/modules/gles32/es32cTestPackage.cpp
index ab4fd0e..a89d4ee 100644
--- a/external/openglcts/modules/gles32/es32cTestPackage.cpp
+++ b/external/openglcts/modules/gles32/es32cTestPackage.cpp
@@ -41,6 +41,7 @@
#include "glcShaderSwitchTests.hpp"
#include "glcUniformBlockTests.hpp"
#include "glcNearestEdgeTests.hpp"
+#include "glcFramebufferCompleteness.hpp"
#include "gluStateReset.hpp"
#include "glwEnums.hpp"
#include "glwFunctions.hpp"
@@ -176,6 +177,7 @@
coreGroup->addChild(new glcts::InternalformatTests(getContext()));
coreGroup->addChild(new deqp::Functional::TextureShadowLodTest(getContext()));
coreGroup->addChild(new glcts::NearestEdgeCases(getContext()));
+ coreGroup->addChild(new glcts::FramebufferCompletenessTests(getContext()));
addChild(coreGroup);
}
catch (...)
diff --git a/external/openglcts/modules/glesext/geometry_shader/esextcGeometryShaderLayeredFramebuffer.cpp b/external/openglcts/modules/glesext/geometry_shader/esextcGeometryShaderLayeredFramebuffer.cpp
index 5bfe440..40e14b1 100644
--- a/external/openglcts/modules/glesext/geometry_shader/esextcGeometryShaderLayeredFramebuffer.cpp
+++ b/external/openglcts/modules/glesext/geometry_shader/esextcGeometryShaderLayeredFramebuffer.cpp
@@ -574,7 +574,6 @@
for (int current_test = static_cast<int>(CLEAR_FIRST); current_test < static_cast<int>(CLEAR_COUNT); current_test++)
{
void* buffer = NULL;
- const unsigned char clear_color_byte[] = { 64, 128, 255, 32 };
const float clear_color_float[] = { 0.25f, 0.5f, 1.0f, 32.0f / 255.0f };
const int clear_color_int[] = { 64, 128, 255, 32 };
glw::GLuint fbo_id = 0;
@@ -725,19 +724,18 @@
if (current_test == CLEAR_BUFFERIV || current_test == CLEAR_BUFFERUIV)
{
unsigned int* pixel = (unsigned int*)(row + x * pixel_size);
-
if (memcmp(pixel, clear_color_int, sizeof(clear_color_int)) != 0)
{
/* Test fails at this point */
m_testCtx.getLog()
<< tcu::TestLog::Message << "(x=" << x << " y=" << y << ") Reference pixel ["
- << clear_color_byte[0] << ", " << clear_color_byte[1] << ", " << clear_color_byte[2]
- << ", " << clear_color_byte[3] << "] is different from the one retrieved ["
+ << clear_color_int[0] << ", " << clear_color_int[1] << ", " << clear_color_int[2]
+ << ", " << clear_color_int[3] << "] is different from the one retrieved ["
<< (int)pixel[0] << ", " << (int)pixel[1] << ", " << (int)pixel[2] << ", "
<< (int)pixel[3] << "]" << tcu::TestLog::EndMessage;
TCU_FAIL("Data comparison failure");
- } /* if (memcmp(pixel, clear_color_byte, sizeof(clear_color_byte) ) != 0) */
+ } /* if (memcmp(pixel, clear_color_int, sizeof(clear_color_int) ) != 0) */
} /* if (current_test == CLEAR_BUFFERIV || current_test == CLEAR_BUFFERUIV) */
else
{
@@ -753,8 +751,8 @@
/* Test fails at this point */
m_testCtx.getLog()
<< tcu::TestLog::Message << "(x=" << x << " y=" << y << ") Reference pixel ["
- << clear_color_byte[0] << ", " << clear_color_byte[1] << ", " << clear_color_byte[2]
- << ", " << clear_color_byte[3] << "] is different from the one retrieved ["
+ << clear_color_int[0] << ", " << clear_color_int[1] << ", " << clear_color_int[2]
+ << ", " << clear_color_int[3] << "] is different from the one retrieved ["
<< (int)pixel[0] << ", " << (int)pixel[1] << ", " << (int)pixel[2] << ", "
<< (int)pixel[3] << "]" << tcu::TestLog::EndMessage;
diff --git a/external/openglcts/modules/glesext/texture_buffer/esextcTextureBufferOperations.cpp b/external/openglcts/modules/glesext/texture_buffer/esextcTextureBufferOperations.cpp
index 850ee45..6688b91 100644
--- a/external/openglcts/modules/glesext/texture_buffer/esextcTextureBufferOperations.cpp
+++ b/external/openglcts/modules/glesext/texture_buffer/esextcTextureBufferOperations.cpp
@@ -1230,6 +1230,8 @@
gl.useProgram(0);
+ gl.memoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
+
m_position_location = -1;
}
diff --git a/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayImageOperations.cpp b/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayImageOperations.cpp
index f989d17..3079e4f 100644
--- a/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayImageOperations.cpp
+++ b/external/openglcts/modules/glesext/texture_cube_map_array/esextcTextureCubeMapArrayImageOperations.cpp
@@ -181,6 +181,14 @@
GLU_EXPECT_NO_ERROR(gl.getError(), "Error querying old program!");
gl.useProgram(copy_po_id);
GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting active program object!");
+
+ gl.memoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting memory barrier!");
+ }
+ else
+ {
+ gl.memoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting memory barrier!");
}
bool result = true;
@@ -196,6 +204,9 @@
gl.dispatchCompute(width, height, 1);
GLU_EXPECT_NO_ERROR(gl.getError(), "Error dispatching float-to-integer compute shader");
+ gl.memoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting memory barrier!");
+
/* Read data as unsigned ints */
gl.readPixels(0, 0, width, height, GL_RGBA_INTEGER, GL_UNSIGNED_INT, &resultData[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "Error reading pixels from frame buffer!");
@@ -333,6 +344,19 @@
/* Nothing to be done here */
}
+glw::GLenum getQueryPname(SHADER_TO_CHECK stage) {
+ switch (stage) {
+ case STC_COMPUTE_SHADER: return GL_MAX_COMPUTE_IMAGE_UNIFORMS;
+ case STC_VERTEX_SHADER: return GL_MAX_VERTEX_IMAGE_UNIFORMS;
+ case STC_FRAGMENT_SHADER: return GL_MAX_FRAGMENT_IMAGE_UNIFORMS;
+ case STC_GEOMETRY_SHADER: return GL_MAX_GEOMETRY_IMAGE_UNIFORMS;
+ case STC_TESSELLATION_CONTROL_SHADER: return GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS;
+ case STC_TESSELLATION_EVALUATION_SHADER: return GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS;
+ }
+ DE_ASSERT(0);
+ return GL_NONE;
+}
+
/** Initialize test case */
void TextureCubeMapArrayImageOpCompute::initTest(void)
{
@@ -354,6 +378,12 @@
throw tcu::NotSupportedError(TESSELLATION_SHADER_EXTENSION_NOT_SUPPORTED, "", __FILE__, __LINE__);
}
+ int maxImages;
+ glw::GLenum pname = getQueryPname(m_shader_to_check);
+ gl.getIntegerv(pname, &maxImages);
+ if (maxImages < 6)
+ throw tcu::NotSupportedError( "Shader stage does not support at least 6 image uniforms", "", __FILE__, __LINE__);
+
/* Generate and bind VAO */
gl.genVertexArrays(1, &m_vao_id);
GLU_EXPECT_NO_ERROR(gl.getError(), "Could not generate vertex array object");
@@ -704,8 +734,6 @@
{
gl.dispatchCompute(width, height, depth);
GLU_EXPECT_NO_ERROR(gl.getError(), "Error running compute shader!");
- gl.memoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting memory barrier!");
break;
}
@@ -727,8 +755,6 @@
gl.drawArrays(GL_POINTS, 0, 1);
GLU_EXPECT_NO_ERROR(gl.getError(), "Rendering failed!");
- gl.memoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting memory barrier!");
break;
}
@@ -751,8 +777,6 @@
gl.drawArrays(m_glExtTokens.PATCHES, 0, 1);
GLU_EXPECT_NO_ERROR(gl.getError(), "Rendering failed!");
- gl.memoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting memory barrier!");
gl.patchParameteri(m_glExtTokens.PATCH_VERTICES, 3);
GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting patch parameter!");
@@ -777,7 +801,6 @@
const char* csCode = getComputeShaderCode();
- /* Images are required for compute shader */
if (!buildProgram(m_po_id, m_cs_id, 1 /* part */, &csCode))
{
TCU_FAIL("Could not create a program from valid compute shader code!");
@@ -785,24 +808,6 @@
break;
}
case STC_VERTEX_SHADER:
- {
- m_vs_id = gl.createShader(GL_VERTEX_SHADER);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
- m_fs_id = gl.createShader(GL_FRAGMENT_SHADER);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
-
- const char* vsCode = getVertexShaderCode();
- const char* fsCode = getFragmentShaderCodeBoilerPlate();
-
- /* Execute test only if images are supported by vertex shader */
- if (!buildProgram(m_po_id, m_fs_id, 1 /* part */, &fsCode, m_vs_id, 1 /* part */, &vsCode))
- {
- throw tcu::NotSupportedError(
- "imageCubeArray/iimageCubeArray/uimageCubeArray are not supported by Vertex Shader", "", __FILE__,
- __LINE__);
- }
- break;
- }
case STC_FRAGMENT_SHADER:
{
m_vs_id = gl.createShader(GL_VERTEX_SHADER);
@@ -810,15 +815,15 @@
m_fs_id = gl.createShader(GL_FRAGMENT_SHADER);
GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
- const char* vsCode = getVertexShaderCodeBoilerPlate();
- const char* fsCode = getFragmentShaderCode();
+ bool vs = (m_shader_to_check == STC_VERTEX_SHADER);
+ const char* vsCode = vs ? getVertexShaderCode()
+ : getVertexShaderCodeBoilerPlate();
+ const char* fsCode = vs ? getFragmentShaderCodeBoilerPlate()
+ : getFragmentShaderCode();
- /* Execute test only if images are supported by fragment shader */
if (!buildProgram(m_po_id, m_fs_id, 1 /* part */, &fsCode, m_vs_id, 1 /* part */, &vsCode))
{
- throw tcu::NotSupportedError(
- "imageCubeArray/iimageCubeArray/uimageCubeArray are not supported by Fragment Shader", "", __FILE__,
- __LINE__);
+ TCU_FAIL("Could not create shader program.");
}
break;
}
@@ -835,42 +840,14 @@
const char* gsCode = getGeometryShaderCode();
const char* fsCode = getFragmentShaderCodeBoilerPlate();
- /* Execute test only if images are supported by geometry shader */
if (!buildProgram(m_po_id, m_fs_id, 1 /* part */, &fsCode, m_gs_id, 1 /* part */, &gsCode, m_vs_id,
1 /* part */, &vsCode))
{
- throw tcu::NotSupportedError(
- "imageCubeArray/iimageCubeArray/uimageCubeArray are not supported by Geometry Shader", "", __FILE__,
- __LINE__);
+ TCU_FAIL("Could not create shader program.");
}
break;
}
case STC_TESSELLATION_CONTROL_SHADER:
- {
- m_vs_id = gl.createShader(GL_VERTEX_SHADER);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
- m_tc_id = gl.createShader(m_glExtTokens.TESS_CONTROL_SHADER);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
- m_te_id = gl.createShader(m_glExtTokens.TESS_EVALUATION_SHADER);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
- m_fs_id = gl.createShader(GL_FRAGMENT_SHADER);
- GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
-
- const char* vsCode = getVertexShaderCodeBoilerPlate();
- const char* tcsCode = getTessControlShaderCode();
- const char* tesCode = getTessEvaluationShaderCodeBoilerPlate();
- const char* fsCode = getFragmentShaderCodeBoilerPlate();
-
- /* Execute test only if images are supported by tessellation control shader */
- if (!buildProgram(m_po_id, m_fs_id, 1 /* part */, &fsCode, m_tc_id, 1 /* part */, &tcsCode, m_te_id,
- 1 /* part */, &tesCode, m_vs_id, 1 /* part */, &vsCode))
- {
- throw tcu::NotSupportedError(
- "imageCubeArray/iimageCubeArray/uimageCubeArray are not supported by Tessellation Control Shader", "",
- __FILE__, __LINE__);
- }
- break;
- }
case STC_TESSELLATION_EVALUATION_SHADER:
{
m_vs_id = gl.createShader(GL_VERTEX_SHADER);
@@ -882,18 +859,18 @@
m_fs_id = gl.createShader(GL_FRAGMENT_SHADER);
GLU_EXPECT_NO_ERROR(gl.getError(), "Could not create shader object!");
+ bool tcs = (m_shader_to_check == STC_TESSELLATION_CONTROL_SHADER);
const char* vsCode = getVertexShaderCodeBoilerPlate();
- const char* tcsCode = getTessControlShaderCodeBoilerPlate();
- const char* tesCode = getTessEvaluationShaderCode();
+ const char* tcsCode = tcs ? getTessControlShaderCode()
+ : getTessControlShaderCodeBoilerPlate();
+ const char* tesCode = tcs ? getTessEvaluationShaderCodeBoilerPlate()
+ : getTessEvaluationShaderCode();
const char* fsCode = getFragmentShaderCodeBoilerPlate();
- /* Execute test only if images are supported by tessellation evaluation shader */
if (!buildProgram(m_po_id, m_fs_id, 1 /* part */, &fsCode, m_tc_id, 1 /* part */, &tcsCode, m_te_id,
1 /* part */, &tesCode, m_vs_id, 1 /* part */, &vsCode))
{
- throw tcu::NotSupportedError(
- "imageCubeArray/iimageCubeArray/uimageCubeArray are not supported by Tessellation Evaluation Shader",
- "", __FILE__, __LINE__);
+ TCU_FAIL("Could not create shader program.");
}
break;
}
diff --git a/external/openglcts/modules/runner/glcAospMustpassEgl.hpp b/external/openglcts/modules/runner/glcAospMustpassEgl.hpp
index 4183438..c1c9844 100644
--- a/external/openglcts/modules/runner/glcAospMustpassEgl.hpp
+++ b/external/openglcts/modules/runner/glcAospMustpassEgl.hpp
@@ -19,7 +19,7 @@
* be lost! Modify the generating script instead.
*/
-const char* mustpassDir = "gl_cts/data/mustpass/egl/aosp_mustpass/3.2.6.x/";
+const char* mustpassDir = "gl_cts/data/mustpass/egl/aosp_mustpass/master/";
static const RunParams aosp_mustpass_egl_first_cfg[] = {
{ glu::ApiType(), "master", "rgba8888d24s8ms0", "unspecified", -1, DE_NULL, 256, 256 },
diff --git a/external/openglcts/modules/runner/glcAospMustpassEs.hpp b/external/openglcts/modules/runner/glcAospMustpassEs.hpp
index 8ff4fef..f094bf5 100644
--- a/external/openglcts/modules/runner/glcAospMustpassEs.hpp
+++ b/external/openglcts/modules/runner/glcAospMustpassEs.hpp
@@ -19,7 +19,7 @@
* be lost! Modify the generating script instead.
*/
-const char* mustpassDir = "gl_cts/data/mustpass/gles/aosp_mustpass/3.2.6.x/";
+const char* mustpassDir = "gl_cts/data/mustpass/gles/aosp_mustpass/master/";
static const RunParams aosp_mustpass_es_first_cfg[] = {
{ glu::ApiType::es(2, 0), "master", "rgba8888d24s8ms0", "unspecified", -1, DE_NULL, 256, 256 },
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp b/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp
index cceb791..ff0ffdb 100644
--- a/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp
+++ b/external/openglcts/modules/runner/glcKhronosMustpassEs.hpp
@@ -19,7 +19,7 @@
* be lost! Modify the generating script instead.
*/
-const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass/3.2.6.x/";
+const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass/master/";
static const RunParams khronos_mustpass_es_first_cfg[] = {
{ glu::ApiType::es(2, 0), "khr-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp b/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
index a072eb0..803355c 100644
--- a/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
+++ b/external/openglcts/modules/runner/glcKhronosMustpassEsNocontext.hpp
@@ -19,7 +19,7 @@
* be lost! Modify the generating script instead.
*/
-const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass_noctx/3.2.6.x/";
+const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass_noctx/master/";
static const RunParams khronos_mustpass_es_nocontext_first_cfg[] = {
{ glu::ApiType::es(2, 0), "khr-noctx-master", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
diff --git a/external/openglcts/modules/runner/glcKhronosMustpassEsSingleConfig.hpp b/external/openglcts/modules/runner/glcKhronosMustpassEsSingleConfig.hpp
index 0b869f7..85e48dc 100644
--- a/external/openglcts/modules/runner/glcKhronosMustpassEsSingleConfig.hpp
+++ b/external/openglcts/modules/runner/glcKhronosMustpassEsSingleConfig.hpp
@@ -19,7 +19,7 @@
* be lost! Modify the generating script instead.
*/
-const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass_single/3.2.6.x/";
+const char* mustpassDir = "gl_cts/data/mustpass/gles/khronos_mustpass_single/master/";
static const RunParams khronos_mustpass_es_single_config_first_cfg[] = {
{ glu::ApiType::es(3, 2), "khr-single", DE_NULL, "unspecified", 1, DE_NULL, 64, 64 },
diff --git a/external/openglcts/modules/runner/glcTestRunner.cpp b/external/openglcts/modules/runner/glcTestRunner.cpp
index ce2e3ab..648b981 100644
--- a/external/openglcts/modules/runner/glcTestRunner.cpp
+++ b/external/openglcts/modules/runner/glcTestRunner.cpp
@@ -779,7 +779,6 @@
writeRunSummary(m_summary, de::FilePath::join(m_logDirPath, "cts-run-summary.xml").getPath());
m_runSessions.clear();
- m_summary.clear();
}
void TestRunner::initSession(const TestRunParams& runParams)
diff --git a/external/openglcts/scripts/build_mustpass.py b/external/openglcts/scripts/build_mustpass.py
index 217a735..5420b8f 100644
--- a/external/openglcts/scripts/build_mustpass.py
+++ b/external/openglcts/scripts/build_mustpass.py
@@ -999,7 +999,7 @@
# 3.2.6.x
- Mustpass(project = CTS_KHR_MP_ES_PROJECT, version = "3.2.6.x", isCurrent=True,
+ Mustpass(project = CTS_KHR_MP_ES_PROJECT, version = "3.2.6.x", isCurrent=False,
packages = [GLCTS_GLES2_KHR_PKG_1CFG,
GLCTS_GLES2_KHR_PKG_N1CFG,
GLCTS_GLES3_KHR_PKG_1CFG,
@@ -1010,21 +1010,21 @@
GLCTS_GLES32_KHR_PKG_N1CFG,
]),
- Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "3.2.6.x", isCurrent=True,
+ Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "3.2.6.x", isCurrent=False,
packages = [GLCTS_NOCTX_ES2_KHR_PKG, GLCTS_NOCTX_ES32_KHR_PKG]),
- Mustpass(project = CTS_KHR_MP_SINGLE_ES_PROJECT, version = "3.2.6.x", isCurrent=True,
+ Mustpass(project = CTS_KHR_MP_SINGLE_ES_PROJECT, version = "3.2.6.x", isCurrent=False,
packages = [GLCTS_SINGLE_ES32_KHR_PKG]),
- Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "3.2.6.x", isCurrent=True,
+ Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "3.2.6.x", isCurrent=False,
packages = [GLCTS_3_2_3_GLES2_PKG, GLCTS_3_2_3_GLES3_PKG, GLCTS_3_2_3_GLES31_PKG]),
- Mustpass(project = CTS_AOSP_MP_EGL_PROJECT, version = "3.2.6.x", isCurrent=True,
+ Mustpass(project = CTS_AOSP_MP_EGL_PROJECT, version = "3.2.6.x", isCurrent=False,
packages = [GLCTS_3_2_3_EGL_PKG]),
# master
- Mustpass(project = CTS_KHR_MP_ES_PROJECT, version = "master", isCurrent=False,
+ Mustpass(project = CTS_KHR_MP_ES_PROJECT, version = "master", isCurrent=True,
packages = [GLCTS_GLES2_KHR_PKG_1CFG,
GLCTS_GLES2_KHR_PKG_N1CFG,
GLCTS_GLES3_KHR_PKG_1CFG,
@@ -1035,17 +1035,17 @@
GLCTS_GLES32_KHR_PKG_N1CFG,
]),
- Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "master", isCurrent=False,
+ Mustpass(project = CTS_KHR_MP_NOCTX_ES_PROJECT, version = "master", isCurrent=True,
packages = [GLCTS_NOCTX_ES2_KHR_PKG, GLCTS_NOCTX_ES32_KHR_PKG]),
- Mustpass(project = CTS_KHR_MP_SINGLE_ES_PROJECT, version = "master", isCurrent=False,
+ Mustpass(project = CTS_KHR_MP_SINGLE_ES_PROJECT, version = "master", isCurrent=True,
packages = [GLCTS_SINGLE_ES32_KHR_PKG]),
- Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "master", isCurrent=False,
- packages = [MASTER_GLES2_PKG, MASTER_GLES3_PKG, MASTER_GLES31_PKG]),
+ Mustpass(project = CTS_AOSP_MP_ES_PROJECT, version = "master", isCurrent=True,
+ packages = [GLCTS_3_2_3_GLES2_PKG, GLCTS_3_2_3_GLES3_PKG, GLCTS_3_2_3_GLES31_PKG]),
- Mustpass(project = CTS_AOSP_MP_EGL_PROJECT, version = "master", isCurrent=False,
- packages = [MASTER_EGL_PKG])
+ Mustpass(project = CTS_AOSP_MP_EGL_PROJECT, version = "master", isCurrent=True,
+ packages = [GLCTS_3_2_3_EGL_PKG])
]
diff --git a/external/vulkancts/README.md b/external/vulkancts/README.md
index 21514c7..055a8f6 100644
--- a/external/vulkancts/README.md
+++ b/external/vulkancts/README.md
@@ -16,7 +16,7 @@
* Git (for checking out sources)
* Python 3.x (for the build related scripts, some other scripts still use Python 2.7.x)
- * CMake 3.0 (3.6 for Android NDK r17+ builds) or newer
+ * CMake 3.10.2 or newer
### Win32
@@ -25,6 +25,9 @@
### Linux
* Standard toolchain (make, gcc/clang)
+ * If you have X11 installed, then the build assumes you also have the `GL/glx.h` header
+ file.
+ * You can get this from the `mesa-common-dev` Ubuntu package.
### Android
@@ -170,6 +173,12 @@
--deqp-waiver-file=<path>
+Some CTS tests use third-party runners. By default all tests are executed
+regardless of runner type (`any`). To exclude all tests using any of the
+external runners (`none`) or to only include tests using a certain runner:
+
+ --deqp-runner-type=(any|none|amber)
+
No other command line options are allowed.
### Win32
@@ -263,7 +272,7 @@
If the submission package covers multiple products, you can list them by appending
additional `PRODUCT:` lines to the conformance statement. For example:
- CONFORM_VERSION: vulkan-cts-1.2.5.0
+ CONFORM_VERSION: vulkan-cts-1.2.6.0
PRODUCT: Product A
PRODUCT: Product B
...
diff --git a/external/vulkancts/data/vulkan/amber/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order.amber b/external/vulkancts/data/vulkan/amber/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order.amber
new file mode 100644
index 0000000..8f3ea8b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order.amber
@@ -0,0 +1,73 @@
+#!amber
+# Copyright 2020 The Amber Authors.
+#
+# 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
+#
+# https://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.
+
+SHADER compute compute_shader GLSL
+#version 430
+
+layout(set = 0, binding = 0) readonly uniform block0
+{
+ int data0;
+};
+
+layout(set = 0, binding = 1) readonly uniform block1
+{
+ int data1;
+};
+
+layout(set = 0, binding = 2) readonly uniform block2
+{
+ int data2;
+};
+
+layout(set = 0, binding = 3) buffer result
+{
+ int res0;
+ int res1;
+ int res2;
+};
+
+void main()
+{
+ res0 = data0;
+ res1 = data1;
+ res2 = data2;
+}
+END
+
+# Here the size is in terms of items.
+BUFFER buf0 DATA_TYPE int32 SIZE 1024 SERIES_FROM 0 INC_BY 1
+BUFFER buf1 DATA_TYPE int32 SIZE 1024 SERIES_FROM 1 INC_BY 1
+BUFFER buf2 DATA_TYPE int32 SIZE 1024 SERIES_FROM 2 INC_BY 1
+BUFFER result DATA_TYPE int32 DATA
+0 0 0
+END
+
+PIPELINE compute pipeline
+ ATTACH compute_shader
+
+ # Note the binding order. The offsets below are in byte offsets.
+ BIND BUFFER buf0 AS uniform_dynamic DESCRIPTOR_SET 0 BINDING 2 OFFSET 0
+ BIND BUFFER buf1 AS uniform_dynamic DESCRIPTOR_SET 0 BINDING 0 OFFSET 1024
+ BIND BUFFER buf2 AS uniform_dynamic DESCRIPTOR_SET 0 BINDING 1 OFFSET 2048
+ BIND BUFFER result AS storage DESCRIPTOR_SET 0 BINDING 3
+END
+
+RUN pipeline 1 1 1
+
+# Offset of 1024/4 = 256 items plus one since the series started from one.
+EXPECT result IDX 0 EQ 257
+# Offset of 2048/4 = 512 items plus two since the series started from two.
+EXPECT result IDX 4 EQ 514
+EXPECT result IDX 8 EQ 0
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-access-array-dot.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-access-array-dot.amber
new file mode 100644
index 0000000..769350b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-access-array-dot.amber
@@ -0,0 +1,239 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers instruction combine casting, combine shifting and DAG code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_2 _GLF_uniform_int_values[2]
+# #define _float_2_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[2]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [2.0, 1.0, 0.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [0, 1, 2]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int numbers[3];
+# numbers[_int_0] = _int_0;
+# numbers[_int_1] = _int_1;
+# numbers[_int_2] = _int_2;
+#
+# vec2 a = vec2(_int_0, numbers[((0.0 < _float_0_0) ? 1 : 2)]);
+# float b = dot(a, vec2(_float_1_0, _float_1_0));
+#
+# if (b == _float_2_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 94
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %75
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "numbers"
+ OpName %13 "buf1"
+ OpMemberName %13 0 "_GLF_uniform_int_values"
+ OpName %15 ""
+ OpName %39 "a"
+ OpName %45 "buf0"
+ OpMemberName %45 0 "_GLF_uniform_float_values"
+ OpName %47 ""
+ OpName %59 "b"
+ OpName %75 "_GLF_color"
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 1
+ OpDecorate %44 ArrayStride 16
+ OpMemberDecorate %45 0 Offset 0
+ OpDecorate %45 Block
+ OpDecorate %47 DescriptorSet 0
+ OpDecorate %47 Binding 0
+ OpDecorate %75 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeInt 32 0
+ %8 = OpConstant %7 3
+ %9 = OpTypeArray %6 %8
+ %10 = OpTypePointer Function %9
+ %12 = OpTypeArray %6 %8
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpConstant %6 0
+ %17 = OpTypePointer Uniform %6
+ %22 = OpTypePointer Function %6
+ %24 = OpConstant %6 1
+ %30 = OpConstant %6 2
+ %36 = OpTypeFloat 32
+ %37 = OpTypeVector %36 2
+ %38 = OpTypePointer Function %37
+ %43 = OpConstant %36 0
+ %44 = OpTypeArray %36 %8
+ %45 = OpTypeStruct %44
+ %46 = OpTypePointer Uniform %45
+ %47 = OpVariable %46 Uniform
+ %48 = OpTypePointer Uniform %36
+ %51 = OpTypeBool
+ %58 = OpTypePointer Function %36
+ %73 = OpTypeVector %36 4
+ %74 = OpTypePointer Output %73
+ %75 = OpVariable %74 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %11 = OpVariable %10 Function
+ %39 = OpVariable %38 Function
+ %59 = OpVariable %58 Function
+ %18 = OpAccessChain %17 %15 %16 %16
+ %19 = OpLoad %6 %18
+ %20 = OpAccessChain %17 %15 %16 %16
+ %21 = OpLoad %6 %20
+ %23 = OpAccessChain %22 %11 %19
+ OpStore %23 %21
+ %25 = OpAccessChain %17 %15 %16 %24
+ %26 = OpLoad %6 %25
+ %27 = OpAccessChain %17 %15 %16 %24
+ %28 = OpLoad %6 %27
+ %29 = OpAccessChain %22 %11 %26
+ OpStore %29 %28
+ %31 = OpAccessChain %17 %15 %16 %30
+ %32 = OpLoad %6 %31
+ %33 = OpAccessChain %17 %15 %16 %30
+ %34 = OpLoad %6 %33
+ %35 = OpAccessChain %22 %11 %32
+ OpStore %35 %34
+ %40 = OpAccessChain %17 %15 %16 %16
+ %41 = OpLoad %6 %40
+ %42 = OpConvertSToF %36 %41
+ %49 = OpAccessChain %48 %47 %16 %30
+ %50 = OpLoad %36 %49
+ %52 = OpFOrdLessThan %51 %43 %50
+ %53 = OpSelect %6 %52 %24 %30
+ %54 = OpAccessChain %22 %11 %53
+ %55 = OpLoad %6 %54
+ %56 = OpConvertSToF %36 %55
+ %57 = OpCompositeConstruct %37 %42 %56
+ OpStore %39 %57
+ %60 = OpLoad %37 %39
+ %61 = OpAccessChain %48 %47 %16 %24
+ %62 = OpLoad %36 %61
+ %63 = OpAccessChain %48 %47 %16 %24
+ %64 = OpLoad %36 %63
+ %65 = OpCompositeConstruct %37 %62 %64
+ %66 = OpDot %36 %60 %65
+ OpStore %59 %66
+ %67 = OpLoad %36 %59
+ %68 = OpAccessChain %48 %47 %16 %16
+ %69 = OpLoad %36 %68
+ %70 = OpFOrdEqual %51 %67 %69
+ OpSelectionMerge %72 None
+ OpBranchConditional %70 %71 %89
+ %71 = OpLabel
+ %76 = OpAccessChain %17 %15 %16 %24
+ %77 = OpLoad %6 %76
+ %78 = OpConvertSToF %36 %77
+ %79 = OpAccessChain %17 %15 %16 %16
+ %80 = OpLoad %6 %79
+ %81 = OpConvertSToF %36 %80
+ %82 = OpAccessChain %17 %15 %16 %16
+ %83 = OpLoad %6 %82
+ %84 = OpConvertSToF %36 %83
+ %85 = OpAccessChain %17 %15 %16 %24
+ %86 = OpLoad %6 %85
+ %87 = OpConvertSToF %36 %86
+ %88 = OpCompositeConstruct %73 %78 %81 %84 %87
+ OpStore %75 %88
+ OpBranch %72
+ %89 = OpLabel
+ %90 = OpAccessChain %17 %15 %16 %16
+ %91 = OpLoad %6 %90
+ %92 = OpConvertSToF %36 %91
+ %93 = OpCompositeConstruct %73 %92 %92 %92 %92
+ OpStore %75 %93
+ OpBranch %72
+ %72 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1 2
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 2.0 1.0 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-determinant-for-if.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-determinant-for-if.amber
new file mode 100644
index 0000000..2fc9678
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-determinant-for-if.amber
@@ -0,0 +1,225 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific APFloat code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_100 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _int_9993001 _GLF_uniform_int_values[3]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [0, 100, 1, 9993001]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // Becomes -9993001.
+# float a = determinant(mat3(1.0, 5000.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2000.0));
+#
+# int b = _int_1;
+#
+# for (int i = _int_1; i < _int_100; i++)
+# {
+# if (b > _int_1)
+# {
+# break;
+# }
+# b = int(a);
+# }
+#
+# if (b == -_int_9993001)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 87
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %68
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %21 "b"
+ OpName %25 "buf0"
+ OpMemberName %25 0 "_GLF_uniform_int_values"
+ OpName %27 ""
+ OpName %33 "i"
+ OpName %68 "_GLF_color"
+ OpDecorate %24 ArrayStride 16
+ OpMemberDecorate %25 0 Offset 0
+ OpDecorate %25 Block
+ OpDecorate %27 DescriptorSet 0
+ OpDecorate %27 Binding 0
+ OpDecorate %68 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeVector %6 3
+ %10 = OpTypeMatrix %9 3
+ %11 = OpConstant %6 1
+ %12 = OpConstant %6 5000
+ %13 = OpConstantComposite %9 %11 %12 %11
+ %14 = OpConstantComposite %9 %11 %11 %11
+ %15 = OpConstant %6 2000
+ %16 = OpConstantComposite %9 %11 %11 %15
+ %17 = OpConstantComposite %10 %13 %14 %16
+ %19 = OpTypeInt 32 1
+ %20 = OpTypePointer Function %19
+ %22 = OpTypeInt 32 0
+ %23 = OpConstant %22 4
+ %24 = OpTypeArray %19 %23
+ %25 = OpTypeStruct %24
+ %26 = OpTypePointer Uniform %25
+ %27 = OpVariable %26 Uniform
+ %28 = OpConstant %19 0
+ %29 = OpConstant %19 2
+ %30 = OpTypePointer Uniform %19
+ %42 = OpConstant %19 1
+ %45 = OpTypeBool
+ %59 = OpConstant %19 3
+ %66 = OpTypeVector %6 4
+ %67 = OpTypePointer Output %66
+ %68 = OpVariable %67 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %21 = OpVariable %20 Function
+ %33 = OpVariable %20 Function
+ %18 = OpExtInst %6 %1 Determinant %17
+ OpStore %8 %18
+ %31 = OpAccessChain %30 %27 %28 %29
+ %32 = OpLoad %19 %31
+ OpStore %21 %32
+ %34 = OpAccessChain %30 %27 %28 %29
+ %35 = OpLoad %19 %34
+ OpStore %33 %35
+ OpBranch %36
+ %36 = OpLabel
+ OpLoopMerge %38 %39 None
+ OpBranch %40
+ %40 = OpLabel
+ %41 = OpLoad %19 %33
+ %43 = OpAccessChain %30 %27 %28 %42
+ %44 = OpLoad %19 %43
+ %46 = OpSLessThan %45 %41 %44
+ OpBranchConditional %46 %37 %38
+ %37 = OpLabel
+ %47 = OpLoad %19 %21
+ %48 = OpAccessChain %30 %27 %28 %29
+ %49 = OpLoad %19 %48
+ %50 = OpSGreaterThan %45 %47 %49
+ OpSelectionMerge %52 None
+ OpBranchConditional %50 %51 %52
+ %51 = OpLabel
+ OpBranch %38
+ %52 = OpLabel
+ %54 = OpLoad %6 %8
+ %55 = OpConvertFToS %19 %54
+ OpStore %21 %55
+ OpBranch %39
+ %39 = OpLabel
+ %56 = OpLoad %19 %33
+ %57 = OpIAdd %19 %56 %42
+ OpStore %33 %57
+ OpBranch %36
+ %38 = OpLabel
+ %58 = OpLoad %19 %21
+ %60 = OpAccessChain %30 %27 %28 %59
+ %61 = OpLoad %19 %60
+ %62 = OpSNegate %19 %61
+ %63 = OpIEqual %45 %58 %62
+ OpSelectionMerge %65 None
+ OpBranchConditional %63 %64 %82
+ %64 = OpLabel
+ %69 = OpAccessChain %30 %27 %28 %29
+ %70 = OpLoad %19 %69
+ %71 = OpConvertSToF %6 %70
+ %72 = OpAccessChain %30 %27 %28 %28
+ %73 = OpLoad %19 %72
+ %74 = OpConvertSToF %6 %73
+ %75 = OpAccessChain %30 %27 %28 %28
+ %76 = OpLoad %19 %75
+ %77 = OpConvertSToF %6 %76
+ %78 = OpAccessChain %30 %27 %28 %29
+ %79 = OpLoad %19 %78
+ %80 = OpConvertSToF %6 %79
+ %81 = OpCompositeConstruct %66 %71 %74 %77 %80
+ OpStore %68 %81
+ OpBranch %65
+ %82 = OpLabel
+ %83 = OpAccessChain %30 %27 %28 %28
+ %84 = OpLoad %19 %83
+ %85 = OpConvertSToF %6 %84
+ %86 = OpCompositeConstruct %66 %85 %85 %85 %85
+ OpStore %68 %86
+ OpBranch %65
+ %65 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 100 1 9993001
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-mix-nan.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-mix-nan.amber
new file mode 100644
index 0000000..e73f48d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-mix-nan.amber
@@ -0,0 +1,251 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific floating point code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_2 _GLF_uniform_int_values[1]
+# #define _int_3 _GLF_uniform_int_values[2]
+# #define _int_4 _GLF_uniform_int_values[3]
+# #define _int_5 _GLF_uniform_int_values[4]
+# #define _int_6 _GLF_uniform_int_values[5]
+# #define _int_7 _GLF_uniform_int_values[6]
+# #define _int_8 _GLF_uniform_int_values[7]
+# #define _int_0 _GLF_uniform_int_values[8]
+# #define _also_1 _GLF_uniform_int_values[9]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [1, 2, 3, 4, 5, 6, 7, 8, 0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[10];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float nan = intBitsToFloat(-1);
+#
+# // This results in an undefined value, but not in undefined behavior.
+# vec4 undefined = mix(vec4(_int_1, _int_2, _int_3, _int_4),
+# vec4(_int_5, _int_6, _int_7, _int_8), nan);
+#
+# if (_int_1 == _also_1 || undefined.x > _float_0_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 105
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %85
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "nan"
+ OpName %14 "undefined"
+ OpName %18 "buf1"
+ OpMemberName %18 0 "_GLF_uniform_int_values"
+ OpName %20 ""
+ OpName %74 "buf0"
+ OpMemberName %74 0 "_GLF_uniform_float_values"
+ OpName %76 ""
+ OpName %85 "_GLF_color"
+ OpDecorate %17 ArrayStride 16
+ OpMemberDecorate %18 0 Offset 0
+ OpDecorate %18 Block
+ OpDecorate %20 DescriptorSet 0
+ OpDecorate %20 Binding 1
+ OpDecorate %73 ArrayStride 16
+ OpMemberDecorate %74 0 Offset 0
+ OpDecorate %74 Block
+ OpDecorate %76 DescriptorSet 0
+ OpDecorate %76 Binding 0
+ OpDecorate %85 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 1
+ %10 = OpConstant %9 -1
+ %12 = OpTypeVector %6 4
+ %13 = OpTypePointer Function %12
+ %15 = OpTypeInt 32 0
+ %16 = OpConstant %15 10
+ %17 = OpTypeArray %9 %16
+ %18 = OpTypeStruct %17
+ %19 = OpTypePointer Uniform %18
+ %20 = OpVariable %19 Uniform
+ %21 = OpConstant %9 0
+ %22 = OpTypePointer Uniform %9
+ %26 = OpConstant %9 1
+ %30 = OpConstant %9 2
+ %34 = OpConstant %9 3
+ %39 = OpConstant %9 4
+ %43 = OpConstant %9 5
+ %47 = OpConstant %9 6
+ %51 = OpConstant %9 7
+ %59 = OpTypeBool
+ %62 = OpConstant %9 9
+ %69 = OpConstant %15 0
+ %72 = OpConstant %15 1
+ %73 = OpTypeArray %6 %72
+ %74 = OpTypeStruct %73
+ %75 = OpTypePointer Uniform %74
+ %76 = OpVariable %75 Uniform
+ %77 = OpTypePointer Uniform %6
+ %84 = OpTypePointer Output %12
+ %85 = OpVariable %84 Output
+ %89 = OpConstant %9 8
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %14 = OpVariable %13 Function
+ %11 = OpBitcast %6 %10
+ OpStore %8 %11
+ %23 = OpAccessChain %22 %20 %21 %21
+ %24 = OpLoad %9 %23
+ %25 = OpConvertSToF %6 %24
+ %27 = OpAccessChain %22 %20 %21 %26
+ %28 = OpLoad %9 %27
+ %29 = OpConvertSToF %6 %28
+ %31 = OpAccessChain %22 %20 %21 %30
+ %32 = OpLoad %9 %31
+ %33 = OpConvertSToF %6 %32
+ %35 = OpAccessChain %22 %20 %21 %34
+ %36 = OpLoad %9 %35
+ %37 = OpConvertSToF %6 %36
+ %38 = OpCompositeConstruct %12 %25 %29 %33 %37
+ %40 = OpAccessChain %22 %20 %21 %39
+ %41 = OpLoad %9 %40
+ %42 = OpConvertSToF %6 %41
+ %44 = OpAccessChain %22 %20 %21 %43
+ %45 = OpLoad %9 %44
+ %46 = OpConvertSToF %6 %45
+ %48 = OpAccessChain %22 %20 %21 %47
+ %49 = OpLoad %9 %48
+ %50 = OpConvertSToF %6 %49
+ %52 = OpAccessChain %22 %20 %21 %51
+ %53 = OpLoad %9 %52
+ %54 = OpConvertSToF %6 %53
+ %55 = OpCompositeConstruct %12 %42 %46 %50 %54
+ %56 = OpLoad %6 %8
+ %57 = OpCompositeConstruct %12 %56 %56 %56 %56
+ %58 = OpExtInst %12 %1 FMix %38 %55 %57
+ OpStore %14 %58
+ %60 = OpAccessChain %22 %20 %21 %21
+ %61 = OpLoad %9 %60
+ %63 = OpAccessChain %22 %20 %21 %62
+ %64 = OpLoad %9 %63
+ %65 = OpIEqual %59 %61 %64
+ %66 = OpLogicalNot %59 %65
+ OpSelectionMerge %68 None
+ OpBranchConditional %66 %67 %68
+ %67 = OpLabel
+ %70 = OpAccessChain %7 %14 %69
+ %71 = OpLoad %6 %70
+ %78 = OpAccessChain %77 %76 %21 %21
+ %79 = OpLoad %6 %78
+ %80 = OpFOrdGreaterThan %59 %71 %79
+ OpBranch %68
+ %68 = OpLabel
+ %81 = OpPhi %59 %65 %5 %80 %67
+ OpSelectionMerge %83 None
+ OpBranchConditional %81 %82 %100
+ %82 = OpLabel
+ %86 = OpAccessChain %22 %20 %21 %21
+ %87 = OpLoad %9 %86
+ %88 = OpConvertSToF %6 %87
+ %90 = OpAccessChain %22 %20 %21 %89
+ %91 = OpLoad %9 %90
+ %92 = OpConvertSToF %6 %91
+ %93 = OpAccessChain %22 %20 %21 %89
+ %94 = OpLoad %9 %93
+ %95 = OpConvertSToF %6 %94
+ %96 = OpAccessChain %22 %20 %21 %21
+ %97 = OpLoad %9 %96
+ %98 = OpConvertSToF %6 %97
+ %99 = OpCompositeConstruct %12 %88 %92 %95 %98
+ OpStore %85 %99
+ OpBranch %83
+ %100 = OpLabel
+ %101 = OpAccessChain %22 %20 %21 %89
+ %102 = OpLoad %9 %101
+ %103 = OpConvertSToF %6 %102
+ %104 = OpCompositeConstruct %12 %103 %103 %103 %103
+ OpStore %85 %104
+ OpBranch %83
+ %83 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 2 3 4 5 6 7 8 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-mod-zero.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-mod-zero.amber
new file mode 100644
index 0000000..c752ee8
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-mod-zero.amber
@@ -0,0 +1,208 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific floating point code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // This results in an undefined value, but not in undefined behavior.
+# float undefined = mod(5.0, 0.0);
+# if (_int_1 == (_int_1 + _int_0) || undefined > _float_0_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 68
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %49
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "undefined"
+ OpName %17 "buf1"
+ OpMemberName %17 0 "_GLF_uniform_int_values"
+ OpName %19 ""
+ OpName %37 "buf0"
+ OpMemberName %37 0 "_GLF_uniform_float_values"
+ OpName %39 ""
+ OpName %49 "_GLF_color"
+ OpDecorate %16 ArrayStride 16
+ OpMemberDecorate %17 0 RelaxedPrecision
+ OpMemberDecorate %17 0 Offset 0
+ OpDecorate %17 Block
+ OpDecorate %19 DescriptorSet 0
+ OpDecorate %19 Binding 1
+ OpDecorate %23 RelaxedPrecision
+ OpDecorate %25 RelaxedPrecision
+ OpDecorate %28 RelaxedPrecision
+ OpDecorate %29 RelaxedPrecision
+ OpDecorate %36 ArrayStride 16
+ OpMemberDecorate %37 0 Offset 0
+ OpDecorate %37 Block
+ OpDecorate %39 DescriptorSet 0
+ OpDecorate %39 Binding 0
+ OpDecorate %49 Location 0
+ OpDecorate %51 RelaxedPrecision
+ OpDecorate %54 RelaxedPrecision
+ OpDecorate %57 RelaxedPrecision
+ OpDecorate %60 RelaxedPrecision
+ OpDecorate %65 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 5
+ %10 = OpConstant %6 0
+ %12 = OpTypeBool
+ %13 = OpTypeInt 32 1
+ %14 = OpTypeInt 32 0
+ %15 = OpConstant %14 3
+ %16 = OpTypeArray %13 %15
+ %17 = OpTypeStruct %16
+ %18 = OpTypePointer Uniform %17
+ %19 = OpVariable %18 Uniform
+ %20 = OpConstant %13 0
+ %21 = OpTypePointer Uniform %13
+ %26 = OpConstant %13 1
+ %35 = OpConstant %14 1
+ %36 = OpTypeArray %6 %35
+ %37 = OpTypeStruct %36
+ %38 = OpTypePointer Uniform %37
+ %39 = OpVariable %38 Uniform
+ %40 = OpTypePointer Uniform %6
+ %47 = OpTypeVector %6 4
+ %48 = OpTypePointer Output %47
+ %49 = OpVariable %48 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %11 = OpFMod %6 %9 %10
+ OpStore %8 %11
+ %22 = OpAccessChain %21 %19 %20 %20
+ %23 = OpLoad %13 %22
+ %24 = OpAccessChain %21 %19 %20 %20
+ %25 = OpLoad %13 %24
+ %27 = OpAccessChain %21 %19 %20 %26
+ %28 = OpLoad %13 %27
+ %29 = OpIAdd %13 %25 %28
+ %30 = OpIEqual %12 %23 %29
+ %31 = OpLogicalNot %12 %30
+ OpSelectionMerge %33 None
+ OpBranchConditional %31 %32 %33
+ %32 = OpLabel
+ %34 = OpLoad %6 %8
+ %41 = OpAccessChain %40 %39 %20 %20
+ %42 = OpLoad %6 %41
+ %43 = OpFOrdGreaterThan %12 %34 %42
+ OpBranch %33
+ %33 = OpLabel
+ %44 = OpPhi %12 %30 %5 %43 %32
+ OpSelectionMerge %46 None
+ OpBranchConditional %44 %45 %63
+ %45 = OpLabel
+ %50 = OpAccessChain %21 %19 %20 %20
+ %51 = OpLoad %13 %50
+ %52 = OpConvertSToF %6 %51
+ %53 = OpAccessChain %21 %19 %20 %26
+ %54 = OpLoad %13 %53
+ %55 = OpConvertSToF %6 %54
+ %56 = OpAccessChain %21 %19 %20 %26
+ %57 = OpLoad %13 %56
+ %58 = OpConvertSToF %6 %57
+ %59 = OpAccessChain %21 %19 %20 %20
+ %60 = OpLoad %13 %59
+ %61 = OpConvertSToF %6 %60
+ %62 = OpCompositeConstruct %47 %52 %55 %58 %61
+ OpStore %49 %62
+ OpBranch %46
+ %63 = OpLabel
+ %64 = OpAccessChain %21 %19 %20 %26
+ %65 = OpLoad %13 %64
+ %66 = OpConvertSToF %6 %65
+ %67 = OpCompositeConstruct %47 %66 %66 %66 %66
+ OpStore %49 %67
+ OpBranch %46
+ %46 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-negative-step-func.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-negative-step-func.amber
new file mode 100644
index 0000000..495b011
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-negative-step-func.amber
@@ -0,0 +1,197 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific floating point code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float edge = determinant(mat3(1));
+# if (step(edge, vec4(-3.0)) == vec4(_float_0_0))
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 69
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %43
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "edge"
+ OpName %27 "buf1"
+ OpMemberName %27 0 "_GLF_uniform_float_values"
+ OpName %29 ""
+ OpName %43 "_GLF_color"
+ OpName %46 "buf0"
+ OpMemberName %46 0 "_GLF_uniform_int_values"
+ OpName %48 ""
+ OpDecorate %26 ArrayStride 16
+ OpMemberDecorate %27 0 Offset 0
+ OpDecorate %27 Block
+ OpDecorate %29 DescriptorSet 0
+ OpDecorate %29 Binding 1
+ OpDecorate %43 Location 0
+ OpDecorate %45 ArrayStride 16
+ OpMemberDecorate %46 0 Offset 0
+ OpDecorate %46 Block
+ OpDecorate %48 DescriptorSet 0
+ OpDecorate %48 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeVector %6 3
+ %10 = OpTypeMatrix %9 3
+ %11 = OpConstant %6 1
+ %12 = OpConstant %6 0
+ %13 = OpConstantComposite %9 %11 %12 %12
+ %14 = OpConstantComposite %9 %12 %11 %12
+ %15 = OpConstantComposite %9 %12 %12 %11
+ %16 = OpConstantComposite %10 %13 %14 %15
+ %19 = OpTypeVector %6 4
+ %20 = OpConstant %6 -3
+ %21 = OpConstantComposite %19 %20 %20 %20 %20
+ %24 = OpTypeInt 32 0
+ %25 = OpConstant %24 1
+ %26 = OpTypeArray %6 %25
+ %27 = OpTypeStruct %26
+ %28 = OpTypePointer Uniform %27
+ %29 = OpVariable %28 Uniform
+ %30 = OpTypeInt 32 1
+ %31 = OpConstant %30 0
+ %32 = OpTypePointer Uniform %6
+ %36 = OpTypeBool
+ %37 = OpTypeVector %36 4
+ %42 = OpTypePointer Output %19
+ %43 = OpVariable %42 Output
+ %44 = OpConstant %24 2
+ %45 = OpTypeArray %30 %44
+ %46 = OpTypeStruct %45
+ %47 = OpTypePointer Uniform %46
+ %48 = OpVariable %47 Uniform
+ %49 = OpTypePointer Uniform %30
+ %53 = OpConstant %30 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %17 = OpExtInst %6 %1 Determinant %16
+ OpStore %8 %17
+ %18 = OpLoad %6 %8
+ %22 = OpCompositeConstruct %19 %18 %18 %18 %18
+ %23 = OpExtInst %19 %1 Step %22 %21
+ %33 = OpAccessChain %32 %29 %31 %31
+ %34 = OpLoad %6 %33
+ %35 = OpCompositeConstruct %19 %34 %34 %34 %34
+ %38 = OpFOrdEqual %37 %23 %35
+ %39 = OpAll %36 %38
+ OpSelectionMerge %41 None
+ OpBranchConditional %39 %40 %64
+ %40 = OpLabel
+ %50 = OpAccessChain %49 %48 %31 %31
+ %51 = OpLoad %30 %50
+ %52 = OpConvertSToF %6 %51
+ %54 = OpAccessChain %49 %48 %31 %53
+ %55 = OpLoad %30 %54
+ %56 = OpConvertSToF %6 %55
+ %57 = OpAccessChain %49 %48 %31 %53
+ %58 = OpLoad %30 %57
+ %59 = OpConvertSToF %6 %58
+ %60 = OpAccessChain %49 %48 %31 %31
+ %61 = OpLoad %30 %60
+ %62 = OpConvertSToF %6 %61
+ %63 = OpCompositeConstruct %19 %52 %56 %59 %62
+ OpStore %43 %63
+ OpBranch %41
+ %64 = OpLabel
+ %65 = OpAccessChain %49 %48 %31 %53
+ %66 = OpLoad %30 %65
+ %67 = OpConvertSToF %6 %66
+ %68 = OpCompositeConstruct %19 %67 %67 %67 %67
+ OpStore %43 %68
+ OpBranch %41
+ %41 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-reflect-denorm.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-reflect-denorm.amber
new file mode 100644
index 0000000..356585d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-reflect-denorm.amber
@@ -0,0 +1,238 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific floating point code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_768 _GLF_uniform_int_values[2]
+# #define _int_1792 _GLF_uniform_int_values[3]
+# #define _int_45056 _GLF_uniform_int_values[4]
+# #define _float_0_1 _GLF_uniform_float_values[0]
+# #define _float_0_5 _GLF_uniform_float_values[1]
+# #define _float_2_0 _GLF_uniform_float_values[2]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0, 768, 1792, 45056]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[5];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [0.1, 0.5, 2.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // All components of I are denormalized.
+# vec4 I = uintBitsToFloat(uvec4(_int_768, _int_1792, _int_45056, 0x16b39));
+# vec4 N = vec4(_float_0_5);
+#
+# // Whether or not denormalized values are supported or flushed to zero,
+# // the result of "reflect" should match the reference result.
+# vec4 R = reflect(I, vec4(0.5));
+# vec4 ref = I - _float_2_0 * dot(N, I) * N;
+#
+# if (distance(R, ref) < _float_0_1)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 91
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %72
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "I"
+ OpName %14 "buf0"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpName %35 "N"
+ OpName %38 "buf1"
+ OpMemberName %38 0 "_GLF_uniform_float_values"
+ OpName %40 ""
+ OpName %46 "R"
+ OpName %51 "ref"
+ OpName %72 "_GLF_color"
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 0
+ OpDecorate %37 ArrayStride 16
+ OpMemberDecorate %38 0 Offset 0
+ OpDecorate %38 Block
+ OpDecorate %40 DescriptorSet 0
+ OpDecorate %40 Binding 1
+ OpDecorate %72 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeInt 32 1
+ %11 = OpTypeInt 32 0
+ %12 = OpConstant %11 5
+ %13 = OpTypeArray %10 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %10 0
+ %18 = OpConstant %10 2
+ %19 = OpTypePointer Uniform %10
+ %23 = OpConstant %10 3
+ %27 = OpConstant %10 4
+ %31 = OpConstant %11 92985
+ %32 = OpTypeVector %11 4
+ %36 = OpConstant %11 3
+ %37 = OpTypeArray %6 %36
+ %38 = OpTypeStruct %37
+ %39 = OpTypePointer Uniform %38
+ %40 = OpVariable %39 Uniform
+ %41 = OpConstant %10 1
+ %42 = OpTypePointer Uniform %6
+ %48 = OpConstant %6 0.5
+ %49 = OpConstantComposite %7 %48 %48 %48 %48
+ %67 = OpTypeBool
+ %71 = OpTypePointer Output %7
+ %72 = OpVariable %71 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %35 = OpVariable %8 Function
+ %46 = OpVariable %8 Function
+ %51 = OpVariable %8 Function
+ %20 = OpAccessChain %19 %16 %17 %18
+ %21 = OpLoad %10 %20
+ %22 = OpBitcast %11 %21
+ %24 = OpAccessChain %19 %16 %17 %23
+ %25 = OpLoad %10 %24
+ %26 = OpBitcast %11 %25
+ %28 = OpAccessChain %19 %16 %17 %27
+ %29 = OpLoad %10 %28
+ %30 = OpBitcast %11 %29
+ %33 = OpCompositeConstruct %32 %22 %26 %30 %31
+ %34 = OpBitcast %7 %33
+ OpStore %9 %34
+ %43 = OpAccessChain %42 %40 %17 %41
+ %44 = OpLoad %6 %43
+ %45 = OpCompositeConstruct %7 %44 %44 %44 %44
+ OpStore %35 %45
+ %47 = OpLoad %7 %9
+ %50 = OpExtInst %7 %1 Reflect %47 %49
+ OpStore %46 %50
+ %52 = OpLoad %7 %9
+ %53 = OpAccessChain %42 %40 %17 %18
+ %54 = OpLoad %6 %53
+ %55 = OpLoad %7 %35
+ %56 = OpLoad %7 %9
+ %57 = OpDot %6 %55 %56
+ %58 = OpFMul %6 %54 %57
+ %59 = OpLoad %7 %35
+ %60 = OpVectorTimesScalar %7 %59 %58
+ %61 = OpFSub %7 %52 %60
+ OpStore %51 %61
+ %62 = OpLoad %7 %46
+ %63 = OpLoad %7 %51
+ %64 = OpExtInst %6 %1 Distance %62 %63
+ %65 = OpAccessChain %42 %40 %17 %17
+ %66 = OpLoad %6 %65
+ %68 = OpFOrdLessThan %67 %64 %66
+ OpSelectionMerge %70 None
+ OpBranchConditional %68 %69 %86
+ %69 = OpLabel
+ %73 = OpAccessChain %19 %16 %17 %17
+ %74 = OpLoad %10 %73
+ %75 = OpConvertSToF %6 %74
+ %76 = OpAccessChain %19 %16 %17 %41
+ %77 = OpLoad %10 %76
+ %78 = OpConvertSToF %6 %77
+ %79 = OpAccessChain %19 %16 %17 %41
+ %80 = OpLoad %10 %79
+ %81 = OpConvertSToF %6 %80
+ %82 = OpAccessChain %19 %16 %17 %17
+ %83 = OpLoad %10 %82
+ %84 = OpConvertSToF %6 %83
+ %85 = OpCompositeConstruct %7 %75 %78 %81 %84
+ OpStore %72 %85
+ OpBranch %70
+ %86 = OpLabel
+ %87 = OpAccessChain %19 %16 %17 %41
+ %88 = OpLoad %10 %87
+ %89 = OpConvertSToF %6 %88
+ %90 = OpCompositeConstruct %7 %89 %89 %89 %89
+ OpStore %72 %90
+ OpBranch %70
+ %70 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.1 0.5 2.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0 768 1792 45056
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-sinh-negative-log2.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-sinh-negative-log2.amber
new file mode 100644
index 0000000..89613c5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-sinh-negative-log2.amber
@@ -0,0 +1,201 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific floating point code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // This results in an undefined value, but not in undefined behavior.
+# float undefined = sinh(log2(-8.9));
+#
+# if (1 == _int_1 || undefined > _float_0_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 62
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %43
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "undefined"
+ OpName %17 "buf0"
+ OpMemberName %17 0 "_GLF_uniform_int_values"
+ OpName %19 ""
+ OpName %31 "buf1"
+ OpMemberName %31 0 "_GLF_uniform_float_values"
+ OpName %33 ""
+ OpName %43 "_GLF_color"
+ OpDecorate %16 ArrayStride 16
+ OpMemberDecorate %17 0 RelaxedPrecision
+ OpMemberDecorate %17 0 Offset 0
+ OpDecorate %17 Block
+ OpDecorate %19 DescriptorSet 0
+ OpDecorate %19 Binding 0
+ OpDecorate %23 RelaxedPrecision
+ OpDecorate %30 ArrayStride 16
+ OpMemberDecorate %31 0 Offset 0
+ OpDecorate %31 Block
+ OpDecorate %33 DescriptorSet 0
+ OpDecorate %33 Binding 1
+ OpDecorate %43 Location 0
+ OpDecorate %45 RelaxedPrecision
+ OpDecorate %48 RelaxedPrecision
+ OpDecorate %51 RelaxedPrecision
+ OpDecorate %54 RelaxedPrecision
+ OpDecorate %59 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 0x1.8p+128
+ %11 = OpTypeBool
+ %12 = OpTypeInt 32 1
+ %13 = OpConstant %12 1
+ %14 = OpTypeInt 32 0
+ %15 = OpConstant %14 2
+ %16 = OpTypeArray %12 %15
+ %17 = OpTypeStruct %16
+ %18 = OpTypePointer Uniform %17
+ %19 = OpVariable %18 Uniform
+ %20 = OpConstant %12 0
+ %21 = OpTypePointer Uniform %12
+ %29 = OpConstant %14 1
+ %30 = OpTypeArray %6 %29
+ %31 = OpTypeStruct %30
+ %32 = OpTypePointer Uniform %31
+ %33 = OpVariable %32 Uniform
+ %34 = OpTypePointer Uniform %6
+ %41 = OpTypeVector %6 4
+ %42 = OpTypePointer Output %41
+ %43 = OpVariable %42 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %10 = OpExtInst %6 %1 Sinh %9
+ OpStore %8 %10
+ %22 = OpAccessChain %21 %19 %20 %20
+ %23 = OpLoad %12 %22
+ %24 = OpIEqual %11 %13 %23
+ %25 = OpLogicalNot %11 %24
+ OpSelectionMerge %27 None
+ OpBranchConditional %25 %26 %27
+ %26 = OpLabel
+ %28 = OpLoad %6 %8
+ %35 = OpAccessChain %34 %33 %20 %20
+ %36 = OpLoad %6 %35
+ %37 = OpFOrdGreaterThan %11 %28 %36
+ OpBranch %27
+ %27 = OpLabel
+ %38 = OpPhi %11 %24 %5 %37 %26
+ OpSelectionMerge %40 None
+ OpBranchConditional %38 %39 %57
+ %39 = OpLabel
+ %44 = OpAccessChain %21 %19 %20 %20
+ %45 = OpLoad %12 %44
+ %46 = OpConvertSToF %6 %45
+ %47 = OpAccessChain %21 %19 %20 %13
+ %48 = OpLoad %12 %47
+ %49 = OpConvertSToF %6 %48
+ %50 = OpAccessChain %21 %19 %20 %13
+ %51 = OpLoad %12 %50
+ %52 = OpConvertSToF %6 %51
+ %53 = OpAccessChain %21 %19 %20 %20
+ %54 = OpLoad %12 %53
+ %55 = OpConvertSToF %6 %54
+ %56 = OpCompositeConstruct %41 %46 %49 %52 %55
+ OpStore %43 %56
+ OpBranch %40
+ %57 = OpLabel
+ %58 = OpAccessChain %21 %19 %20 %13
+ %59 = OpLoad %12 %58
+ %60 = OpConvertSToF %6 %59
+ %61 = OpCompositeConstruct %41 %60 %60 %60 %60
+ OpStore %43 %61
+ OpBranch %40
+ %40 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-undefined-matrix-mul.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-undefined-matrix-mul.amber
new file mode 100644
index 0000000..90f99bf
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-undefined-matrix-mul.amber
@@ -0,0 +1,355 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific floating point code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_50 _GLF_uniform_int_values[0]
+# #define _int_10 _GLF_uniform_int_values[1]
+# #define _int_11 _GLF_uniform_int_values[2]
+# #define _int_12 _GLF_uniform_int_values[3]
+# #define _int_1 _GLF_uniform_int_values[4]
+# #define _int_2 _GLF_uniform_int_values[5]
+# #define _int_3 _GLF_uniform_int_values[6]
+# #define _int_6 _GLF_uniform_int_values[7]
+# #define _int_7 _GLF_uniform_int_values[8]
+# #define _int_0 _GLF_uniform_int_values[9]
+# #define _int_5 _GLF_uniform_int_values[10]
+# #define _int_9 _GLF_uniform_int_values[11]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [50, 10, 11, 12, 1, 2, 3, 6, 7, 0, 5, 9]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[12];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# mat3x4 m0 = mat3x4(_int_1, _int_2, _int_3, 4, _int_5, _int_6, _int_7, 8,
+# _int_9, _int_10, _int_11, _int_12);
+# mat3x4 m1 = mat3x4(_int_1);
+#
+# // Results are too large to fit into a floating point type, thus the results are undefined.
+# vec3 undefined = ldexp(vec3(1), ivec3(500));
+# // These still fit into floating point type.
+# vec3 defined = ldexp(vec3(_int_1), ivec3(_int_50));
+#
+# // Vectors v0 and v1 are undefined.
+# vec4 v0 = m0 * undefined;
+# vec4 v1 = m1 * undefined;
+#
+# // Vectors v2 and v3 are defined.
+# vec4 v2 = m0 * defined;
+# vec4 v3 = m1 * defined;
+#
+# // Always true.
+# if (v2.x > v3.x)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+#
+# // The result doesn't matter as the green channel is already zero.
+# if (v0.x < v1.x)
+# {
+# _GLF_color.g = _float_0_0;
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 158
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %121
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %10 "m0"
+ OpName %15 "buf1"
+ OpMemberName %15 0 "_GLF_uniform_int_values"
+ OpName %17 ""
+ OpName %68 "m1"
+ OpName %78 "undefined"
+ OpName %84 "defined"
+ OpName %94 "v0"
+ OpName %98 "v1"
+ OpName %102 "v2"
+ OpName %106 "v3"
+ OpName %121 "_GLF_color"
+ OpName %150 "buf0"
+ OpMemberName %150 0 "_GLF_uniform_float_values"
+ OpName %152 ""
+ OpDecorate %14 ArrayStride 16
+ OpMemberDecorate %15 0 RelaxedPrecision
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 1
+ OpDecorate %22 RelaxedPrecision
+ OpDecorate %26 RelaxedPrecision
+ OpDecorate %30 RelaxedPrecision
+ OpDecorate %35 RelaxedPrecision
+ OpDecorate %39 RelaxedPrecision
+ OpDecorate %43 RelaxedPrecision
+ OpDecorate %48 RelaxedPrecision
+ OpDecorate %52 RelaxedPrecision
+ OpDecorate %56 RelaxedPrecision
+ OpDecorate %60 RelaxedPrecision
+ OpDecorate %70 RelaxedPrecision
+ OpDecorate %86 RelaxedPrecision
+ OpDecorate %90 RelaxedPrecision
+ OpDecorate %121 Location 0
+ OpDecorate %123 RelaxedPrecision
+ OpDecorate %127 RelaxedPrecision
+ OpDecorate %130 RelaxedPrecision
+ OpDecorate %133 RelaxedPrecision
+ OpDecorate %138 RelaxedPrecision
+ OpDecorate %149 ArrayStride 16
+ OpMemberDecorate %150 0 Offset 0
+ OpDecorate %150 Block
+ OpDecorate %152 DescriptorSet 0
+ OpDecorate %152 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypeMatrix %7 3
+ %9 = OpTypePointer Function %8
+ %11 = OpTypeInt 32 1
+ %12 = OpTypeInt 32 0
+ %13 = OpConstant %12 12
+ %14 = OpTypeArray %11 %13
+ %15 = OpTypeStruct %14
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpConstant %11 0
+ %19 = OpConstant %11 4
+ %20 = OpTypePointer Uniform %11
+ %24 = OpConstant %11 5
+ %28 = OpConstant %11 6
+ %32 = OpConstant %6 4
+ %33 = OpConstant %11 10
+ %37 = OpConstant %11 7
+ %41 = OpConstant %11 8
+ %45 = OpConstant %6 8
+ %46 = OpConstant %11 11
+ %50 = OpConstant %11 1
+ %54 = OpConstant %11 2
+ %58 = OpConstant %11 3
+ %62 = OpConstant %6 1
+ %63 = OpConstant %6 0
+ %76 = OpTypeVector %6 3
+ %77 = OpTypePointer Function %76
+ %79 = OpConstantComposite %76 %62 %62 %62
+ %80 = OpTypeVector %11 3
+ %81 = OpConstant %11 500
+ %82 = OpConstantComposite %80 %81 %81 %81
+ %93 = OpTypePointer Function %7
+ %110 = OpConstant %12 0
+ %111 = OpTypePointer Function %6
+ %116 = OpTypeBool
+ %120 = OpTypePointer Output %7
+ %121 = OpVariable %120 Output
+ %125 = OpConstant %11 9
+ %148 = OpConstant %12 1
+ %149 = OpTypeArray %6 %148
+ %150 = OpTypeStruct %149
+ %151 = OpTypePointer Uniform %150
+ %152 = OpVariable %151 Uniform
+ %153 = OpTypePointer Uniform %6
+ %156 = OpTypePointer Output %6
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %10 = OpVariable %9 Function
+ %68 = OpVariable %9 Function
+ %78 = OpVariable %77 Function
+ %84 = OpVariable %77 Function
+ %94 = OpVariable %93 Function
+ %98 = OpVariable %93 Function
+ %102 = OpVariable %93 Function
+ %106 = OpVariable %93 Function
+ %21 = OpAccessChain %20 %17 %18 %19
+ %22 = OpLoad %11 %21
+ %23 = OpConvertSToF %6 %22
+ %25 = OpAccessChain %20 %17 %18 %24
+ %26 = OpLoad %11 %25
+ %27 = OpConvertSToF %6 %26
+ %29 = OpAccessChain %20 %17 %18 %28
+ %30 = OpLoad %11 %29
+ %31 = OpConvertSToF %6 %30
+ %34 = OpAccessChain %20 %17 %18 %33
+ %35 = OpLoad %11 %34
+ %36 = OpConvertSToF %6 %35
+ %38 = OpAccessChain %20 %17 %18 %37
+ %39 = OpLoad %11 %38
+ %40 = OpConvertSToF %6 %39
+ %42 = OpAccessChain %20 %17 %18 %41
+ %43 = OpLoad %11 %42
+ %44 = OpConvertSToF %6 %43
+ %47 = OpAccessChain %20 %17 %18 %46
+ %48 = OpLoad %11 %47
+ %49 = OpConvertSToF %6 %48
+ %51 = OpAccessChain %20 %17 %18 %50
+ %52 = OpLoad %11 %51
+ %53 = OpConvertSToF %6 %52
+ %55 = OpAccessChain %20 %17 %18 %54
+ %56 = OpLoad %11 %55
+ %57 = OpConvertSToF %6 %56
+ %59 = OpAccessChain %20 %17 %18 %58
+ %60 = OpLoad %11 %59
+ %61 = OpConvertSToF %6 %60
+ %64 = OpCompositeConstruct %7 %23 %27 %31 %32
+ %65 = OpCompositeConstruct %7 %36 %40 %44 %45
+ %66 = OpCompositeConstruct %7 %49 %53 %57 %61
+ %67 = OpCompositeConstruct %8 %64 %65 %66
+ OpStore %10 %67
+ %69 = OpAccessChain %20 %17 %18 %19
+ %70 = OpLoad %11 %69
+ %71 = OpConvertSToF %6 %70
+ %72 = OpCompositeConstruct %7 %71 %63 %63 %63
+ %73 = OpCompositeConstruct %7 %63 %71 %63 %63
+ %74 = OpCompositeConstruct %7 %63 %63 %71 %63
+ %75 = OpCompositeConstruct %8 %72 %73 %74
+ OpStore %68 %75
+ %83 = OpExtInst %76 %1 Ldexp %79 %82
+ OpStore %78 %83
+ %85 = OpAccessChain %20 %17 %18 %19
+ %86 = OpLoad %11 %85
+ %87 = OpConvertSToF %6 %86
+ %88 = OpCompositeConstruct %76 %87 %87 %87
+ %89 = OpAccessChain %20 %17 %18 %18
+ %90 = OpLoad %11 %89
+ %91 = OpCompositeConstruct %80 %90 %90 %90
+ %92 = OpExtInst %76 %1 Ldexp %88 %91
+ OpStore %84 %92
+ %95 = OpLoad %8 %10
+ %96 = OpLoad %76 %78
+ %97 = OpMatrixTimesVector %7 %95 %96
+ OpStore %94 %97
+ %99 = OpLoad %8 %68
+ %100 = OpLoad %76 %78
+ %101 = OpMatrixTimesVector %7 %99 %100
+ OpStore %98 %101
+ %103 = OpLoad %8 %10
+ %104 = OpLoad %76 %84
+ %105 = OpMatrixTimesVector %7 %103 %104
+ OpStore %102 %105
+ %107 = OpLoad %8 %68
+ %108 = OpLoad %76 %84
+ %109 = OpMatrixTimesVector %7 %107 %108
+ OpStore %106 %109
+ %112 = OpAccessChain %111 %102 %110
+ %113 = OpLoad %6 %112
+ %114 = OpAccessChain %111 %106 %110
+ %115 = OpLoad %6 %114
+ %117 = OpFOrdGreaterThan %116 %113 %115
+ OpSelectionMerge %119 None
+ OpBranchConditional %117 %118 %136
+ %118 = OpLabel
+ %122 = OpAccessChain %20 %17 %18 %19
+ %123 = OpLoad %11 %122
+ %124 = OpConvertSToF %6 %123
+ %126 = OpAccessChain %20 %17 %18 %125
+ %127 = OpLoad %11 %126
+ %128 = OpConvertSToF %6 %127
+ %129 = OpAccessChain %20 %17 %18 %125
+ %130 = OpLoad %11 %129
+ %131 = OpConvertSToF %6 %130
+ %132 = OpAccessChain %20 %17 %18 %19
+ %133 = OpLoad %11 %132
+ %134 = OpConvertSToF %6 %133
+ %135 = OpCompositeConstruct %7 %124 %128 %131 %134
+ OpStore %121 %135
+ OpBranch %119
+ %136 = OpLabel
+ %137 = OpAccessChain %20 %17 %18 %125
+ %138 = OpLoad %11 %137
+ %139 = OpConvertSToF %6 %138
+ %140 = OpCompositeConstruct %7 %139 %139 %139 %139
+ OpStore %121 %140
+ OpBranch %119
+ %119 = OpLabel
+ %141 = OpAccessChain %111 %94 %110
+ %142 = OpLoad %6 %141
+ %143 = OpAccessChain %111 %98 %110
+ %144 = OpLoad %6 %143
+ %145 = OpFOrdLessThan %116 %142 %144
+ OpSelectionMerge %147 None
+ OpBranchConditional %145 %146 %147
+ %146 = OpLabel
+ %154 = OpAccessChain %153 %152 %18 %18
+ %155 = OpLoad %6 %154
+ %157 = OpAccessChain %156 %121 %148
+ OpStore %157 %155
+ OpBranch %147
+ %147 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 50 10 11 12 1 2 3 6 7 0 5 9
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-unpackunorm-loop.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-unpackunorm-loop.amber
new file mode 100644
index 0000000..b15112a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-apfloat-unpackunorm-loop.amber
@@ -0,0 +1,188 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific floating point code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_5 _GLF_uniform_int_values[2]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# for (int i = _int_0; i < _int_5; i++)
+# {
+# vec4 v = unpackUnorm4x8(100u);
+#
+# // Always false.
+# if (int(v.x) > i)
+# {
+# _GLF_color = vec4(_int_0);
+# return;
+# }
+# }
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 68
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %47
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "i"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %34 "v"
+ OpName %47 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %47 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 1
+ %17 = OpTypePointer Uniform %6
+ %26 = OpConstant %6 2
+ %29 = OpTypeBool
+ %31 = OpTypeFloat 32
+ %32 = OpTypeVector %31 4
+ %33 = OpTypePointer Function %32
+ %35 = OpConstant %9 100
+ %37 = OpConstant %9 0
+ %38 = OpTypePointer Function %31
+ %46 = OpTypePointer Output %32
+ %47 = OpVariable %46 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %34 = OpVariable %33 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ OpBranch %20
+ %20 = OpLabel
+ OpLoopMerge %22 %23 None
+ OpBranch %24
+ %24 = OpLabel
+ %25 = OpLoad %6 %8
+ %27 = OpAccessChain %17 %14 %15 %26
+ %28 = OpLoad %6 %27
+ %30 = OpSLessThan %29 %25 %28
+ OpBranchConditional %30 %21 %22
+ %21 = OpLabel
+ %36 = OpExtInst %32 %1 UnpackUnorm4x8 %35
+ OpStore %34 %36
+ %39 = OpAccessChain %38 %34 %37
+ %40 = OpLoad %31 %39
+ %41 = OpConvertFToS %6 %40
+ %42 = OpLoad %6 %8
+ %43 = OpSGreaterThan %29 %41 %42
+ OpSelectionMerge %45 None
+ OpBranchConditional %43 %44 %45
+ %44 = OpLabel
+ %48 = OpAccessChain %17 %14 %15 %16
+ %49 = OpLoad %6 %48
+ %50 = OpConvertSToF %31 %49
+ %51 = OpCompositeConstruct %32 %50 %50 %50 %50
+ OpStore %47 %51
+ OpReturn
+ %45 = OpLabel
+ OpBranch %23
+ %23 = OpLabel
+ %53 = OpLoad %6 %8
+ %54 = OpIAdd %6 %53 %16
+ OpStore %8 %54
+ OpBranch %20
+ %22 = OpLabel
+ %55 = OpAccessChain %17 %14 %15 %15
+ %56 = OpLoad %6 %55
+ %57 = OpConvertSToF %31 %56
+ %58 = OpAccessChain %17 %14 %15 %16
+ %59 = OpLoad %6 %58
+ %60 = OpConvertSToF %31 %59
+ %61 = OpAccessChain %17 %14 %15 %16
+ %62 = OpLoad %6 %61
+ %63 = OpConvertSToF %31 %62
+ %64 = OpAccessChain %17 %14 %15 %15
+ %65 = OpLoad %6 %64
+ %66 = OpConvertSToF %31 %65
+ %67 = OpCompositeConstruct %32 %57 %60 %63 %66
+ OpStore %47 %67
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0 5
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-asin-undefined-smoothstep.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-asin-undefined-smoothstep.amber
new file mode 100644
index 0000000..9d5ae2d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-asin-undefined-smoothstep.amber
@@ -0,0 +1,252 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction simplify code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[1]
+# #define _float_0_2 _GLF_uniform_float_values[2]
+# #define _float_0_95 _GLF_uniform_float_values[3]
+# #define _float_0_62 _GLF_uniform_float_values[4]
+# #define _float_0_63 _GLF_uniform_float_values[5]
+# #define _float_0_96 _GLF_uniform_float_values[6]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.0, 0.2, 0.95, 0.62, 0.63, 0.96]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[7];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# vec4 v1 = vec4(_float_0_2, _float_0_2, _float_1_0, _float_0_2);
+#
+# // This results in an undefined value, but not in undefined behavior. v2 becomes
+# // [1.57, 1.11, undefined, 0.92]. The undefined z-component doesn't matter
+# // since it's not accessed when assigning the final color.
+# vec4 v2 = asin(vec4(1.0, 0.9, 1.1, 0.8));
+#
+# vec4 v3 = vec4(_float_1_0);
+# vec4 v4 = smoothstep(v1, v2, v3);
+#
+# _GLF_color = v4.xywx;
+#
+# if (v4.x > _float_0_62 && v4.x < _float_0_63 && v4.y > _float_0_95
+# && v4.y < _float_0_96 && v4.w == _float_1_0)
+# {
+# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
+# }
+# else
+# {
+# _GLF_color = vec4(_float_0_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 110
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %45
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "v1"
+ OpName %13 "buf0"
+ OpMemberName %13 0 "_GLF_uniform_float_values"
+ OpName %15 ""
+ OpName %29 "v2"
+ OpName %35 "v3"
+ OpName %39 "v4"
+ OpName %45 "_GLF_color"
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 0
+ OpDecorate %45 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeInt 32 0
+ %11 = OpConstant %10 7
+ %12 = OpTypeArray %6 %11
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpTypeInt 32 1
+ %17 = OpConstant %16 0
+ %18 = OpConstant %16 2
+ %19 = OpTypePointer Uniform %6
+ %30 = OpConstant %6 1.57079637
+ %31 = OpConstant %6 1.11976957
+ %32 = OpConstant %6 0x1.8p+128
+ %33 = OpConstant %6 0.927295208
+ %34 = OpConstantComposite %7 %30 %31 %32 %33
+ %44 = OpTypePointer Output %7
+ %45 = OpVariable %44 Output
+ %48 = OpTypeBool
+ %49 = OpConstant %10 0
+ %50 = OpTypePointer Function %6
+ %53 = OpConstant %16 4
+ %61 = OpConstant %16 5
+ %68 = OpConstant %10 1
+ %71 = OpConstant %16 3
+ %80 = OpConstant %16 6
+ %87 = OpConstant %10 3
+ %98 = OpConstant %16 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %29 = OpVariable %8 Function
+ %35 = OpVariable %8 Function
+ %39 = OpVariable %8 Function
+ %20 = OpAccessChain %19 %15 %17 %18
+ %21 = OpLoad %6 %20
+ %22 = OpAccessChain %19 %15 %17 %18
+ %23 = OpLoad %6 %22
+ %24 = OpAccessChain %19 %15 %17 %17
+ %25 = OpLoad %6 %24
+ %26 = OpAccessChain %19 %15 %17 %18
+ %27 = OpLoad %6 %26
+ %28 = OpCompositeConstruct %7 %21 %23 %25 %27
+ OpStore %9 %28
+ OpStore %29 %34
+ %36 = OpAccessChain %19 %15 %17 %17
+ %37 = OpLoad %6 %36
+ %38 = OpCompositeConstruct %7 %37 %37 %37 %37
+ OpStore %35 %38
+ %40 = OpLoad %7 %9
+ %41 = OpLoad %7 %29
+ %42 = OpLoad %7 %35
+ %43 = OpExtInst %7 %1 SmoothStep %40 %41 %42
+ OpStore %39 %43
+ %46 = OpLoad %7 %39
+ %47 = OpVectorShuffle %7 %46 %46 0 1 3 0
+ OpStore %45 %47
+ %51 = OpAccessChain %50 %39 %49
+ %52 = OpLoad %6 %51
+ %54 = OpAccessChain %19 %15 %17 %53
+ %55 = OpLoad %6 %54
+ %56 = OpFOrdGreaterThan %48 %52 %55
+ OpSelectionMerge %58 None
+ OpBranchConditional %56 %57 %58
+ %57 = OpLabel
+ %59 = OpAccessChain %50 %39 %49
+ %60 = OpLoad %6 %59
+ %62 = OpAccessChain %19 %15 %17 %61
+ %63 = OpLoad %6 %62
+ %64 = OpFOrdLessThan %48 %60 %63
+ OpBranch %58
+ %58 = OpLabel
+ %65 = OpPhi %48 %56 %5 %64 %57
+ OpSelectionMerge %67 None
+ OpBranchConditional %65 %66 %67
+ %66 = OpLabel
+ %69 = OpAccessChain %50 %39 %68
+ %70 = OpLoad %6 %69
+ %72 = OpAccessChain %19 %15 %17 %71
+ %73 = OpLoad %6 %72
+ %74 = OpFOrdGreaterThan %48 %70 %73
+ OpBranch %67
+ %67 = OpLabel
+ %75 = OpPhi %48 %65 %58 %74 %66
+ OpSelectionMerge %77 None
+ OpBranchConditional %75 %76 %77
+ %76 = OpLabel
+ %78 = OpAccessChain %50 %39 %68
+ %79 = OpLoad %6 %78
+ %81 = OpAccessChain %19 %15 %17 %80
+ %82 = OpLoad %6 %81
+ %83 = OpFOrdLessThan %48 %79 %82
+ OpBranch %77
+ %77 = OpLabel
+ %84 = OpPhi %48 %75 %67 %83 %76
+ OpSelectionMerge %86 None
+ OpBranchConditional %84 %85 %86
+ %85 = OpLabel
+ %88 = OpAccessChain %50 %39 %87
+ %89 = OpLoad %6 %88
+ %90 = OpAccessChain %19 %15 %17 %17
+ %91 = OpLoad %6 %90
+ %92 = OpFOrdEqual %48 %89 %91
+ OpBranch %86
+ %86 = OpLabel
+ %93 = OpPhi %48 %84 %77 %92 %85
+ OpSelectionMerge %95 None
+ OpBranchConditional %93 %94 %106
+ %94 = OpLabel
+ %96 = OpAccessChain %19 %15 %17 %17
+ %97 = OpLoad %6 %96
+ %99 = OpAccessChain %19 %15 %17 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %19 %15 %17 %98
+ %102 = OpLoad %6 %101
+ %103 = OpAccessChain %19 %15 %17 %17
+ %104 = OpLoad %6 %103
+ %105 = OpCompositeConstruct %7 %97 %100 %102 %104
+ OpStore %45 %105
+ OpBranch %95
+ %106 = OpLabel
+ %107 = OpAccessChain %19 %15 %17 %98
+ %108 = OpLoad %6 %107
+ %109 = OpCompositeConstruct %7 %108 %108 %108 %108
+ OpStore %45 %109
+ OpBranch %95
+ %95 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.0 0.2 0.95 0.62 0.63 0.96
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldExtract-undefined.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldExtract-undefined.amber
new file mode 100644
index 0000000..e6ab9c2
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldExtract-undefined.amber
@@ -0,0 +1,176 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific constant fold code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# uint a = 0x77777777u;
+#
+# // b becomes undefined. This results in an undefined value, but not in undefined behavior.
+# uint b = bitfieldExtract(a, -1, 1);
+#
+# uint c = a | b;
+#
+# // Always true.
+# if ((c & a) == a)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 57
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %31
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %10 "b"
+ OpName %16 "c"
+ OpName %31 "_GLF_color"
+ OpName %34 "buf0"
+ OpMemberName %34 0 "_GLF_uniform_int_values"
+ OpName %36 ""
+ OpDecorate %31 Location 0
+ OpDecorate %33 ArrayStride 16
+ OpMemberDecorate %34 0 Offset 0
+ OpDecorate %34 Block
+ OpDecorate %36 DescriptorSet 0
+ OpDecorate %36 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 0
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 2004318071
+ %12 = OpTypeInt 32 1
+ %13 = OpConstant %12 -1
+ %14 = OpConstant %12 1
+ %24 = OpTypeBool
+ %28 = OpTypeFloat 32
+ %29 = OpTypeVector %28 4
+ %30 = OpTypePointer Output %29
+ %31 = OpVariable %30 Output
+ %32 = OpConstant %6 2
+ %33 = OpTypeArray %12 %32
+ %34 = OpTypeStruct %33
+ %35 = OpTypePointer Uniform %34
+ %36 = OpVariable %35 Uniform
+ %37 = OpConstant %12 0
+ %38 = OpTypePointer Uniform %12
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %10 = OpVariable %7 Function
+ %16 = OpVariable %7 Function
+ OpStore %8 %9
+ %11 = OpLoad %6 %8
+ %15 = OpBitFieldUExtract %6 %11 %13 %14
+ OpStore %10 %15
+ %17 = OpLoad %6 %8
+ %18 = OpLoad %6 %10
+ %19 = OpBitwiseOr %6 %17 %18
+ OpStore %16 %19
+ %20 = OpLoad %6 %16
+ %21 = OpLoad %6 %8
+ %22 = OpBitwiseAnd %6 %20 %21
+ %23 = OpLoad %6 %8
+ %25 = OpIEqual %24 %22 %23
+ OpSelectionMerge %27 None
+ OpBranchConditional %25 %26 %52
+ %26 = OpLabel
+ %39 = OpAccessChain %38 %36 %37 %37
+ %40 = OpLoad %12 %39
+ %41 = OpConvertSToF %28 %40
+ %42 = OpAccessChain %38 %36 %37 %14
+ %43 = OpLoad %12 %42
+ %44 = OpConvertSToF %28 %43
+ %45 = OpAccessChain %38 %36 %37 %14
+ %46 = OpLoad %12 %45
+ %47 = OpConvertSToF %28 %46
+ %48 = OpAccessChain %38 %36 %37 %37
+ %49 = OpLoad %12 %48
+ %50 = OpConvertSToF %28 %49
+ %51 = OpCompositeConstruct %29 %41 %44 %47 %50
+ OpStore %31 %51
+ OpBranch %27
+ %52 = OpLabel
+ %53 = OpAccessChain %38 %36 %37 %14
+ %54 = OpLoad %12 %53
+ %55 = OpConvertSToF %28 %54
+ %56 = OpCompositeConstruct %29 %55 %55 %55 %55
+ OpStore %31 %56
+ OpBranch %27
+ %27 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldinsert-undefined.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldinsert-undefined.amber
new file mode 100644
index 0000000..e64ff70
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldinsert-undefined.amber
@@ -0,0 +1,303 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction simplify code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_32 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _int_10 _GLF_uniform_int_values[3]
+# #define _int_2 _GLF_uniform_int_values[4]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+# // Contents of _GLF_uniform_int_values: [1, 32, 0, 10]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[5];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int a = _int_0;
+# int b = _int_10;
+# int c = 1;
+#
+# // Always false.
+# if (gl_FragCoord.x < _float_0_0)
+# c--;
+#
+# // This results in an undefined value, but not in undefined behavior. Assigning
+# // an undefined value doesn't matter since d is reassigned a value >= 2 before
+# // using it.
+# int d = bitfieldInsert(1, 1, 32, c);
+#
+# if (d < _int_1)
+# d = _int_2;
+#
+# while ((a < b) || (d < _int_1))
+# {
+# d = bitfieldInsert(_int_1, _int_1, _int_32, c);
+#
+# if (d < _int_1)
+# d = _int_2;
+#
+# a++;
+# }
+#
+# if (a == _int_10)
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# else
+# _GLF_color = vec4(_int_0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 121
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %29 %102
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %20 "b"
+ OpName %24 "c"
+ OpName %29 "gl_FragCoord"
+ OpName %36 "buf0"
+ OpMemberName %36 0 "_GLF_uniform_float_values"
+ OpName %38 ""
+ OpName %48 "d"
+ OpName %102 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %29 BuiltIn FragCoord
+ OpDecorate %35 ArrayStride 16
+ OpMemberDecorate %36 0 Offset 0
+ OpDecorate %36 Block
+ OpDecorate %38 DescriptorSet 0
+ OpDecorate %38 Binding 0
+ OpDecorate %102 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 5
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 2
+ %17 = OpTypePointer Uniform %6
+ %21 = OpConstant %6 3
+ %25 = OpConstant %6 1
+ %26 = OpTypeFloat 32
+ %27 = OpTypeVector %26 4
+ %28 = OpTypePointer Input %27
+ %29 = OpVariable %28 Input
+ %30 = OpConstant %9 0
+ %31 = OpTypePointer Input %26
+ %34 = OpConstant %9 1
+ %35 = OpTypeArray %26 %34
+ %36 = OpTypeStruct %35
+ %37 = OpTypePointer Uniform %36
+ %38 = OpVariable %37 Uniform
+ %39 = OpTypePointer Uniform %26
+ %42 = OpTypeBool
+ %49 = OpConstant %6 32
+ %58 = OpConstant %6 4
+ %101 = OpTypePointer Output %27
+ %102 = OpVariable %101 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %24 = OpVariable %7 Function
+ %48 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %22 = OpAccessChain %17 %14 %15 %21
+ %23 = OpLoad %6 %22
+ OpStore %20 %23
+ OpStore %24 %25
+ %32 = OpAccessChain %31 %29 %30
+ %33 = OpLoad %26 %32
+ %40 = OpAccessChain %39 %38 %15 %15
+ %41 = OpLoad %26 %40
+ %43 = OpFOrdLessThan %42 %33 %41
+ OpSelectionMerge %45 None
+ OpBranchConditional %43 %44 %45
+ %44 = OpLabel
+ %46 = OpLoad %6 %24
+ %47 = OpISub %6 %46 %25
+ OpStore %24 %47
+ OpBranch %45
+ %45 = OpLabel
+ %50 = OpLoad %6 %24
+ %51 = OpBitFieldInsert %6 %25 %25 %49 %50
+ OpStore %48 %51
+ %52 = OpLoad %6 %48
+ %53 = OpAccessChain %17 %14 %15 %15
+ %54 = OpLoad %6 %53
+ %55 = OpSLessThan %42 %52 %54
+ OpSelectionMerge %57 None
+ OpBranchConditional %55 %56 %57
+ %56 = OpLabel
+ %59 = OpAccessChain %17 %14 %15 %58
+ %60 = OpLoad %6 %59
+ OpStore %48 %60
+ OpBranch %57
+ %57 = OpLabel
+ OpBranch %61
+ %61 = OpLabel
+ OpLoopMerge %63 %64 None
+ OpBranch %65
+ %65 = OpLabel
+ %66 = OpLoad %6 %8
+ %67 = OpLoad %6 %20
+ %68 = OpSLessThan %42 %66 %67
+ %69 = OpLogicalNot %42 %68
+ OpSelectionMerge %71 None
+ OpBranchConditional %69 %70 %71
+ %70 = OpLabel
+ %72 = OpLoad %6 %48
+ %73 = OpAccessChain %17 %14 %15 %15
+ %74 = OpLoad %6 %73
+ %75 = OpSLessThan %42 %72 %74
+ OpBranch %71
+ %71 = OpLabel
+ %76 = OpPhi %42 %68 %65 %75 %70
+ OpBranchConditional %76 %62 %63
+ %62 = OpLabel
+ %77 = OpAccessChain %17 %14 %15 %15
+ %78 = OpLoad %6 %77
+ %79 = OpAccessChain %17 %14 %15 %15
+ %80 = OpLoad %6 %79
+ %81 = OpAccessChain %17 %14 %15 %25
+ %82 = OpLoad %6 %81
+ %83 = OpLoad %6 %24
+ %84 = OpBitFieldInsert %6 %78 %80 %82 %83
+ OpStore %48 %84
+ %85 = OpLoad %6 %48
+ %86 = OpAccessChain %17 %14 %15 %15
+ %87 = OpLoad %6 %86
+ %88 = OpSLessThan %42 %85 %87
+ OpSelectionMerge %90 None
+ OpBranchConditional %88 %89 %90
+ %89 = OpLabel
+ %91 = OpAccessChain %17 %14 %15 %58
+ %92 = OpLoad %6 %91
+ OpStore %48 %92
+ OpBranch %90
+ %90 = OpLabel
+ %93 = OpLoad %6 %8
+ %94 = OpIAdd %6 %93 %25
+ OpStore %8 %94
+ OpBranch %64
+ %64 = OpLabel
+ OpBranch %61
+ %63 = OpLabel
+ %95 = OpLoad %6 %8
+ %96 = OpAccessChain %17 %14 %15 %21
+ %97 = OpLoad %6 %96
+ %98 = OpIEqual %42 %95 %97
+ OpSelectionMerge %100 None
+ OpBranchConditional %98 %99 %116
+ %99 = OpLabel
+ %103 = OpAccessChain %17 %14 %15 %15
+ %104 = OpLoad %6 %103
+ %105 = OpConvertSToF %26 %104
+ %106 = OpAccessChain %17 %14 %15 %16
+ %107 = OpLoad %6 %106
+ %108 = OpConvertSToF %26 %107
+ %109 = OpAccessChain %17 %14 %15 %16
+ %110 = OpLoad %6 %109
+ %111 = OpConvertSToF %26 %110
+ %112 = OpAccessChain %17 %14 %15 %15
+ %113 = OpLoad %6 %112
+ %114 = OpConvertSToF %26 %113
+ %115 = OpCompositeConstruct %27 %105 %108 %111 %114
+ OpStore %102 %115
+ OpBranch %100
+ %116 = OpLabel
+ %117 = OpAccessChain %17 %14 %15 %16
+ %118 = OpLoad %6 %117
+ %119 = OpConvertSToF %26 %118
+ %120 = OpCompositeConstruct %27 %119 %119 %119 %119
+ OpStore %102 %120
+ OpBranch %100
+ %100 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 32 0 10 2
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldreverse-left-shift-findmsb.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldreverse-left-shift-findmsb.amber
new file mode 100644
index 0000000..1bf52d5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-bitfieldreverse-left-shift-findmsb.amber
@@ -0,0 +1,179 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers specific DAG combiner and legalize vector ops code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // a becomes -2147483648.
+# int a = bitfieldReverse(1);
+#
+# // a is negative therefore this results in an undefined value, but not in undefined behavior.
+# int b = 1 << a;
+#
+# int c = findMSB(b);
+#
+# _GLF_color = vec4(c);
+#
+# if (a == -2147483648)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 56
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %20
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %11 "b"
+ OpName %14 "c"
+ OpName %20 "_GLF_color"
+ OpName %33 "buf0"
+ OpMemberName %33 0 "_GLF_uniform_int_values"
+ OpName %35 ""
+ OpDecorate %20 Location 0
+ OpDecorate %32 ArrayStride 16
+ OpMemberDecorate %33 0 Offset 0
+ OpDecorate %33 Block
+ OpDecorate %35 DescriptorSet 0
+ OpDecorate %35 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 1
+ %17 = OpTypeFloat 32
+ %18 = OpTypeVector %17 4
+ %19 = OpTypePointer Output %18
+ %20 = OpVariable %19 Output
+ %25 = OpConstant %6 -2147483648
+ %26 = OpTypeBool
+ %30 = OpTypeInt 32 0
+ %31 = OpConstant %30 2
+ %32 = OpTypeArray %6 %31
+ %33 = OpTypeStruct %32
+ %34 = OpTypePointer Uniform %33
+ %35 = OpVariable %34 Uniform
+ %36 = OpConstant %6 0
+ %37 = OpTypePointer Uniform %6
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %11 = OpVariable %7 Function
+ %14 = OpVariable %7 Function
+ %10 = OpBitReverse %6 %9
+ OpStore %8 %10
+ %12 = OpLoad %6 %8
+ %13 = OpShiftLeftLogical %6 %9 %12
+ OpStore %11 %13
+ %15 = OpLoad %6 %11
+ %16 = OpExtInst %6 %1 FindSMsb %15
+ OpStore %14 %16
+ %21 = OpLoad %6 %14
+ %22 = OpConvertSToF %17 %21
+ %23 = OpCompositeConstruct %18 %22 %22 %22 %22
+ OpStore %20 %23
+ %24 = OpLoad %6 %8
+ %27 = OpIEqual %26 %24 %25
+ OpSelectionMerge %29 None
+ OpBranchConditional %27 %28 %51
+ %28 = OpLabel
+ %38 = OpAccessChain %37 %35 %36 %36
+ %39 = OpLoad %6 %38
+ %40 = OpConvertSToF %17 %39
+ %41 = OpAccessChain %37 %35 %36 %9
+ %42 = OpLoad %6 %41
+ %43 = OpConvertSToF %17 %42
+ %44 = OpAccessChain %37 %35 %36 %9
+ %45 = OpLoad %6 %44
+ %46 = OpConvertSToF %17 %45
+ %47 = OpAccessChain %37 %35 %36 %36
+ %48 = OpLoad %6 %47
+ %49 = OpConvertSToF %17 %48
+ %50 = OpCompositeConstruct %18 %40 %43 %46 %49
+ OpStore %20 %50
+ OpBranch %29
+ %51 = OpLabel
+ %52 = OpAccessChain %37 %35 %36 %9
+ %53 = OpLoad %6 %52
+ %54 = OpConvertSToF %17 %53
+ %55 = OpCompositeConstruct %18 %54 %54 %54 %54
+ OpStore %20 %55
+ OpBranch %29
+ %29 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply.amber
new file mode 100644
index 0000000..9c22c4d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply.amber
@@ -0,0 +1,192 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific DAG code paths
+
+# The test passes because the shader always writes red.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: a187dd58a0485988841d325a85c8e6063f53500a
+
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[1]
+# #define _float_0_1 _GLF_uniform_float_values[2]
+# #define _float_0_3 _GLF_uniform_float_values[3]
+# #define _float_0_2 _GLF_uniform_float_values[4]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.0, 0.1, 0.3, 0.2]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[5];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // These conditions don't matter since the color
+# // gets overwritten right after.
+# if(gl_FragCoord.x > _float_1_0)
+# {
+# _GLF_color = vec4(_float_0_1);
+# if(gl_FragCoord.y > _float_1_0)
+# {
+# _GLF_color = vec4(_float_0_2);
+# }
+# _GLF_color = vec4(_float_0_3);
+# }
+#
+# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, 10.0);
+# // Multiplying by an identity matrix doesn't change the vector value.
+# _GLF_color = mat4(_float_1_0) * _GLF_color;
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 72
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %9 %30
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "gl_FragCoord"
+ OpName %17 "buf0"
+ OpMemberName %17 0 "_GLF_uniform_float_values"
+ OpName %19 ""
+ OpName %30 "_GLF_color"
+ OpDecorate %9 BuiltIn FragCoord
+ OpDecorate %16 ArrayStride 16
+ OpMemberDecorate %17 0 Offset 0
+ OpDecorate %17 Block
+ OpDecorate %19 DescriptorSet 0
+ OpDecorate %19 Binding 0
+ OpDecorate %30 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Input %7
+ %9 = OpVariable %8 Input
+ %10 = OpTypeInt 32 0
+ %11 = OpConstant %10 0
+ %12 = OpTypePointer Input %6
+ %15 = OpConstant %10 5
+ %16 = OpTypeArray %6 %15
+ %17 = OpTypeStruct %16
+ %18 = OpTypePointer Uniform %17
+ %19 = OpVariable %18 Uniform
+ %20 = OpTypeInt 32 1
+ %21 = OpConstant %20 0
+ %22 = OpTypePointer Uniform %6
+ %25 = OpTypeBool
+ %29 = OpTypePointer Output %7
+ %30 = OpVariable %29 Output
+ %31 = OpConstant %20 2
+ %35 = OpConstant %10 1
+ %43 = OpConstant %20 4
+ %47 = OpConstant %20 3
+ %53 = OpConstant %20 1
+ %58 = OpConstant %6 10
+ %62 = OpTypeMatrix %7 4
+ %64 = OpConstant %6 0
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %13 = OpAccessChain %12 %9 %11
+ %14 = OpLoad %6 %13
+ %23 = OpAccessChain %22 %19 %21 %21
+ %24 = OpLoad %6 %23
+ %26 = OpFOrdGreaterThan %25 %14 %24
+ OpSelectionMerge %28 None
+ OpBranchConditional %26 %27 %28
+ %27 = OpLabel
+ %32 = OpAccessChain %22 %19 %21 %31
+ %33 = OpLoad %6 %32
+ %34 = OpCompositeConstruct %7 %33 %33 %33 %33
+ OpStore %30 %34
+ %36 = OpAccessChain %12 %9 %35
+ %37 = OpLoad %6 %36
+ %40 = OpFOrdGreaterThan %25 %37 %24
+ OpSelectionMerge %42 None
+ OpBranchConditional %40 %41 %42
+ %41 = OpLabel
+ %44 = OpAccessChain %22 %19 %21 %43
+ %45 = OpLoad %6 %44
+ %46 = OpCompositeConstruct %7 %45 %45 %45 %45
+ OpStore %30 %46
+ OpBranch %42
+ %42 = OpLabel
+ %48 = OpAccessChain %22 %19 %21 %47
+ %49 = OpLoad %6 %48
+ %50 = OpCompositeConstruct %7 %49 %49 %49 %49
+ OpStore %30 %50
+ OpBranch %28
+ %28 = OpLabel
+ %54 = OpAccessChain %22 %19 %21 %53
+ %55 = OpLoad %6 %54
+ %59 = OpCompositeConstruct %7 %24 %55 %55 %58
+ OpStore %30 %59
+ %65 = OpCompositeConstruct %7 %24 %64 %64 %64
+ %66 = OpCompositeConstruct %7 %64 %24 %64 %64
+ %67 = OpCompositeConstruct %7 %64 %64 %24 %64
+ %68 = OpCompositeConstruct %7 %64 %64 %64 %24
+ %69 = OpCompositeConstruct %62 %65 %66 %67 %68
+ %70 = OpLoad %7 %30
+ %71 = OpMatrixTimesVector %7 %69 %70
+ OpStore %30 %71
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.0 0.1 0.3 0.2
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-bitfieldinsert-div-one.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-bitfieldinsert-div-one.amber
new file mode 100644
index 0000000..953f6e4
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-bitfieldinsert-div-one.amber
@@ -0,0 +1,224 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific const folding path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_10 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _float_9_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: 9.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [10, 0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float arr[10];
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# arr[i] = float(i);
+# }
+#
+# float f = arr[bitfieldInsert(9, 0, 0, 0) / 1];
+# if (f == _float_9_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, 1);
+# }
+# else
+# {
+# _GLF_color = vec4(0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 78
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %62
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "i"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %34 "arr"
+ OpName %42 "f"
+ OpName %51 "buf0"
+ OpMemberName %51 0 "_GLF_uniform_float_values"
+ OpName %53 ""
+ OpName %62 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %50 ArrayStride 16
+ OpMemberDecorate %51 0 Offset 0
+ OpDecorate %51 Block
+ OpDecorate %53 DescriptorSet 0
+ OpDecorate %53 Binding 0
+ OpDecorate %62 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 1
+ %17 = OpTypePointer Uniform %6
+ %28 = OpTypeBool
+ %30 = OpTypeFloat 32
+ %31 = OpConstant %9 10
+ %32 = OpTypeArray %30 %31
+ %33 = OpTypePointer Function %32
+ %38 = OpTypePointer Function %30
+ %43 = OpConstant %6 9
+ %49 = OpConstant %9 1
+ %50 = OpTypeArray %30 %49
+ %51 = OpTypeStruct %50
+ %52 = OpTypePointer Uniform %51
+ %53 = OpVariable %52 Uniform
+ %54 = OpTypePointer Uniform %30
+ %60 = OpTypeVector %30 4
+ %61 = OpTypePointer Output %60
+ %62 = OpVariable %61 Output
+ %63 = OpConstant %6 2
+ %73 = OpConstant %30 1
+ %76 = OpConstant %30 0
+ %77 = OpConstantComposite %60 %76 %76 %76 %76
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %34 = OpVariable %33 Function
+ %42 = OpVariable %38 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ OpBranch %20
+ %20 = OpLabel
+ OpLoopMerge %22 %23 None
+ OpBranch %24
+ %24 = OpLabel
+ %25 = OpLoad %6 %8
+ %26 = OpAccessChain %17 %14 %15 %15
+ %27 = OpLoad %6 %26
+ %29 = OpSLessThan %28 %25 %27
+ OpBranchConditional %29 %21 %22
+ %21 = OpLabel
+ %35 = OpLoad %6 %8
+ %36 = OpLoad %6 %8
+ %37 = OpConvertSToF %30 %36
+ %39 = OpAccessChain %38 %34 %35
+ OpStore %39 %37
+ OpBranch %23
+ %23 = OpLabel
+ %40 = OpLoad %6 %8
+ %41 = OpIAdd %6 %40 %16
+ OpStore %8 %41
+ OpBranch %20
+ %22 = OpLabel
+ %44 = OpBitFieldInsert %6 %43 %15 %15 %15
+ %45 = OpSDiv %6 %44 %16
+ %46 = OpAccessChain %38 %34 %45
+ %47 = OpLoad %30 %46
+ OpStore %42 %47
+ %48 = OpLoad %30 %42
+ %55 = OpAccessChain %54 %53 %15 %15
+ %56 = OpLoad %30 %55
+ %57 = OpFOrdEqual %28 %48 %56
+ OpSelectionMerge %59 None
+ OpBranchConditional %57 %58 %75
+ %58 = OpLabel
+ %64 = OpAccessChain %17 %14 %15 %63
+ %65 = OpLoad %6 %64
+ %66 = OpConvertSToF %30 %65
+ %67 = OpAccessChain %17 %14 %15 %16
+ %68 = OpLoad %6 %67
+ %69 = OpConvertSToF %30 %68
+ %70 = OpAccessChain %17 %14 %15 %16
+ %71 = OpLoad %6 %70
+ %72 = OpConvertSToF %30 %71
+ %74 = OpCompositeConstruct %60 %66 %69 %72 %73
+ OpStore %62 %74
+ OpBranch %59
+ %75 = OpLabel
+ OpStore %62 %77
+ OpBranch %59
+ %59 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 10 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 9.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-mod-one-one-lte.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-mod-one-one-lte.amber
new file mode 100644
index 0000000..45a3832
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-mod-one-one-lte.amber
@@ -0,0 +1,147 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific const folding path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# if (mod(1.0, 1.0) <= 0.01)
+# {
+# _GLF_color = vec4(1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 42
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %16
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %16 "_GLF_color"
+ OpName %21 "buf0"
+ OpMemberName %21 0 "_GLF_uniform_int_values"
+ OpName %23 ""
+ OpDecorate %16 Location 0
+ OpDecorate %20 ArrayStride 16
+ OpMemberDecorate %21 0 Offset 0
+ OpDecorate %21 Block
+ OpDecorate %23 DescriptorSet 0
+ OpDecorate %23 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpConstant %6 1
+ %9 = OpConstant %6 0.00999999978
+ %10 = OpTypeBool
+ %14 = OpTypeVector %6 4
+ %15 = OpTypePointer Output %14
+ %16 = OpVariable %15 Output
+ %17 = OpTypeInt 32 1
+ %18 = OpTypeInt 32 0
+ %19 = OpConstant %18 2
+ %20 = OpTypeArray %17 %19
+ %21 = OpTypeStruct %20
+ %22 = OpTypePointer Uniform %21
+ %23 = OpVariable %22 Uniform
+ %24 = OpConstant %17 0
+ %25 = OpTypePointer Uniform %17
+ %32 = OpConstant %17 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpFMod %6 %7 %7
+ %11 = OpFOrdLessThanEqual %10 %8 %9
+ OpSelectionMerge %13 None
+ OpBranchConditional %11 %12 %37
+ %12 = OpLabel
+ %26 = OpAccessChain %25 %23 %24 %24
+ %27 = OpLoad %17 %26
+ %28 = OpConvertSToF %6 %27
+ %29 = OpAccessChain %25 %23 %24 %24
+ %30 = OpLoad %17 %29
+ %31 = OpConvertSToF %6 %30
+ %33 = OpAccessChain %25 %23 %24 %32
+ %34 = OpLoad %17 %33
+ %35 = OpConvertSToF %6 %34
+ %36 = OpCompositeConstruct %14 %7 %28 %31 %35
+ OpStore %16 %36
+ OpBranch %13
+ %37 = OpLabel
+ %38 = OpAccessChain %25 %23 %24 %24
+ %39 = OpLoad %17 %38
+ %40 = OpConvertSToF %6 %39
+ %41 = OpCompositeConstruct %14 %40 %40 %40 %40
+ OpStore %16 %41
+ OpBranch %13
+ %13 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-pow-large-exp.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-pow-large-exp.amber
new file mode 100644
index 0000000..8e0a2ba
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-const-folding-pow-large-exp.amber
@@ -0,0 +1,200 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific const folding path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // This results in an undefined value, but not in undefined behavior.
+# float f = pow(40.33, ldexp(1.0, 98980));
+#
+# if (_int_1 == (_int_1 + _int_0) || f > _float_0_0)
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# else
+# _GLF_color = vec4(_int_0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 70
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %51
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "f"
+ OpName %19 "buf0"
+ OpMemberName %19 0 "_GLF_uniform_int_values"
+ OpName %21 ""
+ OpName %39 "buf1"
+ OpMemberName %39 0 "_GLF_uniform_float_values"
+ OpName %41 ""
+ OpName %51 "_GLF_color"
+ OpDecorate %18 ArrayStride 16
+ OpMemberDecorate %19 0 Offset 0
+ OpDecorate %19 Block
+ OpDecorate %21 DescriptorSet 0
+ OpDecorate %21 Binding 0
+ OpDecorate %38 ArrayStride 16
+ OpMemberDecorate %39 0 Offset 0
+ OpDecorate %39 Block
+ OpDecorate %41 DescriptorSet 0
+ OpDecorate %41 Binding 1
+ OpDecorate %51 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 40.3300018
+ %10 = OpConstant %6 1
+ %11 = OpTypeInt 32 1
+ %12 = OpConstant %11 98980
+ %15 = OpTypeBool
+ %16 = OpTypeInt 32 0
+ %17 = OpConstant %16 2
+ %18 = OpTypeArray %11 %17
+ %19 = OpTypeStruct %18
+ %20 = OpTypePointer Uniform %19
+ %21 = OpVariable %20 Uniform
+ %22 = OpConstant %11 0
+ %23 = OpTypePointer Uniform %11
+ %28 = OpConstant %11 1
+ %37 = OpConstant %16 1
+ %38 = OpTypeArray %6 %37
+ %39 = OpTypeStruct %38
+ %40 = OpTypePointer Uniform %39
+ %41 = OpVariable %40 Uniform
+ %42 = OpTypePointer Uniform %6
+ %49 = OpTypeVector %6 4
+ %50 = OpTypePointer Output %49
+ %51 = OpVariable %50 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %13 = OpExtInst %6 %1 Ldexp %10 %12
+ %14 = OpExtInst %6 %1 Pow %9 %13
+ OpStore %8 %14
+ %24 = OpAccessChain %23 %21 %22 %22
+ %25 = OpLoad %11 %24
+ %26 = OpAccessChain %23 %21 %22 %22
+ %27 = OpLoad %11 %26
+ %29 = OpAccessChain %23 %21 %22 %28
+ %30 = OpLoad %11 %29
+ %31 = OpIAdd %11 %27 %30
+ %32 = OpIEqual %15 %25 %31
+ %33 = OpLogicalNot %15 %32
+ OpSelectionMerge %35 None
+ OpBranchConditional %33 %34 %35
+ %34 = OpLabel
+ %36 = OpLoad %6 %8
+ %43 = OpAccessChain %42 %41 %22 %22
+ %44 = OpLoad %6 %43
+ %45 = OpFOrdGreaterThan %15 %36 %44
+ OpBranch %35
+ %35 = OpLabel
+ %46 = OpPhi %15 %32 %5 %45 %34
+ OpSelectionMerge %48 None
+ OpBranchConditional %46 %47 %65
+ %47 = OpLabel
+ %52 = OpAccessChain %23 %21 %22 %22
+ %53 = OpLoad %11 %52
+ %54 = OpConvertSToF %6 %53
+ %55 = OpAccessChain %23 %21 %22 %28
+ %56 = OpLoad %11 %55
+ %57 = OpConvertSToF %6 %56
+ %58 = OpAccessChain %23 %21 %22 %28
+ %59 = OpLoad %11 %58
+ %60 = OpConvertSToF %6 %59
+ %61 = OpAccessChain %23 %21 %22 %22
+ %62 = OpLoad %11 %61
+ %63 = OpConvertSToF %6 %62
+ %64 = OpCompositeConstruct %49 %54 %57 %60 %63
+ OpStore %51 %64
+ OpBranch %48
+ %65 = OpLabel
+ %66 = OpAccessChain %23 %21 %22 %28
+ %67 = OpLoad %11 %66
+ %68 = OpConvertSToF %6 %67
+ %69 = OpCompositeConstruct %49 %68 %68 %68 %68
+ OpStore %51 %69
+ OpBranch %48
+ %48 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-constants-combine-add-sub.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-constants-combine-add-sub.amber
new file mode 100644
index 0000000..86ff666
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-constants-combine-add-sub.amber
@@ -0,0 +1,265 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific constants and add/sub combining path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_7 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _int_5 _GLF_uniform_int_values[3]
+# #define _int_10 _GLF_uniform_int_values[4]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [7, 1, 0, 5, 10]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[5];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# int func(float f)
+# {
+# int a = _int_1;
+# int b = _int_0;
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# if (a > _int_5)
+# {
+# break;
+# }
+#
+# // Simplifies to a = i.
+# a = int(f) -_int_1 / 2 + i;
+#
+# b++;
+# }
+# if (b == _int_7)
+# {
+# return _int_1;
+# }
+# else
+# {
+# return _int_0;
+# }
+# }
+#
+# void main()
+# {
+# if (func(-9.3 + 10.0) == _int_1)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 107
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %88
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "func(f1;"
+ OpName %10 "f"
+ OpName %14 "a"
+ OpName %18 "buf0"
+ OpMemberName %18 0 "_GLF_uniform_int_values"
+ OpName %20 ""
+ OpName %26 "b"
+ OpName %30 "i"
+ OpName %79 "param"
+ OpName %88 "_GLF_color"
+ OpDecorate %17 ArrayStride 16
+ OpMemberDecorate %18 0 Offset 0
+ OpDecorate %18 Block
+ OpDecorate %20 DescriptorSet 0
+ OpDecorate %20 Binding 0
+ OpDecorate %88 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeInt 32 1
+ %9 = OpTypeFunction %8 %7
+ %13 = OpTypePointer Function %8
+ %15 = OpTypeInt 32 0
+ %16 = OpConstant %15 5
+ %17 = OpTypeArray %8 %16
+ %18 = OpTypeStruct %17
+ %19 = OpTypePointer Uniform %18
+ %20 = OpVariable %19 Uniform
+ %21 = OpConstant %8 0
+ %22 = OpConstant %8 1
+ %23 = OpTypePointer Uniform %8
+ %27 = OpConstant %8 2
+ %39 = OpConstant %8 4
+ %42 = OpTypeBool
+ %45 = OpConstant %8 3
+ %78 = OpConstant %6 0.699999988
+ %86 = OpTypeVector %6 4
+ %87 = OpTypePointer Output %86
+ %88 = OpVariable %87 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %79 = OpVariable %7 Function
+ OpStore %79 %78
+ %80 = OpFunctionCall %8 %11 %79
+ %81 = OpAccessChain %23 %20 %21 %22
+ %82 = OpLoad %8 %81
+ %83 = OpIEqual %42 %80 %82
+ OpSelectionMerge %85 None
+ OpBranchConditional %83 %84 %102
+ %84 = OpLabel
+ %89 = OpAccessChain %23 %20 %21 %22
+ %90 = OpLoad %8 %89
+ %91 = OpConvertSToF %6 %90
+ %92 = OpAccessChain %23 %20 %21 %27
+ %93 = OpLoad %8 %92
+ %94 = OpConvertSToF %6 %93
+ %95 = OpAccessChain %23 %20 %21 %27
+ %96 = OpLoad %8 %95
+ %97 = OpConvertSToF %6 %96
+ %98 = OpAccessChain %23 %20 %21 %22
+ %99 = OpLoad %8 %98
+ %100 = OpConvertSToF %6 %99
+ %101 = OpCompositeConstruct %86 %91 %94 %97 %100
+ OpStore %88 %101
+ OpBranch %85
+ %102 = OpLabel
+ %103 = OpAccessChain %23 %20 %21 %27
+ %104 = OpLoad %8 %103
+ %105 = OpConvertSToF %6 %104
+ %106 = OpCompositeConstruct %86 %105 %105 %105 %105
+ OpStore %88 %106
+ OpBranch %85
+ %85 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %11 = OpFunction %8 None %9
+ %10 = OpFunctionParameter %7
+ %12 = OpLabel
+ %14 = OpVariable %13 Function
+ %26 = OpVariable %13 Function
+ %30 = OpVariable %13 Function
+ %24 = OpAccessChain %23 %20 %21 %22
+ %25 = OpLoad %8 %24
+ OpStore %14 %25
+ %28 = OpAccessChain %23 %20 %21 %27
+ %29 = OpLoad %8 %28
+ OpStore %26 %29
+ %31 = OpAccessChain %23 %20 %21 %27
+ %32 = OpLoad %8 %31
+ OpStore %30 %32
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %8 %30
+ %40 = OpAccessChain %23 %20 %21 %39
+ %41 = OpLoad %8 %40
+ %43 = OpSLessThan %42 %38 %41
+ OpBranchConditional %43 %34 %35
+ %34 = OpLabel
+ %44 = OpLoad %8 %14
+ %46 = OpAccessChain %23 %20 %21 %45
+ %47 = OpLoad %8 %46
+ %48 = OpSGreaterThan %42 %44 %47
+ OpSelectionMerge %50 None
+ OpBranchConditional %48 %49 %50
+ %49 = OpLabel
+ OpBranch %35
+ %50 = OpLabel
+ %52 = OpLoad %6 %10
+ %53 = OpConvertFToS %8 %52
+ %54 = OpAccessChain %23 %20 %21 %22
+ %55 = OpLoad %8 %54
+ %56 = OpSDiv %8 %55 %27
+ %57 = OpISub %8 %53 %56
+ %58 = OpLoad %8 %30
+ %59 = OpIAdd %8 %57 %58
+ OpStore %14 %59
+ %60 = OpLoad %8 %26
+ %61 = OpIAdd %8 %60 %22
+ OpStore %26 %61
+ OpBranch %36
+ %36 = OpLabel
+ %62 = OpLoad %8 %30
+ %63 = OpIAdd %8 %62 %22
+ OpStore %30 %63
+ OpBranch %33
+ %35 = OpLabel
+ %64 = OpLoad %8 %26
+ %65 = OpAccessChain %23 %20 %21 %21
+ %66 = OpLoad %8 %65
+ %67 = OpIEqual %42 %64 %66
+ OpSelectionMerge %69 None
+ OpBranchConditional %67 %68 %73
+ %68 = OpLabel
+ %70 = OpAccessChain %23 %20 %21 %22
+ %71 = OpLoad %8 %70
+ OpReturnValue %71
+ %73 = OpLabel
+ %74 = OpAccessChain %23 %20 %21 %27
+ %75 = OpLoad %8 %74
+ OpReturnValue %75
+ %69 = OpLabel
+ OpUnreachable
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 7 1 0 5 10
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array.amber
new file mode 100644
index 0000000..a8da49c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array.amber
@@ -0,0 +1,247 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific DAG combiner code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_2 _GLF_uniform_int_values[2]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_2_0 _GLF_uniform_float_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[2]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0, 2]
+# layout(set = 0, binding = 0) uniform buf0 {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 2.0]
+# layout(set = 0, binding = 1) uniform buf1 {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float A1[3] = float[3](_float_0_0, _float_1_0, _float_2_0);
+#
+# // a becomes undefined. This results in an undefined value, not undefined behavior.
+# int a = clamp(_int_1, _int_1, _int_0);
+#
+# float b = A1[clamp(a, _int_0, _int_1)];
+#
+# // Always true.
+# bool c = b < A1[_int_0] ? (_float_1_0 > _float_0_0) : (_float_1_0 < A1[_int_2]);
+#
+# if (c)
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# else
+# _GLF_color = vec4(_float_1_0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 101
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %83
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "A1"
+ OpName %13 "buf1"
+ OpMemberName %13 0 "_GLF_uniform_float_values"
+ OpName %15 ""
+ OpName %29 "a"
+ OpName %31 "buf0"
+ OpMemberName %31 0 "_GLF_uniform_int_values"
+ OpName %33 ""
+ OpName %43 "b"
+ OpName %54 "c"
+ OpName %83 "_GLF_color"
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 1
+ OpDecorate %30 ArrayStride 16
+ OpMemberDecorate %31 0 Offset 0
+ OpDecorate %31 Block
+ OpDecorate %33 DescriptorSet 0
+ OpDecorate %33 Binding 0
+ OpDecorate %83 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeInt 32 0
+ %8 = OpConstant %7 3
+ %9 = OpTypeArray %6 %8
+ %10 = OpTypePointer Function %9
+ %12 = OpTypeArray %6 %8
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpTypeInt 32 1
+ %17 = OpConstant %16 0
+ %18 = OpConstant %16 2
+ %19 = OpTypePointer Uniform %6
+ %24 = OpConstant %16 1
+ %28 = OpTypePointer Function %16
+ %30 = OpTypeArray %16 %8
+ %31 = OpTypeStruct %30
+ %32 = OpTypePointer Uniform %31
+ %33 = OpVariable %32 Uniform
+ %34 = OpTypePointer Uniform %16
+ %42 = OpTypePointer Function %6
+ %52 = OpTypeBool
+ %53 = OpTypePointer Function %52
+ %81 = OpTypeVector %6 4
+ %82 = OpTypePointer Output %81
+ %83 = OpVariable %82 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %11 = OpVariable %10 Function
+ %29 = OpVariable %28 Function
+ %43 = OpVariable %42 Function
+ %54 = OpVariable %53 Function
+ %61 = OpVariable %53 Function
+ %20 = OpAccessChain %19 %15 %17 %18
+ %21 = OpLoad %6 %20
+ %22 = OpAccessChain %19 %15 %17 %17
+ %23 = OpLoad %6 %22
+ %25 = OpAccessChain %19 %15 %17 %24
+ %26 = OpLoad %6 %25
+ %27 = OpCompositeConstruct %9 %21 %23 %26
+ OpStore %11 %27
+ %35 = OpAccessChain %34 %33 %17 %17
+ %36 = OpLoad %16 %35
+ %37 = OpAccessChain %34 %33 %17 %17
+ %38 = OpLoad %16 %37
+ %39 = OpAccessChain %34 %33 %17 %24
+ %40 = OpLoad %16 %39
+ %41 = OpExtInst %16 %1 SClamp %36 %38 %40
+ OpStore %29 %41
+ %44 = OpLoad %16 %29
+ %45 = OpAccessChain %34 %33 %17 %24
+ %46 = OpLoad %16 %45
+ %47 = OpAccessChain %34 %33 %17 %17
+ %48 = OpLoad %16 %47
+ %49 = OpExtInst %16 %1 SClamp %44 %46 %48
+ %50 = OpAccessChain %42 %11 %49
+ %51 = OpLoad %6 %50
+ OpStore %43 %51
+ %55 = OpLoad %6 %43
+ %56 = OpAccessChain %34 %33 %17 %24
+ %57 = OpLoad %16 %56
+ %58 = OpAccessChain %42 %11 %57
+ %59 = OpLoad %6 %58
+ %60 = OpFOrdLessThan %52 %55 %59
+ OpSelectionMerge %63 None
+ OpBranchConditional %60 %62 %69
+ %62 = OpLabel
+ %64 = OpAccessChain %19 %15 %17 %17
+ %65 = OpLoad %6 %64
+ %66 = OpAccessChain %19 %15 %17 %18
+ %67 = OpLoad %6 %66
+ %68 = OpFOrdGreaterThan %52 %65 %67
+ OpStore %61 %68
+ OpBranch %63
+ %69 = OpLabel
+ %70 = OpAccessChain %19 %15 %17 %17
+ %71 = OpLoad %6 %70
+ %72 = OpAccessChain %34 %33 %17 %18
+ %73 = OpLoad %16 %72
+ %74 = OpAccessChain %42 %11 %73
+ %75 = OpLoad %6 %74
+ %76 = OpFOrdLessThan %52 %71 %75
+ OpStore %61 %76
+ OpBranch %63
+ %63 = OpLabel
+ %77 = OpLoad %52 %61
+ OpStore %54 %77
+ %78 = OpLoad %52 %54
+ OpSelectionMerge %80 None
+ OpBranchConditional %78 %79 %97
+ %79 = OpLabel
+ %84 = OpAccessChain %34 %33 %17 %17
+ %85 = OpLoad %16 %84
+ %86 = OpConvertSToF %6 %85
+ %87 = OpAccessChain %34 %33 %17 %24
+ %88 = OpLoad %16 %87
+ %89 = OpConvertSToF %6 %88
+ %90 = OpAccessChain %34 %33 %17 %24
+ %91 = OpLoad %16 %90
+ %92 = OpConvertSToF %6 %91
+ %93 = OpAccessChain %34 %33 %17 %17
+ %94 = OpLoad %16 %93
+ %95 = OpConvertSToF %6 %94
+ %96 = OpCompositeConstruct %81 %86 %89 %92 %95
+ OpStore %83 %96
+ OpBranch %80
+ %97 = OpLabel
+ %98 = OpAccessChain %19 %15 %17 %17
+ %99 = OpLoad %6 %98
+ %100 = OpCompositeConstruct %81 %99 %99 %99 %99
+ OpStore %83 %100
+ OpBranch %80
+ %80 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 2.0 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0 2
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-glf_color.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-glf_color.amber
new file mode 100644
index 0000000..948a58d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-glf_color.amber
@@ -0,0 +1,277 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers specific dag combiner code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_4 _GLF_uniform_float_values[1]
+# #define _float_2_0 _GLF_uniform_float_values[2]
+# #define _float_3_0 _GLF_uniform_float_values[3]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.4, 2.0, 3.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# float func(float b)
+# {
+# _GLF_color = vec4(_float_1_0, _float_1_0, _float_0_4, 1.0);
+# _GLF_color = _GLF_color;
+# if (_float_1_0 >= b)
+# {
+# return _float_1_0;
+# }
+# return _float_2_0;
+# }
+#
+# void main()
+# {
+# // func returns 1.0.
+# float a = func(_float_1_0);
+#
+# // func returns 2.0.
+# a += func(_float_1_0 + _float_1_0);
+#
+# if (a == _float_3_0 &&
+# _GLF_color == vec4(_float_1_0, _float_1_0, _float_0_4, _float_1_0))
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 110
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %14
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %10 "func(f1;"
+ OpName %9 "b"
+ OpName %14 "_GLF_color"
+ OpName %18 "buf1"
+ OpMemberName %18 0 "_GLF_uniform_float_values"
+ OpName %20 ""
+ OpName %49 "a"
+ OpName %50 "param"
+ OpName %59 "param"
+ OpName %88 "buf0"
+ OpMemberName %88 0 "_GLF_uniform_int_values"
+ OpName %90 ""
+ OpDecorate %14 Location 0
+ OpDecorate %17 ArrayStride 16
+ OpMemberDecorate %18 0 Offset 0
+ OpDecorate %18 Block
+ OpDecorate %20 DescriptorSet 0
+ OpDecorate %20 Binding 1
+ OpDecorate %87 ArrayStride 16
+ OpMemberDecorate %88 0 RelaxedPrecision
+ OpMemberDecorate %88 0 Offset 0
+ OpDecorate %88 Block
+ OpDecorate %90 DescriptorSet 0
+ OpDecorate %90 Binding 0
+ OpDecorate %93 RelaxedPrecision
+ OpDecorate %96 RelaxedPrecision
+ OpDecorate %99 RelaxedPrecision
+ OpDecorate %102 RelaxedPrecision
+ OpDecorate %107 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %6 %7
+ %12 = OpTypeVector %6 4
+ %13 = OpTypePointer Output %12
+ %14 = OpVariable %13 Output
+ %15 = OpTypeInt 32 0
+ %16 = OpConstant %15 4
+ %17 = OpTypeArray %6 %16
+ %18 = OpTypeStruct %17
+ %19 = OpTypePointer Uniform %18
+ %20 = OpVariable %19 Uniform
+ %21 = OpTypeInt 32 1
+ %22 = OpConstant %21 0
+ %23 = OpTypePointer Uniform %6
+ %28 = OpConstant %21 1
+ %31 = OpConstant %6 1
+ %37 = OpTypeBool
+ %44 = OpConstant %21 2
+ %64 = OpConstant %21 3
+ %80 = OpTypeVector %37 4
+ %86 = OpConstant %15 2
+ %87 = OpTypeArray %21 %86
+ %88 = OpTypeStruct %87
+ %89 = OpTypePointer Uniform %88
+ %90 = OpVariable %89 Uniform
+ %91 = OpTypePointer Uniform %21
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %49 = OpVariable %7 Function
+ %50 = OpVariable %7 Function
+ %59 = OpVariable %7 Function
+ %51 = OpAccessChain %23 %20 %22 %22
+ %52 = OpLoad %6 %51
+ OpStore %50 %52
+ %53 = OpFunctionCall %6 %10 %50
+ OpStore %49 %53
+ %54 = OpAccessChain %23 %20 %22 %22
+ %55 = OpLoad %6 %54
+ %56 = OpAccessChain %23 %20 %22 %22
+ %57 = OpLoad %6 %56
+ %58 = OpFAdd %6 %55 %57
+ OpStore %59 %58
+ %60 = OpFunctionCall %6 %10 %59
+ %61 = OpLoad %6 %49
+ %62 = OpFAdd %6 %61 %60
+ OpStore %49 %62
+ %63 = OpLoad %6 %49
+ %65 = OpAccessChain %23 %20 %22 %64
+ %66 = OpLoad %6 %65
+ %67 = OpFOrdEqual %37 %63 %66
+ OpSelectionMerge %69 None
+ OpBranchConditional %67 %68 %69
+ %68 = OpLabel
+ %70 = OpLoad %12 %14
+ %71 = OpAccessChain %23 %20 %22 %22
+ %72 = OpLoad %6 %71
+ %73 = OpAccessChain %23 %20 %22 %22
+ %74 = OpLoad %6 %73
+ %75 = OpAccessChain %23 %20 %22 %28
+ %76 = OpLoad %6 %75
+ %77 = OpAccessChain %23 %20 %22 %22
+ %78 = OpLoad %6 %77
+ %79 = OpCompositeConstruct %12 %72 %74 %76 %78
+ %81 = OpFOrdEqual %80 %70 %79
+ %82 = OpAll %37 %81
+ OpBranch %69
+ %69 = OpLabel
+ %83 = OpPhi %37 %67 %5 %82 %68
+ OpSelectionMerge %85 None
+ OpBranchConditional %83 %84 %105
+ %84 = OpLabel
+ %92 = OpAccessChain %91 %90 %22 %22
+ %93 = OpLoad %21 %92
+ %94 = OpConvertSToF %6 %93
+ %95 = OpAccessChain %91 %90 %22 %28
+ %96 = OpLoad %21 %95
+ %97 = OpConvertSToF %6 %96
+ %98 = OpAccessChain %91 %90 %22 %28
+ %99 = OpLoad %21 %98
+ %100 = OpConvertSToF %6 %99
+ %101 = OpAccessChain %91 %90 %22 %22
+ %102 = OpLoad %21 %101
+ %103 = OpConvertSToF %6 %102
+ %104 = OpCompositeConstruct %12 %94 %97 %100 %103
+ OpStore %14 %104
+ OpBranch %85
+ %105 = OpLabel
+ %106 = OpAccessChain %91 %90 %22 %28
+ %107 = OpLoad %21 %106
+ %108 = OpConvertSToF %6 %107
+ %109 = OpCompositeConstruct %12 %108 %108 %108 %108
+ OpStore %14 %109
+ OpBranch %85
+ %85 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %10 = OpFunction %6 None %8
+ %9 = OpFunctionParameter %7
+ %11 = OpLabel
+ %24 = OpAccessChain %23 %20 %22 %22
+ %25 = OpLoad %6 %24
+ %26 = OpAccessChain %23 %20 %22 %22
+ %27 = OpLoad %6 %26
+ %29 = OpAccessChain %23 %20 %22 %28
+ %30 = OpLoad %6 %29
+ %32 = OpCompositeConstruct %12 %25 %27 %30 %31
+ OpStore %14 %32
+ %33 = OpLoad %12 %14
+ OpStore %14 %33
+ %34 = OpAccessChain %23 %20 %22 %22
+ %35 = OpLoad %6 %34
+ %36 = OpLoad %6 %9
+ %38 = OpFOrdGreaterThanEqual %37 %35 %36
+ OpSelectionMerge %40 None
+ OpBranchConditional %38 %39 %40
+ %39 = OpLabel
+ %41 = OpAccessChain %23 %20 %22 %22
+ %42 = OpLoad %6 %41
+ OpReturnValue %42
+ %40 = OpLabel
+ %45 = OpAccessChain %23 %20 %22 %44
+ %46 = OpLoad %6 %45
+ OpReturnValue %46
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.4 2.0 3.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse.amber
new file mode 100644
index 0000000..92c3bc3
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse.amber
@@ -0,0 +1,192 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific DAG combiner code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_3 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _int_2 _GLF_uniform_int_values[3]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [3, 0, 1, 2]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int a = _int_0;
+# for (int i = -_int_2; bitfieldReverse(++i) <= _int_1;)
+# {
+# a++;
+# }
+# if (a == _int_3)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 68
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %49
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %20 "i"
+ OpName %49 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %49 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 4
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 1
+ %17 = OpTypePointer Uniform %6
+ %21 = OpConstant %6 3
+ %33 = OpConstant %6 2
+ %36 = OpTypeBool
+ %46 = OpTypeFloat 32
+ %47 = OpTypeVector %46 4
+ %48 = OpTypePointer Output %47
+ %49 = OpVariable %48 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %22 = OpAccessChain %17 %14 %15 %21
+ %23 = OpLoad %6 %22
+ %24 = OpSNegate %6 %23
+ OpStore %20 %24
+ OpBranch %25
+ %25 = OpLabel
+ OpLoopMerge %27 %28 None
+ OpBranch %29
+ %29 = OpLabel
+ %30 = OpLoad %6 %20
+ %31 = OpIAdd %6 %30 %16
+ OpStore %20 %31
+ %32 = OpBitReverse %6 %31
+ %34 = OpAccessChain %17 %14 %15 %33
+ %35 = OpLoad %6 %34
+ %37 = OpSLessThanEqual %36 %32 %35
+ OpBranchConditional %37 %26 %27
+ %26 = OpLabel
+ %38 = OpLoad %6 %8
+ %39 = OpIAdd %6 %38 %16
+ OpStore %8 %39
+ OpBranch %28
+ %28 = OpLabel
+ OpBranch %25
+ %27 = OpLabel
+ %40 = OpLoad %6 %8
+ %41 = OpAccessChain %17 %14 %15 %15
+ %42 = OpLoad %6 %41
+ %43 = OpIEqual %36 %40 %42
+ OpSelectionMerge %45 None
+ OpBranchConditional %43 %44 %63
+ %44 = OpLabel
+ %50 = OpAccessChain %17 %14 %15 %33
+ %51 = OpLoad %6 %50
+ %52 = OpConvertSToF %46 %51
+ %53 = OpAccessChain %17 %14 %15 %16
+ %54 = OpLoad %6 %53
+ %55 = OpConvertSToF %46 %54
+ %56 = OpAccessChain %17 %14 %15 %16
+ %57 = OpLoad %6 %56
+ %58 = OpConvertSToF %46 %57
+ %59 = OpAccessChain %17 %14 %15 %33
+ %60 = OpLoad %6 %59
+ %61 = OpConvertSToF %46 %60
+ %62 = OpCompositeConstruct %47 %52 %55 %58 %61
+ OpStore %49 %62
+ OpBranch %45
+ %63 = OpLabel
+ %64 = OpAccessChain %17 %14 %15 %16
+ %65 = OpLoad %6 %64
+ %66 = OpConvertSToF %46 %65
+ %67 = OpCompositeConstruct %47 %66 %66 %66 %66
+ OpStore %49 %67
+ OpBranch %45
+ %45 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 3 0 1 2
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-findlsb-division-by-zero.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-findlsb-division-by-zero.amber
new file mode 100644
index 0000000..b81c680
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-findlsb-division-by-zero.amber
@@ -0,0 +1,248 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction simplify code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_5 _GLF_uniform_int_values[0]
+# #define _int_2 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _int_0 _GLF_uniform_int_values[3]
+# #define _int_9 _GLF_uniform_int_values[4]
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [5, 2, 1, 0, 9]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[5];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct S {
+# int data;
+# };
+#
+# void main()
+# {
+# int value = -_int_1;
+# for (int i = _int_1; i < _int_5; i++)
+# {
+# // idx becomes undefined during the first and third iteration since i
+# // is divided by zero. Nevertheless, it becomes 2 in the last iteration.
+# int idx = clamp(_int_0, (i / findLSB(i)), _int_9);
+#
+# if (idx == _int_2)
+# {
+# value = S[3](S(_int_0), S(_int_1), S(_int_2))[idx].data;
+# }
+# }
+#
+# if (value == _int_2)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 101
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %82
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "value"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %21 "i"
+ OpName %34 "idx"
+ OpName %55 "S"
+ OpMemberName %55 0 "data"
+ OpName %68 "indexable"
+ OpName %82 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %82 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 5
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 2
+ %17 = OpTypePointer Uniform %6
+ %32 = OpTypeBool
+ %35 = OpConstant %6 3
+ %42 = OpConstant %6 4
+ %47 = OpConstant %6 1
+ %55 = OpTypeStruct %6
+ %63 = OpConstant %9 3
+ %64 = OpTypeArray %55 %63
+ %67 = OpTypePointer Function %64
+ %79 = OpTypeFloat 32
+ %80 = OpTypeVector %79 4
+ %81 = OpTypePointer Output %80
+ %82 = OpVariable %81 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %21 = OpVariable %7 Function
+ %34 = OpVariable %7 Function
+ %68 = OpVariable %67 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ %20 = OpSNegate %6 %19
+ OpStore %8 %20
+ %22 = OpAccessChain %17 %14 %15 %16
+ %23 = OpLoad %6 %22
+ OpStore %21 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %21
+ %30 = OpAccessChain %17 %14 %15 %15
+ %31 = OpLoad %6 %30
+ %33 = OpSLessThan %32 %29 %31
+ OpBranchConditional %33 %25 %26
+ %25 = OpLabel
+ %36 = OpAccessChain %17 %14 %15 %35
+ %37 = OpLoad %6 %36
+ %38 = OpLoad %6 %21
+ %39 = OpLoad %6 %21
+ %40 = OpExtInst %6 %1 FindILsb %39
+ %41 = OpSDiv %6 %38 %40
+ %43 = OpAccessChain %17 %14 %15 %42
+ %44 = OpLoad %6 %43
+ %45 = OpExtInst %6 %1 SClamp %37 %41 %44
+ OpStore %34 %45
+ %46 = OpLoad %6 %34
+ %48 = OpAccessChain %17 %14 %15 %47
+ %49 = OpLoad %6 %48
+ %50 = OpIEqual %32 %46 %49
+ OpSelectionMerge %52 None
+ OpBranchConditional %50 %51 %52
+ %51 = OpLabel
+ %53 = OpAccessChain %17 %14 %15 %35
+ %54 = OpLoad %6 %53
+ %56 = OpCompositeConstruct %55 %54
+ %57 = OpAccessChain %17 %14 %15 %16
+ %58 = OpLoad %6 %57
+ %59 = OpCompositeConstruct %55 %58
+ %60 = OpAccessChain %17 %14 %15 %47
+ %61 = OpLoad %6 %60
+ %62 = OpCompositeConstruct %55 %61
+ %65 = OpCompositeConstruct %64 %56 %59 %62
+ %66 = OpLoad %6 %34
+ OpStore %68 %65
+ %69 = OpAccessChain %7 %68 %66 %15
+ %70 = OpLoad %6 %69
+ OpStore %8 %70
+ OpBranch %52
+ %52 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ %71 = OpLoad %6 %21
+ %72 = OpIAdd %6 %71 %47
+ OpStore %21 %72
+ OpBranch %24
+ %26 = OpLabel
+ %73 = OpLoad %6 %8
+ %74 = OpAccessChain %17 %14 %15 %47
+ %75 = OpLoad %6 %74
+ %76 = OpIEqual %32 %73 %75
+ OpSelectionMerge %78 None
+ OpBranchConditional %76 %77 %96
+ %77 = OpLabel
+ %83 = OpAccessChain %17 %14 %15 %16
+ %84 = OpLoad %6 %83
+ %85 = OpConvertSToF %79 %84
+ %86 = OpAccessChain %17 %14 %15 %35
+ %87 = OpLoad %6 %86
+ %88 = OpConvertSToF %79 %87
+ %89 = OpAccessChain %17 %14 %15 %35
+ %90 = OpLoad %6 %89
+ %91 = OpConvertSToF %79 %90
+ %92 = OpAccessChain %17 %14 %15 %16
+ %93 = OpLoad %6 %92
+ %94 = OpConvertSToF %79 %93
+ %95 = OpCompositeConstruct %80 %85 %88 %91 %94
+ OpStore %82 %95
+ OpBranch %78
+ %96 = OpLabel
+ %97 = OpAccessChain %17 %14 %15 %35
+ %98 = OpLoad %6 %97
+ %99 = OpConvertSToF %79 %98
+ %100 = OpCompositeConstruct %80 %99 %99 %99 %99
+ OpStore %82 %100
+ OpBranch %78
+ %78 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 5 2 1 0 9
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-fract-smoothstep-undefined.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-fract-smoothstep-undefined.amber
new file mode 100644
index 0000000..014c9ee
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-fract-smoothstep-undefined.amber
@@ -0,0 +1,191 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific APFloat code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _float_1_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: 1.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# vec2 v1 = vec2(_float_1_0);
+# vec2 b = fract(v1);
+#
+# // The values of the edges are the same, therefore this results in
+# // an undefined value, but not in undefined behavior.
+# float a = smoothstep(vec2(1.0), vec2(1.0), b).x;
+#
+# _GLF_color = vec4(_float_1_0, a, a, _float_1_0);
+#
+# // Always true.
+# if (b.x < 1.0 && b.y < 1.0)
+# {
+# _GLF_color = vec4(_float_1_0, b.x, b.y, _float_1_0);
+# }
+# else
+# {
+# _GLF_color = vec4(_float_1_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 68
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %35
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "v1"
+ OpName %13 "buf0"
+ OpMemberName %13 0 "_GLF_uniform_float_values"
+ OpName %15 ""
+ OpName %22 "b"
+ OpName %26 "a"
+ OpName %35 "_GLF_color"
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 0
+ OpDecorate %35 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeInt 32 0
+ %11 = OpConstant %10 1
+ %12 = OpTypeArray %6 %11
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpTypeInt 32 1
+ %17 = OpConstant %16 0
+ %18 = OpTypePointer Uniform %6
+ %25 = OpTypePointer Function %6
+ %27 = OpConstant %6 1
+ %28 = OpConstantComposite %7 %27 %27
+ %31 = OpConstant %10 0
+ %33 = OpTypeVector %6 4
+ %34 = OpTypePointer Output %33
+ %35 = OpVariable %34 Output
+ %43 = OpTypeBool
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %22 = OpVariable %8 Function
+ %26 = OpVariable %25 Function
+ %19 = OpAccessChain %18 %15 %17 %17
+ %20 = OpLoad %6 %19
+ %21 = OpCompositeConstruct %7 %20 %20
+ OpStore %9 %21
+ %23 = OpLoad %7 %9
+ %24 = OpExtInst %7 %1 Fract %23
+ OpStore %22 %24
+ %29 = OpLoad %7 %22
+ %30 = OpExtInst %7 %1 SmoothStep %28 %28 %29
+ %32 = OpCompositeExtract %6 %30 0
+ OpStore %26 %32
+ %36 = OpAccessChain %18 %15 %17 %17
+ %37 = OpLoad %6 %36
+ %38 = OpLoad %6 %26
+ %39 = OpLoad %6 %26
+ %40 = OpAccessChain %18 %15 %17 %17
+ %41 = OpLoad %6 %40
+ %42 = OpCompositeConstruct %33 %37 %38 %39 %41
+ OpStore %35 %42
+ %44 = OpAccessChain %25 %22 %31
+ %45 = OpLoad %6 %44
+ %46 = OpFOrdLessThan %43 %45 %27
+ OpSelectionMerge %48 None
+ OpBranchConditional %46 %47 %48
+ %47 = OpLabel
+ %49 = OpAccessChain %25 %22 %11
+ %50 = OpLoad %6 %49
+ %51 = OpFOrdLessThan %43 %50 %27
+ OpBranch %48
+ %48 = OpLabel
+ %52 = OpPhi %43 %46 %5 %51 %47
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %64
+ %53 = OpLabel
+ %55 = OpAccessChain %18 %15 %17 %17
+ %56 = OpLoad %6 %55
+ %57 = OpAccessChain %25 %22 %31
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %25 %22 %11
+ %60 = OpLoad %6 %59
+ %61 = OpAccessChain %18 %15 %17 %17
+ %62 = OpLoad %6 %61
+ %63 = OpCompositeConstruct %33 %56 %58 %60 %62
+ OpStore %35 %63
+ OpBranch %54
+ %64 = OpLabel
+ %65 = OpAccessChain %18 %15 %17 %17
+ %66 = OpLoad %6 %65
+ %67 = OpCompositeConstruct %33 %66 %66 %66 %66
+ OpStore %35 %67
+ OpBranch %54
+ %54 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-fragcoord-clamp-array-access.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-fragcoord-clamp-array-access.amber
new file mode 100644
index 0000000..d01cc6c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-fragcoord-clamp-array-access.amber
@@ -0,0 +1,293 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction simplify path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_2 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _int_15 _GLF_uniform_int_values[3]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: 1.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [2, 1, 0, 15]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# vec4 data[2] = vec4[2](vec4(_float_1_0), vec4(_float_1_0));
+#
+# int b = _int_1;
+#
+# // This results in an undefined value, but not in undefined behavior. y becomes
+# // undefined with some of the window coordinate values. Doesn't matter since
+# // b's value is checked at the same time with y.
+# int y = clamp(int(gl_FragCoord.y), _int_1 | int(gl_FragCoord.y), _int_1);
+#
+# for (int i = _int_1; i < _int_2; i++)
+# {
+# if (b > _int_2 && y > _int_1)
+# {
+# break;
+# }
+# b++;
+# }
+#
+# if (b == _int_2)
+# {
+# data[clamp(_int_0, _int_1, _int_15)] =
+# vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# _GLF_color = vec4(data[_int_1]);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 127
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %41 %117
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %12 "data"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "_GLF_uniform_float_values"
+ OpName %17 ""
+ OpName %29 "b"
+ OpName %32 "buf1"
+ OpMemberName %32 0 "_GLF_uniform_int_values"
+ OpName %34 ""
+ OpName %39 "y"
+ OpName %41 "gl_FragCoord"
+ OpName %55 "i"
+ OpName %117 "_GLF_color"
+ OpDecorate %14 ArrayStride 16
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %31 ArrayStride 16
+ OpMemberDecorate %32 0 Offset 0
+ OpDecorate %32 Block
+ OpDecorate %34 DescriptorSet 0
+ OpDecorate %34 Binding 1
+ OpDecorate %41 BuiltIn FragCoord
+ OpDecorate %117 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypeInt 32 0
+ %9 = OpConstant %8 2
+ %10 = OpTypeArray %7 %9
+ %11 = OpTypePointer Function %10
+ %13 = OpConstant %8 1
+ %14 = OpTypeArray %6 %13
+ %15 = OpTypeStruct %14
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpTypeInt 32 1
+ %19 = OpConstant %18 0
+ %20 = OpTypePointer Uniform %6
+ %28 = OpTypePointer Function %18
+ %30 = OpConstant %8 4
+ %31 = OpTypeArray %18 %30
+ %32 = OpTypeStruct %31
+ %33 = OpTypePointer Uniform %32
+ %34 = OpVariable %33 Uniform
+ %35 = OpConstant %18 1
+ %36 = OpTypePointer Uniform %18
+ %40 = OpTypePointer Input %7
+ %41 = OpVariable %40 Input
+ %42 = OpTypePointer Input %6
+ %66 = OpTypeBool
+ %92 = OpConstant %18 2
+ %97 = OpConstant %18 3
+ %114 = OpTypePointer Function %7
+ %116 = OpTypePointer Output %7
+ %117 = OpVariable %116 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %12 = OpVariable %11 Function
+ %29 = OpVariable %28 Function
+ %39 = OpVariable %28 Function
+ %55 = OpVariable %28 Function
+ %21 = OpAccessChain %20 %17 %19 %19
+ %22 = OpLoad %6 %21
+ %23 = OpCompositeConstruct %7 %22 %22 %22 %22
+ %24 = OpAccessChain %20 %17 %19 %19
+ %25 = OpLoad %6 %24
+ %26 = OpCompositeConstruct %7 %25 %25 %25 %25
+ %27 = OpCompositeConstruct %10 %23 %26
+ OpStore %12 %27
+ %37 = OpAccessChain %36 %34 %19 %35
+ %38 = OpLoad %18 %37
+ OpStore %29 %38
+ %43 = OpAccessChain %42 %41 %13
+ %44 = OpLoad %6 %43
+ %45 = OpConvertFToS %18 %44
+ %46 = OpAccessChain %36 %34 %19 %35
+ %47 = OpLoad %18 %46
+ %48 = OpAccessChain %42 %41 %13
+ %49 = OpLoad %6 %48
+ %50 = OpConvertFToS %18 %49
+ %51 = OpBitwiseOr %18 %47 %50
+ %52 = OpAccessChain %36 %34 %19 %35
+ %53 = OpLoad %18 %52
+ %54 = OpExtInst %18 %1 SClamp %45 %51 %53
+ OpStore %39 %54
+ %56 = OpAccessChain %36 %34 %19 %35
+ %57 = OpLoad %18 %56
+ OpStore %55 %57
+ OpBranch %58
+ %58 = OpLabel
+ OpLoopMerge %60 %61 None
+ OpBranch %62
+ %62 = OpLabel
+ %63 = OpLoad %18 %55
+ %64 = OpAccessChain %36 %34 %19 %19
+ %65 = OpLoad %18 %64
+ %67 = OpSLessThan %66 %63 %65
+ OpBranchConditional %67 %59 %60
+ %59 = OpLabel
+ %68 = OpLoad %18 %29
+ %69 = OpAccessChain %36 %34 %19 %19
+ %70 = OpLoad %18 %69
+ %71 = OpSGreaterThan %66 %68 %70
+ OpSelectionMerge %73 None
+ OpBranchConditional %71 %72 %73
+ %72 = OpLabel
+ %74 = OpLoad %18 %39
+ %75 = OpAccessChain %36 %34 %19 %35
+ %76 = OpLoad %18 %75
+ %77 = OpSGreaterThan %66 %74 %76
+ OpBranch %73
+ %73 = OpLabel
+ %78 = OpPhi %66 %71 %59 %77 %72
+ OpSelectionMerge %80 None
+ OpBranchConditional %78 %79 %80
+ %79 = OpLabel
+ OpBranch %60
+ %80 = OpLabel
+ %82 = OpLoad %18 %29
+ %83 = OpIAdd %18 %82 %35
+ OpStore %29 %83
+ OpBranch %61
+ %61 = OpLabel
+ %84 = OpLoad %18 %55
+ %85 = OpIAdd %18 %84 %35
+ OpStore %55 %85
+ OpBranch %58
+ %60 = OpLabel
+ %86 = OpLoad %18 %29
+ %87 = OpAccessChain %36 %34 %19 %19
+ %88 = OpLoad %18 %87
+ %89 = OpIEqual %66 %86 %88
+ OpSelectionMerge %91 None
+ OpBranchConditional %89 %90 %91
+ %90 = OpLabel
+ %93 = OpAccessChain %36 %34 %19 %92
+ %94 = OpLoad %18 %93
+ %95 = OpAccessChain %36 %34 %19 %35
+ %96 = OpLoad %18 %95
+ %98 = OpAccessChain %36 %34 %19 %97
+ %99 = OpLoad %18 %98
+ %100 = OpExtInst %18 %1 SClamp %94 %96 %99
+ %101 = OpAccessChain %36 %34 %19 %35
+ %102 = OpLoad %18 %101
+ %103 = OpConvertSToF %6 %102
+ %104 = OpAccessChain %36 %34 %19 %92
+ %105 = OpLoad %18 %104
+ %106 = OpConvertSToF %6 %105
+ %107 = OpAccessChain %36 %34 %19 %92
+ %108 = OpLoad %18 %107
+ %109 = OpConvertSToF %6 %108
+ %110 = OpAccessChain %36 %34 %19 %35
+ %111 = OpLoad %18 %110
+ %112 = OpConvertSToF %6 %111
+ %113 = OpCompositeConstruct %7 %103 %106 %109 %112
+ %115 = OpAccessChain %114 %12 %100
+ OpStore %115 %113
+ OpBranch %91
+ %91 = OpLabel
+ %118 = OpAccessChain %36 %34 %19 %35
+ %119 = OpLoad %18 %118
+ %120 = OpAccessChain %114 %12 %119
+ %121 = OpLoad %7 %120
+ %122 = OpCompositeExtract %6 %121 0
+ %123 = OpCompositeExtract %6 %121 1
+ %124 = OpCompositeExtract %6 %121 2
+ %125 = OpCompositeExtract %6 %121 3
+ %126 = OpCompositeConstruct %7 %122 %123 %124 %125
+ OpStore %117 %126
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 2 1 0 15
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inc-array-element-loop-lsb.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inc-array-element-loop-lsb.amber
new file mode 100644
index 0000000..f24bd32
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inc-array-element-loop-lsb.amber
@@ -0,0 +1,286 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific SSCP path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_50 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _int_49 _GLF_uniform_int_values[3]
+# #define _float_2_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [2.0, 1.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [50, 0, 1, 49]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float A[50];
+# int i = _int_0;
+#
+# // Initializes all A elements to 1.0 and leaves i at 49.
+# for( i = _int_0; i < _int_50; i ++)
+# A[i] = _float_1_0;
+#
+# // a becomes 0.
+# int a = findLSB(0);
+#
+# // Loops once.
+# do
+# {
+# i ++;
+# A[clamp(a, _int_0, _int_49)] += _float_1_0;
+# }
+# while(a < _int_1 && i < _int_50);
+#
+# // Always true.
+# if(A[_int_0] == _float_2_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# return;
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 114
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %94
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "i"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %36 "A"
+ OpName %40 "buf0"
+ OpMemberName %40 0 "_GLF_uniform_float_values"
+ OpName %42 ""
+ OpName %50 "a"
+ OpName %94 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %39 ArrayStride 16
+ OpMemberDecorate %40 0 Offset 0
+ OpDecorate %40 Block
+ OpDecorate %42 DescriptorSet 0
+ OpDecorate %42 Binding 0
+ OpDecorate %51 RelaxedPrecision
+ OpDecorate %94 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 4
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 1
+ %17 = OpTypePointer Uniform %6
+ %30 = OpTypeBool
+ %32 = OpTypeFloat 32
+ %33 = OpConstant %9 50
+ %34 = OpTypeArray %32 %33
+ %35 = OpTypePointer Function %34
+ %38 = OpConstant %9 2
+ %39 = OpTypeArray %32 %38
+ %40 = OpTypeStruct %39
+ %41 = OpTypePointer Uniform %40
+ %42 = OpVariable %41 Uniform
+ %43 = OpTypePointer Uniform %32
+ %46 = OpTypePointer Function %32
+ %61 = OpConstant %6 3
+ %72 = OpConstant %6 2
+ %92 = OpTypeVector %32 4
+ %93 = OpTypePointer Output %92
+ %94 = OpVariable %93 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %36 = OpVariable %35 Function
+ %50 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %20 = OpAccessChain %17 %14 %15 %16
+ %21 = OpLoad %6 %20
+ OpStore %8 %21
+ OpBranch %22
+ %22 = OpLabel
+ OpLoopMerge %24 %25 None
+ OpBranch %26
+ %26 = OpLabel
+ %27 = OpLoad %6 %8
+ %28 = OpAccessChain %17 %14 %15 %15
+ %29 = OpLoad %6 %28
+ %31 = OpSLessThan %30 %27 %29
+ OpBranchConditional %31 %23 %24
+ %23 = OpLabel
+ %37 = OpLoad %6 %8
+ %44 = OpAccessChain %43 %42 %15 %16
+ %45 = OpLoad %32 %44
+ %47 = OpAccessChain %46 %36 %37
+ OpStore %47 %45
+ OpBranch %25
+ %25 = OpLabel
+ %48 = OpLoad %6 %8
+ %49 = OpIAdd %6 %48 %16
+ OpStore %8 %49
+ OpBranch %22
+ %24 = OpLabel
+ %51 = OpExtInst %6 %1 FindILsb %15
+ OpStore %50 %51
+ OpBranch %52
+ %52 = OpLabel
+ OpLoopMerge %54 %55 None
+ OpBranch %53
+ %53 = OpLabel
+ %56 = OpLoad %6 %8
+ %57 = OpIAdd %6 %56 %16
+ OpStore %8 %57
+ %58 = OpLoad %6 %50
+ %59 = OpAccessChain %17 %14 %15 %16
+ %60 = OpLoad %6 %59
+ %62 = OpAccessChain %17 %14 %15 %61
+ %63 = OpLoad %6 %62
+ %64 = OpExtInst %6 %1 SClamp %58 %60 %63
+ %65 = OpAccessChain %43 %42 %15 %16
+ %66 = OpLoad %32 %65
+ %67 = OpAccessChain %46 %36 %64
+ %68 = OpLoad %32 %67
+ %69 = OpFAdd %32 %68 %66
+ %70 = OpAccessChain %46 %36 %64
+ OpStore %70 %69
+ OpBranch %55
+ %55 = OpLabel
+ %71 = OpLoad %6 %50
+ %73 = OpAccessChain %17 %14 %15 %72
+ %74 = OpLoad %6 %73
+ %75 = OpSLessThan %30 %71 %74
+ OpSelectionMerge %77 None
+ OpBranchConditional %75 %76 %77
+ %76 = OpLabel
+ %78 = OpLoad %6 %8
+ %79 = OpAccessChain %17 %14 %15 %15
+ %80 = OpLoad %6 %79
+ %81 = OpSLessThan %30 %78 %80
+ OpBranch %77
+ %77 = OpLabel
+ %82 = OpPhi %30 %75 %55 %81 %76
+ OpBranchConditional %82 %52 %54
+ %54 = OpLabel
+ %83 = OpAccessChain %17 %14 %15 %16
+ %84 = OpLoad %6 %83
+ %85 = OpAccessChain %46 %36 %84
+ %86 = OpLoad %32 %85
+ %87 = OpAccessChain %43 %42 %15 %15
+ %88 = OpLoad %32 %87
+ %89 = OpFOrdEqual %30 %86 %88
+ OpSelectionMerge %91 None
+ OpBranchConditional %89 %90 %108
+ %90 = OpLabel
+ %95 = OpAccessChain %17 %14 %15 %72
+ %96 = OpLoad %6 %95
+ %97 = OpConvertSToF %32 %96
+ %98 = OpAccessChain %17 %14 %15 %16
+ %99 = OpLoad %6 %98
+ %100 = OpConvertSToF %32 %99
+ %101 = OpAccessChain %17 %14 %15 %16
+ %102 = OpLoad %6 %101
+ %103 = OpConvertSToF %32 %102
+ %104 = OpAccessChain %17 %14 %15 %72
+ %105 = OpLoad %6 %104
+ %106 = OpConvertSToF %32 %105
+ %107 = OpCompositeConstruct %92 %97 %100 %103 %106
+ OpStore %94 %107
+ OpBranch %91
+ %108 = OpLabel
+ %109 = OpAccessChain %17 %14 %15 %16
+ %110 = OpLoad %6 %109
+ %111 = OpConvertSToF %32 %110
+ %112 = OpCompositeConstruct %92 %111 %111 %111 %111
+ OpStore %94 %112
+ OpReturn
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 50 0 1 49
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 2.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-determinant.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-determinant.amber
new file mode 100644
index 0000000..1933978
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-determinant.amber
@@ -0,0 +1,230 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine add sub code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_4_0 _GLF_uniform_float_values[1]
+# #define _float_3_0 _GLF_uniform_float_values[2]
+# #define _float_2_0 _GLF_uniform_float_values[3]
+# #define _float_0_0 _GLF_uniform_float_values[4]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 4.0, 3.0, 2.0, 0.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[5];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // mix() selects 2.0.
+# float a = mix(-_float_1_0, 2.0, _float_0_0 < _float_1_0);
+# mat2 m = mat2(1.0, a, 3.0, 4.0);
+# float ref = _float_1_0 * _float_4_0 - (_float_2_0)*_float_3_0;
+#
+# if (determinant(m) == ref)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 90
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %65
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %33 "m"
+ OpName %42 "ref"
+ OpName %65 "_GLF_color"
+ OpName %68 "buf1"
+ OpMemberName %68 0 "_GLF_uniform_int_values"
+ OpName %70 ""
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %65 Location 0
+ OpDecorate %67 ArrayStride 16
+ OpMemberDecorate %68 0 Offset 0
+ OpDecorate %68 Block
+ OpDecorate %70 DescriptorSet 0
+ OpDecorate %70 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 5
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %6
+ %21 = OpConstant %6 2
+ %22 = OpConstant %15 4
+ %27 = OpTypeBool
+ %30 = OpTypeVector %6 2
+ %31 = OpTypeMatrix %30 2
+ %32 = OpTypePointer Function %31
+ %34 = OpConstant %6 1
+ %36 = OpConstant %6 3
+ %37 = OpConstant %6 4
+ %38 = OpConstant %6 0
+ %45 = OpConstant %15 1
+ %49 = OpConstant %15 3
+ %52 = OpConstant %15 2
+ %63 = OpTypeVector %6 4
+ %64 = OpTypePointer Output %63
+ %65 = OpVariable %64 Output
+ %66 = OpConstant %9 2
+ %67 = OpTypeArray %15 %66
+ %68 = OpTypeStruct %67
+ %69 = OpTypePointer Uniform %68
+ %70 = OpVariable %69 Uniform
+ %71 = OpTypePointer Uniform %15
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %33 = OpVariable %32 Function
+ %42 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %16 %16
+ %19 = OpLoad %6 %18
+ %20 = OpFNegate %6 %19
+ %23 = OpAccessChain %17 %14 %16 %22
+ %24 = OpLoad %6 %23
+ %25 = OpAccessChain %17 %14 %16 %16
+ %26 = OpLoad %6 %25
+ %28 = OpFOrdLessThan %27 %24 %26
+ %29 = OpSelect %6 %28 %21 %20
+ OpStore %8 %29
+ %35 = OpLoad %6 %8
+ %39 = OpCompositeConstruct %30 %34 %35
+ %40 = OpCompositeConstruct %30 %36 %37
+ %41 = OpCompositeConstruct %31 %39 %40
+ OpStore %33 %41
+ %43 = OpAccessChain %17 %14 %16 %16
+ %44 = OpLoad %6 %43
+ %46 = OpAccessChain %17 %14 %16 %45
+ %47 = OpLoad %6 %46
+ %48 = OpFMul %6 %44 %47
+ %50 = OpAccessChain %17 %14 %16 %49
+ %51 = OpLoad %6 %50
+ %53 = OpAccessChain %17 %14 %16 %52
+ %54 = OpLoad %6 %53
+ %55 = OpFMul %6 %51 %54
+ %56 = OpFSub %6 %48 %55
+ OpStore %42 %56
+ %57 = OpLoad %31 %33
+ %58 = OpExtInst %6 %1 Determinant %57
+ %59 = OpLoad %6 %42
+ %60 = OpFOrdEqual %27 %58 %59
+ OpSelectionMerge %62 None
+ OpBranchConditional %60 %61 %85
+ %61 = OpLabel
+ %72 = OpAccessChain %71 %70 %16 %16
+ %73 = OpLoad %15 %72
+ %74 = OpConvertSToF %6 %73
+ %75 = OpAccessChain %71 %70 %16 %45
+ %76 = OpLoad %15 %75
+ %77 = OpConvertSToF %6 %76
+ %78 = OpAccessChain %71 %70 %16 %45
+ %79 = OpLoad %15 %78
+ %80 = OpConvertSToF %6 %79
+ %81 = OpAccessChain %71 %70 %16 %16
+ %82 = OpLoad %15 %81
+ %83 = OpConvertSToF %6 %82
+ %84 = OpCompositeConstruct %63 %74 %77 %80 %83
+ OpStore %65 %84
+ OpBranch %62
+ %85 = OpLabel
+ %86 = OpAccessChain %71 %70 %16 %45
+ %87 = OpLoad %15 %86
+ %88 = OpConvertSToF %6 %87
+ %89 = OpCompositeConstruct %63 %88 %88 %88 %88
+ OpStore %65 %89
+ OpBranch %62
+ %62 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 4.0 3.0 2.0 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-increase-negative.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-increase-negative.amber
new file mode 100644
index 0000000..f768d47
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-increase-negative.amber
@@ -0,0 +1,264 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine add sub code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_2 _GLF_uniform_int_values[2]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [0, 1, 2]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int arr[2];
+# for (int i = _int_0; i < _int_2; i++)
+# {
+# arr[i] = _int_0;
+# }
+#
+# int a = -1;
+#
+# // Always true.
+# if (!(gl_FragCoord.y < _float_0_0))
+# {
+# arr[++a] = _int_1;
+# }
+#
+# arr[++a] = _int_2;
+#
+# // Checks arr[0] == 1. Always true.
+# if (arr[_int_0] == _int_1)
+# {
+# _GLF_color = vec4(a, _int_0, _int_0, a);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 99
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %46 %82
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "i"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %33 "arr"
+ OpName %41 "a"
+ OpName %46 "gl_FragCoord"
+ OpName %52 "buf0"
+ OpMemberName %52 0 "_GLF_uniform_float_values"
+ OpName %54 ""
+ OpName %82 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %46 BuiltIn FragCoord
+ OpDecorate %51 ArrayStride 16
+ OpMemberDecorate %52 0 Offset 0
+ OpDecorate %52 Block
+ OpDecorate %54 DescriptorSet 0
+ OpDecorate %54 Binding 0
+ OpDecorate %82 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpTypePointer Uniform %6
+ %25 = OpConstant %6 2
+ %28 = OpTypeBool
+ %30 = OpConstant %9 2
+ %31 = OpTypeArray %6 %30
+ %32 = OpTypePointer Function %31
+ %39 = OpConstant %6 1
+ %42 = OpConstant %6 -1
+ %43 = OpTypeFloat 32
+ %44 = OpTypeVector %43 4
+ %45 = OpTypePointer Input %44
+ %46 = OpVariable %45 Input
+ %47 = OpConstant %9 1
+ %48 = OpTypePointer Input %43
+ %51 = OpTypeArray %43 %47
+ %52 = OpTypeStruct %51
+ %53 = OpTypePointer Uniform %52
+ %54 = OpVariable %53 Uniform
+ %55 = OpTypePointer Uniform %43
+ %81 = OpTypePointer Output %44
+ %82 = OpVariable %81 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %33 = OpVariable %32 Function
+ %41 = OpVariable %7 Function
+ %17 = OpAccessChain %16 %14 %15 %15
+ %18 = OpLoad %6 %17
+ OpStore %8 %18
+ OpBranch %19
+ %19 = OpLabel
+ OpLoopMerge %21 %22 None
+ OpBranch %23
+ %23 = OpLabel
+ %24 = OpLoad %6 %8
+ %26 = OpAccessChain %16 %14 %15 %25
+ %27 = OpLoad %6 %26
+ %29 = OpSLessThan %28 %24 %27
+ OpBranchConditional %29 %20 %21
+ %20 = OpLabel
+ %34 = OpLoad %6 %8
+ %35 = OpAccessChain %16 %14 %15 %15
+ %36 = OpLoad %6 %35
+ %37 = OpAccessChain %7 %33 %34
+ OpStore %37 %36
+ OpBranch %22
+ %22 = OpLabel
+ %38 = OpLoad %6 %8
+ %40 = OpIAdd %6 %38 %39
+ OpStore %8 %40
+ OpBranch %19
+ %21 = OpLabel
+ OpStore %41 %42
+ %49 = OpAccessChain %48 %46 %47
+ %50 = OpLoad %43 %49
+ %56 = OpAccessChain %55 %54 %15 %15
+ %57 = OpLoad %43 %56
+ %58 = OpFOrdLessThan %28 %50 %57
+ %59 = OpLogicalNot %28 %58
+ OpSelectionMerge %61 None
+ OpBranchConditional %59 %60 %61
+ %60 = OpLabel
+ %62 = OpLoad %6 %41
+ %63 = OpIAdd %6 %62 %39
+ OpStore %41 %63
+ %64 = OpAccessChain %16 %14 %15 %39
+ %65 = OpLoad %6 %64
+ %66 = OpAccessChain %7 %33 %63
+ OpStore %66 %65
+ OpBranch %61
+ %61 = OpLabel
+ %67 = OpLoad %6 %41
+ %68 = OpIAdd %6 %67 %39
+ OpStore %41 %68
+ %69 = OpAccessChain %16 %14 %15 %25
+ %70 = OpLoad %6 %69
+ %71 = OpAccessChain %7 %33 %68
+ OpStore %71 %70
+ %72 = OpAccessChain %16 %14 %15 %15
+ %73 = OpLoad %6 %72
+ %74 = OpAccessChain %7 %33 %73
+ %75 = OpLoad %6 %74
+ %76 = OpAccessChain %16 %14 %15 %39
+ %77 = OpLoad %6 %76
+ %78 = OpIEqual %28 %75 %77
+ OpSelectionMerge %80 None
+ OpBranchConditional %78 %79 %94
+ %79 = OpLabel
+ %83 = OpLoad %6 %41
+ %84 = OpConvertSToF %43 %83
+ %85 = OpAccessChain %16 %14 %15 %15
+ %86 = OpLoad %6 %85
+ %87 = OpConvertSToF %43 %86
+ %88 = OpAccessChain %16 %14 %15 %15
+ %89 = OpLoad %6 %88
+ %90 = OpConvertSToF %43 %89
+ %91 = OpLoad %6 %41
+ %92 = OpConvertSToF %43 %91
+ %93 = OpCompositeConstruct %44 %84 %87 %90 %92
+ OpStore %82 %93
+ OpBranch %80
+ %94 = OpLabel
+ %95 = OpAccessChain %16 %14 %15 %15
+ %96 = OpLoad %6 %95
+ %97 = OpConvertSToF %43 %96
+ %98 = OpCompositeConstruct %44 %97 %97 %97 %97
+ OpStore %82 %98
+ OpBranch %80
+ %80 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1 2
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg.amber
new file mode 100644
index 0000000..fbe2f0c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg.amber
@@ -0,0 +1,266 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific add/sub combining path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_9 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _int_5 _GLF_uniform_int_values[3]
+# #define _int_10 _GLF_uniform_int_values[4]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [9, 1, 0, 5, 10]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[5];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# int func(float f)
+# {
+# int a = _int_1;
+# int b = _int_0;
+#
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# if (a > _int_5)
+# {
+# break;
+# }
+#
+# // Simplifies to a = i - 2.
+# a = int(f) - 1 - _int_1 + i;
+#
+# b++;
+# }
+#
+# if (b == _int_9)
+# {
+# return _int_1;
+# }
+# else
+# {
+# return _int_0;
+# }
+# }
+# void main()
+# {
+# if (func(-9.3 + 10.0) == _int_1)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 107
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %88
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "func(f1;"
+ OpName %10 "f"
+ OpName %14 "a"
+ OpName %18 "buf0"
+ OpMemberName %18 0 "_GLF_uniform_int_values"
+ OpName %20 ""
+ OpName %26 "b"
+ OpName %30 "i"
+ OpName %79 "param"
+ OpName %88 "_GLF_color"
+ OpDecorate %17 ArrayStride 16
+ OpMemberDecorate %18 0 Offset 0
+ OpDecorate %18 Block
+ OpDecorate %20 DescriptorSet 0
+ OpDecorate %20 Binding 0
+ OpDecorate %88 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeInt 32 1
+ %9 = OpTypeFunction %8 %7
+ %13 = OpTypePointer Function %8
+ %15 = OpTypeInt 32 0
+ %16 = OpConstant %15 5
+ %17 = OpTypeArray %8 %16
+ %18 = OpTypeStruct %17
+ %19 = OpTypePointer Uniform %18
+ %20 = OpVariable %19 Uniform
+ %21 = OpConstant %8 0
+ %22 = OpConstant %8 1
+ %23 = OpTypePointer Uniform %8
+ %27 = OpConstant %8 2
+ %39 = OpConstant %8 4
+ %42 = OpTypeBool
+ %45 = OpConstant %8 3
+ %78 = OpConstant %6 0.699999988
+ %86 = OpTypeVector %6 4
+ %87 = OpTypePointer Output %86
+ %88 = OpVariable %87 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %79 = OpVariable %7 Function
+ OpStore %79 %78
+ %80 = OpFunctionCall %8 %11 %79
+ %81 = OpAccessChain %23 %20 %21 %22
+ %82 = OpLoad %8 %81
+ %83 = OpIEqual %42 %80 %82
+ OpSelectionMerge %85 None
+ OpBranchConditional %83 %84 %102
+ %84 = OpLabel
+ %89 = OpAccessChain %23 %20 %21 %22
+ %90 = OpLoad %8 %89
+ %91 = OpConvertSToF %6 %90
+ %92 = OpAccessChain %23 %20 %21 %27
+ %93 = OpLoad %8 %92
+ %94 = OpConvertSToF %6 %93
+ %95 = OpAccessChain %23 %20 %21 %27
+ %96 = OpLoad %8 %95
+ %97 = OpConvertSToF %6 %96
+ %98 = OpAccessChain %23 %20 %21 %22
+ %99 = OpLoad %8 %98
+ %100 = OpConvertSToF %6 %99
+ %101 = OpCompositeConstruct %86 %91 %94 %97 %100
+ OpStore %88 %101
+ OpBranch %85
+ %102 = OpLabel
+ %103 = OpAccessChain %23 %20 %21 %27
+ %104 = OpLoad %8 %103
+ %105 = OpConvertSToF %6 %104
+ %106 = OpCompositeConstruct %86 %105 %105 %105 %105
+ OpStore %88 %106
+ OpBranch %85
+ %85 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %11 = OpFunction %8 None %9
+ %10 = OpFunctionParameter %7
+ %12 = OpLabel
+ %14 = OpVariable %13 Function
+ %26 = OpVariable %13 Function
+ %30 = OpVariable %13 Function
+ %24 = OpAccessChain %23 %20 %21 %22
+ %25 = OpLoad %8 %24
+ OpStore %14 %25
+ %28 = OpAccessChain %23 %20 %21 %27
+ %29 = OpLoad %8 %28
+ OpStore %26 %29
+ %31 = OpAccessChain %23 %20 %21 %27
+ %32 = OpLoad %8 %31
+ OpStore %30 %32
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %8 %30
+ %40 = OpAccessChain %23 %20 %21 %39
+ %41 = OpLoad %8 %40
+ %43 = OpSLessThan %42 %38 %41
+ OpBranchConditional %43 %34 %35
+ %34 = OpLabel
+ %44 = OpLoad %8 %14
+ %46 = OpAccessChain %23 %20 %21 %45
+ %47 = OpLoad %8 %46
+ %48 = OpSGreaterThan %42 %44 %47
+ OpSelectionMerge %50 None
+ OpBranchConditional %48 %49 %50
+ %49 = OpLabel
+ OpBranch %35
+ %50 = OpLabel
+ %52 = OpLoad %6 %10
+ %53 = OpConvertFToS %8 %52
+ %54 = OpISub %8 %53 %22
+ %55 = OpAccessChain %23 %20 %21 %22
+ %56 = OpLoad %8 %55
+ %57 = OpISub %8 %54 %56
+ %58 = OpLoad %8 %30
+ %59 = OpIAdd %8 %57 %58
+ OpStore %14 %59
+ %60 = OpLoad %8 %26
+ %61 = OpIAdd %8 %60 %22
+ OpStore %26 %61
+ OpBranch %36
+ %36 = OpLabel
+ %62 = OpLoad %8 %30
+ %63 = OpIAdd %8 %62 %22
+ OpStore %30 %63
+ OpBranch %33
+ %35 = OpLabel
+ %64 = OpLoad %8 %26
+ %65 = OpAccessChain %23 %20 %21 %21
+ %66 = OpLoad %8 %65
+ %67 = OpIEqual %42 %64 %66
+ OpSelectionMerge %69 None
+ OpBranchConditional %67 %68 %73
+ %68 = OpLabel
+ %70 = OpAccessChain %23 %20 %21 %22
+ %71 = OpLoad %8 %70
+ OpReturnValue %71
+ %73 = OpLabel
+ %74 = OpAccessChain %23 %20 %21 %27
+ %75 = OpLoad %8 %74
+ OpReturnValue %75
+ %69 = OpLabel
+ OpUnreachable
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 9 1 0 5 10
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-for-bitfieldinsert.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-for-bitfieldinsert.amber
new file mode 100644
index 0000000..eb436f4
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-for-bitfieldinsert.amber
@@ -0,0 +1,138 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine and or xor code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int a = 1;
+#
+# for (int i = 0; i < 2; i++)
+# {
+# a = bitfieldInsert(1, 1, 1, i);
+# }
+#
+# if (a == 3) {
+# _GLF_color = vec4(1, 0, 0, 1);
+# } else {
+# _GLF_color = vec4(0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 39
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %33
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %10 "i"
+ OpName %33 "_GLF_color"
+ OpDecorate %33 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 1
+ %11 = OpConstant %6 0
+ %18 = OpConstant %6 2
+ %19 = OpTypeBool
+ %26 = OpConstant %6 3
+ %30 = OpTypeFloat 32
+ %31 = OpTypeVector %30 4
+ %32 = OpTypePointer Output %31
+ %33 = OpVariable %32 Output
+ %34 = OpConstant %30 1
+ %35 = OpConstant %30 0
+ %36 = OpConstantComposite %31 %34 %35 %35 %34
+ %38 = OpConstantComposite %31 %35 %35 %35 %35
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %10 = OpVariable %7 Function
+ OpStore %8 %9
+ OpStore %10 %11
+ OpBranch %12
+ %12 = OpLabel
+ OpLoopMerge %14 %15 None
+ OpBranch %16
+ %16 = OpLabel
+ %17 = OpLoad %6 %10
+ %20 = OpSLessThan %19 %17 %18
+ OpBranchConditional %20 %13 %14
+ %13 = OpLabel
+ %21 = OpLoad %6 %10
+ %22 = OpBitFieldInsert %6 %9 %9 %9 %21
+ OpStore %8 %22
+ OpBranch %15
+ %15 = OpLabel
+ %23 = OpLoad %6 %10
+ %24 = OpIAdd %6 %23 %9
+ OpStore %10 %24
+ OpBranch %12
+ %14 = OpLabel
+ %25 = OpLoad %6 %8
+ %27 = OpIEqual %19 %25 %26
+ OpSelectionMerge %29 None
+ OpBranchConditional %27 %28 %37
+ %28 = OpLabel
+ OpStore %33 %36
+ OpBranch %29
+ %37 = OpLabel
+ OpStore %33 %38
+ OpBranch %29
+ %29 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack.amber
new file mode 100644
index 0000000..125e1b1
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack.amber
@@ -0,0 +1,288 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine and or xor code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_3 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_2 _GLF_uniform_int_values[2]
+# #define _int_1 _GLF_uniform_int_values[3]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_127_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 127.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [3, 0, 2, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // Packs the components into an unsigned integer of 4294967295u.
+# uint a = packUnorm4x8(vec4(_float_1_0));
+#
+# // Unpacks the packed integer into signed integers and converts them into
+# // normalized floating-point values.
+# vec4 v1 = unpackSnorm4x8(a);
+#
+# // Reference values. The unpacked values were also divided by 127.0, thus they
+# // can be compared to the reference value regardless of loss of precision.
+# vec4 ref = vec4(-_float_1_0 / _float_127_0, -_float_1_0 / _float_127_0,
+# -_float_1_0 / _float_127_0, -_float_1_0 / _float_127_0);
+#
+# if (v1[_int_0] == ref[_int_3] && v1[_int_1] == ref[_int_2] &&
+# v1[_int_2] == ref[_int_1] && v1[_int_3] == ref[_int_0])
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(v1[_int_0]);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 132
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %112
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %24 "v1"
+ OpName %27 "ref"
+ OpName %57 "buf1"
+ OpMemberName %57 0 "_GLF_uniform_int_values"
+ OpName %59 ""
+ OpName %112 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %56 ArrayStride 16
+ OpMemberDecorate %57 0 Offset 0
+ OpDecorate %57 Block
+ OpDecorate %59 DescriptorSet 0
+ OpDecorate %59 Binding 1
+ OpDecorate %112 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 0
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeFloat 32
+ %10 = OpConstant %6 2
+ %11 = OpTypeArray %9 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %9
+ %20 = OpTypeVector %9 4
+ %23 = OpTypePointer Function %20
+ %31 = OpConstant %15 1
+ %54 = OpTypeBool
+ %55 = OpConstant %6 4
+ %56 = OpTypeArray %15 %55
+ %57 = OpTypeStruct %56
+ %58 = OpTypePointer Uniform %57
+ %59 = OpVariable %58 Uniform
+ %60 = OpTypePointer Uniform %15
+ %63 = OpTypePointer Function %9
+ %73 = OpConstant %15 3
+ %78 = OpConstant %15 2
+ %111 = OpTypePointer Output %20
+ %112 = OpVariable %111 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %24 = OpVariable %23 Function
+ %27 = OpVariable %23 Function
+ %18 = OpAccessChain %17 %14 %16 %16
+ %19 = OpLoad %9 %18
+ %21 = OpCompositeConstruct %20 %19 %19 %19 %19
+ %22 = OpExtInst %6 %1 PackUnorm4x8 %21
+ OpStore %8 %22
+ %25 = OpLoad %6 %8
+ %26 = OpExtInst %20 %1 UnpackSnorm4x8 %25
+ OpStore %24 %26
+ %28 = OpAccessChain %17 %14 %16 %16
+ %29 = OpLoad %9 %28
+ %30 = OpFNegate %9 %29
+ %32 = OpAccessChain %17 %14 %16 %31
+ %33 = OpLoad %9 %32
+ %34 = OpFDiv %9 %30 %33
+ %35 = OpAccessChain %17 %14 %16 %16
+ %36 = OpLoad %9 %35
+ %37 = OpFNegate %9 %36
+ %38 = OpAccessChain %17 %14 %16 %31
+ %39 = OpLoad %9 %38
+ %40 = OpFDiv %9 %37 %39
+ %41 = OpAccessChain %17 %14 %16 %16
+ %42 = OpLoad %9 %41
+ %43 = OpFNegate %9 %42
+ %44 = OpAccessChain %17 %14 %16 %31
+ %45 = OpLoad %9 %44
+ %46 = OpFDiv %9 %43 %45
+ %47 = OpAccessChain %17 %14 %16 %16
+ %48 = OpLoad %9 %47
+ %49 = OpFNegate %9 %48
+ %50 = OpAccessChain %17 %14 %16 %31
+ %51 = OpLoad %9 %50
+ %52 = OpFDiv %9 %49 %51
+ %53 = OpCompositeConstruct %20 %34 %40 %46 %52
+ OpStore %27 %53
+ %61 = OpAccessChain %60 %59 %16 %31
+ %62 = OpLoad %15 %61
+ %64 = OpAccessChain %63 %24 %62
+ %65 = OpLoad %9 %64
+ %66 = OpAccessChain %60 %59 %16 %16
+ %67 = OpLoad %15 %66
+ %68 = OpAccessChain %63 %27 %67
+ %69 = OpLoad %9 %68
+ %70 = OpFOrdEqual %54 %65 %69
+ OpSelectionMerge %72 None
+ OpBranchConditional %70 %71 %72
+ %71 = OpLabel
+ %74 = OpAccessChain %60 %59 %16 %73
+ %75 = OpLoad %15 %74
+ %76 = OpAccessChain %63 %24 %75
+ %77 = OpLoad %9 %76
+ %79 = OpAccessChain %60 %59 %16 %78
+ %80 = OpLoad %15 %79
+ %81 = OpAccessChain %63 %27 %80
+ %82 = OpLoad %9 %81
+ %83 = OpFOrdEqual %54 %77 %82
+ OpBranch %72
+ %72 = OpLabel
+ %84 = OpPhi %54 %70 %5 %83 %71
+ OpSelectionMerge %86 None
+ OpBranchConditional %84 %85 %86
+ %85 = OpLabel
+ %87 = OpAccessChain %60 %59 %16 %78
+ %88 = OpLoad %15 %87
+ %89 = OpAccessChain %63 %24 %88
+ %90 = OpLoad %9 %89
+ %91 = OpAccessChain %60 %59 %16 %73
+ %92 = OpLoad %15 %91
+ %93 = OpAccessChain %63 %27 %92
+ %94 = OpLoad %9 %93
+ %95 = OpFOrdEqual %54 %90 %94
+ OpBranch %86
+ %86 = OpLabel
+ %96 = OpPhi %54 %84 %72 %95 %85
+ OpSelectionMerge %98 None
+ OpBranchConditional %96 %97 %98
+ %97 = OpLabel
+ %99 = OpAccessChain %60 %59 %16 %16
+ %100 = OpLoad %15 %99
+ %101 = OpAccessChain %63 %24 %100
+ %102 = OpLoad %9 %101
+ %103 = OpAccessChain %60 %59 %16 %31
+ %104 = OpLoad %15 %103
+ %105 = OpAccessChain %63 %27 %104
+ %106 = OpLoad %9 %105
+ %107 = OpFOrdEqual %54 %102 %106
+ OpBranch %98
+ %98 = OpLabel
+ %108 = OpPhi %54 %96 %86 %107 %97
+ OpSelectionMerge %110 None
+ OpBranchConditional %108 %109 %126
+ %109 = OpLabel
+ %113 = OpAccessChain %60 %59 %16 %73
+ %114 = OpLoad %15 %113
+ %115 = OpConvertSToF %9 %114
+ %116 = OpAccessChain %60 %59 %16 %31
+ %117 = OpLoad %15 %116
+ %118 = OpConvertSToF %9 %117
+ %119 = OpAccessChain %60 %59 %16 %31
+ %120 = OpLoad %15 %119
+ %121 = OpConvertSToF %9 %120
+ %122 = OpAccessChain %60 %59 %16 %73
+ %123 = OpLoad %15 %122
+ %124 = OpConvertSToF %9 %123
+ %125 = OpCompositeConstruct %20 %115 %118 %121 %124
+ OpStore %112 %125
+ OpBranch %110
+ %126 = OpLabel
+ %127 = OpAccessChain %60 %59 %16 %31
+ %128 = OpLoad %15 %127
+ %129 = OpAccessChain %63 %24 %128
+ %130 = OpLoad %9 %129
+ %131 = OpCompositeConstruct %20 %130 %130 %130 %130
+ OpStore %112 %131
+ OpBranch %110
+ %110 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 3 0 2 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 127.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-switch.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-switch.amber
new file mode 100644
index 0000000..4ba9323
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-switch.amber
@@ -0,0 +1,235 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine and or xor code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_4 _GLF_uniform_int_values[0]
+# #define _int_2 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _int_1 _GLF_uniform_int_values[3]
+# #define _int_10 _GLF_uniform_int_values[4]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [4, 2, 0, 1, 10]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[5];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int count0 = _int_0;
+# int count1 = _int_0;
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# switch (i)
+# {
+# case 0:
+# case 1:
+# count0++;
+# case 3:
+# case 2:
+# count1++;
+# }
+# }
+# if (count1 == _int_4)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# if (count0 != _int_2)
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 88
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %58
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "count0"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %20 "count1"
+ OpName %23 "i"
+ OpName %58 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %58 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 5
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 2
+ %17 = OpTypePointer Uniform %6
+ %32 = OpConstant %6 4
+ %35 = OpTypeBool
+ %42 = OpConstant %6 1
+ %55 = OpTypeFloat 32
+ %56 = OpTypeVector %55 4
+ %57 = OpTypePointer Output %56
+ %58 = OpVariable %57 Output
+ %59 = OpConstant %6 3
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %23 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %21 = OpAccessChain %17 %14 %15 %16
+ %22 = OpLoad %6 %21
+ OpStore %20 %22
+ %24 = OpAccessChain %17 %14 %15 %16
+ %25 = OpLoad %6 %24
+ OpStore %23 %25
+ OpBranch %26
+ %26 = OpLabel
+ OpLoopMerge %28 %29 None
+ OpBranch %30
+ %30 = OpLabel
+ %31 = OpLoad %6 %23
+ %33 = OpAccessChain %17 %14 %15 %32
+ %34 = OpLoad %6 %33
+ %36 = OpSLessThan %35 %31 %34
+ OpBranchConditional %36 %27 %28
+ %27 = OpLabel
+ %37 = OpLoad %6 %23
+ OpSelectionMerge %40 None
+ OpSwitch %37 %40 0 %38 1 %38 3 %39 2 %39
+ %38 = OpLabel
+ %41 = OpLoad %6 %8
+ %43 = OpIAdd %6 %41 %42
+ OpStore %8 %43
+ OpBranch %39
+ %39 = OpLabel
+ %44 = OpLoad %6 %20
+ %45 = OpIAdd %6 %44 %42
+ OpStore %20 %45
+ OpBranch %40
+ %40 = OpLabel
+ OpBranch %29
+ %29 = OpLabel
+ %47 = OpLoad %6 %23
+ %48 = OpIAdd %6 %47 %42
+ OpStore %23 %48
+ OpBranch %26
+ %28 = OpLabel
+ %49 = OpLoad %6 %20
+ %50 = OpAccessChain %17 %14 %15 %15
+ %51 = OpLoad %6 %50
+ %52 = OpIEqual %35 %49 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %73
+ %53 = OpLabel
+ %60 = OpAccessChain %17 %14 %15 %59
+ %61 = OpLoad %6 %60
+ %62 = OpConvertSToF %55 %61
+ %63 = OpAccessChain %17 %14 %15 %16
+ %64 = OpLoad %6 %63
+ %65 = OpConvertSToF %55 %64
+ %66 = OpAccessChain %17 %14 %15 %16
+ %67 = OpLoad %6 %66
+ %68 = OpConvertSToF %55 %67
+ %69 = OpAccessChain %17 %14 %15 %59
+ %70 = OpLoad %6 %69
+ %71 = OpConvertSToF %55 %70
+ %72 = OpCompositeConstruct %56 %62 %65 %68 %71
+ OpStore %58 %72
+ OpBranch %54
+ %73 = OpLabel
+ %74 = OpAccessChain %17 %14 %15 %16
+ %75 = OpLoad %6 %74
+ %76 = OpConvertSToF %55 %75
+ %77 = OpCompositeConstruct %56 %76 %76 %76 %76
+ OpStore %58 %77
+ OpBranch %54
+ %54 = OpLabel
+ %78 = OpLoad %6 %8
+ %79 = OpAccessChain %17 %14 %15 %42
+ %80 = OpLoad %6 %79
+ %81 = OpINotEqual %35 %78 %80
+ OpSelectionMerge %83 None
+ OpBranchConditional %81 %82 %83
+ %82 = OpLabel
+ %84 = OpAccessChain %17 %14 %15 %16
+ %85 = OpLoad %6 %84
+ %86 = OpConvertSToF %55 %85
+ %87 = OpCompositeConstruct %56 %86 %86 %86 %86
+ OpStore %58 %87
+ OpBranch %83
+ %83 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 4 2 0 1 10
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add.amber
new file mode 100644
index 0000000..5d427f9
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add.amber
@@ -0,0 +1,203 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine and or xor code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float data[2];
+# data[_int_0] = _float_0_0;
+# data[_int_1] = _float_1_0;
+# float a = data[(1 ^ (_int_1 & 2))];
+# if (a == _float_1_0)
+# {
+# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
+# }
+# else
+# {
+# _GLF_color = vec4(_float_0_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 67
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "data"
+ OpName %14 "buf0"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpName %22 "buf1"
+ OpMemberName %22 0 "_GLF_uniform_float_values"
+ OpName %24 ""
+ OpName %36 "a"
+ OpName %53 "_GLF_color"
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 0
+ OpDecorate %21 ArrayStride 16
+ OpMemberDecorate %22 0 Offset 0
+ OpDecorate %22 Block
+ OpDecorate %24 DescriptorSet 0
+ OpDecorate %24 Binding 1
+ OpDecorate %53 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeInt 32 0
+ %8 = OpConstant %7 2
+ %9 = OpTypeArray %6 %8
+ %10 = OpTypePointer Function %9
+ %12 = OpTypeInt 32 1
+ %13 = OpTypeArray %12 %8
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %12 0
+ %18 = OpTypePointer Uniform %12
+ %21 = OpTypeArray %6 %8
+ %22 = OpTypeStruct %21
+ %23 = OpTypePointer Uniform %22
+ %24 = OpVariable %23 Uniform
+ %25 = OpTypePointer Uniform %6
+ %28 = OpTypePointer Function %6
+ %30 = OpConstant %12 1
+ %39 = OpConstant %12 2
+ %47 = OpTypeBool
+ %51 = OpTypeVector %6 4
+ %52 = OpTypePointer Output %51
+ %53 = OpVariable %52 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %11 = OpVariable %10 Function
+ %36 = OpVariable %28 Function
+ %19 = OpAccessChain %18 %16 %17 %17
+ %20 = OpLoad %12 %19
+ %26 = OpAccessChain %25 %24 %17 %17
+ %27 = OpLoad %6 %26
+ %29 = OpAccessChain %28 %11 %20
+ OpStore %29 %27
+ %31 = OpAccessChain %18 %16 %17 %30
+ %32 = OpLoad %12 %31
+ %33 = OpAccessChain %25 %24 %17 %30
+ %34 = OpLoad %6 %33
+ %35 = OpAccessChain %28 %11 %32
+ OpStore %35 %34
+ %37 = OpAccessChain %18 %16 %17 %30
+ %38 = OpLoad %12 %37
+ %40 = OpBitwiseAnd %12 %38 %39
+ %41 = OpBitwiseXor %12 %30 %40
+ %42 = OpAccessChain %28 %11 %41
+ %43 = OpLoad %6 %42
+ OpStore %36 %43
+ %44 = OpLoad %6 %36
+ %45 = OpAccessChain %25 %24 %17 %30
+ %46 = OpLoad %6 %45
+ %48 = OpFOrdEqual %47 %44 %46
+ OpSelectionMerge %50 None
+ OpBranchConditional %48 %49 %63
+ %49 = OpLabel
+ %54 = OpAccessChain %25 %24 %17 %30
+ %55 = OpLoad %6 %54
+ %56 = OpAccessChain %25 %24 %17 %17
+ %57 = OpLoad %6 %56
+ %58 = OpAccessChain %25 %24 %17 %17
+ %59 = OpLoad %6 %58
+ %60 = OpAccessChain %25 %24 %17 %30
+ %61 = OpLoad %6 %60
+ %62 = OpCompositeConstruct %51 %55 %57 %59 %61
+ OpStore %53 %62
+ OpBranch %50
+ %63 = OpLabel
+ %64 = OpAccessChain %25 %24 %17 %17
+ %65 = OpLoad %6 %64
+ %66 = OpCompositeConstruct %51 %65 %65 %65 %65
+ OpStore %53 %66
+ OpBranch %50
+ %50 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 1.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-combine-select-uaddcarry.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-combine-select-uaddcarry.amber
new file mode 100644
index 0000000..4da8d88
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-combine-select-uaddcarry.amber
@@ -0,0 +1,333 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers a specific instruction combine compares and combine select code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_2 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _uint_1 _GLF_uniform_uint_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: 1.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_uint_values: 1
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# uint _GLF_uniform_uint_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [2, 0, 1]
+# layout(set = 0, binding = 2) uniform buf2
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct S {
+# int a;
+# };
+#
+# // Always returns 1.
+# int f1()
+# {
+# S A = S(1);
+# int i = _int_0;
+# for (int i = _int_0; i < _int_0 + _int_2; i++)
+# {
+# if (A.a == clamp(i, _int_0, 1))
+# {
+# return _int_1;
+# }
+# }
+#
+# // The function returns before reaching this.
+# return _int_2;
+# }
+#
+# // Always returns 1.0.
+# float f2()
+# {
+# return float(f1());
+# }
+#
+# void main()
+# {
+# uint a = _uint_1;
+# uint b = uaddCarry(uint(2 * _int_0), uint(_int_0), a);
+# if (b == 0u && f2() == _float_1_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 130
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %111
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "f1("
+ OpName %12 "f2("
+ OpName %14 "S"
+ OpMemberName %14 0 "a"
+ OpName %16 "A"
+ OpName %20 "i"
+ OpName %24 "buf2"
+ OpMemberName %24 0 "_GLF_uniform_int_values"
+ OpName %26 ""
+ OpName %31 "i"
+ OpName %71 "a"
+ OpName %74 "buf1"
+ OpMemberName %74 0 "_GLF_uniform_uint_values"
+ OpName %76 ""
+ OpName %80 "b"
+ OpName %88 "ResType"
+ OpName %99 "buf0"
+ OpMemberName %99 0 "_GLF_uniform_float_values"
+ OpName %101 ""
+ OpName %111 "_GLF_color"
+ OpDecorate %23 ArrayStride 16
+ OpMemberDecorate %24 0 Offset 0
+ OpDecorate %24 Block
+ OpDecorate %26 DescriptorSet 0
+ OpDecorate %26 Binding 2
+ OpDecorate %73 ArrayStride 16
+ OpMemberDecorate %74 0 Offset 0
+ OpDecorate %74 Block
+ OpDecorate %76 DescriptorSet 0
+ OpDecorate %76 Binding 1
+ OpDecorate %98 ArrayStride 16
+ OpMemberDecorate %99 0 Offset 0
+ OpDecorate %99 Block
+ OpDecorate %101 DescriptorSet 0
+ OpDecorate %101 Binding 0
+ OpDecorate %111 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeFunction %6
+ %10 = OpTypeFloat 32
+ %11 = OpTypeFunction %10
+ %14 = OpTypeStruct %6
+ %15 = OpTypePointer Function %14
+ %17 = OpConstant %6 1
+ %18 = OpConstantComposite %14 %17
+ %19 = OpTypePointer Function %6
+ %21 = OpTypeInt 32 0
+ %22 = OpConstant %21 3
+ %23 = OpTypeArray %6 %22
+ %24 = OpTypeStruct %23
+ %25 = OpTypePointer Uniform %24
+ %26 = OpVariable %25 Uniform
+ %27 = OpConstant %6 0
+ %28 = OpTypePointer Uniform %6
+ %45 = OpTypeBool
+ %56 = OpConstant %6 2
+ %70 = OpTypePointer Function %21
+ %72 = OpConstant %21 1
+ %73 = OpTypeArray %21 %72
+ %74 = OpTypeStruct %73
+ %75 = OpTypePointer Uniform %74
+ %76 = OpVariable %75 Uniform
+ %77 = OpTypePointer Uniform %21
+ %88 = OpTypeStruct %21 %21
+ %93 = OpConstant %21 0
+ %98 = OpTypeArray %10 %72
+ %99 = OpTypeStruct %98
+ %100 = OpTypePointer Uniform %99
+ %101 = OpVariable %100 Uniform
+ %102 = OpTypePointer Uniform %10
+ %109 = OpTypeVector %10 4
+ %110 = OpTypePointer Output %109
+ %111 = OpVariable %110 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %71 = OpVariable %70 Function
+ %80 = OpVariable %70 Function
+ %78 = OpAccessChain %77 %76 %27 %27
+ %79 = OpLoad %21 %78
+ OpStore %71 %79
+ %81 = OpAccessChain %28 %26 %27 %17
+ %82 = OpLoad %6 %81
+ %83 = OpIMul %6 %56 %82
+ %84 = OpBitcast %21 %83
+ %85 = OpAccessChain %28 %26 %27 %17
+ %86 = OpLoad %6 %85
+ %87 = OpBitcast %21 %86
+ %89 = OpIAddCarry %88 %84 %87
+ %90 = OpCompositeExtract %21 %89 1
+ OpStore %71 %90
+ %91 = OpCompositeExtract %21 %89 0
+ OpStore %80 %91
+ %92 = OpLoad %21 %80
+ %94 = OpIEqual %45 %92 %93
+ OpSelectionMerge %96 None
+ OpBranchConditional %94 %95 %96
+ %95 = OpLabel
+ %97 = OpFunctionCall %10 %12
+ %103 = OpAccessChain %102 %101 %27 %27
+ %104 = OpLoad %10 %103
+ %105 = OpFOrdEqual %45 %97 %104
+ OpBranch %96
+ %96 = OpLabel
+ %106 = OpPhi %45 %94 %5 %105 %95
+ OpSelectionMerge %108 None
+ OpBranchConditional %106 %107 %125
+ %107 = OpLabel
+ %112 = OpAccessChain %28 %26 %27 %56
+ %113 = OpLoad %6 %112
+ %114 = OpConvertSToF %10 %113
+ %115 = OpAccessChain %28 %26 %27 %17
+ %116 = OpLoad %6 %115
+ %117 = OpConvertSToF %10 %116
+ %118 = OpAccessChain %28 %26 %27 %17
+ %119 = OpLoad %6 %118
+ %120 = OpConvertSToF %10 %119
+ %121 = OpAccessChain %28 %26 %27 %56
+ %122 = OpLoad %6 %121
+ %123 = OpConvertSToF %10 %122
+ %124 = OpCompositeConstruct %109 %114 %117 %120 %123
+ OpStore %111 %124
+ OpBranch %108
+ %125 = OpLabel
+ %126 = OpAccessChain %28 %26 %27 %56
+ %127 = OpLoad %6 %126
+ %128 = OpConvertSToF %10 %127
+ %129 = OpCompositeConstruct %109 %128 %128 %128 %128
+ OpStore %111 %129
+ OpBranch %108
+ %108 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %8 = OpFunction %6 None %7
+ %9 = OpLabel
+ %16 = OpVariable %15 Function
+ %20 = OpVariable %19 Function
+ %31 = OpVariable %19 Function
+ OpStore %16 %18
+ %29 = OpAccessChain %28 %26 %27 %17
+ %30 = OpLoad %6 %29
+ OpStore %20 %30
+ %32 = OpAccessChain %28 %26 %27 %17
+ %33 = OpLoad %6 %32
+ OpStore %31 %33
+ OpBranch %34
+ %34 = OpLabel
+ OpLoopMerge %36 %37 None
+ OpBranch %38
+ %38 = OpLabel
+ %39 = OpLoad %6 %31
+ %40 = OpAccessChain %28 %26 %27 %17
+ %41 = OpLoad %6 %40
+ %42 = OpAccessChain %28 %26 %27 %27
+ %43 = OpLoad %6 %42
+ %44 = OpIAdd %6 %41 %43
+ %46 = OpSLessThan %45 %39 %44
+ OpBranchConditional %46 %35 %36
+ %35 = OpLabel
+ %47 = OpAccessChain %19 %16 %27
+ %48 = OpLoad %6 %47
+ %49 = OpLoad %6 %31
+ %50 = OpAccessChain %28 %26 %27 %17
+ %51 = OpLoad %6 %50
+ %52 = OpExtInst %6 %1 SClamp %49 %51 %17
+ %53 = OpIEqual %45 %48 %52
+ OpSelectionMerge %55 None
+ OpBranchConditional %53 %54 %55
+ %54 = OpLabel
+ %57 = OpAccessChain %28 %26 %27 %56
+ %58 = OpLoad %6 %57
+ OpReturnValue %58
+ %55 = OpLabel
+ OpBranch %37
+ %37 = OpLabel
+ %60 = OpLoad %6 %31
+ %61 = OpIAdd %6 %60 %17
+ OpStore %31 %61
+ OpBranch %34
+ %36 = OpLabel
+ %62 = OpAccessChain %28 %26 %27 %27
+ %63 = OpLoad %6 %62
+ OpReturnValue %63
+ OpFunctionEnd
+ %12 = OpFunction %10 None %11
+ %13 = OpLabel
+ %66 = OpFunctionCall %6 %8
+ %67 = OpConvertSToF %10 %66
+ OpReturnValue %67
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 2 0 1
+END
+# _GLF_uniform_uint_values
+BUFFER variant__GLF_uniform_uint_values DATA_TYPE int32[] STD140 DATA
+ 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 2
+ BIND BUFFER variant__GLF_uniform_uint_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-isnan.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-isnan.amber
new file mode 100644
index 0000000..a54455b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-isnan.amber
@@ -0,0 +1,151 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction combine compare code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# if (isnan((-_GLF_color).x))
+# {
+# _GLF_color = vec4(_int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 45
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %9
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "_GLF_color"
+ OpName %14 "buf0"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpDecorate %9 Location 0
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 RelaxedPrecision
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 0
+ OpDecorate %20 RelaxedPrecision
+ OpDecorate %24 RelaxedPrecision
+ OpDecorate %27 RelaxedPrecision
+ OpDecorate %30 RelaxedPrecision
+ OpDecorate %42 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Output %7
+ %9 = OpVariable %8 Output
+ %10 = OpTypeInt 32 1
+ %11 = OpTypeInt 32 0
+ %12 = OpConstant %11 2
+ %13 = OpTypeArray %10 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %10 0
+ %18 = OpTypePointer Uniform %10
+ %22 = OpConstant %10 1
+ %35 = OpConstant %11 0
+ %37 = OpTypeBool
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %19 = OpAccessChain %18 %16 %17 %17
+ %20 = OpLoad %10 %19
+ %21 = OpConvertSToF %6 %20
+ %23 = OpAccessChain %18 %16 %17 %22
+ %24 = OpLoad %10 %23
+ %25 = OpConvertSToF %6 %24
+ %26 = OpAccessChain %18 %16 %17 %22
+ %27 = OpLoad %10 %26
+ %28 = OpConvertSToF %6 %27
+ %29 = OpAccessChain %18 %16 %17 %17
+ %30 = OpLoad %10 %29
+ %31 = OpConvertSToF %6 %30
+ %32 = OpCompositeConstruct %7 %21 %25 %28 %31
+ OpStore %9 %32
+ %33 = OpLoad %7 %9
+ %34 = OpFNegate %7 %33
+ %36 = OpCompositeExtract %6 %34 0
+ %38 = OpIsNan %37 %36
+ OpSelectionMerge %40 None
+ OpBranchConditional %38 %39 %40
+ %39 = OpLabel
+ %41 = OpAccessChain %18 %16 %17 %17
+ %42 = OpLoad %10 %41
+ %43 = OpConvertSToF %6 %42
+ %44 = OpCompositeConstruct %7 %43 %43 %43 %43
+ OpStore %9 %44
+ OpBranch %40
+ %40 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-ldexp.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-ldexp.amber
new file mode 100644
index 0000000..77b17ac
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-ldexp.amber
@@ -0,0 +1,188 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction combine compares code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# if (ldexp(_float_0_0, 10000) == _float_0_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 63
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %28
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %10 "buf0"
+ OpMemberName %10 0 "_GLF_uniform_float_values"
+ OpName %12 ""
+ OpName %28 "_GLF_color"
+ OpName %31 "buf1"
+ OpMemberName %31 0 "_GLF_uniform_int_values"
+ OpName %33 ""
+ OpDecorate %9 ArrayStride 16
+ OpMemberDecorate %10 0 Offset 0
+ OpDecorate %10 Block
+ OpDecorate %12 DescriptorSet 0
+ OpDecorate %12 Binding 0
+ OpDecorate %28 Location 0
+ OpDecorate %30 ArrayStride 16
+ OpMemberDecorate %31 0 Offset 0
+ OpDecorate %31 Block
+ OpDecorate %33 DescriptorSet 0
+ OpDecorate %33 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeInt 32 0
+ %8 = OpConstant %7 1
+ %9 = OpTypeArray %6 %8
+ %10 = OpTypeStruct %9
+ %11 = OpTypePointer Uniform %10
+ %12 = OpVariable %11 Uniform
+ %13 = OpTypeInt 32 1
+ %14 = OpConstant %13 0
+ %15 = OpTypePointer Uniform %6
+ %18 = OpConstant %13 10000
+ %22 = OpTypeBool
+ %26 = OpTypeVector %6 4
+ %27 = OpTypePointer Output %26
+ %28 = OpVariable %27 Output
+ %29 = OpConstant %7 2
+ %30 = OpTypeArray %13 %29
+ %31 = OpTypeStruct %30
+ %32 = OpTypePointer Uniform %31
+ %33 = OpVariable %32 Uniform
+ %34 = OpConstant %13 1
+ %35 = OpTypePointer Uniform %13
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %15 %12 %14 %14
+ %17 = OpLoad %6 %16
+ %19 = OpExtInst %6 %1 Ldexp %17 %18
+ %20 = OpAccessChain %15 %12 %14 %14
+ %21 = OpLoad %6 %20
+ %23 = OpFOrdEqual %22 %19 %21
+ OpSelectionMerge %25 None
+ OpBranchConditional %23 %24 %49
+ %24 = OpLabel
+ %36 = OpAccessChain %35 %33 %14 %34
+ %37 = OpLoad %13 %36
+ %38 = OpConvertSToF %6 %37
+ %39 = OpAccessChain %35 %33 %14 %14
+ %40 = OpLoad %13 %39
+ %41 = OpConvertSToF %6 %40
+ %42 = OpAccessChain %35 %33 %14 %14
+ %43 = OpLoad %13 %42
+ %44 = OpConvertSToF %6 %43
+ %45 = OpAccessChain %35 %33 %14 %34
+ %46 = OpLoad %13 %45
+ %47 = OpConvertSToF %6 %46
+ %48 = OpCompositeConstruct %26 %38 %41 %44 %47
+ OpStore %28 %48
+ OpBranch %25
+ %49 = OpLabel
+ %50 = OpAccessChain %35 %33 %14 %34
+ %51 = OpLoad %13 %50
+ %52 = OpConvertSToF %6 %51
+ %53 = OpAccessChain %35 %33 %14 %14
+ %54 = OpLoad %13 %53
+ %55 = OpConvertSToF %6 %54
+ %56 = OpAccessChain %35 %33 %14 %14
+ %57 = OpLoad %13 %56
+ %58 = OpConvertSToF %6 %57
+ %59 = OpAccessChain %35 %33 %14 %34
+ %60 = OpLoad %13 %59
+ %61 = OpConvertSToF %6 %60
+ %62 = OpCompositeConstruct %26 %52 %55 %58 %61
+ OpStore %28 %62
+ OpBranch %25
+ %25 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp.amber
new file mode 100644
index 0000000..2421af2
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp.amber
@@ -0,0 +1,266 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine compares code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+# #define _float_2_0 _GLF_uniform_float_values[2]
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 1.0, 2.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# float f1(float a)
+# {
+# int b = 8;
+#
+# if (gl_FragCoord.y >= _float_0_0)
+# {
+# ++b;
+# ++b;
+# }
+#
+# // Always false.
+# if (a < _float_1_0)
+# {
+# return _float_1_0;
+# }
+#
+# float c = float(clamp(b, 0, 2));
+#
+# // Always returns 2.0.
+# return c;
+# }
+#
+# void main()
+# {
+# float a = f1(_float_1_0);
+# if (a == _float_2_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 96
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %18 %71
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %10 "f1(f1;"
+ OpName %9 "a"
+ OpName %14 "b"
+ OpName %18 "gl_FragCoord"
+ OpName %26 "buf0"
+ OpMemberName %26 0 "_GLF_uniform_float_values"
+ OpName %28 ""
+ OpName %51 "c"
+ OpName %59 "a"
+ OpName %60 "param"
+ OpName %71 "_GLF_color"
+ OpName %74 "buf1"
+ OpMemberName %74 0 "_GLF_uniform_int_values"
+ OpName %76 ""
+ OpDecorate %18 BuiltIn FragCoord
+ OpDecorate %25 ArrayStride 16
+ OpMemberDecorate %26 0 Offset 0
+ OpDecorate %26 Block
+ OpDecorate %28 DescriptorSet 0
+ OpDecorate %28 Binding 0
+ OpDecorate %71 Location 0
+ OpDecorate %73 ArrayStride 16
+ OpMemberDecorate %74 0 Offset 0
+ OpDecorate %74 Block
+ OpDecorate %76 DescriptorSet 0
+ OpDecorate %76 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %6 %7
+ %12 = OpTypeInt 32 1
+ %13 = OpTypePointer Function %12
+ %15 = OpConstant %12 8
+ %16 = OpTypeVector %6 4
+ %17 = OpTypePointer Input %16
+ %18 = OpVariable %17 Input
+ %19 = OpTypeInt 32 0
+ %20 = OpConstant %19 1
+ %21 = OpTypePointer Input %6
+ %24 = OpConstant %19 3
+ %25 = OpTypeArray %6 %24
+ %26 = OpTypeStruct %25
+ %27 = OpTypePointer Uniform %26
+ %28 = OpVariable %27 Uniform
+ %29 = OpConstant %12 0
+ %30 = OpTypePointer Uniform %6
+ %33 = OpTypeBool
+ %38 = OpConstant %12 1
+ %53 = OpConstant %12 2
+ %70 = OpTypePointer Output %16
+ %71 = OpVariable %70 Output
+ %72 = OpConstant %19 2
+ %73 = OpTypeArray %12 %72
+ %74 = OpTypeStruct %73
+ %75 = OpTypePointer Uniform %74
+ %76 = OpVariable %75 Uniform
+ %77 = OpTypePointer Uniform %12
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %59 = OpVariable %7 Function
+ %60 = OpVariable %7 Function
+ %61 = OpAccessChain %30 %28 %29 %38
+ %62 = OpLoad %6 %61
+ OpStore %60 %62
+ %63 = OpFunctionCall %6 %10 %60
+ OpStore %59 %63
+ %64 = OpLoad %6 %59
+ %65 = OpAccessChain %30 %28 %29 %53
+ %66 = OpLoad %6 %65
+ %67 = OpFOrdEqual %33 %64 %66
+ OpSelectionMerge %69 None
+ OpBranchConditional %67 %68 %91
+ %68 = OpLabel
+ %78 = OpAccessChain %77 %76 %29 %38
+ %79 = OpLoad %12 %78
+ %80 = OpConvertSToF %6 %79
+ %81 = OpAccessChain %77 %76 %29 %29
+ %82 = OpLoad %12 %81
+ %83 = OpConvertSToF %6 %82
+ %84 = OpAccessChain %77 %76 %29 %29
+ %85 = OpLoad %12 %84
+ %86 = OpConvertSToF %6 %85
+ %87 = OpAccessChain %77 %76 %29 %38
+ %88 = OpLoad %12 %87
+ %89 = OpConvertSToF %6 %88
+ %90 = OpCompositeConstruct %16 %80 %83 %86 %89
+ OpStore %71 %90
+ OpBranch %69
+ %91 = OpLabel
+ %92 = OpAccessChain %77 %76 %29 %29
+ %93 = OpLoad %12 %92
+ %94 = OpConvertSToF %6 %93
+ %95 = OpCompositeConstruct %16 %94 %94 %94 %94
+ OpStore %71 %95
+ OpBranch %69
+ %69 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %10 = OpFunction %6 None %8
+ %9 = OpFunctionParameter %7
+ %11 = OpLabel
+ %14 = OpVariable %13 Function
+ %51 = OpVariable %7 Function
+ OpStore %14 %15
+ %22 = OpAccessChain %21 %18 %20
+ %23 = OpLoad %6 %22
+ %31 = OpAccessChain %30 %28 %29 %29
+ %32 = OpLoad %6 %31
+ %34 = OpFOrdGreaterThanEqual %33 %23 %32
+ OpSelectionMerge %36 None
+ OpBranchConditional %34 %35 %36
+ %35 = OpLabel
+ %37 = OpLoad %12 %14
+ %39 = OpIAdd %12 %37 %38
+ OpStore %14 %39
+ %40 = OpLoad %12 %14
+ %41 = OpIAdd %12 %40 %38
+ OpStore %14 %41
+ OpBranch %36
+ %36 = OpLabel
+ %42 = OpLoad %6 %9
+ %43 = OpAccessChain %30 %28 %29 %38
+ %44 = OpLoad %6 %43
+ %45 = OpFOrdLessThan %33 %42 %44
+ OpSelectionMerge %47 None
+ OpBranchConditional %45 %46 %47
+ %46 = OpLabel
+ %48 = OpAccessChain %30 %28 %29 %38
+ %49 = OpLoad %6 %48
+ OpReturnValue %49
+ %47 = OpLabel
+ %52 = OpLoad %12 %14
+ %54 = OpExtInst %12 %1 SClamp %52 %29 %53
+ %55 = OpConvertSToF %6 %54
+ OpStore %51 %55
+ %56 = OpLoad %6 %51
+ OpReturnValue %56
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 1.0 2.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access.amber
new file mode 100644
index 0000000..6a1012d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access.amber
@@ -0,0 +1,216 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction combine compare code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+# #define _float_2_0 _GLF_uniform_float_values[2]
+# #define _float_3_0 _GLF_uniform_float_values[3]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 1.0, 2.0, 3.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[4];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // a becomes 0.
+# int a = (gl_FragCoord.y >= _float_0_0) ? 0 : 2;
+#
+# float b = vec3(_float_1_0, _float_2_0, _float_3_0)[a];
+#
+# if (b == _float_1_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 77
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %52
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "gl_FragCoord"
+ OpName %20 "buf0"
+ OpMemberName %20 0 "_GLF_uniform_float_values"
+ OpName %22 ""
+ OpName %32 "b"
+ OpName %52 "_GLF_color"
+ OpName %55 "buf1"
+ OpMemberName %55 0 "_GLF_uniform_int_values"
+ OpName %57 ""
+ OpDecorate %12 BuiltIn FragCoord
+ OpDecorate %19 ArrayStride 16
+ OpMemberDecorate %20 0 Offset 0
+ OpDecorate %20 Block
+ OpDecorate %22 DescriptorSet 0
+ OpDecorate %22 Binding 0
+ OpDecorate %52 Location 0
+ OpDecorate %54 ArrayStride 16
+ OpMemberDecorate %55 0 Offset 0
+ OpDecorate %55 Block
+ OpDecorate %57 DescriptorSet 0
+ OpDecorate %57 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeFloat 32
+ %10 = OpTypeVector %9 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %13 = OpTypeInt 32 0
+ %14 = OpConstant %13 1
+ %15 = OpTypePointer Input %9
+ %18 = OpConstant %13 4
+ %19 = OpTypeArray %9 %18
+ %20 = OpTypeStruct %19
+ %21 = OpTypePointer Uniform %20
+ %22 = OpVariable %21 Uniform
+ %23 = OpConstant %6 0
+ %24 = OpTypePointer Uniform %9
+ %27 = OpTypeBool
+ %29 = OpConstant %6 2
+ %31 = OpTypePointer Function %9
+ %33 = OpConstant %6 1
+ %38 = OpConstant %6 3
+ %41 = OpTypeVector %9 3
+ %51 = OpTypePointer Output %10
+ %52 = OpVariable %51 Output
+ %53 = OpConstant %13 2
+ %54 = OpTypeArray %6 %53
+ %55 = OpTypeStruct %54
+ %56 = OpTypePointer Uniform %55
+ %57 = OpVariable %56 Uniform
+ %58 = OpTypePointer Uniform %6
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %32 = OpVariable %31 Function
+ %16 = OpAccessChain %15 %12 %14
+ %17 = OpLoad %9 %16
+ %25 = OpAccessChain %24 %22 %23 %23
+ %26 = OpLoad %9 %25
+ %28 = OpFOrdGreaterThanEqual %27 %17 %26
+ %30 = OpSelect %6 %28 %23 %29
+ OpStore %8 %30
+ %34 = OpAccessChain %24 %22 %23 %33
+ %35 = OpLoad %9 %34
+ %36 = OpAccessChain %24 %22 %23 %29
+ %37 = OpLoad %9 %36
+ %39 = OpAccessChain %24 %22 %23 %38
+ %40 = OpLoad %9 %39
+ %42 = OpCompositeConstruct %41 %35 %37 %40
+ %43 = OpLoad %6 %8
+ %44 = OpVectorExtractDynamic %9 %42 %43
+ OpStore %32 %44
+ %45 = OpLoad %9 %32
+ %46 = OpAccessChain %24 %22 %23 %33
+ %47 = OpLoad %9 %46
+ %48 = OpFOrdEqual %27 %45 %47
+ OpSelectionMerge %50 None
+ OpBranchConditional %48 %49 %72
+ %49 = OpLabel
+ %59 = OpAccessChain %58 %57 %23 %23
+ %60 = OpLoad %6 %59
+ %61 = OpConvertSToF %9 %60
+ %62 = OpAccessChain %58 %57 %23 %33
+ %63 = OpLoad %6 %62
+ %64 = OpConvertSToF %9 %63
+ %65 = OpAccessChain %58 %57 %23 %33
+ %66 = OpLoad %6 %65
+ %67 = OpConvertSToF %9 %66
+ %68 = OpAccessChain %58 %57 %23 %23
+ %69 = OpLoad %6 %68
+ %70 = OpConvertSToF %9 %69
+ %71 = OpCompositeConstruct %10 %61 %64 %67 %70
+ OpStore %52 %71
+ OpBranch %50
+ %72 = OpLabel
+ %73 = OpAccessChain %58 %57 %23 %23
+ %74 = OpLoad %6 %73
+ %75 = OpConvertSToF %9 %74
+ %76 = OpCompositeConstruct %10 %75 %75 %75 %75
+ OpStore %52 %76
+ OpBranch %50
+ %50 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 1.0 2.0 3.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix.amber
new file mode 100644
index 0000000..ba56643
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix.amber
@@ -0,0 +1,264 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine mul div rem code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# float f1(float a)
+# {
+# return dFdx(a);
+# }
+#
+# void main()
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+#
+# vec4 v2;
+#
+# // Always false.
+# if (gl_FragCoord.x < _float_0_0)
+# {
+# // v2 is undefined. Doesn't matter since this is never executed.
+# if (!(v2.x < 1.0))
+# {
+# float a = _float_0_0 / ((_float_0_0 > _float_1_0) ? f1(_float_1_0) : _float_1_0);
+# _GLF_color =
+# vec4(mix(vec3(_float_1_0), vec3(_float_1_0), a), _float_0_0);
+# }
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 104
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %18 %43
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %10 "f1(f1;"
+ OpName %9 "a"
+ OpName %18 "_GLF_color"
+ OpName %23 "buf0"
+ OpMemberName %23 0 "_GLF_uniform_int_values"
+ OpName %25 ""
+ OpName %43 "gl_FragCoord"
+ OpName %49 "buf1"
+ OpMemberName %49 0 "_GLF_uniform_float_values"
+ OpName %51 ""
+ OpName %60 "v2"
+ OpName %68 "a"
+ OpName %79 "param"
+ OpDecorate %18 Location 0
+ OpDecorate %22 ArrayStride 16
+ OpMemberDecorate %23 0 Offset 0
+ OpDecorate %23 Block
+ OpDecorate %25 DescriptorSet 0
+ OpDecorate %25 Binding 0
+ OpDecorate %43 BuiltIn FragCoord
+ OpDecorate %48 ArrayStride 16
+ OpMemberDecorate %49 0 Offset 0
+ OpDecorate %49 Block
+ OpDecorate %51 DescriptorSet 0
+ OpDecorate %51 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %6 %7
+ %16 = OpTypeVector %6 4
+ %17 = OpTypePointer Output %16
+ %18 = OpVariable %17 Output
+ %19 = OpTypeInt 32 1
+ %20 = OpTypeInt 32 0
+ %21 = OpConstant %20 2
+ %22 = OpTypeArray %19 %21
+ %23 = OpTypeStruct %22
+ %24 = OpTypePointer Uniform %23
+ %25 = OpVariable %24 Uniform
+ %26 = OpConstant %19 0
+ %27 = OpTypePointer Uniform %19
+ %31 = OpConstant %19 1
+ %42 = OpTypePointer Input %16
+ %43 = OpVariable %42 Input
+ %44 = OpConstant %20 0
+ %45 = OpTypePointer Input %6
+ %48 = OpTypeArray %6 %21
+ %49 = OpTypeStruct %48
+ %50 = OpTypePointer Uniform %49
+ %51 = OpVariable %50 Uniform
+ %52 = OpTypePointer Uniform %6
+ %55 = OpTypeBool
+ %59 = OpTypePointer Function %16
+ %63 = OpConstant %6 1
+ %90 = OpTypeVector %6 3
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %60 = OpVariable %59 Function
+ %68 = OpVariable %7 Function
+ %76 = OpVariable %7 Function
+ %79 = OpVariable %7 Function
+ %28 = OpAccessChain %27 %25 %26 %26
+ %29 = OpLoad %19 %28
+ %30 = OpConvertSToF %6 %29
+ %32 = OpAccessChain %27 %25 %26 %31
+ %33 = OpLoad %19 %32
+ %34 = OpConvertSToF %6 %33
+ %35 = OpAccessChain %27 %25 %26 %31
+ %36 = OpLoad %19 %35
+ %37 = OpConvertSToF %6 %36
+ %38 = OpAccessChain %27 %25 %26 %26
+ %39 = OpLoad %19 %38
+ %40 = OpConvertSToF %6 %39
+ %41 = OpCompositeConstruct %16 %30 %34 %37 %40
+ OpStore %18 %41
+ %46 = OpAccessChain %45 %43 %44
+ %47 = OpLoad %6 %46
+ %53 = OpAccessChain %52 %51 %26 %31
+ %54 = OpLoad %6 %53
+ %56 = OpFOrdLessThan %55 %47 %54
+ OpSelectionMerge %58 None
+ OpBranchConditional %56 %57 %58
+ %57 = OpLabel
+ %61 = OpAccessChain %7 %60 %44
+ %62 = OpLoad %6 %61
+ %64 = OpFOrdLessThan %55 %62 %63
+ %65 = OpLogicalNot %55 %64
+ OpSelectionMerge %67 None
+ OpBranchConditional %65 %66 %67
+ %66 = OpLabel
+ %69 = OpAccessChain %52 %51 %26 %31
+ %70 = OpLoad %6 %69
+ %71 = OpAccessChain %52 %51 %26 %31
+ %72 = OpLoad %6 %71
+ %73 = OpAccessChain %52 %51 %26 %26
+ %74 = OpLoad %6 %73
+ %75 = OpFOrdGreaterThan %55 %72 %74
+ OpSelectionMerge %78 None
+ OpBranchConditional %75 %77 %83
+ %77 = OpLabel
+ %80 = OpAccessChain %52 %51 %26 %26
+ %81 = OpLoad %6 %80
+ OpStore %79 %81
+ %82 = OpFunctionCall %6 %10 %79
+ OpStore %76 %82
+ OpBranch %78
+ %83 = OpLabel
+ %84 = OpAccessChain %52 %51 %26 %26
+ %85 = OpLoad %6 %84
+ OpStore %76 %85
+ OpBranch %78
+ %78 = OpLabel
+ %86 = OpLoad %6 %76
+ %87 = OpFDiv %6 %70 %86
+ OpStore %68 %87
+ %88 = OpAccessChain %52 %51 %26 %26
+ %89 = OpLoad %6 %88
+ %91 = OpCompositeConstruct %90 %89 %89 %89
+ %92 = OpAccessChain %52 %51 %26 %26
+ %93 = OpLoad %6 %92
+ %94 = OpCompositeConstruct %90 %93 %93 %93
+ %95 = OpLoad %6 %68
+ %96 = OpCompositeConstruct %90 %95 %95 %95
+ %97 = OpExtInst %90 %1 FMix %91 %94 %96
+ %98 = OpAccessChain %52 %51 %26 %31
+ %99 = OpLoad %6 %98
+ %100 = OpCompositeExtract %6 %97 0
+ %101 = OpCompositeExtract %6 %97 1
+ %102 = OpCompositeExtract %6 %97 2
+ %103 = OpCompositeConstruct %16 %100 %101 %102 %99
+ OpStore %18 %103
+ OpBranch %67
+ %67 = OpLabel
+ OpBranch %58
+ %58 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %10 = OpFunction %6 None %8
+ %9 = OpFunctionParameter %7
+ %11 = OpLabel
+ %12 = OpLoad %6 %9
+ %13 = OpDPdx %6 %12
+ OpReturnValue %13
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 2
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-pack-unpack.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-pack-unpack.amber
new file mode 100644
index 0000000..337de64
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-pack-unpack.amber
@@ -0,0 +1,290 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers specific combine shifts and combine simplify demanded code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_3 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _int_2 _GLF_uniform_int_values[3]
+# #define _float_0_25 _GLF_uniform_float_values[0]
+# #define _float_0_75 _GLF_uniform_float_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[2]
+# #define _float_127_0 _GLF_uniform_float_values[3]
+# #define _float_64_0 _GLF_uniform_float_values[4]
+# #define _float_1_0 _GLF_uniform_float_values[5]
+# #define _float_65_0 _GLF_uniform_float_values[6]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [3, 1, 0, 2]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [0.25, 0.75, 0.0, 127.0, 64.0, 1.0, 65.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[7];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // Packs the two components into an unsigned integer of 3221176320.
+# uint a = packUnorm2x16(vec2(_float_0_25, _float_0_75));
+#
+# // Unpacks the integer into values of 0.0, 64.0, -1.0 and -65.0.
+# // Then converts them into floating-point values by dividing with 127.0.
+# vec4 v1 = unpackSnorm4x8(a);
+#
+# float E = 0.01;
+# if ( abs(v1[_int_0] - (_float_0_0 / _float_127_0)) < E
+# && abs(v1[_int_1] - (_float_64_0 / _float_127_0)) < E
+# && abs(v1[_int_2] - (-_float_1_0 / _float_127_0)) < E
+# && abs(v1[_int_3] - (-_float_65_0 / _float_127_0)) < E
+# )
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_float_1_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 130
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %112
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %28 "v1"
+ OpName %32 "E"
+ OpName %37 "buf0"
+ OpMemberName %37 0 "_GLF_uniform_int_values"
+ OpName %39 ""
+ OpName %112 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %36 ArrayStride 16
+ OpMemberDecorate %37 0 Offset 0
+ OpDecorate %37 Block
+ OpDecorate %39 DescriptorSet 0
+ OpDecorate %39 Binding 0
+ OpDecorate %112 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 0
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeFloat 32
+ %10 = OpConstant %6 7
+ %11 = OpTypeArray %9 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %9
+ %20 = OpConstant %15 1
+ %23 = OpTypeVector %9 2
+ %26 = OpTypeVector %9 4
+ %27 = OpTypePointer Function %26
+ %31 = OpTypePointer Function %9
+ %33 = OpConstant %9 0.00999999978
+ %34 = OpTypeBool
+ %35 = OpConstant %6 4
+ %36 = OpTypeArray %15 %35
+ %37 = OpTypeStruct %36
+ %38 = OpTypePointer Uniform %37
+ %39 = OpVariable %38 Uniform
+ %40 = OpConstant %15 2
+ %41 = OpTypePointer Uniform %15
+ %48 = OpConstant %15 3
+ %62 = OpConstant %15 4
+ %79 = OpConstant %15 5
+ %97 = OpConstant %15 6
+ %111 = OpTypePointer Output %26
+ %112 = OpVariable %111 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %28 = OpVariable %27 Function
+ %32 = OpVariable %31 Function
+ %18 = OpAccessChain %17 %14 %16 %16
+ %19 = OpLoad %9 %18
+ %21 = OpAccessChain %17 %14 %16 %20
+ %22 = OpLoad %9 %21
+ %24 = OpCompositeConstruct %23 %19 %22
+ %25 = OpExtInst %6 %1 PackUnorm2x16 %24
+ OpStore %8 %25
+ %29 = OpLoad %6 %8
+ %30 = OpExtInst %26 %1 UnpackSnorm4x8 %29
+ OpStore %28 %30
+ OpStore %32 %33
+ %42 = OpAccessChain %41 %39 %16 %40
+ %43 = OpLoad %15 %42
+ %44 = OpAccessChain %31 %28 %43
+ %45 = OpLoad %9 %44
+ %46 = OpAccessChain %17 %14 %16 %40
+ %47 = OpLoad %9 %46
+ %49 = OpAccessChain %17 %14 %16 %48
+ %50 = OpLoad %9 %49
+ %51 = OpFDiv %9 %47 %50
+ %52 = OpFSub %9 %45 %51
+ %53 = OpExtInst %9 %1 FAbs %52
+ %54 = OpLoad %9 %32
+ %55 = OpFOrdLessThan %34 %53 %54
+ OpSelectionMerge %57 None
+ OpBranchConditional %55 %56 %57
+ %56 = OpLabel
+ %58 = OpAccessChain %41 %39 %16 %20
+ %59 = OpLoad %15 %58
+ %60 = OpAccessChain %31 %28 %59
+ %61 = OpLoad %9 %60
+ %63 = OpAccessChain %17 %14 %16 %62
+ %64 = OpLoad %9 %63
+ %65 = OpAccessChain %17 %14 %16 %48
+ %66 = OpLoad %9 %65
+ %67 = OpFDiv %9 %64 %66
+ %68 = OpFSub %9 %61 %67
+ %69 = OpExtInst %9 %1 FAbs %68
+ %70 = OpLoad %9 %32
+ %71 = OpFOrdLessThan %34 %69 %70
+ OpBranch %57
+ %57 = OpLabel
+ %72 = OpPhi %34 %55 %5 %71 %56
+ OpSelectionMerge %74 None
+ OpBranchConditional %72 %73 %74
+ %73 = OpLabel
+ %75 = OpAccessChain %41 %39 %16 %48
+ %76 = OpLoad %15 %75
+ %77 = OpAccessChain %31 %28 %76
+ %78 = OpLoad %9 %77
+ %80 = OpAccessChain %17 %14 %16 %79
+ %81 = OpLoad %9 %80
+ %82 = OpFNegate %9 %81
+ %83 = OpAccessChain %17 %14 %16 %48
+ %84 = OpLoad %9 %83
+ %85 = OpFDiv %9 %82 %84
+ %86 = OpFSub %9 %78 %85
+ %87 = OpExtInst %9 %1 FAbs %86
+ %88 = OpLoad %9 %32
+ %89 = OpFOrdLessThan %34 %87 %88
+ OpBranch %74
+ %74 = OpLabel
+ %90 = OpPhi %34 %72 %57 %89 %73
+ OpSelectionMerge %92 None
+ OpBranchConditional %90 %91 %92
+ %91 = OpLabel
+ %93 = OpAccessChain %41 %39 %16 %16
+ %94 = OpLoad %15 %93
+ %95 = OpAccessChain %31 %28 %94
+ %96 = OpLoad %9 %95
+ %98 = OpAccessChain %17 %14 %16 %97
+ %99 = OpLoad %9 %98
+ %100 = OpFNegate %9 %99
+ %101 = OpAccessChain %17 %14 %16 %48
+ %102 = OpLoad %9 %101
+ %103 = OpFDiv %9 %100 %102
+ %104 = OpFSub %9 %96 %103
+ %105 = OpExtInst %9 %1 FAbs %104
+ %106 = OpLoad %9 %32
+ %107 = OpFOrdLessThan %34 %105 %106
+ OpBranch %92
+ %92 = OpLabel
+ %108 = OpPhi %34 %90 %74 %107 %91
+ OpSelectionMerge %110 None
+ OpBranchConditional %108 %109 %126
+ %109 = OpLabel
+ %113 = OpAccessChain %41 %39 %16 %20
+ %114 = OpLoad %15 %113
+ %115 = OpConvertSToF %9 %114
+ %116 = OpAccessChain %41 %39 %16 %40
+ %117 = OpLoad %15 %116
+ %118 = OpConvertSToF %9 %117
+ %119 = OpAccessChain %41 %39 %16 %40
+ %120 = OpLoad %15 %119
+ %121 = OpConvertSToF %9 %120
+ %122 = OpAccessChain %41 %39 %16 %20
+ %123 = OpLoad %15 %122
+ %124 = OpConvertSToF %9 %123
+ %125 = OpCompositeConstruct %26 %115 %118 %121 %124
+ OpStore %112 %125
+ OpBranch %110
+ %126 = OpLabel
+ %127 = OpAccessChain %17 %14 %16 %79
+ %128 = OpLoad %9 %127
+ %129 = OpCompositeConstruct %26 %128 %128 %128 %128
+ OpStore %112 %129
+ OpBranch %110
+ %110 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.25 0.75 0.0 127.0 64.0 1.0 65.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 3 1 0 2
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-select-findlsb-uaddcarry.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-select-findlsb-uaddcarry.amber
new file mode 100644
index 0000000..9449f60
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-select-findlsb-uaddcarry.amber
@@ -0,0 +1,415 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction combine select code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_10 _GLF_uniform_int_values[0]
+# #define _int_4 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _int_1 _GLF_uniform_int_values[3]
+# #define _int_2 _GLF_uniform_int_values[4]
+# #define _uint_0 _GLF_uniform_uint_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[1]
+# #define _uint_4294967294 _GLF_uniform_uint_values[1]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_uint_values: 0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# uint _GLF_uniform_uint_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [10, 4, 0, 1, 2]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[5];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.0]
+# layout(set = 0, binding = 2) uniform buf2
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of A: [0.0, 1.0]
+# layout(set = 0, binding = 3) uniform buf3
+# {
+# vec2 A;
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# float f1()
+# {
+# // Always false.
+# if (A.x > A.y)
+# {
+# // Always false.
+# if (gl_FragCoord.y < _float_0_0)
+# {
+# return _float_0_0;
+# }
+# }
+#
+# // Always false.
+# if (_float_0_0 > A.x)
+# {
+# // Always false.
+# if (A.x > A.y)
+# {
+# return _float_0_0;
+# }
+# }
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# // Always false.
+# if (gl_FragCoord.x < _float_0_0)
+# {
+# return _float_0_0;
+# }
+# }
+#
+# // Always returns 1.0.
+# return _float_1_0;
+# }
+#
+# void main()
+# {
+# float data[2];
+#
+# data[0] = 0.1;
+# data[1] = 0.2;
+#
+# // Loops over two times.
+# for (int j = _int_0; j < findLSB(_int_4); j++)
+# {
+# uint index = _uint_0;
+#
+# uaddCarry(uint(_int_2 * j), _uint_4294967294, index);
+# data[index] = f1() - float(index);
+# }
+#
+# _GLF_color = vec4(data[_int_0], data[_int_1], data[_int_1], data[_int_0]);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 170
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %30 %151
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "f1("
+ OpName %11 "buf3"
+ OpMemberName %11 0 "A"
+ OpName %13 ""
+ OpName %30 "gl_FragCoord"
+ OpName %36 "buf2"
+ OpMemberName %36 0 "_GLF_uniform_float_values"
+ OpName %38 ""
+ OpName %66 "i"
+ OpName %69 "buf1"
+ OpMemberName %69 0 "_GLF_uniform_int_values"
+ OpName %71 ""
+ OpName %102 "data"
+ OpName %108 "j"
+ OpName %122 "index"
+ OpName %124 "buf0"
+ OpMemberName %124 0 "_GLF_uniform_uint_values"
+ OpName %126 ""
+ OpName %138 "ResType"
+ OpName %151 "_GLF_color"
+ OpMemberDecorate %11 0 Offset 0
+ OpDecorate %11 Block
+ OpDecorate %13 DescriptorSet 0
+ OpDecorate %13 Binding 3
+ OpDecorate %30 BuiltIn FragCoord
+ OpDecorate %35 ArrayStride 16
+ OpMemberDecorate %36 0 Offset 0
+ OpDecorate %36 Block
+ OpDecorate %38 DescriptorSet 0
+ OpDecorate %38 Binding 2
+ OpDecorate %68 ArrayStride 16
+ OpMemberDecorate %69 0 Offset 0
+ OpDecorate %69 Block
+ OpDecorate %71 DescriptorSet 0
+ OpDecorate %71 Binding 1
+ OpDecorate %123 ArrayStride 16
+ OpMemberDecorate %124 0 Offset 0
+ OpDecorate %124 Block
+ OpDecorate %126 DescriptorSet 0
+ OpDecorate %126 Binding 0
+ OpDecorate %151 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeFunction %6
+ %10 = OpTypeVector %6 2
+ %11 = OpTypeStruct %10
+ %12 = OpTypePointer Uniform %11
+ %13 = OpVariable %12 Uniform
+ %14 = OpTypeInt 32 1
+ %15 = OpConstant %14 0
+ %16 = OpTypeInt 32 0
+ %17 = OpConstant %16 0
+ %18 = OpTypePointer Uniform %6
+ %21 = OpConstant %16 1
+ %24 = OpTypeBool
+ %28 = OpTypeVector %6 4
+ %29 = OpTypePointer Input %28
+ %30 = OpVariable %29 Input
+ %31 = OpTypePointer Input %6
+ %34 = OpConstant %16 2
+ %35 = OpTypeArray %6 %34
+ %36 = OpTypeStruct %35
+ %37 = OpTypePointer Uniform %36
+ %38 = OpVariable %37 Uniform
+ %39 = OpConstant %14 1
+ %65 = OpTypePointer Function %14
+ %67 = OpConstant %16 5
+ %68 = OpTypeArray %14 %67
+ %69 = OpTypeStruct %68
+ %70 = OpTypePointer Uniform %69
+ %71 = OpVariable %70 Uniform
+ %72 = OpConstant %14 2
+ %73 = OpTypePointer Uniform %14
+ %101 = OpTypePointer Function %35
+ %103 = OpConstant %6 0.100000001
+ %104 = OpTypePointer Function %6
+ %106 = OpConstant %6 0.200000003
+ %121 = OpTypePointer Function %16
+ %123 = OpTypeArray %16 %34
+ %124 = OpTypeStruct %123
+ %125 = OpTypePointer Uniform %124
+ %126 = OpVariable %125 Uniform
+ %127 = OpTypePointer Uniform %16
+ %130 = OpConstant %14 4
+ %138 = OpTypeStruct %16 %16
+ %150 = OpTypePointer Output %28
+ %151 = OpVariable %150 Output
+ %156 = OpConstant %14 3
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %102 = OpVariable %101 Function
+ %108 = OpVariable %65 Function
+ %122 = OpVariable %121 Function
+ %105 = OpAccessChain %104 %102 %15
+ OpStore %105 %103
+ %107 = OpAccessChain %104 %102 %39
+ OpStore %107 %106
+ %109 = OpAccessChain %73 %71 %15 %72
+ %110 = OpLoad %14 %109
+ OpStore %108 %110
+ OpBranch %111
+ %111 = OpLabel
+ OpLoopMerge %113 %114 None
+ OpBranch %115
+ %115 = OpLabel
+ %116 = OpLoad %14 %108
+ %117 = OpAccessChain %73 %71 %15 %39
+ %118 = OpLoad %14 %117
+ %119 = OpExtInst %14 %1 FindILsb %118
+ %120 = OpSLessThan %24 %116 %119
+ OpBranchConditional %120 %112 %113
+ %112 = OpLabel
+ %128 = OpAccessChain %127 %126 %15 %15
+ %129 = OpLoad %16 %128
+ OpStore %122 %129
+ %131 = OpAccessChain %73 %71 %15 %130
+ %132 = OpLoad %14 %131
+ %133 = OpLoad %14 %108
+ %134 = OpIMul %14 %132 %133
+ %135 = OpBitcast %16 %134
+ %136 = OpAccessChain %127 %126 %15 %39
+ %137 = OpLoad %16 %136
+ %139 = OpIAddCarry %138 %135 %137
+ %140 = OpCompositeExtract %16 %139 1
+ OpStore %122 %140
+ %141 = OpCompositeExtract %16 %139 0
+ %142 = OpLoad %16 %122
+ %143 = OpFunctionCall %6 %8
+ %144 = OpLoad %16 %122
+ %145 = OpConvertUToF %6 %144
+ %146 = OpFSub %6 %143 %145
+ %147 = OpAccessChain %104 %102 %142
+ OpStore %147 %146
+ OpBranch %114
+ %114 = OpLabel
+ %148 = OpLoad %14 %108
+ %149 = OpIAdd %14 %148 %39
+ OpStore %108 %149
+ OpBranch %111
+ %113 = OpLabel
+ %152 = OpAccessChain %73 %71 %15 %72
+ %153 = OpLoad %14 %152
+ %154 = OpAccessChain %104 %102 %153
+ %155 = OpLoad %6 %154
+ %157 = OpAccessChain %73 %71 %15 %156
+ %158 = OpLoad %14 %157
+ %159 = OpAccessChain %104 %102 %158
+ %160 = OpLoad %6 %159
+ %161 = OpAccessChain %73 %71 %15 %156
+ %162 = OpLoad %14 %161
+ %163 = OpAccessChain %104 %102 %162
+ %164 = OpLoad %6 %163
+ %165 = OpAccessChain %73 %71 %15 %72
+ %166 = OpLoad %14 %165
+ %167 = OpAccessChain %104 %102 %166
+ %168 = OpLoad %6 %167
+ %169 = OpCompositeConstruct %28 %155 %160 %164 %168
+ OpStore %151 %169
+ OpReturn
+ OpFunctionEnd
+ %8 = OpFunction %6 None %7
+ %9 = OpLabel
+ %66 = OpVariable %65 Function
+ %19 = OpAccessChain %18 %13 %15 %17
+ %20 = OpLoad %6 %19
+ %22 = OpAccessChain %18 %13 %15 %21
+ %23 = OpLoad %6 %22
+ %25 = OpFOrdGreaterThan %24 %20 %23
+ OpSelectionMerge %27 None
+ OpBranchConditional %25 %26 %27
+ %26 = OpLabel
+ %32 = OpAccessChain %31 %30 %21
+ %33 = OpLoad %6 %32
+ %40 = OpAccessChain %18 %38 %15 %39
+ %41 = OpLoad %6 %40
+ %42 = OpFOrdLessThan %24 %33 %41
+ OpSelectionMerge %44 None
+ OpBranchConditional %42 %43 %44
+ %43 = OpLabel
+ %45 = OpAccessChain %18 %38 %15 %39
+ %46 = OpLoad %6 %45
+ OpReturnValue %46
+ %44 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ %48 = OpAccessChain %18 %38 %15 %39
+ %49 = OpLoad %6 %48
+ %50 = OpAccessChain %18 %13 %15 %17
+ %51 = OpLoad %6 %50
+ %52 = OpFOrdGreaterThan %24 %49 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %54
+ %53 = OpLabel
+ %55 = OpAccessChain %18 %13 %15 %17
+ %56 = OpLoad %6 %55
+ %57 = OpAccessChain %18 %13 %15 %21
+ %58 = OpLoad %6 %57
+ %59 = OpFOrdGreaterThan %24 %56 %58
+ OpSelectionMerge %61 None
+ OpBranchConditional %59 %60 %61
+ %60 = OpLabel
+ %62 = OpAccessChain %18 %38 %15 %39
+ %63 = OpLoad %6 %62
+ OpReturnValue %63
+ %61 = OpLabel
+ OpBranch %54
+ %54 = OpLabel
+ %74 = OpAccessChain %73 %71 %15 %72
+ %75 = OpLoad %14 %74
+ OpStore %66 %75
+ OpBranch %76
+ %76 = OpLabel
+ OpLoopMerge %78 %79 None
+ OpBranch %80
+ %80 = OpLabel
+ %81 = OpLoad %14 %66
+ %82 = OpAccessChain %73 %71 %15 %15
+ %83 = OpLoad %14 %82
+ %84 = OpSLessThan %24 %81 %83
+ OpBranchConditional %84 %77 %78
+ %77 = OpLabel
+ %85 = OpAccessChain %31 %30 %17
+ %86 = OpLoad %6 %85
+ %87 = OpAccessChain %18 %38 %15 %39
+ %88 = OpLoad %6 %87
+ %89 = OpFOrdLessThan %24 %86 %88
+ OpSelectionMerge %91 None
+ OpBranchConditional %89 %90 %91
+ %90 = OpLabel
+ %92 = OpAccessChain %18 %38 %15 %39
+ %93 = OpLoad %6 %92
+ OpReturnValue %93
+ %91 = OpLabel
+ OpBranch %79
+ %79 = OpLabel
+ %95 = OpLoad %14 %66
+ %96 = OpIAdd %14 %95 %39
+ OpStore %66 %96
+ OpBranch %76
+ %78 = OpLabel
+ %97 = OpAccessChain %18 %38 %15 %15
+ %98 = OpLoad %6 %97
+ OpReturnValue %98
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# A
+BUFFER variant_A DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 10 4 0 1 2
+END
+# _GLF_uniform_uint_values
+BUFFER variant__GLF_uniform_uint_values DATA_TYPE int32[] STD140 DATA
+ 0 4294967294
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_A AS uniform DESCRIPTOR_SET 0 BINDING 3
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 2
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_uint_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-shifts-bitfield-bitcount.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-shifts-bitfield-bitcount.amber
new file mode 100644
index 0000000..dd85566
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-shifts-bitfield-bitcount.amber
@@ -0,0 +1,161 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction combine shifts code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // Always zero.
+# int i = bitfieldExtract(_int_0, bitCount(0), _int_1);
+#
+# if (i == _int_0)
+# {
+# _GLF_color = vec4(_int_1, i, i, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(i);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 50
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %34
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "i"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %34 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %19 RelaxedPrecision
+ OpDecorate %34 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 2
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpTypePointer Uniform %6
+ %20 = OpConstant %6 1
+ %27 = OpTypeBool
+ %31 = OpTypeFloat 32
+ %32 = OpTypeVector %31 4
+ %33 = OpTypePointer Output %32
+ %34 = OpVariable %33 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %17 = OpAccessChain %16 %14 %15 %15
+ %18 = OpLoad %6 %17
+ %19 = OpBitCount %6 %15
+ %21 = OpAccessChain %16 %14 %15 %20
+ %22 = OpLoad %6 %21
+ %23 = OpBitFieldSExtract %6 %18 %19 %22
+ OpStore %8 %23
+ %24 = OpLoad %6 %8
+ %25 = OpAccessChain %16 %14 %15 %15
+ %26 = OpLoad %6 %25
+ %28 = OpIEqual %27 %24 %26
+ OpSelectionMerge %30 None
+ OpBranchConditional %28 %29 %46
+ %29 = OpLabel
+ %35 = OpAccessChain %16 %14 %15 %20
+ %36 = OpLoad %6 %35
+ %37 = OpConvertSToF %31 %36
+ %38 = OpLoad %6 %8
+ %39 = OpConvertSToF %31 %38
+ %40 = OpLoad %6 %8
+ %41 = OpConvertSToF %31 %40
+ %42 = OpAccessChain %16 %14 %15 %20
+ %43 = OpLoad %6 %42
+ %44 = OpConvertSToF %31 %43
+ %45 = OpCompositeConstruct %32 %37 %39 %41 %44
+ OpStore %34 %45
+ OpBranch %30
+ %46 = OpLabel
+ %47 = OpLoad %6 %8
+ %48 = OpConvertSToF %31 %47
+ %49 = OpCompositeConstruct %32 %48 %48 %48 %48
+ OpStore %34 %49
+ OpBranch %30
+ %30 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp.amber
new file mode 100644
index 0000000..c879660
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp.amber
@@ -0,0 +1,313 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction combine shifts code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_2 _GLF_uniform_int_values[1]
+# #define _int_0 _GLF_uniform_int_values[2]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [1, 2, 0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int A[2];
+# A[_int_0] = _int_1;
+# A[_int_1] = _int_2;
+#
+# int i = _int_1;
+# while (i > _int_0)
+# {
+# i--;
+# }
+#
+# int a = A[((_float_0_0 >= _float_0_0) ? 1 : i)];
+#
+# // v1 becomes vec2(1, 1).
+# vec2 v1 = mix(vec2(_int_1, a), vec2(_int_1, _int_1), bvec2((_float_0_0 < _float_1_0), true));
+#
+# // v2 becomes vec2(1, 1).
+# vec2 v2 = mix(vec2(v1[_int_0]), vec2(v1[_int_1]), bvec2(false));
+#
+# int b = A[int(clamp(vec2(_int_2), vec2(_int_1), v2).x)];
+#
+# if (b == _int_2)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 146
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %127
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "A"
+ OpName %14 "buf1"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpName %32 "i"
+ OpName %47 "a"
+ OpName %50 "buf0"
+ OpMemberName %50 0 "_GLF_uniform_float_values"
+ OpName %52 ""
+ OpName %65 "v1"
+ OpName %88 "v2"
+ OpName %103 "b"
+ OpName %127 "_GLF_color"
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 1
+ OpDecorate %49 ArrayStride 16
+ OpMemberDecorate %50 0 Offset 0
+ OpDecorate %50 Block
+ OpDecorate %52 DescriptorSet 0
+ OpDecorate %52 Binding 0
+ OpDecorate %127 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeInt 32 0
+ %8 = OpConstant %7 2
+ %9 = OpTypeArray %6 %8
+ %10 = OpTypePointer Function %9
+ %12 = OpConstant %7 3
+ %13 = OpTypeArray %6 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %6 0
+ %18 = OpConstant %6 2
+ %19 = OpTypePointer Uniform %6
+ %24 = OpTypePointer Function %6
+ %28 = OpConstant %6 1
+ %43 = OpTypeBool
+ %48 = OpTypeFloat 32
+ %49 = OpTypeArray %48 %8
+ %50 = OpTypeStruct %49
+ %51 = OpTypePointer Uniform %50
+ %52 = OpVariable %51 Uniform
+ %53 = OpTypePointer Uniform %48
+ %63 = OpTypeVector %48 2
+ %64 = OpTypePointer Function %63
+ %84 = OpConstantTrue %43
+ %85 = OpTypeVector %43 2
+ %91 = OpTypePointer Function %48
+ %100 = OpConstantFalse %43
+ %101 = OpConstantComposite %85 %100 %100
+ %114 = OpConstant %7 0
+ %125 = OpTypeVector %48 4
+ %126 = OpTypePointer Output %125
+ %127 = OpVariable %126 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %11 = OpVariable %10 Function
+ %32 = OpVariable %24 Function
+ %47 = OpVariable %24 Function
+ %65 = OpVariable %64 Function
+ %88 = OpVariable %64 Function
+ %103 = OpVariable %24 Function
+ %20 = OpAccessChain %19 %16 %17 %18
+ %21 = OpLoad %6 %20
+ %22 = OpAccessChain %19 %16 %17 %17
+ %23 = OpLoad %6 %22
+ %25 = OpAccessChain %24 %11 %21
+ OpStore %25 %23
+ %26 = OpAccessChain %19 %16 %17 %17
+ %27 = OpLoad %6 %26
+ %29 = OpAccessChain %19 %16 %17 %28
+ %30 = OpLoad %6 %29
+ %31 = OpAccessChain %24 %11 %27
+ OpStore %31 %30
+ %33 = OpAccessChain %19 %16 %17 %17
+ %34 = OpLoad %6 %33
+ OpStore %32 %34
+ OpBranch %35
+ %35 = OpLabel
+ OpLoopMerge %37 %38 None
+ OpBranch %39
+ %39 = OpLabel
+ %40 = OpLoad %6 %32
+ %41 = OpAccessChain %19 %16 %17 %18
+ %42 = OpLoad %6 %41
+ %44 = OpSGreaterThan %43 %40 %42
+ OpBranchConditional %44 %36 %37
+ %36 = OpLabel
+ %45 = OpLoad %6 %32
+ %46 = OpISub %6 %45 %28
+ OpStore %32 %46
+ OpBranch %38
+ %38 = OpLabel
+ OpBranch %35
+ %37 = OpLabel
+ %54 = OpAccessChain %53 %52 %17 %28
+ %55 = OpLoad %48 %54
+ %56 = OpAccessChain %53 %52 %17 %28
+ %57 = OpLoad %48 %56
+ %58 = OpFOrdGreaterThanEqual %43 %55 %57
+ %59 = OpLoad %6 %32
+ %60 = OpSelect %6 %58 %28 %59
+ %61 = OpAccessChain %24 %11 %60
+ %62 = OpLoad %6 %61
+ OpStore %47 %62
+ %66 = OpAccessChain %19 %16 %17 %17
+ %67 = OpLoad %6 %66
+ %68 = OpConvertSToF %48 %67
+ %69 = OpLoad %6 %47
+ %70 = OpConvertSToF %48 %69
+ %71 = OpCompositeConstruct %63 %68 %70
+ %72 = OpAccessChain %19 %16 %17 %17
+ %73 = OpLoad %6 %72
+ %74 = OpConvertSToF %48 %73
+ %75 = OpAccessChain %19 %16 %17 %17
+ %76 = OpLoad %6 %75
+ %77 = OpConvertSToF %48 %76
+ %78 = OpCompositeConstruct %63 %74 %77
+ %79 = OpAccessChain %53 %52 %17 %28
+ %80 = OpLoad %48 %79
+ %81 = OpAccessChain %53 %52 %17 %17
+ %82 = OpLoad %48 %81
+ %83 = OpFOrdLessThan %43 %80 %82
+ %86 = OpCompositeConstruct %85 %83 %84
+ %87 = OpSelect %63 %86 %78 %71
+ OpStore %65 %87
+ %89 = OpAccessChain %19 %16 %17 %18
+ %90 = OpLoad %6 %89
+ %92 = OpAccessChain %91 %65 %90
+ %93 = OpLoad %48 %92
+ %94 = OpCompositeConstruct %63 %93 %93
+ %95 = OpAccessChain %19 %16 %17 %17
+ %96 = OpLoad %6 %95
+ %97 = OpAccessChain %91 %65 %96
+ %98 = OpLoad %48 %97
+ %99 = OpCompositeConstruct %63 %98 %98
+ %102 = OpSelect %63 %101 %99 %94
+ OpStore %88 %102
+ %104 = OpAccessChain %19 %16 %17 %28
+ %105 = OpLoad %6 %104
+ %106 = OpConvertSToF %48 %105
+ %107 = OpCompositeConstruct %63 %106 %106
+ %108 = OpAccessChain %19 %16 %17 %17
+ %109 = OpLoad %6 %108
+ %110 = OpConvertSToF %48 %109
+ %111 = OpCompositeConstruct %63 %110 %110
+ %112 = OpLoad %63 %88
+ %113 = OpExtInst %63 %1 FClamp %107 %111 %112
+ %115 = OpCompositeExtract %48 %113 0
+ %116 = OpConvertFToS %6 %115
+ %117 = OpAccessChain %24 %11 %116
+ %118 = OpLoad %6 %117
+ OpStore %103 %118
+ %119 = OpLoad %6 %103
+ %120 = OpAccessChain %19 %16 %17 %28
+ %121 = OpLoad %6 %120
+ %122 = OpIEqual %43 %119 %121
+ OpSelectionMerge %124 None
+ OpBranchConditional %122 %123 %141
+ %123 = OpLabel
+ %128 = OpAccessChain %19 %16 %17 %17
+ %129 = OpLoad %6 %128
+ %130 = OpConvertSToF %48 %129
+ %131 = OpAccessChain %19 %16 %17 %18
+ %132 = OpLoad %6 %131
+ %133 = OpConvertSToF %48 %132
+ %134 = OpAccessChain %19 %16 %17 %18
+ %135 = OpLoad %6 %134
+ %136 = OpConvertSToF %48 %135
+ %137 = OpAccessChain %19 %16 %17 %17
+ %138 = OpLoad %6 %137
+ %139 = OpConvertSToF %48 %138
+ %140 = OpCompositeConstruct %125 %130 %133 %136 %139
+ OpStore %127 %140
+ OpBranch %124
+ %141 = OpLabel
+ %142 = OpAccessChain %19 %16 %17 %18
+ %143 = OpLoad %6 %142
+ %144 = OpConvertSToF %48 %143
+ %145 = OpCompositeConstruct %125 %144 %144 %144 %144
+ OpStore %127 %145
+ OpBranch %124
+ %124 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 2 0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack.amber
new file mode 100644
index 0000000..9d889fc
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack.amber
@@ -0,0 +1,281 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers a specific instruction combine simplify demanded code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_2 _GLF_uniform_int_values[2]
+# #define _int_3 _GLF_uniform_int_values[3]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_127_0 _GLF_uniform_float_values[1]
+# #define _float_60_0 _GLF_uniform_float_values[2]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 127.0, 60.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [1, 0, 2, 3]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // Converts the two 32-bit floating-point quantities to 16-bit quantities
+# // and packs them into a 32-bit unsigned integer of 1006648320.
+# uint a = packHalf2x16(vec2(1.0));
+#
+# // Unpacks the integer into 8-bit signed integers of values 0.0, 60.0, 0.0 and 60.0.
+# // Then converts them into normalized floating-point numbers by dividing 127.0.
+# vec4 v1 = unpackSnorm4x8(a);
+#
+# float E = 0.01;
+# if (abs(v1[_int_0] - (_float_0_0 / _float_127_0)) < E
+# && abs(v1[_int_1] - (_float_60_0 / _float_127_0)) < E
+# && abs(v1[_int_2] - (_float_0_0 / _float_127_0)) < E
+# && abs(v1[_int_3] - (_float_60_0 / _float_127_0)) < E)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(v1[_int_0]);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 124
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %104
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %16 "v1"
+ OpName %20 "E"
+ OpName %26 "buf1"
+ OpMemberName %26 0 "_GLF_uniform_int_values"
+ OpName %28 ""
+ OpName %38 "buf0"
+ OpMemberName %38 0 "_GLF_uniform_float_values"
+ OpName %40 ""
+ OpName %104 "_GLF_color"
+ OpDecorate %25 ArrayStride 16
+ OpMemberDecorate %26 0 Offset 0
+ OpDecorate %26 Block
+ OpDecorate %28 DescriptorSet 0
+ OpDecorate %28 Binding 1
+ OpDecorate %37 ArrayStride 16
+ OpMemberDecorate %38 0 Offset 0
+ OpDecorate %38 Block
+ OpDecorate %40 DescriptorSet 0
+ OpDecorate %40 Binding 0
+ OpDecorate %104 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 0
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeFloat 32
+ %10 = OpTypeVector %9 2
+ %11 = OpConstant %9 1
+ %12 = OpConstantComposite %10 %11 %11
+ %14 = OpTypeVector %9 4
+ %15 = OpTypePointer Function %14
+ %19 = OpTypePointer Function %9
+ %21 = OpConstant %9 0.00999999978
+ %22 = OpTypeBool
+ %23 = OpTypeInt 32 1
+ %24 = OpConstant %6 4
+ %25 = OpTypeArray %23 %24
+ %26 = OpTypeStruct %25
+ %27 = OpTypePointer Uniform %26
+ %28 = OpVariable %27 Uniform
+ %29 = OpConstant %23 0
+ %30 = OpConstant %23 1
+ %31 = OpTypePointer Uniform %23
+ %36 = OpConstant %6 3
+ %37 = OpTypeArray %9 %36
+ %38 = OpTypeStruct %37
+ %39 = OpTypePointer Uniform %38
+ %40 = OpVariable %39 Uniform
+ %41 = OpTypePointer Uniform %9
+ %57 = OpConstant %23 2
+ %86 = OpConstant %23 3
+ %103 = OpTypePointer Output %14
+ %104 = OpVariable %103 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %16 = OpVariable %15 Function
+ %20 = OpVariable %19 Function
+ %13 = OpExtInst %6 %1 PackHalf2x16 %12
+ OpStore %8 %13
+ %17 = OpLoad %6 %8
+ %18 = OpExtInst %14 %1 UnpackSnorm4x8 %17
+ OpStore %16 %18
+ OpStore %20 %21
+ %32 = OpAccessChain %31 %28 %29 %30
+ %33 = OpLoad %23 %32
+ %34 = OpAccessChain %19 %16 %33
+ %35 = OpLoad %9 %34
+ %42 = OpAccessChain %41 %40 %29 %29
+ %43 = OpLoad %9 %42
+ %44 = OpAccessChain %41 %40 %29 %30
+ %45 = OpLoad %9 %44
+ %46 = OpFDiv %9 %43 %45
+ %47 = OpFSub %9 %35 %46
+ %48 = OpExtInst %9 %1 FAbs %47
+ %49 = OpLoad %9 %20
+ %50 = OpFOrdLessThan %22 %48 %49
+ OpSelectionMerge %52 None
+ OpBranchConditional %50 %51 %52
+ %51 = OpLabel
+ %53 = OpAccessChain %31 %28 %29 %29
+ %54 = OpLoad %23 %53
+ %55 = OpAccessChain %19 %16 %54
+ %56 = OpLoad %9 %55
+ %58 = OpAccessChain %41 %40 %29 %57
+ %59 = OpLoad %9 %58
+ %60 = OpAccessChain %41 %40 %29 %30
+ %61 = OpLoad %9 %60
+ %62 = OpFDiv %9 %59 %61
+ %63 = OpFSub %9 %56 %62
+ %64 = OpExtInst %9 %1 FAbs %63
+ %65 = OpLoad %9 %20
+ %66 = OpFOrdLessThan %22 %64 %65
+ OpBranch %52
+ %52 = OpLabel
+ %67 = OpPhi %22 %50 %5 %66 %51
+ OpSelectionMerge %69 None
+ OpBranchConditional %67 %68 %69
+ %68 = OpLabel
+ %70 = OpAccessChain %31 %28 %29 %57
+ %71 = OpLoad %23 %70
+ %72 = OpAccessChain %19 %16 %71
+ %73 = OpLoad %9 %72
+ %74 = OpAccessChain %41 %40 %29 %29
+ %75 = OpLoad %9 %74
+ %76 = OpAccessChain %41 %40 %29 %30
+ %77 = OpLoad %9 %76
+ %78 = OpFDiv %9 %75 %77
+ %79 = OpFSub %9 %73 %78
+ %80 = OpExtInst %9 %1 FAbs %79
+ %81 = OpLoad %9 %20
+ %82 = OpFOrdLessThan %22 %80 %81
+ OpBranch %69
+ %69 = OpLabel
+ %83 = OpPhi %22 %67 %52 %82 %68
+ OpSelectionMerge %85 None
+ OpBranchConditional %83 %84 %85
+ %84 = OpLabel
+ %87 = OpAccessChain %31 %28 %29 %86
+ %88 = OpLoad %23 %87
+ %89 = OpAccessChain %19 %16 %88
+ %90 = OpLoad %9 %89
+ %91 = OpAccessChain %41 %40 %29 %57
+ %92 = OpLoad %9 %91
+ %93 = OpAccessChain %41 %40 %29 %30
+ %94 = OpLoad %9 %93
+ %95 = OpFDiv %9 %92 %94
+ %96 = OpFSub %9 %90 %95
+ %97 = OpExtInst %9 %1 FAbs %96
+ %98 = OpLoad %9 %20
+ %99 = OpFOrdLessThan %22 %97 %98
+ OpBranch %85
+ %85 = OpLabel
+ %100 = OpPhi %22 %83 %69 %99 %84
+ OpSelectionMerge %102 None
+ OpBranchConditional %100 %101 %118
+ %101 = OpLabel
+ %105 = OpAccessChain %31 %28 %29 %29
+ %106 = OpLoad %23 %105
+ %107 = OpConvertSToF %9 %106
+ %108 = OpAccessChain %31 %28 %29 %30
+ %109 = OpLoad %23 %108
+ %110 = OpConvertSToF %9 %109
+ %111 = OpAccessChain %31 %28 %29 %30
+ %112 = OpLoad %23 %111
+ %113 = OpConvertSToF %9 %112
+ %114 = OpAccessChain %31 %28 %29 %29
+ %115 = OpLoad %23 %114
+ %116 = OpConvertSToF %9 %115
+ %117 = OpCompositeConstruct %14 %107 %110 %113 %116
+ OpStore %104 %117
+ OpBranch %102
+ %118 = OpLabel
+ %119 = OpAccessChain %31 %28 %29 %30
+ %120 = OpLoad %23 %119
+ %121 = OpAccessChain %19 %16 %120
+ %122 = OpLoad %9 %121
+ %123 = OpCompositeConstruct %14 %122 %122 %122 %122
+ OpStore %104 %123
+ OpBranch %102
+ %102 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0 2 3
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 127.0 60.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm.amber
new file mode 100644
index 0000000..8baff2d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm.amber
@@ -0,0 +1,280 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers a specific instruction combine simplify demanded code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_3 _GLF_uniform_int_values[2]
+# #define _int_2 _GLF_uniform_int_values[3]
+# #define _float_0_01 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+# #define _float_127_0 _GLF_uniform_float_values[2]
+# #define _float_255_0 _GLF_uniform_float_values[3]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0, 3, 2]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [0.01, 1.0, 127.0, 255.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // Converts the components into signed 8-bit integers and packs the result
+# // into an unsigned integer of 2139062143.
+# uint a = packSnorm4x8(vec4(_float_1_0));
+#
+# // Unpacks the integer into four 8-bit unsigned integers and converts
+# // them into a floating-point value of 0.5.
+# vec4 v1 = unpackUnorm4x8(a);
+#
+# float E = _float_0_01;
+# if (abs(v1[_int_0] - (_float_127_0/_float_255_0)) < E &&
+# abs(v1[_int_1] - (_float_127_0/_float_255_0)) < E &&
+# abs(v1[_int_2] - (_float_127_0/_float_255_0)) < E &&
+# abs(v1[_int_3] - (_float_127_0/_float_255_0)) < E)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 123
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %104
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %25 "v1"
+ OpName %29 "E"
+ OpName %34 "buf0"
+ OpMemberName %34 0 "_GLF_uniform_int_values"
+ OpName %36 ""
+ OpName %104 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %33 ArrayStride 16
+ OpMemberDecorate %34 0 Offset 0
+ OpDecorate %34 Block
+ OpDecorate %36 DescriptorSet 0
+ OpDecorate %36 Binding 0
+ OpDecorate %104 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 0
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeFloat 32
+ %10 = OpConstant %6 4
+ %11 = OpTypeArray %9 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpConstant %15 1
+ %18 = OpTypePointer Uniform %9
+ %21 = OpTypeVector %9 4
+ %24 = OpTypePointer Function %21
+ %28 = OpTypePointer Function %9
+ %32 = OpTypeBool
+ %33 = OpTypeArray %15 %10
+ %34 = OpTypeStruct %33
+ %35 = OpTypePointer Uniform %34
+ %36 = OpVariable %35 Uniform
+ %37 = OpTypePointer Uniform %15
+ %42 = OpConstant %15 2
+ %45 = OpConstant %15 3
+ %103 = OpTypePointer Output %21
+ %104 = OpVariable %103 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %25 = OpVariable %24 Function
+ %29 = OpVariable %28 Function
+ %19 = OpAccessChain %18 %14 %16 %17
+ %20 = OpLoad %9 %19
+ %22 = OpCompositeConstruct %21 %20 %20 %20 %20
+ %23 = OpExtInst %6 %1 PackSnorm4x8 %22
+ OpStore %8 %23
+ %26 = OpLoad %6 %8
+ %27 = OpExtInst %21 %1 UnpackUnorm4x8 %26
+ OpStore %25 %27
+ %30 = OpAccessChain %18 %14 %16 %16
+ %31 = OpLoad %9 %30
+ OpStore %29 %31
+ %38 = OpAccessChain %37 %36 %16 %17
+ %39 = OpLoad %15 %38
+ %40 = OpAccessChain %28 %25 %39
+ %41 = OpLoad %9 %40
+ %43 = OpAccessChain %18 %14 %16 %42
+ %44 = OpLoad %9 %43
+ %46 = OpAccessChain %18 %14 %16 %45
+ %47 = OpLoad %9 %46
+ %48 = OpFDiv %9 %44 %47
+ %49 = OpFSub %9 %41 %48
+ %50 = OpExtInst %9 %1 FAbs %49
+ %51 = OpLoad %9 %29
+ %52 = OpFOrdLessThan %32 %50 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %54
+ %53 = OpLabel
+ %55 = OpAccessChain %37 %36 %16 %16
+ %56 = OpLoad %15 %55
+ %57 = OpAccessChain %28 %25 %56
+ %58 = OpLoad %9 %57
+ %59 = OpAccessChain %18 %14 %16 %42
+ %60 = OpLoad %9 %59
+ %61 = OpAccessChain %18 %14 %16 %45
+ %62 = OpLoad %9 %61
+ %63 = OpFDiv %9 %60 %62
+ %64 = OpFSub %9 %58 %63
+ %65 = OpExtInst %9 %1 FAbs %64
+ %66 = OpLoad %9 %29
+ %67 = OpFOrdLessThan %32 %65 %66
+ OpBranch %54
+ %54 = OpLabel
+ %68 = OpPhi %32 %52 %5 %67 %53
+ OpSelectionMerge %70 None
+ OpBranchConditional %68 %69 %70
+ %69 = OpLabel
+ %71 = OpAccessChain %37 %36 %16 %45
+ %72 = OpLoad %15 %71
+ %73 = OpAccessChain %28 %25 %72
+ %74 = OpLoad %9 %73
+ %75 = OpAccessChain %18 %14 %16 %42
+ %76 = OpLoad %9 %75
+ %77 = OpAccessChain %18 %14 %16 %45
+ %78 = OpLoad %9 %77
+ %79 = OpFDiv %9 %76 %78
+ %80 = OpFSub %9 %74 %79
+ %81 = OpExtInst %9 %1 FAbs %80
+ %82 = OpLoad %9 %29
+ %83 = OpFOrdLessThan %32 %81 %82
+ OpBranch %70
+ %70 = OpLabel
+ %84 = OpPhi %32 %68 %54 %83 %69
+ OpSelectionMerge %86 None
+ OpBranchConditional %84 %85 %86
+ %85 = OpLabel
+ %87 = OpAccessChain %37 %36 %16 %42
+ %88 = OpLoad %15 %87
+ %89 = OpAccessChain %28 %25 %88
+ %90 = OpLoad %9 %89
+ %91 = OpAccessChain %18 %14 %16 %42
+ %92 = OpLoad %9 %91
+ %93 = OpAccessChain %18 %14 %16 %45
+ %94 = OpLoad %9 %93
+ %95 = OpFDiv %9 %92 %94
+ %96 = OpFSub %9 %90 %95
+ %97 = OpExtInst %9 %1 FAbs %96
+ %98 = OpLoad %9 %29
+ %99 = OpFOrdLessThan %32 %97 %98
+ OpBranch %86
+ %86 = OpLabel
+ %100 = OpPhi %32 %84 %70 %99 %85
+ OpSelectionMerge %102 None
+ OpBranchConditional %100 %101 %118
+ %101 = OpLabel
+ %105 = OpAccessChain %37 %36 %16 %16
+ %106 = OpLoad %15 %105
+ %107 = OpConvertSToF %9 %106
+ %108 = OpAccessChain %37 %36 %16 %17
+ %109 = OpLoad %15 %108
+ %110 = OpConvertSToF %9 %109
+ %111 = OpAccessChain %37 %36 %16 %17
+ %112 = OpLoad %15 %111
+ %113 = OpConvertSToF %9 %112
+ %114 = OpAccessChain %37 %36 %16 %16
+ %115 = OpLoad %15 %114
+ %116 = OpConvertSToF %9 %115
+ %117 = OpCompositeConstruct %21 %107 %110 %113 %116
+ OpStore %104 %117
+ OpBranch %102
+ %118 = OpLabel
+ %119 = OpAccessChain %37 %36 %16 %17
+ %120 = OpLoad %15 %119
+ %121 = OpConvertSToF %9 %120
+ %122 = OpCompositeConstruct %21 %121 %121 %121 %121
+ OpStore %104 %122
+ OpBranch %102
+ %102 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.01 1.0 127.0 255.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0 3 2
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor.amber
new file mode 100644
index 0000000..9c9186a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor.amber
@@ -0,0 +1,178 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine simplify demanded path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# vec4 color = vec4(_float_0_0, _float_0_0, _float_0_0, _float_1_0);
+# switch ((1 | _int_1) ^ 1)
+# {
+# case 0:
+# color[_int_0] = _float_1_0;
+# break;
+# }
+#
+# _GLF_color = color;
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 51
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %49
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "color"
+ OpName %13 "buf0"
+ OpMemberName %13 0 "_GLF_uniform_float_values"
+ OpName %15 ""
+ OpName %30 "buf1"
+ OpMemberName %30 0 "_GLF_uniform_int_values"
+ OpName %32 ""
+ OpName %49 "_GLF_color"
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 0
+ OpDecorate %29 ArrayStride 16
+ OpMemberDecorate %30 0 Offset 0
+ OpDecorate %30 Block
+ OpDecorate %32 DescriptorSet 0
+ OpDecorate %32 Binding 1
+ OpDecorate %49 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeInt 32 0
+ %11 = OpConstant %10 2
+ %12 = OpTypeArray %6 %11
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpTypeInt 32 1
+ %17 = OpConstant %16 0
+ %18 = OpTypePointer Uniform %6
+ %25 = OpConstant %16 1
+ %29 = OpTypeArray %16 %11
+ %30 = OpTypeStruct %29
+ %31 = OpTypePointer Uniform %30
+ %32 = OpVariable %31 Uniform
+ %33 = OpTypePointer Uniform %16
+ %44 = OpTypePointer Function %6
+ %48 = OpTypePointer Output %7
+ %49 = OpVariable %48 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %19 = OpAccessChain %18 %15 %17 %17
+ %20 = OpLoad %6 %19
+ %21 = OpAccessChain %18 %15 %17 %17
+ %22 = OpLoad %6 %21
+ %23 = OpAccessChain %18 %15 %17 %17
+ %24 = OpLoad %6 %23
+ %26 = OpAccessChain %18 %15 %17 %25
+ %27 = OpLoad %6 %26
+ %28 = OpCompositeConstruct %7 %20 %22 %24 %27
+ OpStore %9 %28
+ %34 = OpAccessChain %33 %32 %17 %25
+ %35 = OpLoad %16 %34
+ %36 = OpBitwiseOr %16 %25 %35
+ %37 = OpBitwiseXor %16 %36 %25
+ OpSelectionMerge %39 None
+ OpSwitch %37 %39 0 %38
+ %38 = OpLabel
+ %40 = OpAccessChain %33 %32 %17 %17
+ %41 = OpLoad %16 %40
+ %42 = OpAccessChain %18 %15 %17 %25
+ %43 = OpLoad %6 %42
+ %45 = OpAccessChain %44 %9 %41
+ OpStore %45 %43
+ OpBranch %39
+ %39 = OpLabel
+ %50 = OpLoad %7 %9
+ OpStore %49 %50
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-vector-ops-asin.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-vector-ops-asin.amber
new file mode 100644
index 0000000..e588df66
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-inst-combine-vector-ops-asin.amber
@@ -0,0 +1,253 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers specific inst combine vector ops code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_10 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _float_0_25 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+# #define _float_0_281 _GLF_uniform_float_values[2]
+# #define _float_0_282 _GLF_uniform_float_values[3]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [0.25, 1.0, 0.281, 0.282]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[4];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [10, 0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float a = _float_0_25;
+# float b;
+# float c;
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# b = a;
+# c = b;
+# float d = asin(c);
+# c = _float_1_0;
+# a = d;
+# }
+#
+# if ((_float_0_281 < a) && (a < _float_0_282))
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 89
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %70
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %21 "i"
+ OpName %24 "buf1"
+ OpMemberName %24 0 "_GLF_uniform_int_values"
+ OpName %26 ""
+ OpName %41 "b"
+ OpName %43 "c"
+ OpName %45 "d"
+ OpName %70 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %23 ArrayStride 16
+ OpMemberDecorate %24 0 Offset 0
+ OpDecorate %24 Block
+ OpDecorate %26 DescriptorSet 0
+ OpDecorate %26 Binding 1
+ OpDecorate %70 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 4
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %6
+ %20 = OpTypePointer Function %15
+ %22 = OpConstant %9 3
+ %23 = OpTypeArray %15 %22
+ %24 = OpTypeStruct %23
+ %25 = OpTypePointer Uniform %24
+ %26 = OpVariable %25 Uniform
+ %27 = OpConstant %15 1
+ %28 = OpTypePointer Uniform %15
+ %39 = OpTypeBool
+ %53 = OpConstant %15 2
+ %61 = OpConstant %15 3
+ %68 = OpTypeVector %6 4
+ %69 = OpTypePointer Output %68
+ %70 = OpVariable %69 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %21 = OpVariable %20 Function
+ %41 = OpVariable %7 Function
+ %43 = OpVariable %7 Function
+ %45 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %16 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %29 = OpAccessChain %28 %26 %16 %27
+ %30 = OpLoad %15 %29
+ OpStore %21 %30
+ OpBranch %31
+ %31 = OpLabel
+ OpLoopMerge %33 %34 None
+ OpBranch %35
+ %35 = OpLabel
+ %36 = OpLoad %15 %21
+ %37 = OpAccessChain %28 %26 %16 %16
+ %38 = OpLoad %15 %37
+ %40 = OpSLessThan %39 %36 %38
+ OpBranchConditional %40 %32 %33
+ %32 = OpLabel
+ %42 = OpLoad %6 %8
+ OpStore %41 %42
+ %44 = OpLoad %6 %41
+ OpStore %43 %44
+ %46 = OpLoad %6 %43
+ %47 = OpExtInst %6 %1 Asin %46
+ OpStore %45 %47
+ %48 = OpAccessChain %17 %14 %16 %27
+ %49 = OpLoad %6 %48
+ OpStore %43 %49
+ %50 = OpLoad %6 %45
+ OpStore %8 %50
+ OpBranch %34
+ %34 = OpLabel
+ %51 = OpLoad %15 %21
+ %52 = OpIAdd %15 %51 %27
+ OpStore %21 %52
+ OpBranch %31
+ %33 = OpLabel
+ %54 = OpAccessChain %17 %14 %16 %53
+ %55 = OpLoad %6 %54
+ %56 = OpLoad %6 %8
+ %57 = OpFOrdLessThan %39 %55 %56
+ OpSelectionMerge %59 None
+ OpBranchConditional %57 %58 %59
+ %58 = OpLabel
+ %60 = OpLoad %6 %8
+ %62 = OpAccessChain %17 %14 %16 %61
+ %63 = OpLoad %6 %62
+ %64 = OpFOrdLessThan %39 %60 %63
+ OpBranch %59
+ %59 = OpLabel
+ %65 = OpPhi %39 %57 %33 %64 %58
+ OpSelectionMerge %67 None
+ OpBranchConditional %65 %66 %84
+ %66 = OpLabel
+ %71 = OpAccessChain %28 %26 %16 %53
+ %72 = OpLoad %15 %71
+ %73 = OpConvertSToF %6 %72
+ %74 = OpAccessChain %28 %26 %16 %27
+ %75 = OpLoad %15 %74
+ %76 = OpConvertSToF %6 %75
+ %77 = OpAccessChain %28 %26 %16 %27
+ %78 = OpLoad %15 %77
+ %79 = OpConvertSToF %6 %78
+ %80 = OpAccessChain %28 %26 %16 %53
+ %81 = OpLoad %15 %80
+ %82 = OpConvertSToF %6 %81
+ %83 = OpCompositeConstruct %68 %73 %76 %79 %82
+ OpStore %70 %83
+ OpBranch %67
+ %84 = OpLabel
+ %85 = OpAccessChain %28 %26 %16 %27
+ %86 = OpLoad %15 %85
+ %87 = OpConvertSToF %6 %86
+ %88 = OpCompositeConstruct %68 %87 %87 %87 %87
+ OpStore %70 %88
+ OpBranch %67
+ %67 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 10 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.25 1.0 0.281 0.282
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-instr-info-det-mat-min.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-instr-info-det-mat-min.amber
new file mode 100644
index 0000000..a45527b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-instr-info-det-mat-min.amber
@@ -0,0 +1,338 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instr info code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_10 _GLF_uniform_int_values[2]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# int data[10];
+#
+# void f1()
+# {
+# _GLF_color = vec4(0);
+#
+# for (int i = _int_1; i < _int_10; i++)
+# {
+# data[i] = _int_0;
+# }
+#
+# float a = determinant(mat2(1.0, 1.0, 1.0, 1.0));
+# float b = determinant(mat2(0.0, 0.0, 0.0, 0.0));
+#
+# mat2x4 m24a = mat2x4(a, _float_1_0, _float_1_0, _float_1_0, _float_1_0,
+# _float_1_0, _float_1_0, _float_1_0);
+# mat2x4 m24b = mat2x4(b, _float_1_0, _float_1_0, _float_1_0, _float_1_0,
+# _float_1_0, _float_1_0, _float_1_0);
+#
+# float c = min(float(m24a), float(m24b));
+#
+# if (c < _float_1_0 && a == 0.0 && b == 0.0)
+# {
+# data[0] = _int_1;
+# }
+# }
+#
+# void main()
+# {
+# for (int i = 0; i <= 10; i++)
+# {
+# f1();
+# }
+#
+# _GLF_color = vec4(data[0], _float_0_0, _float_0_0, data[0]);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 152
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %11
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %6 "f1("
+ OpName %11 "_GLF_color"
+ OpName %16 "i"
+ OpName %20 "buf0"
+ OpMemberName %20 0 "_GLF_uniform_int_values"
+ OpName %22 ""
+ OpName %42 "data"
+ OpName %51 "a"
+ OpName %58 "b"
+ OpName %64 "m24a"
+ OpName %68 "buf1"
+ OpMemberName %68 0 "_GLF_uniform_float_values"
+ OpName %70 ""
+ OpName %89 "m24b"
+ OpName %108 "c"
+ OpName %129 "i"
+ OpDecorate %11 Location 0
+ OpDecorate %19 ArrayStride 16
+ OpMemberDecorate %20 0 Offset 0
+ OpDecorate %20 Block
+ OpDecorate %22 DescriptorSet 0
+ OpDecorate %22 Binding 0
+ OpDecorate %67 ArrayStride 16
+ OpMemberDecorate %68 0 Offset 0
+ OpDecorate %68 Block
+ OpDecorate %70 DescriptorSet 0
+ OpDecorate %70 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %8 = OpTypeFloat 32
+ %9 = OpTypeVector %8 4
+ %10 = OpTypePointer Output %9
+ %11 = OpVariable %10 Output
+ %12 = OpConstant %8 0
+ %13 = OpConstantComposite %9 %12 %12 %12 %12
+ %14 = OpTypeInt 32 1
+ %15 = OpTypePointer Function %14
+ %17 = OpTypeInt 32 0
+ %18 = OpConstant %17 3
+ %19 = OpTypeArray %14 %18
+ %20 = OpTypeStruct %19
+ %21 = OpTypePointer Uniform %20
+ %22 = OpVariable %21 Uniform
+ %23 = OpConstant %14 0
+ %24 = OpConstant %14 1
+ %25 = OpTypePointer Uniform %14
+ %34 = OpConstant %14 2
+ %37 = OpTypeBool
+ %39 = OpConstant %17 10
+ %40 = OpTypeArray %14 %39
+ %41 = OpTypePointer Private %40
+ %42 = OpVariable %41 Private
+ %46 = OpTypePointer Private %14
+ %50 = OpTypePointer Function %8
+ %52 = OpTypeVector %8 2
+ %53 = OpTypeMatrix %52 2
+ %54 = OpConstant %8 1
+ %55 = OpConstantComposite %52 %54 %54
+ %56 = OpConstantComposite %53 %55 %55
+ %59 = OpConstantComposite %52 %12 %12
+ %60 = OpConstantComposite %53 %59 %59
+ %62 = OpTypeMatrix %9 2
+ %63 = OpTypePointer Function %62
+ %66 = OpConstant %17 2
+ %67 = OpTypeArray %8 %66
+ %68 = OpTypeStruct %67
+ %69 = OpTypePointer Uniform %68
+ %70 = OpVariable %69 Uniform
+ %71 = OpTypePointer Uniform %8
+ %136 = OpConstant %14 10
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %129 = OpVariable %15 Function
+ OpStore %129 %23
+ OpBranch %130
+ %130 = OpLabel
+ OpLoopMerge %132 %133 None
+ OpBranch %134
+ %134 = OpLabel
+ %135 = OpLoad %14 %129
+ %137 = OpSLessThanEqual %37 %135 %136
+ OpBranchConditional %137 %131 %132
+ %131 = OpLabel
+ %138 = OpFunctionCall %2 %6
+ OpBranch %133
+ %133 = OpLabel
+ %139 = OpLoad %14 %129
+ %140 = OpIAdd %14 %139 %24
+ OpStore %129 %140
+ OpBranch %130
+ %132 = OpLabel
+ %141 = OpAccessChain %46 %42 %23
+ %142 = OpLoad %14 %141
+ %143 = OpConvertSToF %8 %142
+ %144 = OpAccessChain %71 %70 %23 %23
+ %145 = OpLoad %8 %144
+ %146 = OpAccessChain %71 %70 %23 %23
+ %147 = OpLoad %8 %146
+ %148 = OpAccessChain %46 %42 %23
+ %149 = OpLoad %14 %148
+ %150 = OpConvertSToF %8 %149
+ %151 = OpCompositeConstruct %9 %143 %145 %147 %150
+ OpStore %11 %151
+ OpReturn
+ OpFunctionEnd
+ %6 = OpFunction %2 None %3
+ %7 = OpLabel
+ %16 = OpVariable %15 Function
+ %51 = OpVariable %50 Function
+ %58 = OpVariable %50 Function
+ %64 = OpVariable %63 Function
+ %89 = OpVariable %63 Function
+ %108 = OpVariable %50 Function
+ OpStore %11 %13
+ %26 = OpAccessChain %25 %22 %23 %24
+ %27 = OpLoad %14 %26
+ OpStore %16 %27
+ OpBranch %28
+ %28 = OpLabel
+ OpLoopMerge %30 %31 None
+ OpBranch %32
+ %32 = OpLabel
+ %33 = OpLoad %14 %16
+ %35 = OpAccessChain %25 %22 %23 %34
+ %36 = OpLoad %14 %35
+ %38 = OpSLessThan %37 %33 %36
+ OpBranchConditional %38 %29 %30
+ %29 = OpLabel
+ %43 = OpLoad %14 %16
+ %44 = OpAccessChain %25 %22 %23 %23
+ %45 = OpLoad %14 %44
+ %47 = OpAccessChain %46 %42 %43
+ OpStore %47 %45
+ OpBranch %31
+ %31 = OpLabel
+ %48 = OpLoad %14 %16
+ %49 = OpIAdd %14 %48 %24
+ OpStore %16 %49
+ OpBranch %28
+ %30 = OpLabel
+ %57 = OpExtInst %8 %1 Determinant %56
+ OpStore %51 %57
+ %61 = OpExtInst %8 %1 Determinant %60
+ OpStore %58 %61
+ %65 = OpLoad %8 %51
+ %72 = OpAccessChain %71 %70 %23 %24
+ %73 = OpLoad %8 %72
+ %74 = OpAccessChain %71 %70 %23 %24
+ %75 = OpLoad %8 %74
+ %76 = OpAccessChain %71 %70 %23 %24
+ %77 = OpLoad %8 %76
+ %78 = OpAccessChain %71 %70 %23 %24
+ %79 = OpLoad %8 %78
+ %80 = OpAccessChain %71 %70 %23 %24
+ %81 = OpLoad %8 %80
+ %82 = OpAccessChain %71 %70 %23 %24
+ %83 = OpLoad %8 %82
+ %84 = OpAccessChain %71 %70 %23 %24
+ %85 = OpLoad %8 %84
+ %86 = OpCompositeConstruct %9 %65 %73 %75 %77
+ %87 = OpCompositeConstruct %9 %79 %81 %83 %85
+ %88 = OpCompositeConstruct %62 %86 %87
+ OpStore %64 %88
+ %90 = OpLoad %8 %58
+ %91 = OpAccessChain %71 %70 %23 %24
+ %92 = OpLoad %8 %91
+ %93 = OpAccessChain %71 %70 %23 %24
+ %94 = OpLoad %8 %93
+ %95 = OpAccessChain %71 %70 %23 %24
+ %96 = OpLoad %8 %95
+ %97 = OpAccessChain %71 %70 %23 %24
+ %98 = OpLoad %8 %97
+ %99 = OpAccessChain %71 %70 %23 %24
+ %100 = OpLoad %8 %99
+ %101 = OpAccessChain %71 %70 %23 %24
+ %102 = OpLoad %8 %101
+ %103 = OpAccessChain %71 %70 %23 %24
+ %104 = OpLoad %8 %103
+ %105 = OpCompositeConstruct %9 %90 %92 %94 %96
+ %106 = OpCompositeConstruct %9 %98 %100 %102 %104
+ %107 = OpCompositeConstruct %62 %105 %106
+ OpStore %89 %107
+ %109 = OpLoad %62 %64
+ %110 = OpCompositeExtract %8 %109 0 0
+ %111 = OpLoad %62 %89
+ %112 = OpCompositeExtract %8 %111 0 0
+ %113 = OpExtInst %8 %1 FMin %110 %112
+ OpStore %108 %113
+ %114 = OpLoad %8 %108
+ %115 = OpAccessChain %71 %70 %23 %24
+ %116 = OpLoad %8 %115
+ %117 = OpFOrdLessThan %37 %114 %116
+ %118 = OpLoad %8 %51
+ %119 = OpFOrdEqual %37 %118 %12
+ %120 = OpLogicalAnd %37 %117 %119
+ %121 = OpLoad %8 %58
+ %122 = OpFOrdEqual %37 %121 %12
+ %123 = OpLogicalAnd %37 %120 %122
+ OpSelectionMerge %125 None
+ OpBranchConditional %123 %124 %125
+ %124 = OpLabel
+ %126 = OpAccessChain %25 %22 %23 %24
+ %127 = OpLoad %14 %126
+ %128 = OpAccessChain %46 %42 %23
+ OpStore %128 %127
+ OpBranch %125
+ %125 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1 10
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-instructions-for-if-less-than-equal.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-instructions-for-if-less-than-equal.amber
new file mode 100644
index 0000000..9fcdc0e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-instructions-for-if-less-than-equal.amber
@@ -0,0 +1,199 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers specific instruction simplify and combine compare code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_10 _GLF_uniform_int_values[1]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_25 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.25]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [0, 10]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# _GLF_color = vec4(_int_0);
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# // True when i = 0.
+# if (!(_float_0_25 <= float(i)))
+# {
+# _GLF_color += vec4(_float_1_0, i, i, _float_1_0);
+# }
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 64
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %9
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "_GLF_color"
+ OpName %14 "buf1"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpName %24 "i"
+ OpName %39 "buf0"
+ OpMemberName %39 0 "_GLF_uniform_float_values"
+ OpName %41 ""
+ OpDecorate %9 Location 0
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 1
+ OpDecorate %38 ArrayStride 16
+ OpMemberDecorate %39 0 Offset 0
+ OpDecorate %39 Block
+ OpDecorate %41 DescriptorSet 0
+ OpDecorate %41 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Output %7
+ %9 = OpVariable %8 Output
+ %10 = OpTypeInt 32 1
+ %11 = OpTypeInt 32 0
+ %12 = OpConstant %11 2
+ %13 = OpTypeArray %10 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %10 0
+ %18 = OpTypePointer Uniform %10
+ %23 = OpTypePointer Function %10
+ %33 = OpConstant %10 1
+ %36 = OpTypeBool
+ %38 = OpTypeArray %6 %12
+ %39 = OpTypeStruct %38
+ %40 = OpTypePointer Uniform %39
+ %41 = OpVariable %40 Uniform
+ %42 = OpTypePointer Uniform %6
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %24 = OpVariable %23 Function
+ %19 = OpAccessChain %18 %16 %17 %17
+ %20 = OpLoad %10 %19
+ %21 = OpConvertSToF %6 %20
+ %22 = OpCompositeConstruct %7 %21 %21 %21 %21
+ OpStore %9 %22
+ %25 = OpAccessChain %18 %16 %17 %17
+ %26 = OpLoad %10 %25
+ OpStore %24 %26
+ OpBranch %27
+ %27 = OpLabel
+ OpLoopMerge %29 %30 None
+ OpBranch %31
+ %31 = OpLabel
+ %32 = OpLoad %10 %24
+ %34 = OpAccessChain %18 %16 %17 %33
+ %35 = OpLoad %10 %34
+ %37 = OpSLessThan %36 %32 %35
+ OpBranchConditional %37 %28 %29
+ %28 = OpLabel
+ %43 = OpAccessChain %42 %41 %17 %33
+ %44 = OpLoad %6 %43
+ %45 = OpLoad %10 %24
+ %46 = OpConvertSToF %6 %45
+ %47 = OpFOrdLessThanEqual %36 %44 %46
+ %48 = OpLogicalNot %36 %47
+ OpSelectionMerge %50 None
+ OpBranchConditional %48 %49 %50
+ %49 = OpLabel
+ %51 = OpAccessChain %42 %41 %17 %17
+ %52 = OpLoad %6 %51
+ %53 = OpLoad %10 %24
+ %54 = OpConvertSToF %6 %53
+ %55 = OpLoad %10 %24
+ %56 = OpConvertSToF %6 %55
+ %57 = OpAccessChain %42 %41 %17 %17
+ %58 = OpLoad %6 %57
+ %59 = OpCompositeConstruct %7 %52 %54 %56 %58
+ %60 = OpLoad %7 %9
+ %61 = OpFAdd %7 %60 %59
+ OpStore %9 %61
+ OpBranch %50
+ %50 = OpLabel
+ OpBranch %30
+ %30 = OpLabel
+ %62 = OpLoad %10 %24
+ %63 = OpIAdd %10 %62 %33
+ OpStore %24 %63
+ OpBranch %27
+ %29 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 10
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.25
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-integer-modulo-negative.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-integer-modulo-negative.amber
new file mode 100644
index 0000000..2eb8e1a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-integer-modulo-negative.amber
@@ -0,0 +1,204 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers specific instruction combining code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_10 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [10, 0, 1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[3];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int count = _int_0;
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# // Always false.
+# if (count % -93448 > _int_0)
+# {
+# count++;
+# }
+# }
+# if (count == _int_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 74
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %54
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "count"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %20 "i"
+ OpName %54 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %54 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 1
+ %17 = OpTypePointer Uniform %6
+ %31 = OpTypeBool
+ %34 = OpConstant %6 -93448
+ %51 = OpTypeFloat 32
+ %52 = OpTypeVector %51 4
+ %53 = OpTypePointer Output %52
+ %54 = OpVariable %53 Output
+ %55 = OpConstant %6 2
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %21 = OpAccessChain %17 %14 %15 %16
+ %22 = OpLoad %6 %21
+ OpStore %20 %22
+ OpBranch %23
+ %23 = OpLabel
+ OpLoopMerge %25 %26 None
+ OpBranch %27
+ %27 = OpLabel
+ %28 = OpLoad %6 %20
+ %29 = OpAccessChain %17 %14 %15 %15
+ %30 = OpLoad %6 %29
+ %32 = OpSLessThan %31 %28 %30
+ OpBranchConditional %32 %24 %25
+ %24 = OpLabel
+ %33 = OpLoad %6 %8
+ %35 = OpSMod %6 %33 %34
+ %36 = OpAccessChain %17 %14 %15 %16
+ %37 = OpLoad %6 %36
+ %38 = OpSGreaterThan %31 %35 %37
+ OpSelectionMerge %40 None
+ OpBranchConditional %38 %39 %40
+ %39 = OpLabel
+ %41 = OpLoad %6 %8
+ %42 = OpIAdd %6 %41 %16
+ OpStore %8 %42
+ OpBranch %40
+ %40 = OpLabel
+ OpBranch %26
+ %26 = OpLabel
+ %43 = OpLoad %6 %20
+ %44 = OpIAdd %6 %43 %16
+ OpStore %20 %44
+ OpBranch %23
+ %25 = OpLabel
+ %45 = OpLoad %6 %8
+ %46 = OpAccessChain %17 %14 %15 %16
+ %47 = OpLoad %6 %46
+ %48 = OpIEqual %31 %45 %47
+ OpSelectionMerge %50 None
+ OpBranchConditional %48 %49 %69
+ %49 = OpLabel
+ %56 = OpAccessChain %17 %14 %15 %55
+ %57 = OpLoad %6 %56
+ %58 = OpConvertSToF %51 %57
+ %59 = OpAccessChain %17 %14 %15 %16
+ %60 = OpLoad %6 %59
+ %61 = OpConvertSToF %51 %60
+ %62 = OpAccessChain %17 %14 %15 %16
+ %63 = OpLoad %6 %62
+ %64 = OpConvertSToF %51 %63
+ %65 = OpAccessChain %17 %14 %15 %55
+ %66 = OpLoad %6 %65
+ %67 = OpConvertSToF %51 %66
+ %68 = OpCompositeConstruct %52 %58 %61 %64 %67
+ OpStore %54 %68
+ OpBranch %50
+ %69 = OpLabel
+ %70 = OpAccessChain %17 %14 %15 %16
+ %71 = OpLoad %6 %70
+ %72 = OpConvertSToF %51 %71
+ %73 = OpCompositeConstruct %52 %72 %72 %72 %72
+ OpStore %54 %73
+ OpBranch %50
+ %50 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 10 0 1
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply.amber
new file mode 100644
index 0000000..fca8876
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply.amber
@@ -0,0 +1,200 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers specific inst combine simplify demanded and inst combine shifts path
+
+# The test passes because the shader always writes red.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: a187dd58a0485988841d325a85c8e6063f53500a
+
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_256_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 256.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# vec2 v1 = vec2(_float_256_0);
+#
+# // v1.y becomes undefined. This results in an undefined value, but not in undefined behavior.
+# v1[_int_1] = ldexp(v1.y, -256);
+#
+# vec2 v2 = v1 * mat2(_float_0_0);
+#
+# if (v2.x == _float_0_0)
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# else
+# _GLF_color = vec4(_int_0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 78
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %58
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "v1"
+ OpName %13 "buf0"
+ OpMemberName %13 0 "_GLF_uniform_float_values"
+ OpName %15 ""
+ OpName %23 "buf1"
+ OpMemberName %23 0 "_GLF_uniform_int_values"
+ OpName %25 ""
+ OpName %58 "_GLF_color"
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 0
+ OpDecorate %22 ArrayStride 16
+ OpMemberDecorate %23 0 Offset 0
+ OpDecorate %23 Block
+ OpDecorate %25 DescriptorSet 0
+ OpDecorate %25 Binding 1
+ OpDecorate %58 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeInt 32 0
+ %11 = OpConstant %10 2
+ %12 = OpTypeArray %6 %11
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpTypeInt 32 1
+ %17 = OpConstant %16 0
+ %18 = OpTypePointer Uniform %6
+ %22 = OpTypeArray %16 %11
+ %23 = OpTypeStruct %22
+ %24 = OpTypePointer Uniform %23
+ %25 = OpVariable %24 Uniform
+ %26 = OpTypePointer Uniform %16
+ %29 = OpConstant %10 1
+ %30 = OpTypePointer Function %6
+ %33 = OpConstant %16 -256
+ %40 = OpTypeMatrix %7 2
+ %42 = OpConstant %6 0
+ %52 = OpTypeBool
+ %56 = OpTypeVector %6 4
+ %57 = OpTypePointer Output %56
+ %58 = OpVariable %57 Output
+ %62 = OpConstant %16 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %19 = OpAccessChain %18 %15 %17 %17
+ %20 = OpLoad %6 %19
+ %21 = OpCompositeConstruct %7 %20 %20
+ OpStore %9 %21
+ %27 = OpAccessChain %26 %25 %17 %17
+ %28 = OpLoad %16 %27
+ %31 = OpAccessChain %30 %9 %29
+ %32 = OpLoad %6 %31
+ %34 = OpExtInst %6 %1 Ldexp %32 %33
+ %35 = OpAccessChain %30 %9 %28
+ OpStore %35 %34
+ %37 = OpLoad %7 %9
+ %43 = OpCompositeConstruct %7 %20 %42
+ %44 = OpCompositeConstruct %7 %42 %20
+ %45 = OpCompositeConstruct %40 %43 %44
+ %46 = OpVectorTimesMatrix %7 %37 %45
+ %49 = OpCompositeExtract %6 %46 0
+ %53 = OpFOrdEqual %52 %49 %20
+ OpSelectionMerge %55 None
+ OpBranchConditional %53 %54 %73
+ %54 = OpLabel
+ %61 = OpConvertSToF %6 %28
+ %63 = OpAccessChain %26 %25 %17 %62
+ %64 = OpLoad %16 %63
+ %65 = OpConvertSToF %6 %64
+ %72 = OpCompositeConstruct %56 %61 %65 %65 %61
+ OpStore %58 %72
+ OpBranch %55
+ %73 = OpLabel
+ %74 = OpAccessChain %26 %25 %17 %62
+ %75 = OpLoad %16 %74
+ %76 = OpConvertSToF %6 %75
+ %77 = OpCompositeConstruct %56 %76 %76 %76 %76
+ OpStore %58 %77
+ OpBranch %55
+ %55 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than.amber
new file mode 100644
index 0000000..2442671
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than.amber
@@ -0,0 +1,337 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific machine basic block code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_5 _GLF_uniform_int_values[1]
+# #define _int_4 _GLF_uniform_int_values[2]
+# #define _int_3 _GLF_uniform_int_values[3]
+# #define _int_2 _GLF_uniform_int_values[4]
+# #define _int_0 _GLF_uniform_int_values[5]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp int;
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+# // Contents of _GLF_uniform_int_values: [1, 5, 4, 3, 2, 0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[6];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+#
+# int data[5] = int[5](_int_5, _int_4, _int_3, _int_2, _int_1);
+#
+# for (int a = _int_0; a < _int_1; a++)
+# {
+# for (int i = _int_0; i < _int_5; i++)
+# {
+# for (int j = i; j < _int_5; j++)
+# {
+# if (data[i] < data[j])
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+# }
+# }
+#
+# // Always false.
+# while (gl_FragCoord.x < _float_0_0)
+# {
+# for (int i = _int_0; i < _int_1; i++)
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 146
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %9 %114
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "_GLF_color"
+ OpName %14 "buf1"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpName %36 "data"
+ OpName %53 "a"
+ OpName %66 "i"
+ OpName %78 "j"
+ OpName %114 "gl_FragCoord"
+ OpName %121 "buf0"
+ OpMemberName %121 0 "_GLF_uniform_float_values"
+ OpName %123 ""
+ OpName %128 "i"
+ OpDecorate %9 Location 0
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 1
+ OpDecorate %114 BuiltIn FragCoord
+ OpDecorate %120 ArrayStride 16
+ OpMemberDecorate %121 0 Offset 0
+ OpDecorate %121 Block
+ OpDecorate %123 DescriptorSet 0
+ OpDecorate %123 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Output %7
+ %9 = OpVariable %8 Output
+ %10 = OpTypeInt 32 1
+ %11 = OpTypeInt 32 0
+ %12 = OpConstant %11 6
+ %13 = OpTypeArray %10 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %10 0
+ %18 = OpTypePointer Uniform %10
+ %22 = OpConstant %10 5
+ %33 = OpConstant %11 5
+ %34 = OpTypeArray %10 %33
+ %35 = OpTypePointer Function %34
+ %37 = OpConstant %10 1
+ %40 = OpConstant %10 2
+ %43 = OpConstant %10 3
+ %46 = OpConstant %10 4
+ %52 = OpTypePointer Function %10
+ %64 = OpTypeBool
+ %113 = OpTypePointer Input %7
+ %114 = OpVariable %113 Input
+ %115 = OpConstant %11 0
+ %116 = OpTypePointer Input %6
+ %119 = OpConstant %11 1
+ %120 = OpTypeArray %6 %119
+ %121 = OpTypeStruct %120
+ %122 = OpTypePointer Uniform %121
+ %123 = OpVariable %122 Uniform
+ %124 = OpTypePointer Uniform %6
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %36 = OpVariable %35 Function
+ %53 = OpVariable %52 Function
+ %66 = OpVariable %52 Function
+ %78 = OpVariable %52 Function
+ %128 = OpVariable %52 Function
+ %19 = OpAccessChain %18 %16 %17 %17
+ %20 = OpLoad %10 %19
+ %21 = OpConvertSToF %6 %20
+ %23 = OpAccessChain %18 %16 %17 %22
+ %24 = OpLoad %10 %23
+ %25 = OpConvertSToF %6 %24
+ %26 = OpAccessChain %18 %16 %17 %22
+ %27 = OpLoad %10 %26
+ %28 = OpConvertSToF %6 %27
+ %29 = OpAccessChain %18 %16 %17 %17
+ %30 = OpLoad %10 %29
+ %31 = OpConvertSToF %6 %30
+ %32 = OpCompositeConstruct %7 %21 %25 %28 %31
+ OpStore %9 %32
+ %38 = OpAccessChain %18 %16 %17 %37
+ %39 = OpLoad %10 %38
+ %41 = OpAccessChain %18 %16 %17 %40
+ %42 = OpLoad %10 %41
+ %44 = OpAccessChain %18 %16 %17 %43
+ %45 = OpLoad %10 %44
+ %47 = OpAccessChain %18 %16 %17 %46
+ %48 = OpLoad %10 %47
+ %49 = OpAccessChain %18 %16 %17 %17
+ %50 = OpLoad %10 %49
+ %51 = OpCompositeConstruct %34 %39 %42 %45 %48 %50
+ OpStore %36 %51
+ %54 = OpAccessChain %18 %16 %17 %22
+ %55 = OpLoad %10 %54
+ OpStore %53 %55
+ OpBranch %56
+ %56 = OpLabel
+ OpLoopMerge %58 %59 None
+ OpBranch %60
+ %60 = OpLabel
+ %61 = OpLoad %10 %53
+ %62 = OpAccessChain %18 %16 %17 %17
+ %63 = OpLoad %10 %62
+ %65 = OpSLessThan %64 %61 %63
+ OpBranchConditional %65 %57 %58
+ %57 = OpLabel
+ %67 = OpAccessChain %18 %16 %17 %22
+ %68 = OpLoad %10 %67
+ OpStore %66 %68
+ OpBranch %69
+ %69 = OpLabel
+ OpLoopMerge %71 %72 None
+ OpBranch %73
+ %73 = OpLabel
+ %74 = OpLoad %10 %66
+ %75 = OpAccessChain %18 %16 %17 %37
+ %76 = OpLoad %10 %75
+ %77 = OpSLessThan %64 %74 %76
+ OpBranchConditional %77 %70 %71
+ %70 = OpLabel
+ %79 = OpLoad %10 %66
+ OpStore %78 %79
+ OpBranch %80
+ %80 = OpLabel
+ OpLoopMerge %82 %83 None
+ OpBranch %84
+ %84 = OpLabel
+ %85 = OpLoad %10 %78
+ %86 = OpAccessChain %18 %16 %17 %37
+ %87 = OpLoad %10 %86
+ %88 = OpSLessThan %64 %85 %87
+ OpBranchConditional %88 %81 %82
+ %81 = OpLabel
+ %89 = OpLoad %10 %66
+ %90 = OpAccessChain %52 %36 %89
+ %91 = OpLoad %10 %90
+ %92 = OpLoad %10 %78
+ %93 = OpAccessChain %52 %36 %92
+ %94 = OpLoad %10 %93
+ %95 = OpSLessThan %64 %91 %94
+ OpSelectionMerge %97 None
+ OpBranchConditional %95 %96 %97
+ %96 = OpLabel
+ %98 = OpAccessChain %18 %16 %17 %22
+ %99 = OpLoad %10 %98
+ %100 = OpConvertSToF %6 %99
+ %101 = OpCompositeConstruct %7 %100 %100 %100 %100
+ OpStore %9 %101
+ OpBranch %97
+ %97 = OpLabel
+ OpBranch %83
+ %83 = OpLabel
+ %102 = OpLoad %10 %78
+ %103 = OpIAdd %10 %102 %37
+ OpStore %78 %103
+ OpBranch %80
+ %82 = OpLabel
+ OpBranch %72
+ %72 = OpLabel
+ %104 = OpLoad %10 %66
+ %105 = OpIAdd %10 %104 %37
+ OpStore %66 %105
+ OpBranch %69
+ %71 = OpLabel
+ OpBranch %59
+ %59 = OpLabel
+ %106 = OpLoad %10 %53
+ %107 = OpIAdd %10 %106 %37
+ OpStore %53 %107
+ OpBranch %56
+ %58 = OpLabel
+ OpBranch %108
+ %108 = OpLabel
+ OpLoopMerge %110 %111 None
+ OpBranch %112
+ %112 = OpLabel
+ %117 = OpAccessChain %116 %114 %115
+ %118 = OpLoad %6 %117
+ %125 = OpAccessChain %124 %123 %17 %17
+ %126 = OpLoad %6 %125
+ %127 = OpFOrdLessThan %64 %118 %126
+ OpBranchConditional %127 %109 %110
+ %109 = OpLabel
+ %129 = OpAccessChain %18 %16 %17 %22
+ %130 = OpLoad %10 %129
+ OpStore %128 %130
+ OpBranch %131
+ %131 = OpLabel
+ OpLoopMerge %133 %134 None
+ OpBranch %135
+ %135 = OpLabel
+ %136 = OpLoad %10 %128
+ %137 = OpAccessChain %18 %16 %17 %17
+ %138 = OpLoad %10 %137
+ %139 = OpSLessThan %64 %136 %138
+ OpBranchConditional %139 %132 %133
+ %132 = OpLabel
+ %140 = OpAccessChain %18 %16 %17 %22
+ %141 = OpLoad %10 %140
+ %142 = OpConvertSToF %6 %141
+ %143 = OpCompositeConstruct %7 %142 %142 %142 %142
+ OpStore %9 %143
+ OpBranch %134
+ %134 = OpLabel
+ %144 = OpLoad %10 %128
+ %145 = OpIAdd %10 %144 %37
+ OpStore %128 %145
+ OpBranch %131
+ %133 = OpLabel
+ OpBranch %111
+ %111 = OpLabel
+ OpBranch %108
+ %110 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 5 4 3 2 0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-machine-scheduler-for-if-pow.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-machine-scheduler-for-if-pow.amber
new file mode 100644
index 0000000..99180e0
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-machine-scheduler-for-if-pow.amber
@@ -0,0 +1,300 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific machine scheduler path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_10 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_4_0 _GLF_uniform_float_values[1]
+# #define _float_1_0 _GLF_uniform_float_values[2]
+# #define _float_2_0 _GLF_uniform_float_values[3]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [10, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 4.0, 1.0, 2.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_v1;
+#
+# void main()
+# {
+# vec2 uv = gl_FragCoord.xy;
+# vec4 v1 = vec4(_float_0_0);
+# if (uv.y >= _float_0_0)
+# {
+# v1.x = _float_1_0;
+# v1.y = _float_0_0;
+# v1.z = _float_0_0;
+# v1.w = _float_1_0;
+# }
+#
+# float a = _float_1_0;
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# // Always false.
+# if (_float_1_0 < _float_0_0)
+# {
+# discard;
+# }
+# // a becomes 4.
+# a = pow(v1.x + v1.y + v1.z + v1.w, _float_2_0);
+# }
+#
+# if (a == _float_4_0)
+# {
+# _GLF_v1 = v1;
+# }
+# else
+# {
+# _GLF_v1 = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 116
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %109
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "uv"
+ OpName %12 "gl_FragCoord"
+ OpName %16 "v1"
+ OpName %20 "buf1"
+ OpMemberName %20 0 "_GLF_uniform_float_values"
+ OpName %22 ""
+ OpName %55 "a"
+ OpName %59 "i"
+ OpName %61 "buf0"
+ OpMemberName %61 0 "_GLF_uniform_int_values"
+ OpName %63 ""
+ OpName %109 "_GLF_v1"
+ OpDecorate %12 BuiltIn FragCoord
+ OpDecorate %19 ArrayStride 16
+ OpMemberDecorate %20 0 Offset 0
+ OpDecorate %20 Block
+ OpDecorate %22 DescriptorSet 0
+ OpDecorate %22 Binding 1
+ OpDecorate %59 RelaxedPrecision
+ OpDecorate %60 ArrayStride 16
+ OpMemberDecorate %61 0 RelaxedPrecision
+ OpMemberDecorate %61 0 Offset 0
+ OpDecorate %61 Block
+ OpDecorate %63 DescriptorSet 0
+ OpDecorate %63 Binding 0
+ OpDecorate %67 RelaxedPrecision
+ OpDecorate %73 RelaxedPrecision
+ OpDecorate %75 RelaxedPrecision
+ OpDecorate %100 RelaxedPrecision
+ OpDecorate %101 RelaxedPrecision
+ OpDecorate %109 Location 0
+ OpDecorate %113 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeVector %6 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %15 = OpTypePointer Function %10
+ %17 = OpTypeInt 32 0
+ %18 = OpConstant %17 4
+ %19 = OpTypeArray %6 %18
+ %20 = OpTypeStruct %19
+ %21 = OpTypePointer Uniform %20
+ %22 = OpVariable %21 Uniform
+ %23 = OpTypeInt 32 1
+ %24 = OpConstant %23 0
+ %25 = OpTypePointer Uniform %6
+ %29 = OpConstant %17 1
+ %30 = OpTypePointer Function %6
+ %35 = OpTypeBool
+ %39 = OpConstant %23 2
+ %42 = OpConstant %17 0
+ %49 = OpConstant %17 2
+ %53 = OpConstant %17 3
+ %58 = OpTypePointer Function %23
+ %60 = OpTypeArray %23 %49
+ %61 = OpTypeStruct %60
+ %62 = OpTypePointer Uniform %61
+ %63 = OpVariable %62 Uniform
+ %64 = OpConstant %23 1
+ %65 = OpTypePointer Uniform %23
+ %96 = OpConstant %23 3
+ %108 = OpTypePointer Output %10
+ %109 = OpVariable %108 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %16 = OpVariable %15 Function
+ %55 = OpVariable %30 Function
+ %59 = OpVariable %58 Function
+ %13 = OpLoad %10 %12
+ %14 = OpVectorShuffle %7 %13 %13 0 1
+ OpStore %9 %14
+ %26 = OpAccessChain %25 %22 %24 %24
+ %27 = OpLoad %6 %26
+ %28 = OpCompositeConstruct %10 %27 %27 %27 %27
+ OpStore %16 %28
+ %31 = OpAccessChain %30 %9 %29
+ %32 = OpLoad %6 %31
+ %33 = OpAccessChain %25 %22 %24 %24
+ %34 = OpLoad %6 %33
+ %36 = OpFOrdGreaterThanEqual %35 %32 %34
+ OpSelectionMerge %38 None
+ OpBranchConditional %36 %37 %38
+ %37 = OpLabel
+ %40 = OpAccessChain %25 %22 %24 %39
+ %41 = OpLoad %6 %40
+ %43 = OpAccessChain %30 %16 %42
+ OpStore %43 %41
+ %44 = OpAccessChain %25 %22 %24 %24
+ %45 = OpLoad %6 %44
+ %46 = OpAccessChain %30 %16 %29
+ OpStore %46 %45
+ %47 = OpAccessChain %25 %22 %24 %24
+ %48 = OpLoad %6 %47
+ %50 = OpAccessChain %30 %16 %49
+ OpStore %50 %48
+ %51 = OpAccessChain %25 %22 %24 %39
+ %52 = OpLoad %6 %51
+ %54 = OpAccessChain %30 %16 %53
+ OpStore %54 %52
+ OpBranch %38
+ %38 = OpLabel
+ %56 = OpAccessChain %25 %22 %24 %39
+ %57 = OpLoad %6 %56
+ OpStore %55 %57
+ %66 = OpAccessChain %65 %63 %24 %64
+ %67 = OpLoad %23 %66
+ OpStore %59 %67
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %23 %59
+ %74 = OpAccessChain %65 %63 %24 %24
+ %75 = OpLoad %23 %74
+ %76 = OpSLessThan %35 %73 %75
+ OpBranchConditional %76 %69 %70
+ %69 = OpLabel
+ %77 = OpAccessChain %25 %22 %24 %39
+ %78 = OpLoad %6 %77
+ %79 = OpAccessChain %25 %22 %24 %24
+ %80 = OpLoad %6 %79
+ %81 = OpFOrdLessThan %35 %78 %80
+ OpSelectionMerge %83 None
+ OpBranchConditional %81 %82 %83
+ %82 = OpLabel
+ OpKill
+ %83 = OpLabel
+ %85 = OpAccessChain %30 %16 %42
+ %86 = OpLoad %6 %85
+ %87 = OpAccessChain %30 %16 %29
+ %88 = OpLoad %6 %87
+ %89 = OpFAdd %6 %86 %88
+ %90 = OpAccessChain %30 %16 %49
+ %91 = OpLoad %6 %90
+ %92 = OpFAdd %6 %89 %91
+ %93 = OpAccessChain %30 %16 %53
+ %94 = OpLoad %6 %93
+ %95 = OpFAdd %6 %92 %94
+ %97 = OpAccessChain %25 %22 %24 %96
+ %98 = OpLoad %6 %97
+ %99 = OpExtInst %6 %1 Pow %95 %98
+ OpStore %55 %99
+ OpBranch %71
+ %71 = OpLabel
+ %100 = OpLoad %23 %59
+ %101 = OpIAdd %23 %100 %64
+ OpStore %59 %101
+ OpBranch %68
+ %70 = OpLabel
+ %102 = OpLoad %6 %55
+ %103 = OpAccessChain %25 %22 %24 %64
+ %104 = OpLoad %6 %103
+ %105 = OpFOrdEqual %35 %102 %104
+ OpSelectionMerge %107 None
+ OpBranchConditional %105 %106 %111
+ %106 = OpLabel
+ %110 = OpLoad %10 %16
+ OpStore %109 %110
+ OpBranch %107
+ %111 = OpLabel
+ %112 = OpAccessChain %65 %63 %24 %64
+ %113 = OpLoad %23 %112
+ %114 = OpConvertSToF %6 %113
+ %115 = OpCompositeConstruct %10 %114 %114 %114 %114
+ OpStore %109 %115
+ OpBranch %107
+ %107 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 4.0 1.0 2.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 10 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-mod-acosh.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-mod-acosh.amber
new file mode 100644
index 0000000..4d92f82
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-mod-acosh.amber
@@ -0,0 +1,193 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that calculates modulo of an acosh result
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _float_2_6 _GLF_uniform_float_values[0]
+# #define _float_1_61 _GLF_uniform_float_values[1]
+# #define _float_0_1 _GLF_uniform_float_values[2]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [2.6, 1.61, 0.1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float f = mod(acosh(_float_2_6), 7938.0);
+# if (abs(f - _float_1_61) < _float_0_1)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 63
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %38
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "f"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %38 "_GLF_color"
+ OpName %41 "buf1"
+ OpMemberName %41 0 "_GLF_uniform_int_values"
+ OpName %43 ""
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %38 Location 0
+ OpDecorate %40 ArrayStride 16
+ OpMemberDecorate %41 0 Offset 0
+ OpDecorate %41 Block
+ OpDecorate %43 DescriptorSet 0
+ OpDecorate %43 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %6
+ %21 = OpConstant %6 7938
+ %24 = OpConstant %15 1
+ %29 = OpConstant %15 2
+ %32 = OpTypeBool
+ %36 = OpTypeVector %6 4
+ %37 = OpTypePointer Output %36
+ %38 = OpVariable %37 Output
+ %39 = OpConstant %9 2
+ %40 = OpTypeArray %15 %39
+ %41 = OpTypeStruct %40
+ %42 = OpTypePointer Uniform %41
+ %43 = OpVariable %42 Uniform
+ %44 = OpTypePointer Uniform %15
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %16 %16
+ %19 = OpLoad %6 %18
+ %20 = OpExtInst %6 %1 Acosh %19
+ %22 = OpFMod %6 %20 %21
+ OpStore %8 %22
+ %23 = OpLoad %6 %8
+ %25 = OpAccessChain %17 %14 %16 %24
+ %26 = OpLoad %6 %25
+ %27 = OpFSub %6 %23 %26
+ %28 = OpExtInst %6 %1 FAbs %27
+ %30 = OpAccessChain %17 %14 %16 %29
+ %31 = OpLoad %6 %30
+ %33 = OpFOrdLessThan %32 %28 %31
+ OpSelectionMerge %35 None
+ OpBranchConditional %33 %34 %58
+ %34 = OpLabel
+ %45 = OpAccessChain %44 %43 %16 %24
+ %46 = OpLoad %15 %45
+ %47 = OpConvertSToF %6 %46
+ %48 = OpAccessChain %44 %43 %16 %16
+ %49 = OpLoad %15 %48
+ %50 = OpConvertSToF %6 %49
+ %51 = OpAccessChain %44 %43 %16 %16
+ %52 = OpLoad %15 %51
+ %53 = OpConvertSToF %6 %52
+ %54 = OpAccessChain %44 %43 %16 %24
+ %55 = OpLoad %15 %54
+ %56 = OpConvertSToF %6 %55
+ %57 = OpCompositeConstruct %36 %47 %50 %53 %56
+ OpStore %38 %57
+ OpBranch %35
+ %58 = OpLabel
+ %59 = OpAccessChain %44 %43 %16 %16
+ %60 = OpLoad %15 %59
+ %61 = OpConvertSToF %6 %60
+ %62 = OpCompositeConstruct %36 %61 %61 %61 %61
+ OpStore %38 %62
+ OpBranch %35
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 2.6 1.61 0.1
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-modf-clamp-for.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-modf-clamp-for.amber
new file mode 100644
index 0000000..701f284
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-modf-clamp-for.amber
@@ -0,0 +1,280 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific live intervals code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_2 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _int_10 _GLF_uniform_int_values[3]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_2_0 _GLF_uniform_float_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[2]
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [0, 2, 1, 10]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 2.0, 0.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float a = _float_1_0;
+#
+# // b becomes 0.
+# int b = int(modf(_float_0_0, a));
+#
+# vec2 v1 = vec2(_float_1_0);
+#
+# // Always true.
+# if (v1[clamp(_int_0, b, _int_2)] >= _float_1_0)
+# {
+# float c = _float_2_0;
+# for (int i = _int_0; (c >= _float_2_0) && (i < _int_10); i++)
+# {
+# a = c;
+# c = a;
+# }
+# }
+# if (a == _float_2_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 108
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %89
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %21 "b"
+ OpName %29 "v1"
+ OpName %35 "buf0"
+ OpMemberName %35 0 "_GLF_uniform_int_values"
+ OpName %37 ""
+ OpName %54 "c"
+ OpName %57 "i"
+ OpName %89 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %34 ArrayStride 16
+ OpMemberDecorate %35 0 Offset 0
+ OpDecorate %35 Block
+ OpDecorate %37 DescriptorSet 0
+ OpDecorate %37 Binding 0
+ OpDecorate %89 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %6
+ %20 = OpTypePointer Function %15
+ %22 = OpConstant %15 2
+ %27 = OpTypeVector %6 2
+ %28 = OpTypePointer Function %27
+ %33 = OpConstant %9 4
+ %34 = OpTypeArray %15 %33
+ %35 = OpTypeStruct %34
+ %36 = OpTypePointer Uniform %35
+ %37 = OpVariable %36 Uniform
+ %38 = OpTypePointer Uniform %15
+ %42 = OpConstant %15 1
+ %50 = OpTypeBool
+ %72 = OpConstant %15 3
+ %87 = OpTypeVector %6 4
+ %88 = OpTypePointer Output %87
+ %89 = OpVariable %88 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %21 = OpVariable %20 Function
+ %29 = OpVariable %28 Function
+ %54 = OpVariable %7 Function
+ %57 = OpVariable %20 Function
+ %18 = OpAccessChain %17 %14 %16 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %23 = OpAccessChain %17 %14 %16 %22
+ %24 = OpLoad %6 %23
+ %25 = OpExtInst %6 %1 Modf %24 %8
+ %26 = OpConvertFToS %15 %25
+ OpStore %21 %26
+ %30 = OpAccessChain %17 %14 %16 %16
+ %31 = OpLoad %6 %30
+ %32 = OpCompositeConstruct %27 %31 %31
+ OpStore %29 %32
+ %39 = OpAccessChain %38 %37 %16 %16
+ %40 = OpLoad %15 %39
+ %41 = OpLoad %15 %21
+ %43 = OpAccessChain %38 %37 %16 %42
+ %44 = OpLoad %15 %43
+ %45 = OpExtInst %15 %1 SClamp %40 %41 %44
+ %46 = OpAccessChain %7 %29 %45
+ %47 = OpLoad %6 %46
+ %48 = OpAccessChain %17 %14 %16 %16
+ %49 = OpLoad %6 %48
+ %51 = OpFOrdGreaterThanEqual %50 %47 %49
+ OpSelectionMerge %53 None
+ OpBranchConditional %51 %52 %53
+ %52 = OpLabel
+ %55 = OpAccessChain %17 %14 %16 %42
+ %56 = OpLoad %6 %55
+ OpStore %54 %56
+ %58 = OpAccessChain %38 %37 %16 %16
+ %59 = OpLoad %15 %58
+ OpStore %57 %59
+ OpBranch %60
+ %60 = OpLabel
+ OpLoopMerge %62 %63 None
+ OpBranch %64
+ %64 = OpLabel
+ %65 = OpLoad %6 %54
+ %66 = OpAccessChain %17 %14 %16 %42
+ %67 = OpLoad %6 %66
+ %68 = OpFOrdGreaterThanEqual %50 %65 %67
+ OpSelectionMerge %70 None
+ OpBranchConditional %68 %69 %70
+ %69 = OpLabel
+ %71 = OpLoad %15 %57
+ %73 = OpAccessChain %38 %37 %16 %72
+ %74 = OpLoad %15 %73
+ %75 = OpSLessThan %50 %71 %74
+ OpBranch %70
+ %70 = OpLabel
+ %76 = OpPhi %50 %68 %64 %75 %69
+ OpBranchConditional %76 %61 %62
+ %61 = OpLabel
+ %77 = OpLoad %6 %54
+ OpStore %8 %77
+ %78 = OpLoad %6 %8
+ OpStore %54 %78
+ OpBranch %63
+ %63 = OpLabel
+ %79 = OpLoad %15 %57
+ %80 = OpIAdd %15 %79 %42
+ OpStore %57 %80
+ OpBranch %60
+ %62 = OpLabel
+ OpBranch %53
+ %53 = OpLabel
+ %81 = OpLoad %6 %8
+ %82 = OpAccessChain %17 %14 %16 %42
+ %83 = OpLoad %6 %82
+ %84 = OpFOrdEqual %50 %81 %83
+ OpSelectionMerge %86 None
+ OpBranchConditional %84 %85 %103
+ %85 = OpLabel
+ %90 = OpAccessChain %38 %37 %16 %22
+ %91 = OpLoad %15 %90
+ %92 = OpConvertSToF %6 %91
+ %93 = OpAccessChain %38 %37 %16 %16
+ %94 = OpLoad %15 %93
+ %95 = OpConvertSToF %6 %94
+ %96 = OpAccessChain %38 %37 %16 %16
+ %97 = OpLoad %15 %96
+ %98 = OpConvertSToF %6 %97
+ %99 = OpAccessChain %38 %37 %16 %22
+ %100 = OpLoad %15 %99
+ %101 = OpConvertSToF %6 %100
+ %102 = OpCompositeConstruct %87 %92 %95 %98 %101
+ OpStore %89 %102
+ OpBranch %86
+ %103 = OpLabel
+ %104 = OpAccessChain %38 %37 %16 %16
+ %105 = OpLoad %15 %104
+ %106 = OpConvertSToF %6 %105
+ %107 = OpCompositeConstruct %87 %106 %106 %106 %106
+ OpStore %89 %107
+ OpBranch %86
+ %86 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 2.0 0.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 2 1 10
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-not-clamp-matrix-access.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-not-clamp-matrix-access.amber
new file mode 100644
index 0000000..91fb2cd
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-not-clamp-matrix-access.amber
@@ -0,0 +1,252 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific selection dag code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_3 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _float_10_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+# #define _float_2_0 _GLF_uniform_float_values[2]
+# #define _float_3_0 _GLF_uniform_float_values[3]
+# #define _float_4_0 _GLF_uniform_float_values[4]
+#
+# precision highp int;
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: [10.0, 1.0, 2.0, 3.0, 4.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[5];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [3, 0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# mat2 M1 = mat2(_float_1_0, _float_2_0, _float_3_0, _float_4_0);
+# float a = _float_1_0;
+#
+# for (int c = _int_0; c < _int_3; c++)
+# {
+# // At each iteration, clamp returns 0.
+# a += M1[_int_1][clamp(~c, 0, 1)];
+# }
+#
+# if (a == _float_10_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 99
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %80
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %10 "M1"
+ OpName %14 "buf0"
+ OpMemberName %14 0 "_GLF_uniform_float_values"
+ OpName %16 ""
+ OpName %38 "a"
+ OpName %42 "c"
+ OpName %45 "buf1"
+ OpMemberName %45 0 "_GLF_uniform_int_values"
+ OpName %47 ""
+ OpName %80 "_GLF_color"
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 0
+ OpDecorate %44 ArrayStride 16
+ OpMemberDecorate %45 0 Offset 0
+ OpDecorate %45 Block
+ OpDecorate %47 DescriptorSet 0
+ OpDecorate %47 Binding 1
+ OpDecorate %80 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypeMatrix %7 2
+ %9 = OpTypePointer Function %8
+ %11 = OpTypeInt 32 0
+ %12 = OpConstant %11 5
+ %13 = OpTypeArray %6 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpTypeInt 32 1
+ %18 = OpConstant %17 0
+ %19 = OpConstant %17 1
+ %20 = OpTypePointer Uniform %6
+ %23 = OpConstant %17 2
+ %26 = OpConstant %17 3
+ %29 = OpConstant %17 4
+ %32 = OpConstant %6 1
+ %33 = OpConstant %6 0
+ %37 = OpTypePointer Function %6
+ %41 = OpTypePointer Function %17
+ %43 = OpConstant %11 3
+ %44 = OpTypeArray %17 %43
+ %45 = OpTypeStruct %44
+ %46 = OpTypePointer Uniform %45
+ %47 = OpVariable %46 Uniform
+ %48 = OpTypePointer Uniform %17
+ %59 = OpTypeBool
+ %78 = OpTypeVector %6 4
+ %79 = OpTypePointer Output %78
+ %80 = OpVariable %79 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %10 = OpVariable %9 Function
+ %38 = OpVariable %37 Function
+ %42 = OpVariable %41 Function
+ %21 = OpAccessChain %20 %16 %18 %19
+ %22 = OpLoad %6 %21
+ %24 = OpAccessChain %20 %16 %18 %23
+ %25 = OpLoad %6 %24
+ %27 = OpAccessChain %20 %16 %18 %26
+ %28 = OpLoad %6 %27
+ %30 = OpAccessChain %20 %16 %18 %29
+ %31 = OpLoad %6 %30
+ %34 = OpCompositeConstruct %7 %22 %25
+ %35 = OpCompositeConstruct %7 %28 %31
+ %36 = OpCompositeConstruct %8 %34 %35
+ OpStore %10 %36
+ %39 = OpAccessChain %20 %16 %18 %19
+ %40 = OpLoad %6 %39
+ OpStore %38 %40
+ %49 = OpAccessChain %48 %47 %18 %19
+ %50 = OpLoad %17 %49
+ OpStore %42 %50
+ OpBranch %51
+ %51 = OpLabel
+ OpLoopMerge %53 %54 None
+ OpBranch %55
+ %55 = OpLabel
+ %56 = OpLoad %17 %42
+ %57 = OpAccessChain %48 %47 %18 %18
+ %58 = OpLoad %17 %57
+ %60 = OpSLessThan %59 %56 %58
+ OpBranchConditional %60 %52 %53
+ %52 = OpLabel
+ %61 = OpAccessChain %48 %47 %18 %23
+ %62 = OpLoad %17 %61
+ %63 = OpLoad %17 %42
+ %64 = OpNot %17 %63
+ %65 = OpExtInst %17 %1 SClamp %64 %18 %19
+ %66 = OpAccessChain %37 %10 %62 %65
+ %67 = OpLoad %6 %66
+ %68 = OpLoad %6 %38
+ %69 = OpFAdd %6 %68 %67
+ OpStore %38 %69
+ OpBranch %54
+ %54 = OpLabel
+ %70 = OpLoad %17 %42
+ %71 = OpIAdd %17 %70 %19
+ OpStore %42 %71
+ OpBranch %51
+ %53 = OpLabel
+ %72 = OpLoad %6 %38
+ %73 = OpAccessChain %20 %16 %18 %18
+ %74 = OpLoad %6 %73
+ %75 = OpFOrdEqual %59 %72 %74
+ OpSelectionMerge %77 None
+ OpBranchConditional %75 %76 %94
+ %76 = OpLabel
+ %81 = OpAccessChain %48 %47 %18 %23
+ %82 = OpLoad %17 %81
+ %83 = OpConvertSToF %6 %82
+ %84 = OpAccessChain %48 %47 %18 %19
+ %85 = OpLoad %17 %84
+ %86 = OpConvertSToF %6 %85
+ %87 = OpAccessChain %48 %47 %18 %19
+ %88 = OpLoad %17 %87
+ %89 = OpConvertSToF %6 %88
+ %90 = OpAccessChain %48 %47 %18 %23
+ %91 = OpLoad %17 %90
+ %92 = OpConvertSToF %6 %91
+ %93 = OpCompositeConstruct %78 %83 %86 %89 %92
+ OpStore %80 %93
+ OpBranch %77
+ %94 = OpLabel
+ %95 = OpAccessChain %48 %47 %18 %23
+ %96 = OpLoad %17 %95
+ %97 = OpConvertSToF %6 %96
+ %98 = OpCompositeConstruct %78 %97 %97 %97 %97
+ OpStore %80 %98
+ OpBranch %77
+ %77 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 3 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 10.0 1.0 2.0 3.0 4.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-pow-undefined.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-pow-undefined.amber
new file mode 100644
index 0000000..890ee6f
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-pow-undefined.amber
@@ -0,0 +1,171 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers specific constant fold and selection dag code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float a = -1.0;
+# float b = 1.7;
+#
+# // c becomes undefined since a < 0. This results in an undefined value, but not in undefined behavior.
+# float c = pow(a, b);
+#
+# _GLF_color = vec4(c);
+#
+# if (a == -1.0 && b == 1.7)
+# {
+# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
+# }
+# else
+# {
+# _GLF_color = vec4(_float_1_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 52
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %18
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %10 "b"
+ OpName %12 "c"
+ OpName %18 "_GLF_color"
+ OpName %32 "buf0"
+ OpMemberName %32 0 "_GLF_uniform_float_values"
+ OpName %34 ""
+ OpDecorate %18 Location 0
+ OpDecorate %31 ArrayStride 16
+ OpMemberDecorate %32 0 Offset 0
+ OpDecorate %32 Block
+ OpDecorate %34 DescriptorSet 0
+ OpDecorate %34 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 -1
+ %11 = OpConstant %6 1.70000005
+ %16 = OpTypeVector %6 4
+ %17 = OpTypePointer Output %16
+ %18 = OpVariable %17 Output
+ %22 = OpTypeBool
+ %29 = OpTypeInt 32 0
+ %30 = OpConstant %29 2
+ %31 = OpTypeArray %6 %30
+ %32 = OpTypeStruct %31
+ %33 = OpTypePointer Uniform %32
+ %34 = OpVariable %33 Uniform
+ %35 = OpTypeInt 32 1
+ %36 = OpConstant %35 0
+ %37 = OpTypePointer Uniform %6
+ %40 = OpConstant %35 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %10 = OpVariable %7 Function
+ %12 = OpVariable %7 Function
+ OpStore %8 %9
+ OpStore %10 %11
+ %13 = OpLoad %6 %8
+ %14 = OpLoad %6 %10
+ %15 = OpExtInst %6 %1 Pow %13 %14
+ OpStore %12 %15
+ %19 = OpLoad %6 %12
+ %20 = OpCompositeConstruct %16 %19 %19 %19 %19
+ OpStore %18 %20
+ %21 = OpLoad %6 %8
+ %23 = OpFOrdEqual %22 %21 %9
+ %24 = OpLoad %6 %10
+ %25 = OpFOrdEqual %22 %24 %11
+ %26 = OpLogicalAnd %22 %23 %25
+ OpSelectionMerge %28 None
+ OpBranchConditional %26 %27 %48
+ %27 = OpLabel
+ %38 = OpAccessChain %37 %34 %36 %36
+ %39 = OpLoad %6 %38
+ %41 = OpAccessChain %37 %34 %36 %40
+ %42 = OpLoad %6 %41
+ %43 = OpAccessChain %37 %34 %36 %40
+ %44 = OpLoad %6 %43
+ %45 = OpAccessChain %37 %34 %36 %36
+ %46 = OpLoad %6 %45
+ %47 = OpCompositeConstruct %16 %39 %42 %44 %46
+ OpStore %18 %47
+ OpBranch %28
+ %48 = OpLabel
+ %49 = OpAccessChain %37 %34 %36 %36
+ %50 = OpLoad %6 %49
+ %51 = OpCompositeConstruct %16 %50 %50 %50 %50
+ OpStore %18 %51
+ OpBranch %28
+ %28 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard.amber
new file mode 100644
index 0000000..7bf46aa
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard.amber
@@ -0,0 +1,245 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers register coalescer, live intervals and target instr info code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_10 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: [10, 0, 1]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_v1;
+#
+# void main()
+# {
+# for (int i = _int_0; i < _int_10; i++)
+# {
+# // Always false.
+# if (_float_0_0 > _float_1_0)
+# {
+# discard;
+# }
+# for (int j = _int_0; j < _int_10; j++)
+# {
+# // Always false.
+# if (gl_FragCoord.x < _float_0_0)
+# {
+# discard;
+# }
+# _GLF_v1 = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 90
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %59 %71
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "i"
+ OpName %12 "buf1"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %33 "buf0"
+ OpMemberName %33 0 "_GLF_uniform_float_values"
+ OpName %35 ""
+ OpName %45 "j"
+ OpName %59 "gl_FragCoord"
+ OpName %71 "_GLF_v1"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 1
+ OpDecorate %32 ArrayStride 16
+ OpMemberDecorate %33 0 Offset 0
+ OpDecorate %33 Block
+ OpDecorate %35 DescriptorSet 0
+ OpDecorate %35 Binding 0
+ OpDecorate %59 BuiltIn FragCoord
+ OpDecorate %71 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 1
+ %17 = OpTypePointer Uniform %6
+ %28 = OpTypeBool
+ %30 = OpTypeFloat 32
+ %31 = OpConstant %9 2
+ %32 = OpTypeArray %30 %31
+ %33 = OpTypeStruct %32
+ %34 = OpTypePointer Uniform %33
+ %35 = OpVariable %34 Uniform
+ %36 = OpTypePointer Uniform %30
+ %57 = OpTypeVector %30 4
+ %58 = OpTypePointer Input %57
+ %59 = OpVariable %58 Input
+ %60 = OpConstant %9 0
+ %61 = OpTypePointer Input %30
+ %70 = OpTypePointer Output %57
+ %71 = OpVariable %70 Output
+ %72 = OpConstant %6 2
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %45 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ OpBranch %20
+ %20 = OpLabel
+ OpLoopMerge %22 %23 None
+ OpBranch %24
+ %24 = OpLabel
+ %25 = OpLoad %6 %8
+ %26 = OpAccessChain %17 %14 %15 %15
+ %27 = OpLoad %6 %26
+ %29 = OpSLessThan %28 %25 %27
+ OpBranchConditional %29 %21 %22
+ %21 = OpLabel
+ %37 = OpAccessChain %36 %35 %15 %15
+ %38 = OpLoad %30 %37
+ %39 = OpAccessChain %36 %35 %15 %16
+ %40 = OpLoad %30 %39
+ %41 = OpFOrdGreaterThan %28 %38 %40
+ OpSelectionMerge %43 None
+ OpBranchConditional %41 %42 %43
+ %42 = OpLabel
+ OpKill
+ %43 = OpLabel
+ %46 = OpAccessChain %17 %14 %15 %16
+ %47 = OpLoad %6 %46
+ OpStore %45 %47
+ OpBranch %48
+ %48 = OpLabel
+ OpLoopMerge %50 %51 None
+ OpBranch %52
+ %52 = OpLabel
+ %53 = OpLoad %6 %45
+ %54 = OpAccessChain %17 %14 %15 %15
+ %55 = OpLoad %6 %54
+ %56 = OpSLessThan %28 %53 %55
+ OpBranchConditional %56 %49 %50
+ %49 = OpLabel
+ %62 = OpAccessChain %61 %59 %60
+ %63 = OpLoad %30 %62
+ %64 = OpAccessChain %36 %35 %15 %15
+ %65 = OpLoad %30 %64
+ %66 = OpFOrdLessThan %28 %63 %65
+ OpSelectionMerge %68 None
+ OpBranchConditional %66 %67 %68
+ %67 = OpLabel
+ OpKill
+ %68 = OpLabel
+ %73 = OpAccessChain %17 %14 %15 %72
+ %74 = OpLoad %6 %73
+ %75 = OpConvertSToF %30 %74
+ %76 = OpAccessChain %17 %14 %15 %16
+ %77 = OpLoad %6 %76
+ %78 = OpConvertSToF %30 %77
+ %79 = OpAccessChain %17 %14 %15 %16
+ %80 = OpLoad %6 %79
+ %81 = OpConvertSToF %30 %80
+ %82 = OpAccessChain %17 %14 %15 %72
+ %83 = OpLoad %6 %82
+ %84 = OpConvertSToF %30 %83
+ %85 = OpCompositeConstruct %57 %75 %78 %81 %84
+ OpStore %71 %85
+ OpBranch %51
+ %51 = OpLabel
+ %86 = OpLoad %6 %45
+ %87 = OpIAdd %6 %86 %16
+ OpStore %45 %87
+ OpBranch %48
+ %50 = OpLabel
+ OpBranch %23
+ %23 = OpLabel
+ %88 = OpLoad %6 %8
+ %89 = OpIAdd %6 %88 %16
+ OpStore %8 %89
+ OpBranch %20
+ %22 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 10 0 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-return-after-do-while.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-return-after-do-while.amber
new file mode 100644
index 0000000..8c658a1
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-return-after-do-while.amber
@@ -0,0 +1,168 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific simplify cfg code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf1
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+#
+# // Always false.
+# if(_int_0 > _int_1)
+# {
+# do
+# {
+# _GLF_color = vec4(_int_1);
+# }
+# while(_int_0 > _int_1);
+#
+# return;
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 55
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %9
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "_GLF_color"
+ OpName %14 "buf1"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpDecorate %9 Location 0
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Output %7
+ %9 = OpVariable %8 Output
+ %10 = OpTypeInt 32 1
+ %11 = OpTypeInt 32 0
+ %12 = OpConstant %11 2
+ %13 = OpTypeArray %10 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %10 0
+ %18 = OpTypePointer Uniform %10
+ %22 = OpConstant %10 1
+ %37 = OpTypeBool
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %19 = OpAccessChain %18 %16 %17 %17
+ %20 = OpLoad %10 %19
+ %21 = OpConvertSToF %6 %20
+ %23 = OpAccessChain %18 %16 %17 %22
+ %24 = OpLoad %10 %23
+ %25 = OpConvertSToF %6 %24
+ %26 = OpAccessChain %18 %16 %17 %22
+ %27 = OpLoad %10 %26
+ %28 = OpConvertSToF %6 %27
+ %29 = OpAccessChain %18 %16 %17 %17
+ %30 = OpLoad %10 %29
+ %31 = OpConvertSToF %6 %30
+ %32 = OpCompositeConstruct %7 %21 %25 %28 %31
+ OpStore %9 %32
+ %33 = OpAccessChain %18 %16 %17 %22
+ %34 = OpLoad %10 %33
+ %35 = OpAccessChain %18 %16 %17 %17
+ %36 = OpLoad %10 %35
+ %38 = OpSGreaterThan %37 %34 %36
+ OpSelectionMerge %40 None
+ OpBranchConditional %38 %39 %40
+ %39 = OpLabel
+ OpBranch %41
+ %41 = OpLabel
+ OpLoopMerge %43 %44 None
+ OpBranch %42
+ %42 = OpLabel
+ %45 = OpAccessChain %18 %16 %17 %17
+ %46 = OpLoad %10 %45
+ %47 = OpConvertSToF %6 %46
+ %48 = OpCompositeConstruct %7 %47 %47 %47 %47
+ OpStore %9 %48
+ OpBranch %44
+ %44 = OpLabel
+ %49 = OpAccessChain %18 %16 %17 %22
+ %50 = OpLoad %10 %49
+ %51 = OpAccessChain %18 %16 %17 %17
+ %52 = OpLoad %10 %51
+ %53 = OpSGreaterThan %37 %50 %52
+ OpBranchConditional %53 %41 %43
+ %43 = OpLabel
+ OpReturn
+ %40 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-scaled-number-nested-loops-array-access.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-scaled-number-nested-loops-array-access.amber
new file mode 100644
index 0000000..d847094
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-scaled-number-nested-loops-array-access.amber
@@ -0,0 +1,545 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific scaled number path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_2 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+# #define _int_12 _GLF_uniform_int_values[3]
+# #define _int_4 _GLF_uniform_int_values[4]
+# #define _int_8 _GLF_uniform_int_values[5]
+# #define _int_3 _GLF_uniform_int_values[6]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_6912_0 _GLF_uniform_float_values[1]
+# #define _float_1_0 _GLF_uniform_float_values[2]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [2, 0, 1, 12, 4, 8, 3]
+# layout(set = 0, binding = 0) uniform buf0 {
+# int _GLF_uniform_int_values[7];
+# };
+# // Contents of _GLF_uniform_float_values: [0.0, 6912.0, 1.0]
+# layout(set = 0, binding = 1) uniform buf1 {
+# float _GLF_uniform_float_values[3];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float sums[2];
+# sums[_int_0] = _float_0_0;
+# sums[_int_1] = _float_0_0;
+#
+# for(int a = _int_0; a < _int_2; a ++)
+# for(int b = _int_8; b < _int_12; b ++) // Loops 4 times.
+# for(int c = _int_3; c <= _int_4; c ++) // Loops 2 times.
+# for(int d = _int_0; d < _int_3; d ++) // Loops 3 times.
+# for(int e = _int_2; e <= _int_4; e ++) // Loops 3 times.
+# for(int f = _int_0; f < _int_2; f ++) // Loops 2 times.
+# for(int g = _int_0; g < _int_3; g ++) // Loops 3 times.
+# for(int h = _int_0; h < _int_2; h ++) // Loops 2 times.
+# for(int i = _int_0; i < _int_4; i ++) // Loops 4 times.
+# for(int j = _int_2; j > _int_0; j --) // Loops 2 times.
+# {
+# sums[a] += _float_1_0;
+# }
+#
+# if(sums[_int_0] == _float_6912_0 && sums[_int_1] == _float_6912_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 232
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %213
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "sums"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "_GLF_uniform_int_values"
+ OpName %17 ""
+ OpName %25 "buf1"
+ OpMemberName %25 0 "_GLF_uniform_float_values"
+ OpName %27 ""
+ OpName %40 "a"
+ OpName %53 "b"
+ OpName %67 "c"
+ OpName %81 "d"
+ OpName %93 "e"
+ OpName %105 "f"
+ OpName %117 "g"
+ OpName %129 "h"
+ OpName %141 "i"
+ OpName %153 "j"
+ OpName %213 "_GLF_color"
+ OpDecorate %14 ArrayStride 16
+ OpMemberDecorate %15 0 RelaxedPrecision
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %22 RelaxedPrecision
+ OpDecorate %24 ArrayStride 16
+ OpMemberDecorate %25 0 Offset 0
+ OpDecorate %25 Block
+ OpDecorate %27 DescriptorSet 0
+ OpDecorate %27 Binding 1
+ OpDecorate %35 RelaxedPrecision
+ OpDecorate %40 RelaxedPrecision
+ OpDecorate %42 RelaxedPrecision
+ OpDecorate %48 RelaxedPrecision
+ OpDecorate %50 RelaxedPrecision
+ OpDecorate %53 RelaxedPrecision
+ OpDecorate %56 RelaxedPrecision
+ OpDecorate %62 RelaxedPrecision
+ OpDecorate %65 RelaxedPrecision
+ OpDecorate %67 RelaxedPrecision
+ OpDecorate %70 RelaxedPrecision
+ OpDecorate %76 RelaxedPrecision
+ OpDecorate %79 RelaxedPrecision
+ OpDecorate %81 RelaxedPrecision
+ OpDecorate %83 RelaxedPrecision
+ OpDecorate %89 RelaxedPrecision
+ OpDecorate %91 RelaxedPrecision
+ OpDecorate %93 RelaxedPrecision
+ OpDecorate %95 RelaxedPrecision
+ OpDecorate %101 RelaxedPrecision
+ OpDecorate %103 RelaxedPrecision
+ OpDecorate %105 RelaxedPrecision
+ OpDecorate %107 RelaxedPrecision
+ OpDecorate %113 RelaxedPrecision
+ OpDecorate %115 RelaxedPrecision
+ OpDecorate %117 RelaxedPrecision
+ OpDecorate %119 RelaxedPrecision
+ OpDecorate %125 RelaxedPrecision
+ OpDecorate %127 RelaxedPrecision
+ OpDecorate %129 RelaxedPrecision
+ OpDecorate %131 RelaxedPrecision
+ OpDecorate %137 RelaxedPrecision
+ OpDecorate %139 RelaxedPrecision
+ OpDecorate %141 RelaxedPrecision
+ OpDecorate %143 RelaxedPrecision
+ OpDecorate %149 RelaxedPrecision
+ OpDecorate %151 RelaxedPrecision
+ OpDecorate %153 RelaxedPrecision
+ OpDecorate %155 RelaxedPrecision
+ OpDecorate %161 RelaxedPrecision
+ OpDecorate %163 RelaxedPrecision
+ OpDecorate %165 RelaxedPrecision
+ OpDecorate %172 RelaxedPrecision
+ OpDecorate %173 RelaxedPrecision
+ OpDecorate %174 RelaxedPrecision
+ OpDecorate %175 RelaxedPrecision
+ OpDecorate %176 RelaxedPrecision
+ OpDecorate %177 RelaxedPrecision
+ OpDecorate %178 RelaxedPrecision
+ OpDecorate %179 RelaxedPrecision
+ OpDecorate %180 RelaxedPrecision
+ OpDecorate %181 RelaxedPrecision
+ OpDecorate %182 RelaxedPrecision
+ OpDecorate %183 RelaxedPrecision
+ OpDecorate %184 RelaxedPrecision
+ OpDecorate %185 RelaxedPrecision
+ OpDecorate %186 RelaxedPrecision
+ OpDecorate %187 RelaxedPrecision
+ OpDecorate %188 RelaxedPrecision
+ OpDecorate %189 RelaxedPrecision
+ OpDecorate %190 RelaxedPrecision
+ OpDecorate %191 RelaxedPrecision
+ OpDecorate %193 RelaxedPrecision
+ OpDecorate %202 RelaxedPrecision
+ OpDecorate %213 Location 0
+ OpDecorate %215 RelaxedPrecision
+ OpDecorate %218 RelaxedPrecision
+ OpDecorate %221 RelaxedPrecision
+ OpDecorate %224 RelaxedPrecision
+ OpDecorate %229 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeInt 32 0
+ %8 = OpConstant %7 2
+ %9 = OpTypeArray %6 %8
+ %10 = OpTypePointer Function %9
+ %12 = OpTypeInt 32 1
+ %13 = OpConstant %7 7
+ %14 = OpTypeArray %12 %13
+ %15 = OpTypeStruct %14
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpConstant %12 0
+ %19 = OpConstant %12 1
+ %20 = OpTypePointer Uniform %12
+ %23 = OpConstant %7 3
+ %24 = OpTypeArray %6 %23
+ %25 = OpTypeStruct %24
+ %26 = OpTypePointer Uniform %25
+ %27 = OpVariable %26 Uniform
+ %28 = OpTypePointer Uniform %6
+ %31 = OpTypePointer Function %6
+ %33 = OpConstant %12 2
+ %39 = OpTypePointer Function %12
+ %51 = OpTypeBool
+ %54 = OpConstant %12 5
+ %63 = OpConstant %12 3
+ %68 = OpConstant %12 6
+ %77 = OpConstant %12 4
+ %211 = OpTypeVector %6 4
+ %212 = OpTypePointer Output %211
+ %213 = OpVariable %212 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %11 = OpVariable %10 Function
+ %40 = OpVariable %39 Function
+ %53 = OpVariable %39 Function
+ %67 = OpVariable %39 Function
+ %81 = OpVariable %39 Function
+ %93 = OpVariable %39 Function
+ %105 = OpVariable %39 Function
+ %117 = OpVariable %39 Function
+ %129 = OpVariable %39 Function
+ %141 = OpVariable %39 Function
+ %153 = OpVariable %39 Function
+ %21 = OpAccessChain %20 %17 %18 %19
+ %22 = OpLoad %12 %21
+ %29 = OpAccessChain %28 %27 %18 %18
+ %30 = OpLoad %6 %29
+ %32 = OpAccessChain %31 %11 %22
+ OpStore %32 %30
+ %34 = OpAccessChain %20 %17 %18 %33
+ %35 = OpLoad %12 %34
+ %36 = OpAccessChain %28 %27 %18 %18
+ %37 = OpLoad %6 %36
+ %38 = OpAccessChain %31 %11 %35
+ OpStore %38 %37
+ %41 = OpAccessChain %20 %17 %18 %19
+ %42 = OpLoad %12 %41
+ OpStore %40 %42
+ OpBranch %43
+ %43 = OpLabel
+ OpLoopMerge %45 %46 None
+ OpBranch %47
+ %47 = OpLabel
+ %48 = OpLoad %12 %40
+ %49 = OpAccessChain %20 %17 %18 %18
+ %50 = OpLoad %12 %49
+ %52 = OpSLessThan %51 %48 %50
+ OpBranchConditional %52 %44 %45
+ %44 = OpLabel
+ %55 = OpAccessChain %20 %17 %18 %54
+ %56 = OpLoad %12 %55
+ OpStore %53 %56
+ OpBranch %57
+ %57 = OpLabel
+ OpLoopMerge %59 %60 None
+ OpBranch %61
+ %61 = OpLabel
+ %62 = OpLoad %12 %53
+ %64 = OpAccessChain %20 %17 %18 %63
+ %65 = OpLoad %12 %64
+ %66 = OpSLessThan %51 %62 %65
+ OpBranchConditional %66 %58 %59
+ %58 = OpLabel
+ %69 = OpAccessChain %20 %17 %18 %68
+ %70 = OpLoad %12 %69
+ OpStore %67 %70
+ OpBranch %71
+ %71 = OpLabel
+ OpLoopMerge %73 %74 None
+ OpBranch %75
+ %75 = OpLabel
+ %76 = OpLoad %12 %67
+ %78 = OpAccessChain %20 %17 %18 %77
+ %79 = OpLoad %12 %78
+ %80 = OpSLessThanEqual %51 %76 %79
+ OpBranchConditional %80 %72 %73
+ %72 = OpLabel
+ %82 = OpAccessChain %20 %17 %18 %19
+ %83 = OpLoad %12 %82
+ OpStore %81 %83
+ OpBranch %84
+ %84 = OpLabel
+ OpLoopMerge %86 %87 None
+ OpBranch %88
+ %88 = OpLabel
+ %89 = OpLoad %12 %81
+ %90 = OpAccessChain %20 %17 %18 %68
+ %91 = OpLoad %12 %90
+ %92 = OpSLessThan %51 %89 %91
+ OpBranchConditional %92 %85 %86
+ %85 = OpLabel
+ %94 = OpAccessChain %20 %17 %18 %18
+ %95 = OpLoad %12 %94
+ OpStore %93 %95
+ OpBranch %96
+ %96 = OpLabel
+ OpLoopMerge %98 %99 None
+ OpBranch %100
+ %100 = OpLabel
+ %101 = OpLoad %12 %93
+ %102 = OpAccessChain %20 %17 %18 %77
+ %103 = OpLoad %12 %102
+ %104 = OpSLessThanEqual %51 %101 %103
+ OpBranchConditional %104 %97 %98
+ %97 = OpLabel
+ %106 = OpAccessChain %20 %17 %18 %19
+ %107 = OpLoad %12 %106
+ OpStore %105 %107
+ OpBranch %108
+ %108 = OpLabel
+ OpLoopMerge %110 %111 None
+ OpBranch %112
+ %112 = OpLabel
+ %113 = OpLoad %12 %105
+ %114 = OpAccessChain %20 %17 %18 %18
+ %115 = OpLoad %12 %114
+ %116 = OpSLessThan %51 %113 %115
+ OpBranchConditional %116 %109 %110
+ %109 = OpLabel
+ %118 = OpAccessChain %20 %17 %18 %19
+ %119 = OpLoad %12 %118
+ OpStore %117 %119
+ OpBranch %120
+ %120 = OpLabel
+ OpLoopMerge %122 %123 None
+ OpBranch %124
+ %124 = OpLabel
+ %125 = OpLoad %12 %117
+ %126 = OpAccessChain %20 %17 %18 %68
+ %127 = OpLoad %12 %126
+ %128 = OpSLessThan %51 %125 %127
+ OpBranchConditional %128 %121 %122
+ %121 = OpLabel
+ %130 = OpAccessChain %20 %17 %18 %19
+ %131 = OpLoad %12 %130
+ OpStore %129 %131
+ OpBranch %132
+ %132 = OpLabel
+ OpLoopMerge %134 %135 None
+ OpBranch %136
+ %136 = OpLabel
+ %137 = OpLoad %12 %129
+ %138 = OpAccessChain %20 %17 %18 %18
+ %139 = OpLoad %12 %138
+ %140 = OpSLessThan %51 %137 %139
+ OpBranchConditional %140 %133 %134
+ %133 = OpLabel
+ %142 = OpAccessChain %20 %17 %18 %19
+ %143 = OpLoad %12 %142
+ OpStore %141 %143
+ OpBranch %144
+ %144 = OpLabel
+ OpLoopMerge %146 %147 None
+ OpBranch %148
+ %148 = OpLabel
+ %149 = OpLoad %12 %141
+ %150 = OpAccessChain %20 %17 %18 %77
+ %151 = OpLoad %12 %150
+ %152 = OpSLessThan %51 %149 %151
+ OpBranchConditional %152 %145 %146
+ %145 = OpLabel
+ %154 = OpAccessChain %20 %17 %18 %18
+ %155 = OpLoad %12 %154
+ OpStore %153 %155
+ OpBranch %156
+ %156 = OpLabel
+ OpLoopMerge %158 %159 None
+ OpBranch %160
+ %160 = OpLabel
+ %161 = OpLoad %12 %153
+ %162 = OpAccessChain %20 %17 %18 %19
+ %163 = OpLoad %12 %162
+ %164 = OpSGreaterThan %51 %161 %163
+ OpBranchConditional %164 %157 %158
+ %157 = OpLabel
+ %165 = OpLoad %12 %40
+ %166 = OpAccessChain %28 %27 %18 %33
+ %167 = OpLoad %6 %166
+ %168 = OpAccessChain %31 %11 %165
+ %169 = OpLoad %6 %168
+ %170 = OpFAdd %6 %169 %167
+ %171 = OpAccessChain %31 %11 %165
+ OpStore %171 %170
+ OpBranch %159
+ %159 = OpLabel
+ %172 = OpLoad %12 %153
+ %173 = OpISub %12 %172 %19
+ OpStore %153 %173
+ OpBranch %156
+ %158 = OpLabel
+ OpBranch %147
+ %147 = OpLabel
+ %174 = OpLoad %12 %141
+ %175 = OpIAdd %12 %174 %19
+ OpStore %141 %175
+ OpBranch %144
+ %146 = OpLabel
+ OpBranch %135
+ %135 = OpLabel
+ %176 = OpLoad %12 %129
+ %177 = OpIAdd %12 %176 %19
+ OpStore %129 %177
+ OpBranch %132
+ %134 = OpLabel
+ OpBranch %123
+ %123 = OpLabel
+ %178 = OpLoad %12 %117
+ %179 = OpIAdd %12 %178 %19
+ OpStore %117 %179
+ OpBranch %120
+ %122 = OpLabel
+ OpBranch %111
+ %111 = OpLabel
+ %180 = OpLoad %12 %105
+ %181 = OpIAdd %12 %180 %19
+ OpStore %105 %181
+ OpBranch %108
+ %110 = OpLabel
+ OpBranch %99
+ %99 = OpLabel
+ %182 = OpLoad %12 %93
+ %183 = OpIAdd %12 %182 %19
+ OpStore %93 %183
+ OpBranch %96
+ %98 = OpLabel
+ OpBranch %87
+ %87 = OpLabel
+ %184 = OpLoad %12 %81
+ %185 = OpIAdd %12 %184 %19
+ OpStore %81 %185
+ OpBranch %84
+ %86 = OpLabel
+ OpBranch %74
+ %74 = OpLabel
+ %186 = OpLoad %12 %67
+ %187 = OpIAdd %12 %186 %19
+ OpStore %67 %187
+ OpBranch %71
+ %73 = OpLabel
+ OpBranch %60
+ %60 = OpLabel
+ %188 = OpLoad %12 %53
+ %189 = OpIAdd %12 %188 %19
+ OpStore %53 %189
+ OpBranch %57
+ %59 = OpLabel
+ OpBranch %46
+ %46 = OpLabel
+ %190 = OpLoad %12 %40
+ %191 = OpIAdd %12 %190 %19
+ OpStore %40 %191
+ OpBranch %43
+ %45 = OpLabel
+ %192 = OpAccessChain %20 %17 %18 %19
+ %193 = OpLoad %12 %192
+ %194 = OpAccessChain %31 %11 %193
+ %195 = OpLoad %6 %194
+ %196 = OpAccessChain %28 %27 %18 %19
+ %197 = OpLoad %6 %196
+ %198 = OpFOrdEqual %51 %195 %197
+ OpSelectionMerge %200 None
+ OpBranchConditional %198 %199 %200
+ %199 = OpLabel
+ %201 = OpAccessChain %20 %17 %18 %33
+ %202 = OpLoad %12 %201
+ %203 = OpAccessChain %31 %11 %202
+ %204 = OpLoad %6 %203
+ %205 = OpAccessChain %28 %27 %18 %19
+ %206 = OpLoad %6 %205
+ %207 = OpFOrdEqual %51 %204 %206
+ OpBranch %200
+ %200 = OpLabel
+ %208 = OpPhi %51 %198 %45 %207 %199
+ OpSelectionMerge %210 None
+ OpBranchConditional %208 %209 %227
+ %209 = OpLabel
+ %214 = OpAccessChain %20 %17 %18 %33
+ %215 = OpLoad %12 %214
+ %216 = OpConvertSToF %6 %215
+ %217 = OpAccessChain %20 %17 %18 %19
+ %218 = OpLoad %12 %217
+ %219 = OpConvertSToF %6 %218
+ %220 = OpAccessChain %20 %17 %18 %19
+ %221 = OpLoad %12 %220
+ %222 = OpConvertSToF %6 %221
+ %223 = OpAccessChain %20 %17 %18 %33
+ %224 = OpLoad %12 %223
+ %225 = OpConvertSToF %6 %224
+ %226 = OpCompositeConstruct %211 %216 %219 %222 %225
+ OpStore %213 %226
+ OpBranch %210
+ %227 = OpLabel
+ %228 = OpAccessChain %20 %17 %18 %19
+ %229 = OpLoad %12 %228
+ %230 = OpConvertSToF %6 %229
+ %231 = OpCompositeConstruct %211 %230 %230 %230 %230
+ OpStore %213 %231
+ OpBranch %210
+ %210 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 6912.0 1.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 2 0 1 12 4 8 3
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos.amber
new file mode 100644
index 0000000..690abbc
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos.amber
@@ -0,0 +1,180 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers a specific schedule dag register reduction list code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _float_0_0446 _GLF_uniform_float_values[0]
+# #define _float_0_0448 _GLF_uniform_float_values[1]
+# #define _float_4_6 _GLF_uniform_float_values[2]
+# #define _float_1_0 _GLF_uniform_float_values[3]
+# #define _float_0_0 _GLF_uniform_float_values[4]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: [0.0446, 0.0448, 4.6, 1.0, 0.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[5];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // a becomes 4.6.
+# float a = mix(_float_4_6, _float_1_0, _float_1_0 > _float_4_6);
+#
+# float b = cos(log(a));
+#
+# _GLF_color = vec4(b);
+#
+# if (b > _float_0_0446 && b < _float_0_0448)
+# {
+# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 64
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %37
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %31 "b"
+ OpName %37 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %37 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 5
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpConstant %15 2
+ %18 = OpTypePointer Uniform %6
+ %21 = OpConstant %15 3
+ %28 = OpTypeBool
+ %35 = OpTypeVector %6 4
+ %36 = OpTypePointer Output %35
+ %37 = OpVariable %36 Output
+ %47 = OpConstant %15 1
+ %56 = OpConstant %15 4
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %31 = OpVariable %7 Function
+ %19 = OpAccessChain %18 %14 %16 %17
+ %20 = OpLoad %6 %19
+ %22 = OpAccessChain %18 %14 %16 %21
+ %23 = OpLoad %6 %22
+ %24 = OpAccessChain %18 %14 %16 %21
+ %25 = OpLoad %6 %24
+ %26 = OpAccessChain %18 %14 %16 %17
+ %27 = OpLoad %6 %26
+ %29 = OpFOrdGreaterThan %28 %25 %27
+ %30 = OpSelect %6 %29 %23 %20
+ OpStore %8 %30
+ %32 = OpLoad %6 %8
+ %33 = OpExtInst %6 %1 Log %32
+ %34 = OpExtInst %6 %1 Cos %33
+ OpStore %31 %34
+ %38 = OpLoad %6 %31
+ %39 = OpCompositeConstruct %35 %38 %38 %38 %38
+ OpStore %37 %39
+ %40 = OpLoad %6 %31
+ %41 = OpAccessChain %18 %14 %16 %16
+ %42 = OpLoad %6 %41
+ %43 = OpFOrdGreaterThan %28 %40 %42
+ OpSelectionMerge %45 None
+ OpBranchConditional %43 %44 %45
+ %44 = OpLabel
+ %46 = OpLoad %6 %31
+ %48 = OpAccessChain %18 %14 %16 %47
+ %49 = OpLoad %6 %48
+ %50 = OpFOrdLessThan %28 %46 %49
+ OpBranch %45
+ %45 = OpLabel
+ %51 = OpPhi %28 %43 %5 %50 %44
+ OpSelectionMerge %53 None
+ OpBranchConditional %51 %52 %53
+ %52 = OpLabel
+ %54 = OpAccessChain %18 %14 %16 %21
+ %55 = OpLoad %6 %54
+ %57 = OpAccessChain %18 %14 %16 %56
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %18 %14 %16 %56
+ %60 = OpLoad %6 %59
+ %61 = OpAccessChain %18 %14 %16 %21
+ %62 = OpLoad %6 %61
+ %63 = OpCompositeConstruct %35 %55 %58 %60 %62
+ OpStore %37 %63
+ OpBranch %53
+ %53 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0446 0.0448 4.6 1.0 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-selection-dag-inverse-clamp.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-selection-dag-inverse-clamp.amber
new file mode 100644
index 0000000..a832438
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-selection-dag-inverse-clamp.amber
@@ -0,0 +1,194 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific selection DAG code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_10 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_1 _GLF_uniform_int_values[2]
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [10, 0, 1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int c = _int_1;
+#
+# for (int i = _int_1; i < _int_10; i++)
+# {
+# c = ~i;
+#
+# c = clamp(c, 0, 3);
+# }
+#
+# _GLF_color = vec4(_int_0);
+#
+# if (c == _int_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 68
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %44
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "c"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %20 "i"
+ OpName %44 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %44 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 3
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 2
+ %17 = OpTypePointer Uniform %6
+ %31 = OpTypeBool
+ %36 = OpConstant %6 3
+ %39 = OpConstant %6 1
+ %41 = OpTypeFloat 32
+ %42 = OpTypeVector %41 4
+ %43 = OpTypePointer Output %42
+ %44 = OpVariable %43 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %21 = OpAccessChain %17 %14 %15 %16
+ %22 = OpLoad %6 %21
+ OpStore %20 %22
+ OpBranch %23
+ %23 = OpLabel
+ OpLoopMerge %25 %26 None
+ OpBranch %27
+ %27 = OpLabel
+ %28 = OpLoad %6 %20
+ %29 = OpAccessChain %17 %14 %15 %15
+ %30 = OpLoad %6 %29
+ %32 = OpSLessThan %31 %28 %30
+ OpBranchConditional %32 %24 %25
+ %24 = OpLabel
+ %33 = OpLoad %6 %20
+ %34 = OpNot %6 %33
+ OpStore %8 %34
+ %35 = OpLoad %6 %8
+ %37 = OpExtInst %6 %1 SClamp %35 %15 %36
+ OpStore %8 %37
+ OpBranch %26
+ %26 = OpLabel
+ %38 = OpLoad %6 %20
+ %40 = OpIAdd %6 %38 %39
+ OpStore %20 %40
+ OpBranch %23
+ %25 = OpLabel
+ %45 = OpAccessChain %17 %14 %15 %39
+ %46 = OpLoad %6 %45
+ %47 = OpConvertSToF %41 %46
+ %48 = OpCompositeConstruct %42 %47 %47 %47 %47
+ OpStore %44 %48
+ %49 = OpLoad %6 %8
+ %50 = OpAccessChain %17 %14 %15 %39
+ %51 = OpLoad %6 %50
+ %52 = OpIEqual %31 %49 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %54
+ %53 = OpLabel
+ %55 = OpAccessChain %17 %14 %15 %16
+ %56 = OpLoad %6 %55
+ %57 = OpConvertSToF %41 %56
+ %58 = OpAccessChain %17 %14 %15 %39
+ %59 = OpLoad %6 %58
+ %60 = OpConvertSToF %41 %59
+ %61 = OpAccessChain %17 %14 %15 %39
+ %62 = OpLoad %6 %61
+ %63 = OpConvertSToF %41 %62
+ %64 = OpAccessChain %17 %14 %15 %16
+ %65 = OpLoad %6 %64
+ %66 = OpConvertSToF %41 %65
+ %67 = OpCompositeConstruct %42 %57 %60 %63 %66
+ OpStore %44 %67
+ OpBranch %54
+ %54 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 10 0 1
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-combine-compares-max-max-one.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-combine-compares-max-max-one.amber
new file mode 100644
index 0000000..3992c4c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-combine-compares-max-max-one.amber
@@ -0,0 +1,159 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers specific instruction simplifying and combining code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _int_5 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int a = max(_int_1, max(_int_1, 1));
+# if (a == _int_1)
+# {
+# _GLF_color = vec4(a, _int_0, _int_0, a);
+# }
+# else
+# {
+# _GLF_color = vec4(a);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 50
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %34
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %34 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %34 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 2
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpTypePointer Uniform %6
+ %21 = OpConstant %6 1
+ %27 = OpTypeBool
+ %31 = OpTypeFloat 32
+ %32 = OpTypeVector %31 4
+ %33 = OpTypePointer Output %32
+ %34 = OpVariable %33 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %17 = OpAccessChain %16 %14 %15 %15
+ %18 = OpLoad %6 %17
+ %19 = OpAccessChain %16 %14 %15 %15
+ %20 = OpLoad %6 %19
+ %22 = OpExtInst %6 %1 SMax %20 %21
+ %23 = OpExtInst %6 %1 SMax %18 %22
+ OpStore %8 %23
+ %24 = OpLoad %6 %8
+ %25 = OpAccessChain %16 %14 %15 %15
+ %26 = OpLoad %6 %25
+ %28 = OpIEqual %27 %24 %26
+ OpSelectionMerge %30 None
+ OpBranchConditional %28 %29 %46
+ %29 = OpLabel
+ %35 = OpLoad %6 %8
+ %36 = OpConvertSToF %31 %35
+ %37 = OpAccessChain %16 %14 %15 %21
+ %38 = OpLoad %6 %37
+ %39 = OpConvertSToF %31 %38
+ %40 = OpAccessChain %16 %14 %15 %21
+ %41 = OpLoad %6 %40
+ %42 = OpConvertSToF %31 %41
+ %43 = OpLoad %6 %8
+ %44 = OpConvertSToF %31 %43
+ %45 = OpCompositeConstruct %32 %36 %39 %42 %44
+ OpStore %34 %45
+ OpBranch %30
+ %46 = OpLabel
+ %47 = OpLoad %6 %8
+ %48 = OpConvertSToF %31 %47
+ %49 = OpCompositeConstruct %32 %48 %48 %48 %48
+ OpStore %34 %49
+ OpBranch %30
+ %30 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-for-bitwise-condition.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-for-bitwise-condition.amber
new file mode 100644
index 0000000..58d0e06
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-for-bitwise-condition.amber
@@ -0,0 +1,193 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction simplify code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0 {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int a = _int_0;
+# for (int i = -_int_1; (i | _int_1) < _int_1; i++)
+# {
+# a = i * _int_1;
+# }
+#
+# if (a == -_int_1)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(a);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 71
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %20 "i"
+ OpName %53 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %53 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 2
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpConstant %6 1
+ %17 = OpTypePointer Uniform %6
+ %35 = OpTypeBool
+ %50 = OpTypeFloat 32
+ %51 = OpTypeVector %50 4
+ %52 = OpTypePointer Output %51
+ %53 = OpVariable %52 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %15 %16
+ %19 = OpLoad %6 %18
+ OpStore %8 %19
+ %21 = OpAccessChain %17 %14 %15 %15
+ %22 = OpLoad %6 %21
+ %23 = OpSNegate %6 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %20
+ %30 = OpAccessChain %17 %14 %15 %15
+ %31 = OpLoad %6 %30
+ %32 = OpBitwiseOr %6 %29 %31
+ %33 = OpAccessChain %17 %14 %15 %15
+ %34 = OpLoad %6 %33
+ %36 = OpSLessThan %35 %32 %34
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %37 = OpLoad %6 %20
+ %38 = OpAccessChain %17 %14 %15 %15
+ %39 = OpLoad %6 %38
+ %40 = OpIMul %6 %37 %39
+ OpStore %8 %40
+ OpBranch %27
+ %27 = OpLabel
+ %41 = OpLoad %6 %20
+ %42 = OpIAdd %6 %41 %16
+ OpStore %20 %42
+ OpBranch %24
+ %26 = OpLabel
+ %43 = OpLoad %6 %8
+ %44 = OpAccessChain %17 %14 %15 %15
+ %45 = OpLoad %6 %44
+ %46 = OpSNegate %6 %45
+ %47 = OpIEqual %35 %43 %46
+ OpSelectionMerge %49 None
+ OpBranchConditional %47 %48 %67
+ %48 = OpLabel
+ %54 = OpAccessChain %17 %14 %15 %15
+ %55 = OpLoad %6 %54
+ %56 = OpConvertSToF %50 %55
+ %57 = OpAccessChain %17 %14 %15 %16
+ %58 = OpLoad %6 %57
+ %59 = OpConvertSToF %50 %58
+ %60 = OpAccessChain %17 %14 %15 %16
+ %61 = OpLoad %6 %60
+ %62 = OpConvertSToF %50 %61
+ %63 = OpAccessChain %17 %14 %15 %15
+ %64 = OpLoad %6 %63
+ %65 = OpConvertSToF %50 %64
+ %66 = OpCompositeConstruct %51 %56 %59 %62 %65
+ OpStore %53 %66
+ OpBranch %49
+ %67 = OpLabel
+ %68 = OpLoad %6 %8
+ %69 = OpConvertSToF %50 %68
+ %70 = OpCompositeConstruct %51 %69 %69 %69 %69
+ OpStore %53 %70
+ OpBranch %49
+ %49 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-max-multiplied-values.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-max-multiplied-values.amber
new file mode 100644
index 0000000..52950ac
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-max-multiplied-values.amber
@@ -0,0 +1,261 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction simplify code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_2 _GLF_uniform_int_values[1]
+# #define _int_3 _GLF_uniform_int_values[2]
+# #define _int_1 _GLF_uniform_int_values[3]
+# #define _int_4 _GLF_uniform_int_values[4]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [0, 2, 3, 1, 4]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[5];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# int A[4];
+# for (int i = _int_0; i < _int_4; i++)
+# {
+# A[i] = _int_0;
+#
+# // Sets the first two elements of A to 1.
+# if (max(2 * i, 2 * _int_1) == _int_2)
+# {
+# A[i] = 1;
+# }
+# }
+#
+# if (A[_int_0] == _int_1 && A[_int_1] == _int_1 && A[_int_2] == _int_0 &&
+# A[_int_3] == _int_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 115
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %98
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "i"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_int_values"
+ OpName %14 ""
+ OpName %33 "A"
+ OpName %98 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %98 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 5
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpConstant %6 0
+ %16 = OpTypePointer Uniform %6
+ %25 = OpConstant %6 4
+ %28 = OpTypeBool
+ %30 = OpConstant %9 4
+ %31 = OpTypeArray %6 %30
+ %32 = OpTypePointer Function %31
+ %38 = OpConstant %6 2
+ %41 = OpConstant %6 3
+ %46 = OpConstant %6 1
+ %95 = OpTypeFloat 32
+ %96 = OpTypeVector %95 4
+ %97 = OpTypePointer Output %96
+ %98 = OpVariable %97 Output
+ %113 = OpConstant %95 1
+ %114 = OpConstantComposite %96 %113 %113 %113 %113
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %33 = OpVariable %32 Function
+ %17 = OpAccessChain %16 %14 %15 %15
+ %18 = OpLoad %6 %17
+ OpStore %8 %18
+ OpBranch %19
+ %19 = OpLabel
+ OpLoopMerge %21 %22 None
+ OpBranch %23
+ %23 = OpLabel
+ %24 = OpLoad %6 %8
+ %26 = OpAccessChain %16 %14 %15 %25
+ %27 = OpLoad %6 %26
+ %29 = OpSLessThan %28 %24 %27
+ OpBranchConditional %29 %20 %21
+ %20 = OpLabel
+ %34 = OpLoad %6 %8
+ %35 = OpAccessChain %16 %14 %15 %15
+ %36 = OpLoad %6 %35
+ %37 = OpAccessChain %7 %33 %34
+ OpStore %37 %36
+ %39 = OpLoad %6 %8
+ %40 = OpIMul %6 %38 %39
+ %42 = OpAccessChain %16 %14 %15 %41
+ %43 = OpLoad %6 %42
+ %44 = OpIMul %6 %38 %43
+ %45 = OpExtInst %6 %1 SMax %40 %44
+ %47 = OpAccessChain %16 %14 %15 %46
+ %48 = OpLoad %6 %47
+ %49 = OpIEqual %28 %45 %48
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %51
+ %50 = OpLabel
+ %52 = OpLoad %6 %8
+ %53 = OpAccessChain %7 %33 %52
+ OpStore %53 %46
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %22
+ %22 = OpLabel
+ %54 = OpLoad %6 %8
+ %55 = OpIAdd %6 %54 %46
+ OpStore %8 %55
+ OpBranch %19
+ %21 = OpLabel
+ %56 = OpAccessChain %16 %14 %15 %15
+ %57 = OpLoad %6 %56
+ %58 = OpAccessChain %7 %33 %57
+ %59 = OpLoad %6 %58
+ %60 = OpAccessChain %16 %14 %15 %41
+ %61 = OpLoad %6 %60
+ %62 = OpIEqual %28 %59 %61
+ OpSelectionMerge %64 None
+ OpBranchConditional %62 %63 %64
+ %63 = OpLabel
+ %65 = OpAccessChain %16 %14 %15 %41
+ %66 = OpLoad %6 %65
+ %67 = OpAccessChain %7 %33 %66
+ %68 = OpLoad %6 %67
+ %69 = OpAccessChain %16 %14 %15 %41
+ %70 = OpLoad %6 %69
+ %71 = OpIEqual %28 %68 %70
+ OpBranch %64
+ %64 = OpLabel
+ %72 = OpPhi %28 %62 %21 %71 %63
+ OpSelectionMerge %74 None
+ OpBranchConditional %72 %73 %74
+ %73 = OpLabel
+ %75 = OpAccessChain %16 %14 %15 %46
+ %76 = OpLoad %6 %75
+ %77 = OpAccessChain %7 %33 %76
+ %78 = OpLoad %6 %77
+ %79 = OpAccessChain %16 %14 %15 %15
+ %80 = OpLoad %6 %79
+ %81 = OpIEqual %28 %78 %80
+ OpBranch %74
+ %74 = OpLabel
+ %82 = OpPhi %28 %72 %64 %81 %73
+ OpSelectionMerge %84 None
+ OpBranchConditional %82 %83 %84
+ %83 = OpLabel
+ %85 = OpAccessChain %16 %14 %15 %38
+ %86 = OpLoad %6 %85
+ %87 = OpAccessChain %7 %33 %86
+ %88 = OpLoad %6 %87
+ %89 = OpAccessChain %16 %14 %15 %15
+ %90 = OpLoad %6 %89
+ %91 = OpIEqual %28 %88 %90
+ OpBranch %84
+ %84 = OpLabel
+ %92 = OpPhi %28 %82 %74 %91 %83
+ OpSelectionMerge %94 None
+ OpBranchConditional %92 %93 %112
+ %93 = OpLabel
+ %99 = OpAccessChain %16 %14 %15 %41
+ %100 = OpLoad %6 %99
+ %101 = OpConvertSToF %95 %100
+ %102 = OpAccessChain %16 %14 %15 %15
+ %103 = OpLoad %6 %102
+ %104 = OpConvertSToF %95 %103
+ %105 = OpAccessChain %16 %14 %15 %15
+ %106 = OpLoad %6 %105
+ %107 = OpConvertSToF %95 %106
+ %108 = OpAccessChain %16 %14 %15 %41
+ %109 = OpLoad %6 %108
+ %110 = OpConvertSToF %95 %109
+ %111 = OpCompositeConstruct %96 %101 %104 %107 %110
+ OpStore %98 %111
+ OpBranch %94
+ %112 = OpLabel
+ OpStore %98 %114
+ OpBranch %94
+ %94 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 2 3 1 4
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-modulo-1.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-modulo-1.amber
new file mode 100644
index 0000000..ccbc652
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-modulo-1.amber
@@ -0,0 +1,180 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific instruction simplification code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_10_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 10.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# // Contents of _GLF_uniform_int_values: 1
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# int _GLF_uniform_int_values[1];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float a = mod(_float_10_0, 1.);
+#
+# if (a == _float_0_0)
+# {
+# _GLF_color = vec4(_int_1, a, a, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(a);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 50
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %31
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %31 "_GLF_color"
+ OpName %34 "buf1"
+ OpMemberName %34 0 "_GLF_uniform_int_values"
+ OpName %36 ""
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %31 Location 0
+ OpDecorate %33 ArrayStride 16
+ OpMemberDecorate %34 0 Offset 0
+ OpDecorate %34 Block
+ OpDecorate %36 DescriptorSet 0
+ OpDecorate %36 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 2
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %6
+ %20 = OpConstant %6 1
+ %25 = OpTypeBool
+ %29 = OpTypeVector %6 4
+ %30 = OpTypePointer Output %29
+ %31 = OpVariable %30 Output
+ %32 = OpConstant %9 1
+ %33 = OpTypeArray %15 %32
+ %34 = OpTypeStruct %33
+ %35 = OpTypePointer Uniform %34
+ %36 = OpVariable %35 Uniform
+ %37 = OpTypePointer Uniform %15
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %18 = OpAccessChain %17 %14 %16 %16
+ %19 = OpLoad %6 %18
+ %21 = OpFMod %6 %19 %20
+ OpStore %8 %21
+ %22 = OpLoad %6 %8
+ %23 = OpAccessChain %17 %14 %16 %16
+ %24 = OpLoad %6 %23
+ %26 = OpFOrdEqual %25 %22 %24
+ OpSelectionMerge %28 None
+ OpBranchConditional %26 %27 %47
+ %27 = OpLabel
+ %38 = OpAccessChain %37 %36 %16 %16
+ %39 = OpLoad %15 %38
+ %40 = OpConvertSToF %6 %39
+ %41 = OpLoad %6 %8
+ %42 = OpLoad %6 %8
+ %43 = OpAccessChain %37 %36 %16 %16
+ %44 = OpLoad %15 %43
+ %45 = OpConvertSToF %6 %44
+ %46 = OpCompositeConstruct %29 %40 %41 %42 %45
+ OpStore %31 %46
+ OpBranch %28
+ %47 = OpLabel
+ %48 = OpLoad %6 %8
+ %49 = OpCompositeConstruct %29 %48 %48 %48 %48
+ OpStore %31 %49
+ OpBranch %28
+ %28 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 10.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-right-shift-greater-than-zero.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-right-shift-greater-than-zero.amber
new file mode 100644
index 0000000..d665a7d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-simplify-right-shift-greater-than-zero.amber
@@ -0,0 +1,150 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers specific instruction simplify and combine compare code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [0, 1]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# if ((1 >> _int_0) > 0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 45
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %26
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "buf0"
+ OpMemberName %11 0 "_GLF_uniform_int_values"
+ OpName %13 ""
+ OpName %26 "_GLF_color"
+ OpDecorate %10 ArrayStride 16
+ OpMemberDecorate %11 0 Offset 0
+ OpDecorate %11 Block
+ OpDecorate %13 DescriptorSet 0
+ OpDecorate %13 Binding 0
+ OpDecorate %26 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpConstant %6 1
+ %8 = OpTypeInt 32 0
+ %9 = OpConstant %8 2
+ %10 = OpTypeArray %6 %9
+ %11 = OpTypeStruct %10
+ %12 = OpTypePointer Uniform %11
+ %13 = OpVariable %12 Uniform
+ %14 = OpConstant %6 0
+ %15 = OpTypePointer Uniform %6
+ %19 = OpTypeBool
+ %23 = OpTypeFloat 32
+ %24 = OpTypeVector %23 4
+ %25 = OpTypePointer Output %24
+ %26 = OpVariable %25 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %15 %13 %14 %14
+ %17 = OpLoad %6 %16
+ %18 = OpShiftRightArithmetic %6 %7 %17
+ %20 = OpSGreaterThan %19 %18 %14
+ OpSelectionMerge %22 None
+ OpBranchConditional %20 %21 %40
+ %21 = OpLabel
+ %27 = OpAccessChain %15 %13 %14 %7
+ %28 = OpLoad %6 %27
+ %29 = OpConvertSToF %23 %28
+ %30 = OpAccessChain %15 %13 %14 %14
+ %31 = OpLoad %6 %30
+ %32 = OpConvertSToF %23 %31
+ %33 = OpAccessChain %15 %13 %14 %14
+ %34 = OpLoad %6 %33
+ %35 = OpConvertSToF %23 %34
+ %36 = OpAccessChain %15 %13 %14 %7
+ %37 = OpLoad %6 %36
+ %38 = OpConvertSToF %23 %37
+ %39 = OpCompositeConstruct %24 %29 %32 %35 %38
+ OpStore %26 %39
+ OpBranch %22
+ %40 = OpLabel
+ %41 = OpAccessChain %15 %13 %14 %14
+ %42 = OpLoad %6 %41
+ %43 = OpConvertSToF %23 %42
+ %44 = OpCompositeConstruct %24 %43 %43 %43 %43
+ OpStore %26 %44
+ OpBranch %22
+ %22 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-sinh-ldexp.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-sinh-ldexp.amber
new file mode 100644
index 0000000..7332fbb
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-sinh-ldexp.amber
@@ -0,0 +1,241 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific inst combine compares code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_2_3503 _GLF_uniform_float_values[0]
+# #define _float_2_3505 _GLF_uniform_float_values[1]
+# #define _float_1_0 _GLF_uniform_float_values[2]
+# #define _float_800_0 _GLF_uniform_float_values[3]
+#
+# precision highp int;
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [2.3503, 2.3505, 1.0, 800.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[4];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // This results in an undefined value, but not in undefined behavior.
+# // v1.x becomes approximately 1.1752 and v1.y becomes undefined.
+# vec2 v1 = sinh(vec2(_float_1_0, _float_800_0));
+#
+# ivec2 v2 = ivec2(_int_1, -3000);
+#
+# // This results in an undefined value, but not in undefined behavior.
+# // v3.x becomes approximately 2.3504 and v3.y becomes undefined.
+# vec2 v3 = ldexp(v1, v2);
+#
+# // Assigning an undefined value doesn't matter since the variable will be
+# // reassigned later with a sensible value.
+# _GLF_color = vec4(v3.y);
+#
+# if (v3.x > _float_2_3503 && v3.x < _float_2_3505)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 88
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %46
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "v1"
+ OpName %13 "buf1"
+ OpMemberName %13 0 "_GLF_uniform_float_values"
+ OpName %15 ""
+ OpName %29 "v2"
+ OpName %32 "buf0"
+ OpMemberName %32 0 "_GLF_uniform_int_values"
+ OpName %34 ""
+ OpName %40 "v3"
+ OpName %46 "_GLF_color"
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 1
+ OpDecorate %31 ArrayStride 16
+ OpMemberDecorate %32 0 Offset 0
+ OpDecorate %32 Block
+ OpDecorate %34 DescriptorSet 0
+ OpDecorate %34 Binding 0
+ OpDecorate %46 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeInt 32 0
+ %11 = OpConstant %10 4
+ %12 = OpTypeArray %6 %11
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpTypeInt 32 1
+ %17 = OpConstant %16 0
+ %18 = OpConstant %16 2
+ %19 = OpTypePointer Uniform %6
+ %22 = OpConstant %16 3
+ %27 = OpTypeVector %16 2
+ %28 = OpTypePointer Function %27
+ %30 = OpConstant %10 2
+ %31 = OpTypeArray %16 %30
+ %32 = OpTypeStruct %31
+ %33 = OpTypePointer Uniform %32
+ %34 = OpVariable %33 Uniform
+ %35 = OpTypePointer Uniform %16
+ %38 = OpConstant %16 -3000
+ %44 = OpTypeVector %6 4
+ %45 = OpTypePointer Output %44
+ %46 = OpVariable %45 Output
+ %47 = OpConstant %10 1
+ %48 = OpTypePointer Function %6
+ %52 = OpTypeBool
+ %53 = OpConstant %10 0
+ %63 = OpConstant %16 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %29 = OpVariable %28 Function
+ %40 = OpVariable %8 Function
+ %20 = OpAccessChain %19 %15 %17 %18
+ %21 = OpLoad %6 %20
+ %23 = OpAccessChain %19 %15 %17 %22
+ %24 = OpLoad %6 %23
+ %25 = OpCompositeConstruct %7 %21 %24
+ %26 = OpExtInst %7 %1 Sinh %25
+ OpStore %9 %26
+ %36 = OpAccessChain %35 %34 %17 %17
+ %37 = OpLoad %16 %36
+ %39 = OpCompositeConstruct %27 %37 %38
+ OpStore %29 %39
+ %41 = OpLoad %7 %9
+ %42 = OpLoad %27 %29
+ %43 = OpExtInst %7 %1 Ldexp %41 %42
+ OpStore %40 %43
+ %49 = OpAccessChain %48 %40 %47
+ %50 = OpLoad %6 %49
+ %51 = OpCompositeConstruct %44 %50 %50 %50 %50
+ OpStore %46 %51
+ %54 = OpAccessChain %48 %40 %53
+ %55 = OpLoad %6 %54
+ %56 = OpAccessChain %19 %15 %17 %17
+ %57 = OpLoad %6 %56
+ %58 = OpFOrdGreaterThan %52 %55 %57
+ OpSelectionMerge %60 None
+ OpBranchConditional %58 %59 %60
+ %59 = OpLabel
+ %61 = OpAccessChain %48 %40 %53
+ %62 = OpLoad %6 %61
+ %64 = OpAccessChain %19 %15 %17 %63
+ %65 = OpLoad %6 %64
+ %66 = OpFOrdLessThan %52 %62 %65
+ OpBranch %60
+ %60 = OpLabel
+ %67 = OpPhi %52 %58 %5 %66 %59
+ OpSelectionMerge %69 None
+ OpBranchConditional %67 %68 %83
+ %68 = OpLabel
+ %70 = OpAccessChain %35 %34 %17 %17
+ %71 = OpLoad %16 %70
+ %72 = OpConvertSToF %6 %71
+ %73 = OpAccessChain %35 %34 %17 %63
+ %74 = OpLoad %16 %73
+ %75 = OpConvertSToF %6 %74
+ %76 = OpAccessChain %35 %34 %17 %63
+ %77 = OpLoad %16 %76
+ %78 = OpConvertSToF %6 %77
+ %79 = OpAccessChain %35 %34 %17 %17
+ %80 = OpLoad %16 %79
+ %81 = OpConvertSToF %6 %80
+ %82 = OpCompositeConstruct %44 %72 %75 %78 %81
+ OpStore %46 %82
+ OpBranch %69
+ %83 = OpLabel
+ %84 = OpAccessChain %35 %34 %17 %63
+ %85 = OpLoad %16 %84
+ %86 = OpConvertSToF %6 %85
+ %87 = OpCompositeConstruct %44 %86 %86 %86 %86
+ OpStore %46 %87
+ OpBranch %69
+ %69 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 2.3503 2.3505 1.0 800.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-tail-duplicator-for-for-for.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-tail-duplicator-for-for-for.amber
new file mode 100644
index 0000000..66614f2
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-tail-duplicator-for-for-for.amber
@@ -0,0 +1,265 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific tail duplicator code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_4 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: 0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# vec4 color = vec4(1.0);
+#
+# for (int i = _int_0; i < _int_4; i++)
+# {
+# switch (i)
+# {
+# case 1:
+# // Never entered.
+# for (int j = _int_0; i > i; j++)
+# {
+# for (int k = _int_0; k < i; k++)
+# {
+# color[k] = _float_0_0;
+# }
+# }
+#
+# color[i] = _float_0_0;
+# break;
+#
+# case 2:
+# color[i] = _float_0_0;
+# break;
+# }
+# }
+#
+# _GLF_color = color;
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 93
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %91
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "color"
+ OpName %14 "i"
+ OpName %18 "buf0"
+ OpMemberName %18 0 "_GLF_uniform_int_values"
+ OpName %20 ""
+ OpName %40 "j"
+ OpName %51 "k"
+ OpName %65 "buf1"
+ OpMemberName %65 0 "_GLF_uniform_float_values"
+ OpName %67 ""
+ OpName %91 "_GLF_color"
+ OpDecorate %17 ArrayStride 16
+ OpMemberDecorate %18 0 Offset 0
+ OpDecorate %18 Block
+ OpDecorate %20 DescriptorSet 0
+ OpDecorate %20 Binding 0
+ OpDecorate %64 ArrayStride 16
+ OpMemberDecorate %65 0 Offset 0
+ OpDecorate %65 Block
+ OpDecorate %67 DescriptorSet 0
+ OpDecorate %67 Binding 1
+ OpDecorate %91 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Function %7
+ %10 = OpConstant %6 1
+ %11 = OpConstantComposite %7 %10 %10 %10 %10
+ %12 = OpTypeInt 32 1
+ %13 = OpTypePointer Function %12
+ %15 = OpTypeInt 32 0
+ %16 = OpConstant %15 2
+ %17 = OpTypeArray %12 %16
+ %18 = OpTypeStruct %17
+ %19 = OpTypePointer Uniform %18
+ %20 = OpVariable %19 Uniform
+ %21 = OpConstant %12 0
+ %22 = OpTypePointer Uniform %12
+ %31 = OpConstant %12 1
+ %34 = OpTypeBool
+ %63 = OpConstant %15 1
+ %64 = OpTypeArray %6 %63
+ %65 = OpTypeStruct %64
+ %66 = OpTypePointer Uniform %65
+ %67 = OpVariable %66 Uniform
+ %68 = OpTypePointer Uniform %6
+ %71 = OpTypePointer Function %6
+ %90 = OpTypePointer Output %7
+ %91 = OpVariable %90 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %14 = OpVariable %13 Function
+ %40 = OpVariable %13 Function
+ %51 = OpVariable %13 Function
+ OpStore %9 %11
+ %23 = OpAccessChain %22 %20 %21 %21
+ %24 = OpLoad %12 %23
+ OpStore %14 %24
+ OpBranch %25
+ %25 = OpLabel
+ OpLoopMerge %27 %28 None
+ OpBranch %29
+ %29 = OpLabel
+ %30 = OpLoad %12 %14
+ %32 = OpAccessChain %22 %20 %21 %31
+ %33 = OpLoad %12 %32
+ %35 = OpSLessThan %34 %30 %33
+ OpBranchConditional %35 %26 %27
+ %26 = OpLabel
+ %36 = OpLoad %12 %14
+ OpSelectionMerge %39 None
+ OpSwitch %36 %39 1 %37 2 %38
+ %37 = OpLabel
+ %41 = OpAccessChain %22 %20 %21 %21
+ %42 = OpLoad %12 %41
+ OpStore %40 %42
+ OpBranch %43
+ %43 = OpLabel
+ OpLoopMerge %45 %46 None
+ OpBranch %47
+ %47 = OpLabel
+ %48 = OpLoad %12 %14
+ %49 = OpLoad %12 %14
+ %50 = OpSGreaterThan %34 %48 %49
+ OpBranchConditional %50 %44 %45
+ %44 = OpLabel
+ %52 = OpAccessChain %22 %20 %21 %21
+ %53 = OpLoad %12 %52
+ OpStore %51 %53
+ OpBranch %54
+ %54 = OpLabel
+ OpLoopMerge %56 %57 None
+ OpBranch %58
+ %58 = OpLabel
+ %59 = OpLoad %12 %51
+ %60 = OpLoad %12 %14
+ %61 = OpSLessThan %34 %59 %60
+ OpBranchConditional %61 %55 %56
+ %55 = OpLabel
+ %62 = OpLoad %12 %51
+ %69 = OpAccessChain %68 %67 %21 %21
+ %70 = OpLoad %6 %69
+ %72 = OpAccessChain %71 %9 %62
+ OpStore %72 %70
+ OpBranch %57
+ %57 = OpLabel
+ %73 = OpLoad %12 %51
+ %74 = OpIAdd %12 %73 %31
+ OpStore %51 %74
+ OpBranch %54
+ %56 = OpLabel
+ OpBranch %46
+ %46 = OpLabel
+ %75 = OpLoad %12 %40
+ %76 = OpIAdd %12 %75 %31
+ OpStore %40 %76
+ OpBranch %43
+ %45 = OpLabel
+ %77 = OpLoad %12 %14
+ %78 = OpAccessChain %68 %67 %21 %21
+ %79 = OpLoad %6 %78
+ %80 = OpAccessChain %71 %9 %77
+ OpStore %80 %79
+ OpBranch %39
+ %38 = OpLabel
+ %82 = OpLoad %12 %14
+ %83 = OpAccessChain %68 %67 %21 %21
+ %84 = OpLoad %6 %83
+ %85 = OpAccessChain %71 %9 %82
+ OpStore %85 %84
+ OpBranch %39
+ %39 = OpLabel
+ OpBranch %28
+ %28 = OpLabel
+ %88 = OpLoad %12 %14
+ %89 = OpIAdd %12 %88 %31
+ OpStore %14 %89
+ OpBranch %25
+ %27 = OpLabel
+ %92 = OpLoad %7 %9
+ OpStore %91 %92
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 4
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-tail-duplicator-infinite-loops.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-tail-duplicator-infinite-loops.amber
new file mode 100644
index 0000000..7c51c19
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-tail-duplicator-infinite-loops.amber
@@ -0,0 +1,275 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific tail duplicator code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_5 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_1_0 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_int_values: [5, 0]
+# layout(set = 0, binding = 0) uniform buf0 {
+# int _GLF_uniform_int_values[2];
+# };
+# // Contents of _GLF_uniform_float_values: [0.0, 1.0]
+# layout(set = 0, binding = 1) uniform buf1 {
+# float _GLF_uniform_float_values[2];
+# };
+# // Contents of zero: 0.0
+# layout(set = 0, binding = 2) uniform buf2 {
+# float zero;
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# _GLF_color = vec4(_float_0_0);
+#
+# // Always false.
+# if(zero > _float_0_0)
+# {
+# do
+# {
+# _GLF_color = vec4(_float_1_0);
+# }
+# while(true);
+# }
+# else
+# {
+# do
+# {
+# // Loops once because of the break inside.
+# while(true)
+# {
+# for(int i = _int_0; i < _int_5; i ++)
+# {
+# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
+# }
+# break;
+# }
+# }
+# while(zero > _float_0_0); // Always false.
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 87
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %9
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "_GLF_color"
+ OpName %13 "buf1"
+ OpMemberName %13 0 "_GLF_uniform_float_values"
+ OpName %15 ""
+ OpName %22 "buf2"
+ OpMemberName %22 0 "zero"
+ OpName %24 ""
+ OpName %53 "i"
+ OpName %55 "buf0"
+ OpMemberName %55 0 "_GLF_uniform_int_values"
+ OpName %57 ""
+ OpDecorate %9 Location 0
+ OpDecorate %12 ArrayStride 16
+ OpMemberDecorate %13 0 Offset 0
+ OpDecorate %13 Block
+ OpDecorate %15 DescriptorSet 0
+ OpDecorate %15 Binding 1
+ OpMemberDecorate %22 0 Offset 0
+ OpDecorate %22 Block
+ OpDecorate %24 DescriptorSet 0
+ OpDecorate %24 Binding 2
+ OpDecorate %53 RelaxedPrecision
+ OpDecorate %54 ArrayStride 16
+ OpMemberDecorate %55 0 RelaxedPrecision
+ OpMemberDecorate %55 0 Offset 0
+ OpDecorate %55 Block
+ OpDecorate %57 DescriptorSet 0
+ OpDecorate %57 Binding 0
+ OpDecorate %60 RelaxedPrecision
+ OpDecorate %66 RelaxedPrecision
+ OpDecorate %68 RelaxedPrecision
+ OpDecorate %79 RelaxedPrecision
+ OpDecorate %80 RelaxedPrecision
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 4
+ %8 = OpTypePointer Output %7
+ %9 = OpVariable %8 Output
+ %10 = OpTypeInt 32 0
+ %11 = OpConstant %10 2
+ %12 = OpTypeArray %6 %11
+ %13 = OpTypeStruct %12
+ %14 = OpTypePointer Uniform %13
+ %15 = OpVariable %14 Uniform
+ %16 = OpTypeInt 32 1
+ %17 = OpConstant %16 0
+ %18 = OpTypePointer Uniform %6
+ %22 = OpTypeStruct %6
+ %23 = OpTypePointer Uniform %22
+ %24 = OpVariable %23 Uniform
+ %29 = OpTypeBool
+ %37 = OpConstant %16 1
+ %41 = OpConstantTrue %29
+ %52 = OpTypePointer Function %16
+ %54 = OpTypeArray %16 %11
+ %55 = OpTypeStruct %54
+ %56 = OpTypePointer Uniform %55
+ %57 = OpVariable %56 Uniform
+ %58 = OpTypePointer Uniform %16
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %53 = OpVariable %52 Function
+ %19 = OpAccessChain %18 %15 %17 %17
+ %20 = OpLoad %6 %19
+ %21 = OpCompositeConstruct %7 %20 %20 %20 %20
+ OpStore %9 %21
+ %25 = OpAccessChain %18 %24 %17
+ %26 = OpLoad %6 %25
+ %27 = OpAccessChain %18 %15 %17 %17
+ %28 = OpLoad %6 %27
+ %30 = OpFOrdGreaterThan %29 %26 %28
+ OpSelectionMerge %32 None
+ OpBranchConditional %30 %31 %42
+ %31 = OpLabel
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %34
+ %34 = OpLabel
+ %38 = OpAccessChain %18 %15 %17 %37
+ %39 = OpLoad %6 %38
+ %40 = OpCompositeConstruct %7 %39 %39 %39 %39
+ OpStore %9 %40
+ OpBranch %36
+ %36 = OpLabel
+ OpBranchConditional %41 %33 %35
+ %35 = OpLabel
+ OpBranch %32
+ %42 = OpLabel
+ OpBranch %43
+ %43 = OpLabel
+ OpLoopMerge %45 %46 None
+ OpBranch %44
+ %44 = OpLabel
+ OpBranch %47
+ %47 = OpLabel
+ OpLoopMerge %49 %50 None
+ OpBranch %51
+ %51 = OpLabel
+ OpBranchConditional %41 %48 %49
+ %48 = OpLabel
+ %59 = OpAccessChain %58 %57 %17 %37
+ %60 = OpLoad %16 %59
+ OpStore %53 %60
+ OpBranch %61
+ %61 = OpLabel
+ OpLoopMerge %63 %64 None
+ OpBranch %65
+ %65 = OpLabel
+ %66 = OpLoad %16 %53
+ %67 = OpAccessChain %58 %57 %17 %17
+ %68 = OpLoad %16 %67
+ %69 = OpSLessThan %29 %66 %68
+ OpBranchConditional %69 %62 %63
+ %62 = OpLabel
+ %70 = OpAccessChain %18 %15 %17 %37
+ %71 = OpLoad %6 %70
+ %72 = OpAccessChain %18 %15 %17 %17
+ %73 = OpLoad %6 %72
+ %74 = OpAccessChain %18 %15 %17 %17
+ %75 = OpLoad %6 %74
+ %76 = OpAccessChain %18 %15 %17 %37
+ %77 = OpLoad %6 %76
+ %78 = OpCompositeConstruct %7 %71 %73 %75 %77
+ OpStore %9 %78
+ OpBranch %64
+ %64 = OpLabel
+ %79 = OpLoad %16 %53
+ %80 = OpIAdd %16 %79 %37
+ OpStore %53 %80
+ OpBranch %61
+ %63 = OpLabel
+ OpBranch %49
+ %50 = OpLabel
+ OpBranch %47
+ %49 = OpLabel
+ OpBranch %46
+ %46 = OpLabel
+ %82 = OpAccessChain %18 %24 %17
+ %83 = OpLoad %6 %82
+ %84 = OpAccessChain %18 %15 %17 %17
+ %85 = OpLoad %6 %84
+ %86 = OpFOrdGreaterThan %29 %83 %85
+ OpBranchConditional %86 %43 %45
+ %45 = OpLabel
+ OpBranch %32
+ %32 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# zero
+BUFFER variant_zero DATA_TYPE float STD140 DATA
+ 0.0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 1.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 5 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_zero AS uniform DESCRIPTOR_SET 0 BINDING 2
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-undefined-inversesqrt-reflect.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-undefined-inversesqrt-reflect.amber
new file mode 100644
index 0000000..632073c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-undefined-inversesqrt-reflect.amber
@@ -0,0 +1,220 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific APFloat code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _float_1_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: 1.0
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# // Contents of v1: [0.0, 1.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# highp vec2 v1;
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# mat2 m24 = mat2x2(_float_1_0, _float_1_0, dot(v1.x, 1.0), _float_1_0);
+#
+# // a becomes 0.0.
+# float a = float(m24);
+#
+# // Since a negative value is given to inversesqrt this results in an undefined value,
+# // but not in undefined behavior.
+# vec2 v2 = inversesqrt(vec2(-1.0, 1.0));
+#
+# // Since v2 includes an undefined value this results in an undefined value,
+# // but not in undefined behavior.
+# vec2 v3 = reflect(v2, vec2(a, 1.0));
+#
+# _GLF_color = vec4(_float_1_0, v3, _float_1_0);
+#
+# if (v1.y == _float_1_0)
+# {
+# _GLF_color.yz = vec2(0.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 75
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %10 "m24"
+ OpName %14 "buf0"
+ OpMemberName %14 0 "_GLF_uniform_float_values"
+ OpName %16 ""
+ OpName %24 "buf1"
+ OpMemberName %24 0 "v1"
+ OpName %26 ""
+ OpName %39 "a"
+ OpName %43 "v2"
+ OpName %46 "v3"
+ OpName %53 "_GLF_color"
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 0
+ OpMemberDecorate %24 0 Offset 0
+ OpDecorate %24 Block
+ OpDecorate %26 DescriptorSet 0
+ OpDecorate %26 Binding 1
+ OpDecorate %53 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypeMatrix %7 2
+ %9 = OpTypePointer Function %8
+ %11 = OpTypeInt 32 0
+ %12 = OpConstant %11 1
+ %13 = OpTypeArray %6 %12
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpTypeInt 32 1
+ %18 = OpConstant %17 0
+ %19 = OpTypePointer Uniform %6
+ %24 = OpTypeStruct %7
+ %25 = OpTypePointer Uniform %24
+ %26 = OpVariable %25 Uniform
+ %27 = OpConstant %11 0
+ %30 = OpConstant %6 1
+ %34 = OpConstant %6 0
+ %38 = OpTypePointer Function %6
+ %42 = OpTypePointer Function %7
+ %44 = OpConstant %6 -0x1.8p+128
+ %45 = OpConstantComposite %7 %44 %30
+ %51 = OpTypeVector %6 4
+ %52 = OpTypePointer Output %51
+ %53 = OpVariable %52 Output
+ %66 = OpTypeBool
+ %70 = OpConstantComposite %7 %34 %34
+ %74 = OpConstantComposite %51 %34 %34 %34 %34
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %10 = OpVariable %9 Function
+ %39 = OpVariable %38 Function
+ %43 = OpVariable %42 Function
+ %46 = OpVariable %42 Function
+ %20 = OpAccessChain %19 %16 %18 %18
+ %21 = OpLoad %6 %20
+ %22 = OpAccessChain %19 %16 %18 %18
+ %23 = OpLoad %6 %22
+ %28 = OpAccessChain %19 %26 %18 %27
+ %29 = OpLoad %6 %28
+ %31 = OpFMul %6 %29 %30
+ %32 = OpAccessChain %19 %16 %18 %18
+ %33 = OpLoad %6 %32
+ %35 = OpCompositeConstruct %7 %21 %23
+ %36 = OpCompositeConstruct %7 %31 %33
+ %37 = OpCompositeConstruct %8 %35 %36
+ OpStore %10 %37
+ %40 = OpLoad %8 %10
+ %41 = OpCompositeExtract %6 %40 0 0
+ OpStore %39 %41
+ OpStore %43 %45
+ %47 = OpLoad %7 %43
+ %48 = OpLoad %6 %39
+ %49 = OpCompositeConstruct %7 %48 %30
+ %50 = OpExtInst %7 %1 Reflect %47 %49
+ OpStore %46 %50
+ %54 = OpAccessChain %19 %16 %18 %18
+ %55 = OpLoad %6 %54
+ %56 = OpLoad %7 %46
+ %57 = OpAccessChain %19 %16 %18 %18
+ %58 = OpLoad %6 %57
+ %59 = OpCompositeExtract %6 %56 0
+ %60 = OpCompositeExtract %6 %56 1
+ %61 = OpCompositeConstruct %51 %55 %59 %60 %58
+ OpStore %53 %61
+ %62 = OpAccessChain %19 %26 %18 %12
+ %63 = OpLoad %6 %62
+ %64 = OpAccessChain %19 %16 %18 %18
+ %65 = OpLoad %6 %64
+ %67 = OpFOrdEqual %66 %63 %65
+ OpSelectionMerge %69 None
+ OpBranchConditional %67 %68 %73
+ %68 = OpLabel
+ %71 = OpLoad %51 %53
+ %72 = OpVectorShuffle %51 %71 %70 0 4 5 3
+ OpStore %53 %72
+ OpBranch %69
+ %73 = OpLabel
+ OpStore %53 %74
+ OpBranch %69
+ %69 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# v1
+BUFFER variant_v1 DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_v1 AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos.amber
new file mode 100644
index 0000000..9e14b29
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos.amber
@@ -0,0 +1,215 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific X86 ISel lowering and AP Float code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _float_0_54 _GLF_uniform_float_values[0]
+# #define _float_0_55 _GLF_uniform_float_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [0.54, 0.55]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // uintbitstofloat(1) gives a very small denormalized value. The cos of this value
+# // should be very close to 1; perhaps marginally smaller. The cosine of *that* value
+# // should then be bounded below by 0.54, and might be slightly larger,
+# // so that 0.55 is a suitable upper bound.
+# vec2 v1 = cos(cos(intBitsToFloat(ivec2(-1, _int_1))));
+# _GLF_color = vec4(v1.x);
+#
+# if (v1.y > _float_0_54 && v1.y < _float_0_55)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 76
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %29
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %9 "v1"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "_GLF_uniform_int_values"
+ OpName %17 ""
+ OpName %29 "_GLF_color"
+ OpName %40 "buf1"
+ OpMemberName %40 0 "_GLF_uniform_float_values"
+ OpName %42 ""
+ OpDecorate %14 ArrayStride 16
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %29 Location 0
+ OpDecorate %39 ArrayStride 16
+ OpMemberDecorate %40 0 Offset 0
+ OpDecorate %40 Block
+ OpDecorate %42 DescriptorSet 0
+ OpDecorate %42 Binding 1
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeInt 32 1
+ %11 = OpConstant %10 -1
+ %12 = OpTypeInt 32 0
+ %13 = OpConstant %12 2
+ %14 = OpTypeArray %10 %13
+ %15 = OpTypeStruct %14
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpConstant %10 0
+ %19 = OpTypePointer Uniform %10
+ %22 = OpTypeVector %10 2
+ %27 = OpTypeVector %6 4
+ %28 = OpTypePointer Output %27
+ %29 = OpVariable %28 Output
+ %30 = OpConstant %12 0
+ %31 = OpTypePointer Function %6
+ %35 = OpTypeBool
+ %36 = OpConstant %12 1
+ %39 = OpTypeArray %6 %13
+ %40 = OpTypeStruct %39
+ %41 = OpTypePointer Uniform %40
+ %42 = OpVariable %41 Uniform
+ %43 = OpTypePointer Uniform %6
+ %51 = OpConstant %10 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %20 = OpAccessChain %19 %17 %18 %18
+ %21 = OpLoad %10 %20
+ %23 = OpCompositeConstruct %22 %11 %21
+ %24 = OpBitcast %7 %23
+ %25 = OpExtInst %7 %1 Cos %24
+ %26 = OpExtInst %7 %1 Cos %25
+ OpStore %9 %26
+ %32 = OpAccessChain %31 %9 %30
+ %33 = OpLoad %6 %32
+ %34 = OpCompositeConstruct %27 %33 %33 %33 %33
+ OpStore %29 %34
+ %37 = OpAccessChain %31 %9 %36
+ %38 = OpLoad %6 %37
+ %44 = OpAccessChain %43 %42 %18 %18
+ %45 = OpLoad %6 %44
+ %46 = OpFOrdGreaterThan %35 %38 %45
+ OpSelectionMerge %48 None
+ OpBranchConditional %46 %47 %48
+ %47 = OpLabel
+ %49 = OpAccessChain %31 %9 %36
+ %50 = OpLoad %6 %49
+ %52 = OpAccessChain %43 %42 %18 %51
+ %53 = OpLoad %6 %52
+ %54 = OpFOrdLessThan %35 %50 %53
+ OpBranch %48
+ %48 = OpLabel
+ %55 = OpPhi %35 %46 %5 %54 %47
+ OpSelectionMerge %57 None
+ OpBranchConditional %55 %56 %71
+ %56 = OpLabel
+ %58 = OpAccessChain %19 %17 %18 %18
+ %59 = OpLoad %10 %58
+ %60 = OpConvertSToF %6 %59
+ %61 = OpAccessChain %19 %17 %18 %51
+ %62 = OpLoad %10 %61
+ %63 = OpConvertSToF %6 %62
+ %64 = OpAccessChain %19 %17 %18 %51
+ %65 = OpLoad %10 %64
+ %66 = OpConvertSToF %6 %65
+ %67 = OpAccessChain %19 %17 %18 %18
+ %68 = OpLoad %10 %67
+ %69 = OpConvertSToF %6 %68
+ %70 = OpCompositeConstruct %27 %60 %63 %66 %69
+ OpStore %29 %70
+ OpBranch %57
+ %71 = OpLabel
+ %72 = OpAccessChain %19 %17 %18 %51
+ %73 = OpLoad %10 %72
+ %74 = OpConvertSToF %6 %73
+ %75 = OpCompositeConstruct %27 %74 %74 %74 %74
+ OpStore %29 %75
+ OpBranch %57
+ %57 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.54 0.55
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-determinant-exp-acos.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-determinant-exp-acos.amber
new file mode 100644
index 0000000..6e2615b
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-determinant-exp-acos.amber
@@ -0,0 +1,206 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific x86 isel lowering code path
+
+# The test passes because the shader always writes red.
+
+# Optimized using spirv-opt with the following arguments:
+# '--eliminate-dead-branches'
+# '--merge-return'
+# '--eliminate-dead-branches'
+# '--merge-blocks'
+# spirv-opt commit hash: a187dd58a0485988841d325a85c8e6063f53500a
+
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _float_0_0 _GLF_uniform_float_values[0]
+# #define _float_790_0 _GLF_uniform_float_values[1]
+# #define _float_2_0 _GLF_uniform_float_values[2]
+# #define _float_4_0 _GLF_uniform_float_values[3]
+# #define _float_1_0 _GLF_uniform_float_values[4]
+#
+# precision highp float;
+#
+# // Contents of _GLF_uniform_float_values: [0.0, 790.0, 2.0, 4.0, 1.0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# float _GLF_uniform_float_values[5];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# // a becomes 0.
+# float a = determinant(mat2(_float_2_0, _float_4_0, _float_1_0, _float_2_0));
+#
+# //b becomes 0.
+# float b = float(mat2(a));
+#
+# // This results in an undefined value, but not in undefined behavior.
+# // v1.x becomes undefined and v1.y becomes 0.
+# vec2 v1 = acos(exp(vec2(_float_790_0, b)));
+#
+# _GLF_color = vec4(v1.x);
+#
+# if (v1.y == _float_0_0)
+# {
+# _GLF_color = vec4(_float_1_0, _float_0_0, _float_0_0, _float_1_0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 77
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %54
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "_GLF_uniform_float_values"
+ OpName %14 ""
+ OpName %37 "b"
+ OpName %44 "v1"
+ OpName %54 "_GLF_color"
+ OpDecorate %11 ArrayStride 16
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %54 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %9 = OpTypeInt 32 0
+ %10 = OpConstant %9 5
+ %11 = OpTypeArray %6 %10
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 1
+ %16 = OpConstant %15 0
+ %17 = OpConstant %15 2
+ %18 = OpTypePointer Uniform %6
+ %21 = OpConstant %15 3
+ %24 = OpConstant %15 4
+ %29 = OpTypeVector %6 2
+ %30 = OpTypeMatrix %29 2
+ %31 = OpConstant %6 1
+ %32 = OpConstant %6 0
+ %43 = OpTypePointer Function %29
+ %45 = OpConstant %15 1
+ %52 = OpTypeVector %6 4
+ %53 = OpTypePointer Output %52
+ %54 = OpVariable %53 Output
+ %55 = OpConstant %9 0
+ %59 = OpConstant %9 1
+ %64 = OpTypeBool
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %37 = OpVariable %7 Function
+ %44 = OpVariable %43 Function
+ %19 = OpAccessChain %18 %14 %16 %17
+ %20 = OpLoad %6 %19
+ %22 = OpAccessChain %18 %14 %16 %21
+ %23 = OpLoad %6 %22
+ %25 = OpAccessChain %18 %14 %16 %24
+ %26 = OpLoad %6 %25
+ %27 = OpAccessChain %18 %14 %16 %17
+ %28 = OpLoad %6 %27
+ %33 = OpCompositeConstruct %29 %20 %23
+ %34 = OpCompositeConstruct %29 %26 %28
+ %35 = OpCompositeConstruct %30 %33 %34
+ %36 = OpExtInst %6 %1 Determinant %35
+ OpStore %8 %36
+ %38 = OpLoad %6 %8
+ %39 = OpCompositeConstruct %29 %38 %32
+ %40 = OpCompositeConstruct %29 %32 %38
+ %41 = OpCompositeConstruct %30 %39 %40
+ %42 = OpCompositeExtract %6 %41 0 0
+ OpStore %37 %42
+ %46 = OpAccessChain %18 %14 %16 %45
+ %47 = OpLoad %6 %46
+ %48 = OpLoad %6 %37
+ %49 = OpCompositeConstruct %29 %47 %48
+ %50 = OpExtInst %29 %1 Exp %49
+ %51 = OpExtInst %29 %1 Acos %50
+ OpStore %44 %51
+ %56 = OpAccessChain %7 %44 %55
+ %57 = OpLoad %6 %56
+ %58 = OpCompositeConstruct %52 %57 %57 %57 %57
+ OpStore %54 %58
+ %60 = OpAccessChain %7 %44 %59
+ %61 = OpLoad %6 %60
+ %62 = OpAccessChain %18 %14 %16 %16
+ %63 = OpLoad %6 %62
+ %65 = OpFOrdEqual %64 %61 %63
+ OpSelectionMerge %67 None
+ OpBranchConditional %65 %66 %67
+ %66 = OpLabel
+ %68 = OpAccessChain %18 %14 %16 %24
+ %69 = OpLoad %6 %68
+ %70 = OpAccessChain %18 %14 %16 %16
+ %71 = OpLoad %6 %70
+ %72 = OpAccessChain %18 %14 %16 %16
+ %73 = OpLoad %6 %72
+ %74 = OpAccessChain %18 %14 %16 %24
+ %75 = OpLoad %6 %74
+ %76 = OpCompositeConstruct %52 %69 %71 %73 %75
+ OpStore %54 %76
+ OpBranch %67
+ %67 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0 790.0 2.0 4.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float.amber
new file mode 100644
index 0000000..751206e
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float.amber
@@ -0,0 +1,225 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers specific X86 ISel lowering and machine value type code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+# #define _uint_1 _GLF_uniform_uint_values[0]
+# #define _uint_0 _GLF_uniform_uint_values[1]
+# #define _float_0_0 _GLF_uniform_float_values[0]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# // Contents of _GLF_uniform_uint_values: 1
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# uint _GLF_uniform_uint_values[2];
+# };
+#
+# // Contents of _GLF_uniform_float_values: 0.0
+# layout(set = 0, binding = 2) uniform buf2
+# {
+# float _GLF_uniform_float_values[1];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# uint a = _uint_1 >> uint(_float_0_0);
+# float b = uintBitsToFloat(a);
+# uint c = floatBitsToUint(b);
+#
+# if (c == _uint_1)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(b);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 69
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %46
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %8 "a"
+ OpName %11 "buf1"
+ OpMemberName %11 0 "_GLF_uniform_uint_values"
+ OpName %13 ""
+ OpName %22 "buf2"
+ OpMemberName %22 0 "_GLF_uniform_float_values"
+ OpName %24 ""
+ OpName %31 "b"
+ OpName %34 "c"
+ OpName %46 "_GLF_color"
+ OpName %48 "buf0"
+ OpMemberName %48 0 "_GLF_uniform_int_values"
+ OpName %50 ""
+ OpDecorate %10 ArrayStride 16
+ OpMemberDecorate %11 0 Offset 0
+ OpDecorate %11 Block
+ OpDecorate %13 DescriptorSet 0
+ OpDecorate %13 Binding 1
+ OpDecorate %21 ArrayStride 16
+ OpMemberDecorate %22 0 Offset 0
+ OpDecorate %22 Block
+ OpDecorate %24 DescriptorSet 0
+ OpDecorate %24 Binding 2
+ OpDecorate %46 Location 0
+ OpDecorate %47 ArrayStride 16
+ OpMemberDecorate %48 0 Offset 0
+ OpDecorate %48 Block
+ OpDecorate %50 DescriptorSet 0
+ OpDecorate %50 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 0
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 2
+ %10 = OpTypeArray %6 %9
+ %11 = OpTypeStruct %10
+ %12 = OpTypePointer Uniform %11
+ %13 = OpVariable %12 Uniform
+ %14 = OpTypeInt 32 1
+ %15 = OpConstant %14 0
+ %16 = OpTypePointer Uniform %6
+ %19 = OpTypeFloat 32
+ %20 = OpConstant %6 1
+ %21 = OpTypeArray %19 %20
+ %22 = OpTypeStruct %21
+ %23 = OpTypePointer Uniform %22
+ %24 = OpVariable %23 Uniform
+ %25 = OpTypePointer Uniform %19
+ %30 = OpTypePointer Function %19
+ %40 = OpTypeBool
+ %44 = OpTypeVector %19 4
+ %45 = OpTypePointer Output %44
+ %46 = OpVariable %45 Output
+ %47 = OpTypeArray %14 %9
+ %48 = OpTypeStruct %47
+ %49 = OpTypePointer Uniform %48
+ %50 = OpVariable %49 Uniform
+ %51 = OpTypePointer Uniform %14
+ %55 = OpConstant %14 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ %31 = OpVariable %30 Function
+ %34 = OpVariable %7 Function
+ %17 = OpAccessChain %16 %13 %15 %15
+ %18 = OpLoad %6 %17
+ %26 = OpAccessChain %25 %24 %15 %15
+ %27 = OpLoad %19 %26
+ %28 = OpConvertFToU %6 %27
+ %29 = OpShiftRightLogical %6 %18 %28
+ OpStore %8 %29
+ %32 = OpLoad %6 %8
+ %33 = OpBitcast %19 %32
+ OpStore %31 %33
+ %35 = OpLoad %19 %31
+ %36 = OpBitcast %6 %35
+ OpStore %34 %36
+ %37 = OpLoad %6 %34
+ %38 = OpAccessChain %16 %13 %15 %15
+ %39 = OpLoad %6 %38
+ %41 = OpIEqual %40 %37 %39
+ OpSelectionMerge %43 None
+ OpBranchConditional %41 %42 %66
+ %42 = OpLabel
+ %52 = OpAccessChain %51 %50 %15 %15
+ %53 = OpLoad %14 %52
+ %54 = OpConvertSToF %19 %53
+ %56 = OpAccessChain %51 %50 %15 %55
+ %57 = OpLoad %14 %56
+ %58 = OpConvertSToF %19 %57
+ %59 = OpAccessChain %51 %50 %15 %55
+ %60 = OpLoad %14 %59
+ %61 = OpConvertSToF %19 %60
+ %62 = OpAccessChain %51 %50 %15 %15
+ %63 = OpLoad %14 %62
+ %64 = OpConvertSToF %19 %63
+ %65 = OpCompositeConstruct %44 %54 %58 %61 %64
+ OpStore %46 %65
+ OpBranch %43
+ %66 = OpLabel
+ %67 = OpLoad %19 %31
+ %68 = OpCompositeConstruct %44 %67 %67 %67 %67
+ OpStore %46 %68
+ OpBranch %43
+ %43 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 0.0
+END
+# _GLF_uniform_uint_values
+BUFFER variant__GLF_uniform_uint_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 2
+ BIND BUFFER variant__GLF_uniform_uint_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift.amber
new file mode 100644
index 0000000..10a5501
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift.amber
@@ -0,0 +1,311 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: A fragment shader that covers a specific X86 ISel lowering code path
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_0 _GLF_uniform_int_values[0]
+# #define _int_1 _GLF_uniform_int_values[1]
+# #define _int_4 _GLF_uniform_int_values[2]
+# #define _int_2 _GLF_uniform_int_values[3]
+# #define _float_1_0 _GLF_uniform_float_values[0]
+# #define _float_0_0 _GLF_uniform_float_values[1]
+# #define _float_2_0 _GLF_uniform_float_values[2]
+#
+# precision highp float;
+#
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [0, 1, 4, 2]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[4];
+# };
+#
+# // Contents of _GLF_uniform_float_values: [1.0, 0.0, 2.0]
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# float _GLF_uniform_float_values[3];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# float A[2];
+# A[0] = _float_0_0;
+# A[1] = _float_0_0;
+#
+# for (int i = _int_0; i < _int_2; i++)
+# {
+# for (int j = _int_0; j < _int_4; j++)
+# {
+# switch (j)
+# {
+# case 0:
+# // Undefined behavior but doesn't matter because the value will be
+# // overwritten in the next iteration.
+# if ((1 << -1) < i)
+# {
+# continue;
+# }
+# A[i] = _float_2_0;
+# break;
+# case 1:
+# A[i] = _float_1_0;
+# break;
+# }
+# }
+# }
+# if (A[_int_0] == _float_1_0 && A[_int_1] == _float_1_0)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 127
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %108
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %11 "A"
+ OpName %16 "buf1"
+ OpMemberName %16 0 "_GLF_uniform_float_values"
+ OpName %18 ""
+ OpName %29 "i"
+ OpName %32 "buf0"
+ OpMemberName %32 0 "_GLF_uniform_int_values"
+ OpName %34 ""
+ OpName %49 "j"
+ OpName %108 "_GLF_color"
+ OpDecorate %15 ArrayStride 16
+ OpMemberDecorate %16 0 Offset 0
+ OpDecorate %16 Block
+ OpDecorate %18 DescriptorSet 0
+ OpDecorate %18 Binding 1
+ OpDecorate %31 ArrayStride 16
+ OpMemberDecorate %32 0 Offset 0
+ OpDecorate %32 Block
+ OpDecorate %34 DescriptorSet 0
+ OpDecorate %34 Binding 0
+ OpDecorate %108 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeInt 32 0
+ %8 = OpConstant %7 2
+ %9 = OpTypeArray %6 %8
+ %10 = OpTypePointer Function %9
+ %12 = OpTypeInt 32 1
+ %13 = OpConstant %12 0
+ %14 = OpConstant %7 3
+ %15 = OpTypeArray %6 %14
+ %16 = OpTypeStruct %15
+ %17 = OpTypePointer Uniform %16
+ %18 = OpVariable %17 Uniform
+ %19 = OpConstant %12 1
+ %20 = OpTypePointer Uniform %6
+ %23 = OpTypePointer Function %6
+ %28 = OpTypePointer Function %12
+ %30 = OpConstant %7 4
+ %31 = OpTypeArray %12 %30
+ %32 = OpTypeStruct %31
+ %33 = OpTypePointer Uniform %32
+ %34 = OpVariable %33 Uniform
+ %35 = OpTypePointer Uniform %12
+ %44 = OpConstant %12 3
+ %47 = OpTypeBool
+ %58 = OpConstant %12 2
+ %66 = OpConstant %12 -2147483648
+ %106 = OpTypeVector %6 4
+ %107 = OpTypePointer Output %106
+ %108 = OpVariable %107 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %11 = OpVariable %10 Function
+ %29 = OpVariable %28 Function
+ %49 = OpVariable %28 Function
+ %21 = OpAccessChain %20 %18 %13 %19
+ %22 = OpLoad %6 %21
+ %24 = OpAccessChain %23 %11 %13
+ OpStore %24 %22
+ %25 = OpAccessChain %20 %18 %13 %19
+ %26 = OpLoad %6 %25
+ %27 = OpAccessChain %23 %11 %19
+ OpStore %27 %26
+ %36 = OpAccessChain %35 %34 %13 %13
+ %37 = OpLoad %12 %36
+ OpStore %29 %37
+ OpBranch %38
+ %38 = OpLabel
+ OpLoopMerge %40 %41 None
+ OpBranch %42
+ %42 = OpLabel
+ %43 = OpLoad %12 %29
+ %45 = OpAccessChain %35 %34 %13 %44
+ %46 = OpLoad %12 %45
+ %48 = OpSLessThan %47 %43 %46
+ OpBranchConditional %48 %39 %40
+ %39 = OpLabel
+ %50 = OpAccessChain %35 %34 %13 %13
+ %51 = OpLoad %12 %50
+ OpStore %49 %51
+ OpBranch %52
+ %52 = OpLabel
+ OpLoopMerge %54 %55 None
+ OpBranch %56
+ %56 = OpLabel
+ %57 = OpLoad %12 %49
+ %59 = OpAccessChain %35 %34 %13 %58
+ %60 = OpLoad %12 %59
+ %61 = OpSLessThan %47 %57 %60
+ OpBranchConditional %61 %53 %54
+ %53 = OpLabel
+ %62 = OpLoad %12 %49
+ OpSelectionMerge %65 None
+ OpSwitch %62 %65 0 %63 1 %64
+ %63 = OpLabel
+ %67 = OpLoad %12 %29
+ %68 = OpSLessThan %47 %66 %67
+ OpSelectionMerge %70 None
+ OpBranchConditional %68 %69 %70
+ %69 = OpLabel
+ OpBranch %55
+ %70 = OpLabel
+ %72 = OpLoad %12 %29
+ %73 = OpAccessChain %20 %18 %13 %58
+ %74 = OpLoad %6 %73
+ %75 = OpAccessChain %23 %11 %72
+ OpStore %75 %74
+ OpBranch %65
+ %64 = OpLabel
+ %77 = OpLoad %12 %29
+ %78 = OpAccessChain %20 %18 %13 %13
+ %79 = OpLoad %6 %78
+ %80 = OpAccessChain %23 %11 %77
+ OpStore %80 %79
+ OpBranch %65
+ %65 = OpLabel
+ OpBranch %55
+ %55 = OpLabel
+ %83 = OpLoad %12 %49
+ %84 = OpIAdd %12 %83 %19
+ OpStore %49 %84
+ OpBranch %52
+ %54 = OpLabel
+ OpBranch %41
+ %41 = OpLabel
+ %85 = OpLoad %12 %29
+ %86 = OpIAdd %12 %85 %19
+ OpStore %29 %86
+ OpBranch %38
+ %40 = OpLabel
+ %87 = OpAccessChain %35 %34 %13 %13
+ %88 = OpLoad %12 %87
+ %89 = OpAccessChain %23 %11 %88
+ %90 = OpLoad %6 %89
+ %91 = OpAccessChain %20 %18 %13 %13
+ %92 = OpLoad %6 %91
+ %93 = OpFOrdEqual %47 %90 %92
+ OpSelectionMerge %95 None
+ OpBranchConditional %93 %94 %95
+ %94 = OpLabel
+ %96 = OpAccessChain %35 %34 %13 %19
+ %97 = OpLoad %12 %96
+ %98 = OpAccessChain %23 %11 %97
+ %99 = OpLoad %6 %98
+ %100 = OpAccessChain %20 %18 %13 %13
+ %101 = OpLoad %6 %100
+ %102 = OpFOrdEqual %47 %99 %101
+ OpBranch %95
+ %95 = OpLabel
+ %103 = OpPhi %47 %93 %40 %102 %94
+ OpSelectionMerge %105 None
+ OpBranchConditional %103 %104 %122
+ %104 = OpLabel
+ %109 = OpAccessChain %35 %34 %13 %19
+ %110 = OpLoad %12 %109
+ %111 = OpConvertSToF %6 %110
+ %112 = OpAccessChain %35 %34 %13 %13
+ %113 = OpLoad %12 %112
+ %114 = OpConvertSToF %6 %113
+ %115 = OpAccessChain %35 %34 %13 %13
+ %116 = OpLoad %12 %115
+ %117 = OpConvertSToF %6 %116
+ %118 = OpAccessChain %35 %34 %13 %19
+ %119 = OpLoad %12 %118
+ %120 = OpConvertSToF %6 %119
+ %121 = OpCompositeConstruct %106 %111 %114 %117 %120
+ OpStore %108 %121
+ OpBranch %105
+ %122 = OpLabel
+ %123 = OpAccessChain %35 %34 %13 %19
+ %124 = OpLoad %12 %123
+ %125 = OpConvertSToF %6 %124
+ %126 = OpCompositeConstruct %106 %125 %125 %125 %125
+ OpStore %108 %126
+ OpBranch %105
+ %105 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_float_values
+BUFFER variant__GLF_uniform_float_values DATA_TYPE float[] STD140 DATA
+ 1.0 0.0 2.0
+END
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 0 1 4 2
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 16 16
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_float_values AS uniform DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 16 16
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 16 16 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index.amber
new file mode 100644
index 0000000..c73b000
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index.amber
@@ -0,0 +1,224 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a coverage-gap found by the GraphicsFuzz project.
+
+# Short description: Covers a specific X86 ISel lowering and DAG selection code paths
+
+# The test passes because the shader always writes red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 310 es
+# #define _int_1 _GLF_uniform_int_values[0]
+# #define _int_0 _GLF_uniform_int_values[1]
+#
+# precision highp float;
+# precision highp int;
+#
+# // Contents of _GLF_uniform_int_values: [1, 0]
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# int _GLF_uniform_int_values[2];
+# };
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct S {
+# int a;
+# int b;
+# int c;
+# };
+#
+# void main()
+# {
+# S A[2];
+#
+# A[_int_0] = S(_int_0, _int_0, _int_0);
+# A[_int_1] = S(_int_0, _int_0, _int_0);
+#
+# // Always true.
+# if (A[_int_0].b == _int_0)
+# {
+# // A[1].b becomes 1.
+# A[clamp(_int_0, 1, 2)].b = _int_1;
+# }
+#
+# if (A[_int_1].b == _int_1)
+# {
+# _GLF_color = vec4(_int_1, _int_0, _int_0, _int_1);
+# }
+# else
+# {
+# _GLF_color = vec4(_int_1);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 8
+; Bound: 90
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %71
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 310
+ OpName %4 "main"
+ OpName %7 "S"
+ OpMemberName %7 0 "a"
+ OpMemberName %7 1 "b"
+ OpMemberName %7 2 "c"
+ OpName %12 "A"
+ OpName %14 "buf0"
+ OpMemberName %14 0 "_GLF_uniform_int_values"
+ OpName %16 ""
+ OpName %71 "_GLF_color"
+ OpDecorate %13 ArrayStride 16
+ OpMemberDecorate %14 0 Offset 0
+ OpDecorate %14 Block
+ OpDecorate %16 DescriptorSet 0
+ OpDecorate %16 Binding 0
+ OpDecorate %71 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6 %6 %6
+ %8 = OpTypeInt 32 0
+ %9 = OpConstant %8 2
+ %10 = OpTypeArray %7 %9
+ %11 = OpTypePointer Function %10
+ %13 = OpTypeArray %6 %9
+ %14 = OpTypeStruct %13
+ %15 = OpTypePointer Uniform %14
+ %16 = OpVariable %15 Uniform
+ %17 = OpConstant %6 0
+ %18 = OpConstant %6 1
+ %19 = OpTypePointer Uniform %6
+ %29 = OpTypePointer Function %7
+ %43 = OpTypePointer Function %6
+ %48 = OpTypeBool
+ %54 = OpConstant %6 2
+ %68 = OpTypeFloat 32
+ %69 = OpTypeVector %68 4
+ %70 = OpTypePointer Output %69
+ %71 = OpVariable %70 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %12 = OpVariable %11 Function
+ %20 = OpAccessChain %19 %16 %17 %18
+ %21 = OpLoad %6 %20
+ %22 = OpAccessChain %19 %16 %17 %18
+ %23 = OpLoad %6 %22
+ %24 = OpAccessChain %19 %16 %17 %18
+ %25 = OpLoad %6 %24
+ %26 = OpAccessChain %19 %16 %17 %18
+ %27 = OpLoad %6 %26
+ %28 = OpCompositeConstruct %7 %23 %25 %27
+ %30 = OpAccessChain %29 %12 %21
+ OpStore %30 %28
+ %31 = OpAccessChain %19 %16 %17 %17
+ %32 = OpLoad %6 %31
+ %33 = OpAccessChain %19 %16 %17 %18
+ %34 = OpLoad %6 %33
+ %35 = OpAccessChain %19 %16 %17 %18
+ %36 = OpLoad %6 %35
+ %37 = OpAccessChain %19 %16 %17 %18
+ %38 = OpLoad %6 %37
+ %39 = OpCompositeConstruct %7 %34 %36 %38
+ %40 = OpAccessChain %29 %12 %32
+ OpStore %40 %39
+ %41 = OpAccessChain %19 %16 %17 %18
+ %42 = OpLoad %6 %41
+ %44 = OpAccessChain %43 %12 %42 %18
+ %45 = OpLoad %6 %44
+ %46 = OpAccessChain %19 %16 %17 %18
+ %47 = OpLoad %6 %46
+ %49 = OpIEqual %48 %45 %47
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %51
+ %50 = OpLabel
+ %52 = OpAccessChain %19 %16 %17 %18
+ %53 = OpLoad %6 %52
+ %55 = OpExtInst %6 %1 SClamp %53 %18 %54
+ %56 = OpAccessChain %19 %16 %17 %17
+ %57 = OpLoad %6 %56
+ %58 = OpAccessChain %43 %12 %55 %18
+ OpStore %58 %57
+ OpBranch %51
+ %51 = OpLabel
+ %59 = OpAccessChain %19 %16 %17 %17
+ %60 = OpLoad %6 %59
+ %61 = OpAccessChain %43 %12 %60 %18
+ %62 = OpLoad %6 %61
+ %63 = OpAccessChain %19 %16 %17 %17
+ %64 = OpLoad %6 %63
+ %65 = OpIEqual %48 %62 %64
+ OpSelectionMerge %67 None
+ OpBranchConditional %65 %66 %85
+ %66 = OpLabel
+ %72 = OpAccessChain %19 %16 %17 %17
+ %73 = OpLoad %6 %72
+ %74 = OpConvertSToF %68 %73
+ %75 = OpAccessChain %19 %16 %17 %18
+ %76 = OpLoad %6 %75
+ %77 = OpConvertSToF %68 %76
+ %78 = OpAccessChain %19 %16 %17 %18
+ %79 = OpLoad %6 %78
+ %80 = OpConvertSToF %68 %79
+ %81 = OpAccessChain %19 %16 %17 %17
+ %82 = OpLoad %6 %81
+ %83 = OpConvertSToF %68 %82
+ %84 = OpCompositeConstruct %69 %74 %77 %80 %83
+ OpStore %71 %84
+ OpBranch %67
+ %85 = OpLabel
+ %86 = OpAccessChain %19 %16 %17 %17
+ %87 = OpLoad %6 %86
+ %88 = OpConvertSToF %68 %87
+ %89 = OpCompositeConstruct %69 %88 %88 %88 %88
+ OpStore %71 %89
+ OpBranch %67
+ %67 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# _GLF_uniform_int_values
+BUFFER variant__GLF_uniform_int_values DATA_TYPE int32[] STD140 DATA
+ 1 0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant__GLF_uniform_int_values AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/do-while-if-return.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/do-while-if-return.amber
new file mode 100644
index 0000000..81113bf
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/do-while-if-return.amber
@@ -0,0 +1,231 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: A fragment shader with true if in a nested do while loop
+
+# The test passes because the shader always writes color red.
+
+# Optimized using spirv-opt with the following arguments:
+# '--simplify-instructions'
+# '--private-to-local'
+# '--eliminate-local-multi-store'
+# '--convert-local-access-chains'
+# '--inline-entry-points-exhaustive'
+# '--simplify-instructions'
+# '--eliminate-dead-inserts'
+# '--vector-dce'
+# '--combine-access-chains'
+# '--convert-local-access-chains'
+# '--if-conversion'
+# '--private-to-local'
+# '--eliminate-local-single-store'
+# '--copy-propagate-arrays'
+# spirv-opt commit hash: 230f363e6da32791f640b02205e0645cc67c3f1d
+
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch; // x == 0.0, y == 1.0
+# };
+#
+# int func()
+# {
+# const int loop_limit = 100;
+# int loop_count = 0;
+# do
+# {
+# loop_count++;
+# do
+# {
+# loop_count++;
+# // Always true.
+# if (injectionSwitch.x < injectionSwitch.y)
+# {
+# return 1;
+# }
+# // Always true.
+# if (injectionSwitch.x < injectionSwitch.y)
+# {
+# break;
+# }
+# } while (loop_count < loop_limit);
+# } while (loop_count < loop_limit);
+# return 0;
+# }
+# void main()
+# {
+# if(func() == 1)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 73
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %65
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %8 "func("
+ OpName %11 "loop_count"
+ OpName %28 "buf0"
+ OpMemberName %28 0 "injectionSwitch"
+ OpName %30 ""
+ OpName %65 "_GLF_color"
+ OpMemberDecorate %28 0 Offset 0
+ OpDecorate %28 Block
+ OpDecorate %30 DescriptorSet 0
+ OpDecorate %30 Binding 0
+ OpDecorate %65 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeFunction %6
+ %10 = OpTypePointer Function %6
+ %12 = OpConstant %6 0
+ %18 = OpConstant %6 1
+ %26 = OpTypeFloat 32
+ %27 = OpTypeVector %26 2
+ %28 = OpTypeStruct %27
+ %29 = OpTypePointer Uniform %28
+ %30 = OpVariable %29 Uniform
+ %31 = OpTypeInt 32 0
+ %32 = OpConstant %31 0
+ %33 = OpTypePointer Uniform %26
+ %36 = OpConstant %31 1
+ %39 = OpTypeBool
+ %53 = OpConstant %6 100
+ %63 = OpTypeVector %26 4
+ %64 = OpTypePointer Output %63
+ %65 = OpVariable %64 Output
+ %66 = OpConstant %26 1
+ %67 = OpConstant %26 0
+ %68 = OpConstantComposite %63 %66 %67 %67 %66
+ %70 = OpConstantComposite %63 %66 %66 %66 %66
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %59 = OpFunctionCall %6 %8
+ %60 = OpIEqual %39 %59 %18
+ OpSelectionMerge %62 None
+ OpBranchConditional %60 %61 %69
+ %61 = OpLabel
+ OpStore %65 %68
+ OpBranch %62
+ %69 = OpLabel
+ OpStore %65 %70
+ OpBranch %62
+ %62 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %8 = OpFunction %6 None %7
+ %9 = OpLabel
+ %11 = OpVariable %10 Function
+ OpStore %11 %12
+ OpBranch %13
+ %13 = OpLabel
+ %71 = OpPhi %6 %12 %9 %25 %16
+ OpLoopMerge %15 %16 None
+ OpBranch %14
+ %14 = OpLabel
+ %19 = OpIAdd %6 %71 %18
+ OpStore %11 %19
+ OpBranch %20
+ %20 = OpLabel
+ %72 = OpPhi %6 %19 %14 %25 %23
+ OpLoopMerge %22 %23 None
+ OpBranch %21
+ %21 = OpLabel
+ %25 = OpIAdd %6 %72 %18
+ OpStore %11 %25
+ %34 = OpAccessChain %33 %30 %12 %32
+ %35 = OpLoad %26 %34
+ %37 = OpAccessChain %33 %30 %12 %36
+ %38 = OpLoad %26 %37
+ %40 = OpFOrdLessThan %39 %35 %38
+ OpSelectionMerge %42 None
+ OpBranchConditional %40 %41 %42
+ %41 = OpLabel
+ OpReturnValue %18
+ %42 = OpLabel
+ %44 = OpAccessChain %33 %30 %12 %32
+ %45 = OpLoad %26 %44
+ %46 = OpAccessChain %33 %30 %12 %36
+ %47 = OpLoad %26 %46
+ %48 = OpFOrdLessThan %39 %45 %47
+ OpSelectionMerge %50 None
+ OpBranchConditional %48 %49 %50
+ %49 = OpLabel
+ OpBranch %22
+ %50 = OpLabel
+ OpBranch %23
+ %23 = OpLabel
+ %54 = OpSLessThan %39 %25 %53
+ OpBranchConditional %54 %20 %22
+ %22 = OpLabel
+ OpBranch %16
+ %16 = OpLabel
+ %56 = OpSLessThan %39 %25 %53
+ OpBranchConditional %56 %13 %15
+ %15 = OpLabel
+ OpReturnValue %12
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/flag-always-false-if.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/flag-always-false-if.amber
new file mode 100644
index 0000000..27acd10
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/flag-always-false-if.amber
@@ -0,0 +1,299 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: A fragment shader with recurrent always false if statement
+
+# The test passes because the shader always writes color red.
+
+# Optimized using spirv-opt with the following arguments:
+# '--vector-dce'
+# '--vector-dce'
+# '--scalar-replacement=100'
+# '--redundancy-elimination'
+# '--redundancy-elimination'
+# '--eliminate-dead-branches'
+# '--eliminate-dead-branches'
+# '--merge-blocks'
+# '--scalar-replacement=100'
+# '--reduce-load-size'
+# '--copy-propagate-arrays'
+# '--eliminate-dead-branches'
+# '--merge-blocks'
+# '--eliminate-dead-code-aggressive'
+# '--inline-entry-points-exhaustive'
+# '--simplify-instructions'
+# '--redundancy-elimination'
+# '--ccp'
+# '--eliminate-local-single-block'
+# '--scalar-replacement=100'
+# '--reduce-load-size'
+# '--eliminate-local-single-block'
+# '--reduce-load-size'
+# '--eliminate-local-single-store'
+# '--inline-entry-points-exhaustive'
+# spirv-opt commit hash: 230f363e6da32791f640b02205e0645cc67c3f1d
+
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch; // x == 0.0, y == 1.0
+# };
+# void main()
+# {
+# const int loop_limit = 100;
+# int loop_count = 0;
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# return;
+# }
+# // Always false.
+# gl_FragCoord.x < log(1.0);
+# for (; loop_count < loop_limit; loop_count++)
+# {
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# break;
+# }
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# _GLF_color = vec4(1.0);
+# }
+# else
+# {
+# // Always false.
+# if (gl_FragCoord.x < 0.0)
+# {
+# return;
+# }
+# }
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# _GLF_color = vec4(1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# return;
+# }
+# // Always false.
+# if (gl_FragCoord.x < 0.0)
+# {
+# for (; loop_count < loop_limit; loop_count++)
+# {
+# }
+# }
+# }
+# if(loop_count >= loop_limit)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 109
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %30 %60
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %8 "loop_count"
+ OpName %12 "buf0"
+ OpMemberName %12 0 "injectionSwitch"
+ OpName %14 ""
+ OpName %30 "gl_FragCoord"
+ OpName %60 "_GLF_color"
+ OpMemberDecorate %12 0 Offset 0
+ OpDecorate %12 Block
+ OpDecorate %14 DescriptorSet 0
+ OpDecorate %14 Binding 0
+ OpDecorate %30 BuiltIn FragCoord
+ OpDecorate %60 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %9 = OpConstant %6 0
+ %10 = OpTypeFloat 32
+ %11 = OpTypeVector %10 2
+ %12 = OpTypeStruct %11
+ %13 = OpTypePointer Uniform %12
+ %14 = OpVariable %13 Uniform
+ %15 = OpTypeInt 32 0
+ %16 = OpConstant %15 0
+ %17 = OpTypePointer Uniform %10
+ %20 = OpConstant %15 1
+ %23 = OpTypeBool
+ %28 = OpTypeVector %10 4
+ %29 = OpTypePointer Input %28
+ %30 = OpVariable %29 Input
+ %31 = OpTypePointer Input %10
+ %34 = OpConstant %10 0
+ %42 = OpConstant %6 100
+ %59 = OpTypePointer Output %28
+ %60 = OpVariable %59 Output
+ %61 = OpConstant %10 1
+ %62 = OpConstantComposite %28 %61 %61 %61 %61
+ %78 = OpConstantComposite %28 %61 %34 %34 %61
+ %100 = OpConstant %6 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %8 = OpVariable %7 Function
+ OpStore %8 %9
+ %18 = OpAccessChain %17 %14 %9 %16
+ %19 = OpLoad %10 %18
+ %21 = OpAccessChain %17 %14 %9 %20
+ %22 = OpLoad %10 %21
+ %24 = OpFOrdGreaterThan %23 %19 %22
+ OpSelectionMerge %26 None
+ OpBranchConditional %24 %25 %26
+ %25 = OpLabel
+ OpReturn
+ %26 = OpLabel
+ %32 = OpAccessChain %31 %30 %16
+ %33 = OpLoad %10 %32
+ %35 = OpFOrdLessThan %23 %33 %34
+ OpBranch %36
+ %36 = OpLabel
+ %41 = OpLoad %6 %8
+ %43 = OpSLessThan %23 %41 %42
+ OpLoopMerge %38 %39 None
+ OpBranchConditional %43 %37 %38
+ %37 = OpLabel
+ OpSelectionMerge %50 None
+ OpBranchConditional %24 %49 %50
+ %49 = OpLabel
+ OpBranch %38
+ %50 = OpLabel
+ OpSelectionMerge %58 None
+ OpBranchConditional %24 %57 %63
+ %57 = OpLabel
+ OpStore %60 %62
+ OpBranch %58
+ %63 = OpLabel
+ OpSelectionMerge %68 None
+ OpBranchConditional %35 %67 %68
+ %67 = OpLabel
+ OpReturn
+ %68 = OpLabel
+ OpBranch %58
+ %58 = OpLabel
+ OpSelectionMerge %76 None
+ OpBranchConditional %24 %75 %77
+ %75 = OpLabel
+ OpStore %60 %62
+ OpBranch %76
+ %77 = OpLabel
+ OpStore %60 %78
+ OpBranch %76
+ %76 = OpLabel
+ OpSelectionMerge %85 None
+ OpBranchConditional %24 %84 %85
+ %84 = OpLabel
+ OpReturn
+ %85 = OpLabel
+ OpSelectionMerge %91 None
+ OpBranchConditional %35 %90 %91
+ %90 = OpLabel
+ OpBranch %92
+ %92 = OpLabel
+ %97 = OpLoad %6 %8
+ %98 = OpSLessThan %23 %97 %42
+ OpLoopMerge %94 %93 None
+ OpBranchConditional %98 %93 %94
+ %93 = OpLabel
+ %99 = OpLoad %6 %8
+ %101 = OpIAdd %6 %99 %100
+ OpStore %8 %101
+ OpBranch %92
+ %94 = OpLabel
+ OpBranch %91
+ %91 = OpLabel
+ OpBranch %39
+ %39 = OpLabel
+ %102 = OpLoad %6 %8
+ %103 = OpIAdd %6 %102 %100
+ OpStore %8 %103
+ OpBranch %36
+ %38 = OpLabel
+ %104 = OpLoad %6 %8
+ %105 = OpSGreaterThanEqual %23 %104 %42
+ OpSelectionMerge %107 None
+ OpBranchConditional %105 %106 %108
+ %106 = OpLabel
+ OpStore %60 %78
+ OpBranch %107
+ %108 = OpLabel
+ OpStore %60 %62
+ OpBranch %107
+ %107 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt b/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt
index 8049fa1..36eb6e1 100644
--- a/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/index.txt
@@ -18,14 +18,29 @@
{ "control-flow-in-function.amber", "control-flow-in-function", "A fragment shader with a lot of control flow" },
{ "control-flow-switch.amber", "control-flow-switch", "A fragment shader with somewhat complex control flow and a switch" },
{ "cosh-return-inf-unused.amber", "cosh-return-inf-unused", "Cosh returns inf for one component which is never used" },
+{ "cov-access-array-dot.amber", "cov-access-array-dot", "Covers instruction combine casting, combine shifting and DAG code paths" },
{ "cov-analysis-reachable-from-many.amber", "cov-analysis-reachable-from-many", "A fragment shader that covers a specific LLVM analysis code path." },
{ "cov-apfloat-acos-ldexp.amber", "cov-apfloat-acos-ldexp", "A fragment shader that covers a specific AP float code path." },
{ "cov-apfloat-determinant.amber", "cov-apfloat-determinant", "A fragment shader that covers a specific arbitrary precision float usage." },
+{ "cov-apfloat-mix-nan.amber", "cov-apfloat-mix-nan", "A fragment shader that covers a specific floating point code path" },
+{ "cov-apfloat-mod-zero.amber", "cov-apfloat-mod-zero", "A fragment shader that covers a specific floating point code path" },
+{ "cov-apfloat-negative-step-func.amber", "cov-apfloat-negative-step-func", "A fragment shader that covers a specific floating point code path" },
+{ "cov-apfloat-sinh-negative-log2.amber", "cov-apfloat-sinh-negative-log2", "A fragment shader that covers a specific floating point code path" },
{ "cov-apfloat-tanh.amber", "cov-apfloat-tanh", "A fragment shader that covers a specific arbitrary precision float usage." },
+{ "cov-apfloat-undefined-matrix-mul.amber", "cov-apfloat-undefined-matrix-mul", "A fragment shader that covers a specific floating point code path" },
+{ "cov-apfloat-determinant-for-if.amber", "cov-apfloat-determinant-for-if", "A fragment shader that covers a specific APFloat code path" },
+{ "cov-apfloat-reflect-denorm.amber", "cov-apfloat-reflect-denorm", "A fragment shader that covers a specific floating point code path" },
+{ "cov-apfloat-unpackunorm-loop.amber", "cov-apfloat-unpackunorm-loop", "A fragment shader that covers a specific floating point code path" },
+{ "cov-asin-undefined-smoothstep.amber", "cov-asin-undefined-smoothstep", "A fragment shader that covers a specific instruction simplify code path" },
{ "cov-basic-block-discard-in-function.amber", "cov-basic-block-discard-in-function", "A fragment shader that covers a specific basic block code path" },
+{ "cov-bitfieldExtract-undefined.amber", "cov-bitfieldExtract-undefined", "A fragment shader that covers a specific constant fold code path" },
+{ "cov-bitfieldinsert-undefined.amber", "cov-bitfieldinsert-undefined", "A fragment shader that covers a specific instruction simplify code path" },
+{ "cov-bitfieldreverse-left-shift-findmsb.amber", "cov-bitfieldreverse-left-shift-findmsb", "Covers specific DAG combiner and legalize vector ops code paths" },
{ "cov-blockfrequency-several-for-loops.amber", "cov-blockfrequency-several-for-loops", "A fragment shader that covers a specific block frequency info code path." },
{ "cov-branch-probability-identity-matrix.amber", "cov-branch-probability-identity-matrix", "A fragment shader that covers a specific branch propability path" },
{ "cov-combine-and-or-xor-gt-lt.amber", "cov-combine-and-or-xor-gt-lt", "A fragment shader that covers a specific bitwise operator cobmining code path" },
+{ "cov-const-folding-bitfieldinsert-div-one.amber", "cov-const-folding-bitfieldinsert-div-one", "A fragment shader that covers a specific const folding path" },
+{ "cov-color-overwrite-identity-matrix-multiply.amber", "cov-color-overwrite-identity-matrix-multiply", "A fragment shader that covers a specific DAG code paths" },
{ "cov-const-folding-ceil-vec4.amber", "cov-const-folding-ceil-vec4", "A fragment shader that covers a specific constant folding code path" },
{ "cov-const-folding-clamp.amber", "cov-const-folding-clamp", "A fragment shader that covers a specific const folding rule path." },
{ "cov-const-folding-clamp-inside-while.amber", "cov-const-folding-clamp-inside-while", "A fragment shader that covers a specific constant folding path" },
@@ -37,21 +52,28 @@
{ "cov-const-folding-dot-determinant.amber", "cov-const-folding-dot-determinant", "A fragment shader that covers a specific const folding rule path." },
{ "cov-const-folding-gte-const-first.amber", "cov-const-folding-gte-const-first", "A fragment shader that covers a specific constant folding path" },
{ "cov-const-folding-min-as-loop-range.amber", "cov-const-folding-min-as-loop-range", "A fragment shader that covers a specific constant folding path" },
+{ "cov-const-folding-mod-one-one-lte.amber", "cov-const-folding-mod-one-one-lte", "A fragment shader that covers a specific const folding path" },
+{ "cov-const-folding-pow-large-exp.amber", "cov-const-folding-pow-large-exp", "A fragment shader that covers a specific const folding path" },
{ "cov-const-folding-same-condition.amber", "cov-const-folding-same-condition", "A fragment shader that covers a specific constant folding code path" },
{ "cov-const-folding-sinh-inf.amber", "cov-const-folding-sinh-inf", "A fragment shader that covers a specific const folding path" },
{ "cov-const-folding-vector-shuffle.amber", "cov-const-folding-vector-shuffle", "A fragment shader that covers a specific const folding rule path." },
{ "cov-constant-folding-atan-over-tanh.amber", "cov-constant-folding-atan-over-tanh", "A fragment shader that covers a specific constant folding code path." },
+{ "cov-constants-combine-add-sub.amber", "cov-constants-combine-add-sub", "A fragment shader that covers a specific constants and add/sub combining path" },
{ "cov-constants-mix-uniform.amber", "cov-constants-mix-uniform", "A fragment shader that covers a specific constant handling path." },
{ "cov-copy-prop-arrays-func-argument.amber", "cov-copy-prop-arrays-func-argument", "A fragment shader that covers a specific propagate array copy path." },
{ "cov-copy-prop-arrays-no-stores.amber", "cov-copy-prop-arrays-no-stores", "A fragment shader that covers a specific propagate array copy path." },
{ "cov-copy-prop-arrays-param-uniform.amber", "cov-copy-prop-arrays-param-uniform", "A fragment shader that covers a specific propagate array copy path." },
+{ "cov-dag-combiner-clamp-undefined-access-array.amber", "cov-dag-combiner-clamp-undefined-access-array", "A fragment shader that covers a specific DAG combiner code path" },
{ "cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop.amber", "cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop", "Covers DAG combiner, cast combining and legalize vector types code paths" },
{ "cov-dag-combiner-findmsb-loop.amber", "cov-dag-combiner-findmsb-loop", "A fragment shader that covers a specific DAG combiner code path" },
{ "cov-dag-combiner-increment-color.amber", "cov-dag-combiner-increment-color", "A fragment shader that covers a specific DAG combiner code path" },
+{ "cov-dag-combiner-glf_color.amber", "cov-dag-combiner-glf_color", "A fragment shader that covers specific dag combiner code path" },
+{ "cov-dag-combiner-loop-bitfieldreverse.amber", "cov-dag-combiner-loop-bitfieldreverse", "A fragment shader that covers a specific DAG combiner code path" },
{ "cov-dag-combiner-neg-div-pow2.amber", "cov-dag-combiner-neg-div-pow2", "A fragment shader that covers a specific DAG combiner code path" },
{ "cov-dag-combiner-same-cond-nested.amber", "cov-dag-combiner-same-cond-nested", "A fragment shader that covers a specific DAG combiner code path" },
{ "cov-dead-branch-func-return-arg.amber", "cov-dead-branch-func-return-arg", "A fragment shader that covers a specific dead branch elimination path" },
{ "cov-dead-code-unreachable-merge.amber", "cov-dead-code-unreachable-merge", "A fragment shader that covers a specific dead code elimination path." },
+{ "cov-findlsb-division-by-zero.amber", "cov-findlsb-division-by-zero", "A fragment shader that covers a specific instruction simplify code path" },
{ "cov-fold-and-in-for-loop-range.amber", "cov-fold-and-in-for-loop-range", "A fragment shader that covers a specific folding path" },
{ "cov-fold-bitwise-and-zero.amber", "cov-fold-bitwise-and-zero", "A fragment shader that covers a specific instruction folding path." },
{ "cov-fold-bitwise-or-full-mask.amber", "cov-fold-bitwise-or-full-mask", "A fragment shader that covers a specific instruction folding path." },
@@ -84,7 +106,10 @@
{ "cov-folding-rules-shuffle-mix.amber", "cov-folding-rules-shuffle-mix", "A fragment shader that covers a specific instruction folding path." },
{ "cov-folding-rules-split-vector-init.amber", "cov-folding-rules-split-vector-init", "A fragment shader that covers a specific instruction folding path." },
{ "cov-folding-rules-vec-mix-uniform.amber", "cov-folding-rules-vec-mix-uniform", "A fragment shader that covers a specific instruction folding path." },
+{ "cov-fract-smoothstep-undefined.amber", "cov-fract-smoothstep-undefined", "A fragment shader that covers a specific APFloat code path" },
+{ "cov-fragcoord-clamp-array-access.amber", "cov-fragcoord-clamp-array-access", "A fragment shader that covers a specific instruction simplify path" },
{ "cov-if-conversion-identical-branches.amber", "cov-if-conversion-identical-branches", "A fragment shader that covers a specific if condition conversion path." },
+{ "cov-inc-array-element-loop-lsb.amber", "cov-inc-array-element-loop-lsb", "A fragment shader that covers a specific SSCP path" },
{ "cov-inc-inside-switch-and-for.amber", "cov-inc-inside-switch-and-for", "A fragment shader that covers a specific LLVM analysis code path." },
{ "cov-increment-inside-clamp.amber", "cov-increment-inside-clamp", "A fragment shader that covers specific value tracking and simplification paths" },
{ "cov-inline-pass-empty-block.amber", "cov-inline-pass-empty-block", "A fragment shader that covers a specific inlining optimization path." },
@@ -103,46 +128,91 @@
{ "cov-instruction-simplify-mod-sqrt-undefined.amber", "cov-instruction-simplify-mod-sqrt-undefined", "A fragment shader that covers a specific instruction simplification path" },
{ "cov-instruction-simplify-sqrt.amber", "cov-instruction-simplify-sqrt", "A fragment shader that covers a specific instruction simplify code path" },
{ "cov-instructions-first-value-phi.amber", "cov-instructions-first-value-phi", "A fragment shader that covers a specific instructions code path" },
+{ "cov-inst-combine-add-sub-determinant.amber", "cov-inst-combine-add-sub-determinant", "A fragment shader that covers a specific inst combine add sub code path" },
+{ "cov-inst-combine-add-sub-increase-negative.amber", "cov-inst-combine-add-sub-increase-negative", "A fragment shader that covers a specific inst combine add sub code path" },
+{ "cov-inst-combine-add-sub-neg-func-arg.amber", "cov-inst-combine-add-sub-neg-func-arg", "A fragment shader that covers a specific add/sub combining path" },
+{ "cov-inst-combine-and-or-xor-pack-unpack.amber", "cov-inst-combine-and-or-xor-pack-unpack", "A fragment shader that covers a specific inst combine and or xor code path" },
+{ "cov-inst-combine-and-or-xor-switch.amber", "cov-inst-combine-and-or-xor-switch", "A fragment shader that covers a specific inst combine and or xor code path" },
+{ "cov-inst-combine-and-or-xor-xor-add.amber", "cov-inst-combine-and-or-xor-xor-add", "A fragment shader that covers a specific inst combine and or xor code path" },
+{ "cov-inst-combine-compares-combine-select-uaddcarry.amber", "cov-inst-combine-compares-combine-select-uaddcarry", "Covers a specific instruction combine compares and combine select code paths" },
+{ "cov-inst-combine-compares-isnan.amber", "cov-inst-combine-compares-isnan", "A fragment shader that covers a specific instruction combine compare code path" },
+{ "cov-inst-combine-compares-ldexp.amber", "cov-inst-combine-compares-ldexp", "A fragment shader that covers a specific instruction combine compares code path" },
+{ "cov-inst-combine-compares-ternary-vector-access.amber", "cov-inst-combine-compares-ternary-vector-access", "A fragment shader that covers a specific instruction combine compare code path" },
+{ "cov-inst-combine-shifts-bitfield-bitcount.amber", "cov-inst-combine-shifts-bitfield-bitcount", "A fragment shader that covers a specific instruction combine shifts code path" },
+{ "cov-inst-combine-shifts-mix-mix-clamp.amber", "cov-inst-combine-shifts-mix-mix-clamp", "A fragment shader that covers a specific instruction combine shifts code path" },
+{ "cov-instr-info-det-mat-min.amber", "cov-instr-info-det-mat-min", "A fragment shader that covers a specific instr info code path" },
+{ "cov-instructions-for-if-less-than-equal.amber", "cov-instructions-for-if-less-than-equal", "Covers specific instruction simplify and combine compare code paths" },
+{ "cov-inst-combine-and-or-xor-for-bitfieldinsert.amber", "cov-inst-combine-and-or-xor-for-bitfieldinsert", "A fragment shader that covers a specific inst combine and or xor code path" },
+{ "cov-inst-combine-compares-pre-increment-clamp.amber", "cov-inst-combine-compares-pre-increment-clamp", "A fragment shader that covers a specific inst combine compares code path" },
+{ "cov-inst-combine-mul-div-rem-if-undefined-divide-mix.amber", "cov-inst-combine-mul-div-rem-if-undefined-divide-mix", "A fragment shader that covers a specific inst combine mul div rem code path" },
+{ "cov-inst-combine-pack-unpack.amber", "cov-inst-combine-pack-unpack", "Covers specific combine shifts and combine simplify demanded code paths" },
+{ "cov-inst-combine-select-findlsb-uaddcarry.amber", "cov-inst-combine-select-findlsb-uaddcarry", "A fragment shader that covers a specific instruction combine select code path" },
+{ "cov-inst-combine-simplify-demanded-pack-unpack.amber", "cov-inst-combine-simplify-demanded-pack-unpack", "Covers a specific instruction combine simplify demanded code path" },
+{ "cov-inst-combine-simplify-demanded-packsnorm-unpackunorm.amber", "cov-inst-combine-simplify-demanded-packsnorm-unpackunorm", "Covers a specific instruction combine simplify demanded code path" },
+{ "cov-inst-combine-simplify-demanded-switch-or-xor.amber", "cov-inst-combine-simplify-demanded-switch-or-xor", "A fragment shader that covers a specific inst combine simplify demanded path" },
+{ "cov-inst-combine-vector-ops-asin.amber", "cov-inst-combine-vector-ops-asin", "A fragment shader that covers specific inst combine vector ops code paths" },
+{ "cov-integer-modulo-negative.amber", "cov-integer-modulo-negative", "A fragment shader that covers specific instruction combining code paths" },
{ "cov-intervalmap-set-stop.amber", "cov-intervalmap-set-stop", "A fragment shader that covers a specific interval map code path." },
{ "cov-ir-builder-constant-fold-inst-combine-calls-value-tracking-findmsb-incr-if.amber", "cov-ir-builder-constant-fold-inst-combine-calls-value-tracking-findmsb-incr-if", "Covers IR builder, constant fold, inst combine calls and value tracking code paths"},
{ "cov-irbuilder-matrix-cell-uniform.amber", "cov-irbuilder-matrix-cell-uniform", "A fragment shader that covers a specific IR builder path." },
+{ "cov-ldexp-undefined-mat-vec-multiply.amber", "cov-ldexp-undefined-mat-vec-multiply", "Covers specific inst combine simplify demanded and inst combine shifts path" },
{ "cov-liveinterval-different-dest.amber", "cov-liveinterval-different-dest", "A fragment shader that covers a specific live interval code path." },
{ "cov-loop-findmsb-findlsb.amber", "cov-loop-findmsb-findlsb", "A fragment shader that covers specific simplification and value tracking paths" },
+{ "cov-machine-scheduler-for-if-pow.amber", "cov-machine-scheduler-for-if-pow", "A fragment shader that covers a specific machine scheduler path" },
+{ "cov-machine-basic-block-for-for-for-less-than.amber", "cov-machine-basic-block-for-for-for-less-than", "A fragment shader that covers a specific machine basic block code paths" },
{ "cov-machinevaluetype-one-iter-loop.amber", "cov-machinevaluetype-one-iter-loop", "A fragment shader that covers a specific machine value type code path" },
{ "cov-max-clamp-same-minval.amber", "cov-max-clamp-same-minval", "A fragment shader that covers a specific instruction simplification path" },
{ "cov-mem-pass-sum-struct-members.amber", "cov-mem-pass-sum-struct-members", "A fragment shader that covers a specific mem pass code path." },
{ "cov-mem-pass-unused-component.amber", "cov-mem-pass-unused-component", "A fragment shader that covers a specific mem pass code path." },
{ "cov-merge-return-condition-twice.amber", "cov-merge-return-condition-twice", "A fragment shader that covers a specific return merge path." },
+{ "cov-mod-acosh.amber", "cov-mod-acosh", "A fragment shader that calculates modulo of an acosh result" },
+{ "cov-modf-clamp-for.amber", "cov-modf-clamp-for", "A fragment shader that covers a specific live intervals code path" },
{ "cov-modf-integer-to-private.amber", "cov-modf-integer-to-private", "A fragment shader that covers a specific private to local path." },
{ "cov-optimize-phis-for.amber", "cov-optimize-phis-for", "A fragment shader that cover specific optimize phis code paths" },
{ "cov-optimize-phis-for-for-do-while-if-if.amber", "cov-optimize-phis-for-for-do-while-if-if", "A fragment shader that covers a specific optimize PHIs code path" },
+{ "cov-not-clamp-matrix-access.amber", "cov-not-clamp-matrix-access", "A fragment shader that covers a specific selection dag code path" },
{ "cov-pattern-match-signum.amber", "cov-pattern-match-signum", "A fragment shader that covers a specific pattern matching path." },
{ "cov-pattern-match-single-bit.amber", "cov-pattern-match-single-bit", "A fragment shader that covers a specific pattern matching path." },
{ "cov-peephole-optimizer-target-instr-info-for-if-if-if.amber", "cov-peephole-optimizer-target-instr-info-for-if-if-if", "Covers peephole optimizer and instr info code paths" },
+{ "cov-pow-undefined.amber", "cov-pow-undefined", "A fragment shader that covers specific constant fold and selection dag code paths" },
{ "cov-reduce-load-replace-extract.amber", "cov-reduce-load-replace-extract", "A fragment shader that covers a specific load size reduction path." },
+{ "cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard.amber", "cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard", "Covers register coalescer, live intervals and target instr info code paths" },
{ "cov-replace-copy-object.amber", "cov-replace-copy-object", "A fragment shader that covers a specific shader simplification path." },
+{ "cov-return-after-do-while.amber", "cov-return-after-do-while", "A fragment shader that covers a specific simplify cfg code path" },
{ "cov-scaled-number-nested-loops.amber", "cov-scaled-number-nested-loops", "A fragment shader that covers a specific scaled number code path." },
{ "cov-selection-dag-assign-back-and-forth.amber", "cov-selection-dag-assign-back-and-forth", "A fragment shader that covers a specific selection DAG code path" },
{ "cov-selection-dag-lt-gt.amber", "cov-selection-dag-lt-gt", "A fragment shader that covers a specific selection DAG code path" },
+{ "cov-scaled-number-nested-loops-array-access.amber", "cov-scaled-number-nested-loops-array-access", "A fragment shader that covers a specific scaled number path" },
+{ "cov-schedule-dag-rrlist-mix-log-cos.amber", "cov-schedule-dag-rrlist-mix-log-cos", "Covers a specific schedule dag register reduction list code path" },
+{ "cov-selection-dag-inverse-clamp.amber", "cov-selection-dag-inverse-clamp", "A fragment shader that covers a specific selection DAG code path" },
{ "cov-selection-dag-same-cond-twice.amber", "cov-selection-dag-same-cond-twice", "A fragment shader that covers a specific selection DAG code path" },
{ "cov-set-vector-cos-fragcoord.amber", "cov-set-vector-cos-fragcoord", "A fragment shader that covers a specific set vector code path." },
{ "cov-simplification-unused-struct.amber", "cov-simplification-unused-struct", "A fragment shader that covers a specific shader simplification path." },
{ "cov-simplification-while-inside-for.amber", "cov-simplification-while-inside-for", "A fragment shader that covers a specific code simplification path." },
{ "cov-simplify-clamp-max-itself.amber", "cov-simplify-clamp-max-itself", "A fragment shader that covers a specific instruction simplification code path" },
+{ "cov-simplify-combine-compares-max-max-one.amber", "cov-simplify-combine-compares-max-max-one", "Covers specific instruction simplifying and combining code paths" },
{ "cov-simplify-component-uniform-idx.amber", "cov-simplify-component-uniform-idx", "A fragment shader that covers a specific instruction simplification code path" },
{ "cov-simplify-div-by-uint-one.amber", "cov-simplify-div-by-uint-one", "A fragment shader that covers a specific instruction simplification code path" },
+{ "cov-simplify-for-bitwise-condition.amber", "cov-simplify-for-bitwise-condition", "A fragment shader that covers a specific instruction simplify code path" },
{ "cov-simplify-ldexp-exponent-zero.amber", "cov-simplify-ldexp-exponent-zero", "A fragment shader that covers a specific instruction simplification code path" },
+{ "cov-simplify-max-multiplied-values.amber", "cov-simplify-max-multiplied-values", "A fragment shader that covers a specific instruction simplify code path" },
+{ "cov-simplify-modulo-1.amber", "cov-simplify-modulo-1", "A fragment shader that covers a specific instruction simplification code path" },
{ "cov-simplify-mul-identity.amber", "cov-simplify-mul-identity", "A fragment shader that covers a specific instruction simplification code path" },
{ "cov-simplify-not-less-than-neg.amber", "cov-simplify-not-less-than-neg", "A fragment shader that covers a specific instruction simplification code path" },
+{ "cov-simplify-right-shift-greater-than-zero.amber", "cov-simplify-right-shift-greater-than-zero", "Covers specific instruction simplify and combine compare code paths" },
{ "cov-simplify-select-fragcoord.amber", "cov-simplify-select-fragcoord", "A fragment shader that covers a specific instruction simplification code path" },
{ "cov-simplify-sign-cosh.amber", "cov-simplify-sign-cosh", "A fragment shader that covers a specific instruction simplification path" },
{ "cov-simplify-smoothstep-undef.amber", "cov-simplify-smoothstep-undef", "A fragment shader that covers a specific instruction simplification code path" },
{ "cov-single-block-elim-self-assign.amber", "cov-single-block-elim-self-assign", "A fragment shader that covers a specific single block elimination path." },
{ "cov-single-store-elim-assume-store.amber", "cov-single-store-elim-assume-store", "A fragment shader that covers a specific single store elimination path." },
+{ "cov-sinh-ldexp.amber", "cov-sinh-ldexp", "A fragment shader that covers a specific inst combine compares code path" },
{ "cov-ssa-rewrite-case-with-default.amber", "cov-ssa-rewrite-case-with-default", "A fragment shader that covers a specific SSA rewrite path." },
+{ "cov-tail-duplicator-for-for-for.amber", "cov-tail-duplicator-for-for-for", "A fragment shader that covers a specific tail duplicator code path" },
+{ "cov-tail-duplicator-infinite-loops.amber", "cov-tail-duplicator-infinite-loops", "A fragment shader that covers a specific tail duplicator code path" },
{ "cov-target-lowering-dfdx-cos.amber", "cov-target-lowering-dfdx-cos", "A fragment shader that covers a specific target lowering code path." },
{ "cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal.amber", "cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal", "Covers target lowering and compare combining code paths" },
{ "cov-types-return-in-main-never-hit.amber", "cov-types-return-in-main-never-hit", "A fragment shader that covers a specific types optimization path." },
+{ "cov-undefined-inversesqrt-reflect.amber", "cov-undefined-inversesqrt-reflect", "A fragment shader that covers a specific APFloat code path" },
{ "cov-val-cfg-case-fallthrough.amber", "cov-val-cfg-case-fallthrough", "A fragment shader that covers a specific shader validation path." },
{ "cov-value-inst-combine-select-value-tracking-flip-bits.amber", "cov-value-inst-combine-select-value-tracking-flip-bits", "Covers value, inst combine select and value tracking code paths" },
{ "cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator.amber", "cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator", "A fragment shader that calculates modulo of constant one with a loop iterator" },
@@ -158,6 +228,11 @@
{ "cov-vector-log2-cosh.amber", "cov-vector-log2-cosh", "A fragment shader that covers a specific vector log2 and cosh code path." },
{ "cov-wrap-op-kill-for-loop.amber", "cov-wrap-op-kill-for-loop", "A fragment shader that covers a specific OpKill wrapping code path" },
{ "cov-wrap-op-kill-two-branches.amber", "cov-wrap-op-kill-two-branches", "A fragment shader that covers a specific OpKill wrapping path." },
+{ "cov-x86-isel-lowering-determinant-exp-acos.amber", "cov-x86-isel-lowering-determinant-exp-acos", "A fragment shader that covers a specific x86 isel lowering code path" },
+{ "cov-x86-isel-lowering-machine-value-type-uint-to-float.amber", "cov-x86-isel-lowering-machine-value-type-uint-to-float", "Covers specific X86 ISel lowering and machine value type code paths" },
+{ "cov-x86-isel-lowering-selection-dag-struct-array-clamp-index.amber", "cov-x86-isel-lowering-selection-dag-struct-array-clamp-index", "Covers a specific X86 ISel lowering and DAG selection code paths" },
+{ "cov-x86-isel-lowering-apfloat-nan-cos-cos.amber", "cov-x86-isel-lowering-apfloat-nan-cos-cos", "A fragment shader that covers a specific X86 ISel lowering and AP Float code paths"},
+{ "cov-x86-isel-lowering-negative-left-shift.amber", "cov-x86-isel-lowering-negative-left-shift", "A fragment shader that covers a specific X86 ISel lowering code path" },
{ "create-color-in-do-while-for-loop.amber", "create-color-in-do-while-for-loop", "A fragment shader that creates the color inside two loops" },
{ "dead-barriers-in-loops.amber", "dead-barriers-in-loops", "A compute shader with dead barriers" },
{ "dead-struct-init.amber", "dead-struct-init", "A fragment shader that uses struct initializers" },
@@ -168,11 +243,13 @@
{ "discard-in-loop-in-function.amber", "discard-in-loop-in-function", "A shader with a discard nested in a loop in a function" },
{ "discards-in-control-flow.amber", "discards-in-control-flow", "A fragment shader with discards in loops and conditionals" },
{ "do-while-false-loops.amber", "do-while-false-loops", "Code wrapped in nested single iteration loops" },
+{ "do-while-if-return.amber", "do-while-if-return", "A fragment shader with true if in a nested do while loop" },
{ "do-while-loop-in-conditionals.amber", "do-while-loop-in-conditionals", "A fragment shader with do-while loop in conditional nest" },
{ "do-while-with-always-true-if.amber", "do-while-with-always-true-if", "A fragment shader with a do while that always returns" },
{ "do-while-with-if-condition.amber", "do-while-with-if-condition", "A fragment shader that has nested if condition in do while" },
{ "early-return-and-barrier.amber", "early-return-and-barrier", "A compute shader with an early return and a barrier" },
{ "find-msb-from-lsb.amber", "find-msb-from-lsb", "A fragment shader that finds MSB from LSB" },
+{ "flag-always-false-if.amber", "flag-always-false-if", "A fragment shader with recurrent always false if statement" },
{ "for-condition-always-false.amber", "for-condition-always-false", "A fragment shader that uses a for loop with condition always false" },
{ "for-loop-with-return.amber", "for-loop-with-return", "A fragment shader with a for loop that loops only once" },
{ "for-with-ifs-and-return.amber", "for-with-ifs-and-return", "A fragment shader with two ifs and return/continue inside a for loop" },
@@ -227,14 +304,35 @@
{ "spv-double-branch-to-same-block3.amber", "spv-double-branch-to-same-block3", "Equivalent shaders, one with more complex branching" },
{ "spv-load-from-frag-color.amber", "spv-load-from-frag-color", "Equivalent shaders, one with extra access chains and load" },
{ "spv-null-in-phi-and-unroll.amber", "spv-null-in-phi-and-unroll", "Equivalent shaders, one that uses null for 0 and an Unroll annotation" },
+{ "spv-stable-bifurcation-Os-mutate-var-vector-shuffle.amber", "spv-stable-bifurcation-Os-mutate-var-vector-shuffle", "Three shaders diff: mutate var, vector shuffle" },
+{ "spv-stable-collatz-O-mutate-composite-construct-extract.amber", "spv-stable-collatz-O-mutate-composite-construct-extract", "Two shaders diff: mutate var, comp extract/construct" },
+{ "spv-stable-colorgrid-modulo-O-move-block-down.amber", "spv-stable-colorgrid-modulo-O-move-block-down", "Two shaders with diff: some blocks moved down" },
+{ "spv-stable-maze-flatten-copy-composite.amber", "spv-stable-maze-flatten-copy-composite", "Three shaders with diff: conditional %270 is flattened" },
+{ "spv-stable-mergesort-O-prop-up-mutate-var.amber", "spv-stable-mergesort-O-prop-up-mutate-var", "Three shaders with diff: mutate var" },
+{ "spv-stable-mergesort-flatten-selection-dead-continues.amber", "spv-stable-mergesort-flatten-selection-dead-continues", "Shaders diff: selection %25 flattened; dead continues" },
+{ "spv-stable-mergesort-func-inline-mutate-var.amber", "spv-stable-mergesort-func-inline-mutate-var", "Three shaders diff: mutated var" },
+{ "spv-stable-orbit-O-mutate-variable.amber", "spv-stable-orbit-O-mutate-variable", "Two shaders with diff: variable mutated" },
+{ "spv-stable-orbit-Os-access-chain-mutate-pointer.amber", "spv-stable-orbit-Os-access-chain-mutate-pointer", "Three shaders with diff: added mutate pointer" },
+{ "spv-stable-pillars-O-op-select-to-op-phi.amber", "spv-stable-pillars-O-op-select-to-op-phi", "Three shaders diff: OpSelect -> OpPhi" },
+{ "spv-stable-quicksort-mat-func-param.amber", "spv-stable-quicksort-mat-func-param", "Two shaders with diff: added mat3x3 func param" },
+{ "spv-stable-rects-Os-mutate-var-push-through-var.amber", "spv-stable-rects-Os-mutate-var-push-through-var", "Three shaders diff: new variable used and mutated" },
+{ "stable-binarysearch-tree-false-if-discard-loop.amber", "stable-binarysearch-tree-false-if-discard-loop", "A fragment shader with always false if with discard loop" },
+{ "stable-binarysearch-tree-fragcoord-less-than-zero.amber", "stable-binarysearch-tree-fragcoord-less-than-zero", "A fragment shader with gl_FragCoord.x less than zero" },
+{ "stable-binarysearch-tree-nested-if-and-conditional.amber", "stable-binarysearch-tree-nested-if-and-conditional", "A fragment shader with nested if and conditional statement" },
{ "stable-binarysearch-tree-with-loop-read-write-global.amber", "stable-binarysearch-tree-with-loop-read-write-global", "A pair of fragment shaders that both render red" },
+{ "stable-collatz-push-constant-with-nested-min-max.amber", "stable-collatz-push-constant-with-nested-min-max", "A fragment shader with push constant and nested min max" },
+{ "stable-colorgrid-modulo-double-always-false-discard.amber", "stable-colorgrid-modulo-double-always-false-discard", "A fragment shader with two always false discards" },
{ "stable-colorgrid-modulo-injected-conditional-true.amber", "stable-colorgrid-modulo-injected-conditional-true", "A fragment shader with an always true conditional" },
{ "stable-colorgrid-modulo-true-conditional-simple-loop.amber", "stable-colorgrid-modulo-true-conditional-simple-loop", "A fragment shader with conditional and simple loop" },
{ "stable-colorgrid-modulo-vec3-values-from-matrix.amber", "stable-colorgrid-modulo-vec3-values-from-matrix", "A fragment shader with vec3 values set from matrix4x2" },
+{ "stable-mergesort-for-always-false-if-discard.amber", "stable-mergesort-for-always-false-if-discard", "A fragment shader with for loop and always false if" },
+{ "stable-mergesort-reversed-for-loop.amber", "stable-mergesort-reversed-for-loop", "A fragment shader with once iterated reversed for loop" },
{ "stable-quicksort-for-loop-with-injection.amber", "stable-quicksort-for-loop-with-injection", "A fragment shader with a for loop containing injection" },
{ "stable-quicksort-if-false-else-return.amber", "stable-quicksort-if-false-else-return", "A fragment shader with an always false if statement" },
{ "stable-quicksort-max-value-as-index.amber", "stable-quicksort-max-value-as-index", "A fragment shader with greater of two values as index" },
{ "stable-rects-vec4-clamp-conditional-min-mix.amber", "stable-rects-vec4-clamp-conditional-min-mix", "A fragment shader with min-mix in always false conditional" },
+{ "stable-triangle-array-nested-loop.amber", "stable-triangle-array-nested-loop", "A fragment shader with array and nested loops" },
+{ "stable-triangle-nested-for-loop-and-true-if.amber", "stable-triangle-nested-for-loop-and-true-if", "A fragment shader with nested for loop and always true if" },
{ "struct-and-unreachable-infinite-loop.amber", "struct-and-unreachable-infinite-loop", "Fragment shader with struct and unreachable infinite loop" },
{ "struct-array-data-as-loop-iterator.amber", "struct-array-data-as-loop-iterator", "A fragment shader that uses struct array data for loop iterator value" },
{ "struct-controlled-loop.amber", "struct-controlled-loop", "Shader with loop controlled by struct" },
@@ -269,6 +367,7 @@
{ "unreachable-return-in-loop.amber", "unreachable-return-in-loop", "A fragment shader with an unreachable return in a loop" },
{ "unreachable-switch-case-with-discards.amber", "unreachable-switch-case-with-discards", "A shader with a switch statement containing unreachable discards" },
{ "uv-value-comparison-as-boolean.amber", "uv-value-comparison-as-boolean", "A fragment shader with uv value comparison as boolean" },
+{ "vec2-modf.amber", "vec2-modf", "A fragment shader with vec2 in modulus fraction function" },
{ "vector-values-multiplied-by-fragcoord.amber", "vector-values-multiplied-by-fragcoord", "A shader that multiplies a vector by fragcoord" },
{ "vectors-and-discard-in-function.amber", "vectors-and-discard-in-function", "A fragment shader that assigns vector values" },
{ "while-function-always-false.amber", "while-function-always-false", "A fragment shader with an always false while function" },
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle.amber
new file mode 100644
index 0000000..7fe3860
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle.amber
@@ -0,0 +1,446 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Three shaders diff: mutate var, vector shuffle
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 107
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %74
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "gl_FragCoord"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "resolution"
+ OpName %17 ""
+ OpName %74 "_GLF_color"
+ OpName %100 "indexable"
+ OpDecorate %12 BuiltIn FragCoord
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %74 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %10 = OpTypeVector %6 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %15 = OpTypeStruct %7
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpTypeInt 32 1
+ %19 = OpConstant %18 0
+ %20 = OpTypePointer Uniform %7
+ %27 = OpTypeInt 32 0
+ %32 = OpConstant %6 10
+ %47 = OpConstant %18 10
+ %51 = OpConstant %18 100
+ %60 = OpTypeBool
+ %62 = OpConstant %18 4
+ %65 = OpConstant %18 1000
+ %71 = OpConstant %18 1
+ %73 = OpTypePointer Output %10
+ %74 = OpVariable %73 Output
+ %75 = OpConstant %27 16
+ %76 = OpTypeArray %10 %75
+ %77 = OpConstant %6 0
+ %78 = OpConstant %6 1
+ %79 = OpConstantComposite %10 %77 %77 %77 %78
+ %80 = OpConstant %6 0.5
+ %81 = OpConstantComposite %10 %80 %77 %77 %78
+ %82 = OpConstantComposite %10 %77 %80 %77 %78
+ %83 = OpConstantComposite %10 %80 %80 %77 %78
+ %84 = OpConstantComposite %10 %77 %77 %80 %78
+ %85 = OpConstantComposite %10 %80 %77 %80 %78
+ %86 = OpConstantComposite %10 %77 %80 %80 %78
+ %87 = OpConstantComposite %10 %80 %80 %80 %78
+ %88 = OpConstantComposite %10 %78 %77 %77 %78
+ %89 = OpConstantComposite %10 %77 %78 %77 %78
+ %90 = OpConstantComposite %10 %78 %78 %77 %78
+ %91 = OpConstantComposite %10 %77 %77 %78 %78
+ %92 = OpConstantComposite %10 %78 %77 %78 %78
+ %93 = OpConstantComposite %10 %77 %78 %78 %78
+ %94 = OpConstantComposite %10 %78 %78 %78 %78
+ %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
+ %97 = OpConstant %18 16
+ %99 = OpTypePointer Function %76
+ %101 = OpTypePointer Function %10
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %100 = OpVariable %99 Function
+ %13 = OpLoad %10 %12
+ %14 = OpVectorShuffle %7 %13 %13 0 1
+ %21 = OpAccessChain %20 %17 %19
+ %22 = OpLoad %7 %21
+ %23 = OpFDiv %7 %14 %22
+ %31 = OpCompositeExtract %6 %23 0
+ %33 = OpFMul %6 %31 %32
+ %34 = OpConvertFToS %18 %33
+ %37 = OpCompositeExtract %6 %23 1
+ %38 = OpFMul %6 %37 %32
+ %39 = OpConvertFToS %18 %38
+ %48 = OpIMul %18 %39 %47
+ %49 = OpIAdd %18 %34 %48
+ OpBranch %53
+ %53 = OpLabel
+ %106 = OpPhi %18 %51 %5 %69 %54
+ %104 = OpPhi %18 %19 %5 %72 %54
+ %61 = OpSLessThan %60 %104 %49
+ OpLoopMerge %55 %54 None
+ OpBranchConditional %61 %54 %55
+ %54 = OpLabel
+ %64 = OpIMul %18 %62 %106
+ %67 = OpISub %18 %65 %106
+ %68 = OpIMul %18 %64 %67
+ %69 = OpSDiv %18 %68 %65
+ %72 = OpIAdd %18 %104 %71
+ OpBranch %53
+ %55 = OpLabel
+ %98 = OpSMod %18 %106 %97
+ OpStore %100 %95
+ %102 = OpAccessChain %101 %100 %98
+ %103 = OpLoad %10 %102
+ OpStore %74 %103
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 263
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %74
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "gl_FragCoord"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "resolution"
+ OpName %17 ""
+ OpName %74 "_GLF_color"
+ OpName %100 "indexable"
+ OpDecorate %12 BuiltIn FragCoord
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %74 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %10 = OpTypeVector %6 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %15 = OpTypeStruct %7
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpTypeInt 32 1
+ %19 = OpConstant %18 0
+ %20 = OpTypePointer Uniform %7
+ %27 = OpTypeInt 32 0
+ %32 = OpConstant %6 10
+ %47 = OpConstant %18 10
+ %51 = OpConstant %18 100
+ %60 = OpTypeBool
+ %62 = OpConstant %18 4
+ %65 = OpConstant %18 1000
+ %71 = OpConstant %18 1
+ %73 = OpTypePointer Output %10
+ %74 = OpVariable %73 Output
+ %75 = OpConstant %27 16
+ %76 = OpTypeArray %10 %75
+ %77 = OpConstant %6 0
+ %78 = OpConstant %6 1
+ %79 = OpConstantComposite %10 %77 %77 %77 %78
+ %80 = OpConstant %6 0.5
+ %81 = OpConstantComposite %10 %80 %77 %77 %78
+ %82 = OpConstantComposite %10 %77 %80 %77 %78
+ %83 = OpConstantComposite %10 %80 %80 %77 %78
+ %84 = OpConstantComposite %10 %77 %77 %80 %78
+ %85 = OpConstantComposite %10 %80 %77 %80 %78
+ %86 = OpConstantComposite %10 %77 %80 %80 %78
+ %87 = OpConstantComposite %10 %80 %80 %80 %78
+ %88 = OpConstantComposite %10 %78 %77 %77 %78
+ %89 = OpConstantComposite %10 %77 %78 %77 %78
+ %90 = OpConstantComposite %10 %78 %78 %77 %78
+ %91 = OpConstantComposite %10 %77 %77 %78 %78
+ %92 = OpConstantComposite %10 %78 %77 %78 %78
+ %93 = OpConstantComposite %10 %77 %78 %78 %78
+ %94 = OpConstantComposite %10 %78 %78 %78 %78
+ %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
+ %97 = OpConstant %18 16
+ %99 = OpTypePointer Function %76
+ %101 = OpTypePointer Function %10
+ %234 = OpConstant %6 0
+ %235 = OpConstantComposite %10 %234 %234 %234 %234
+ %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %100 = OpVariable %99 Function
+ %13 = OpLoad %10 %12
+ %14 = OpVectorShuffle %7 %13 %13 0 1
+ %21 = OpAccessChain %20 %17 %19
+ %22 = OpLoad %7 %21
+ %23 = OpFDiv %7 %14 %22
+ %31 = OpCompositeExtract %6 %23 0
+ %33 = OpFMul %6 %31 %32
+ %34 = OpConvertFToS %18 %33
+ %37 = OpCompositeExtract %6 %23 1
+ %38 = OpFMul %6 %37 %32
+ %39 = OpConvertFToS %18 %38
+ %48 = OpIMul %18 %39 %47
+ %49 = OpIAdd %18 %34 %48
+ OpBranch %53
+ %53 = OpLabel
+ %106 = OpPhi %18 %51 %5 %69 %54
+ %104 = OpPhi %18 %19 %5 %72 %54
+ %61 = OpSLessThan %60 %104 %49
+ OpLoopMerge %55 %54 None
+ OpBranchConditional %61 %54 %55
+ %54 = OpLabel
+ %64 = OpIMul %18 %62 %106
+ %67 = OpISub %18 %65 %106
+ %68 = OpIMul %18 %64 %67
+ %69 = OpSDiv %18 %68 %65
+ %72 = OpIAdd %18 %104 %71
+ OpBranch %53
+ %55 = OpLabel
+ %98 = OpSMod %18 %106 %97
+ OpStore %100 %95
+ %262 = OpLoad %76 %100
+ OpStore %100 %236
+ OpStore %100 %262
+ %231 = OpVectorShuffle %7 %89 %85 1 4
+ %102 = OpAccessChain %101 %100 %98
+ %103 = OpLoad %10 %102
+ OpStore %74 %103
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 237
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %74
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "gl_FragCoord"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "resolution"
+ OpName %17 ""
+ OpName %74 "_GLF_color"
+ OpName %100 "indexable"
+ OpDecorate %12 BuiltIn FragCoord
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %74 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %10 = OpTypeVector %6 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %15 = OpTypeStruct %7
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpTypeInt 32 1
+ %19 = OpConstant %18 0
+ %20 = OpTypePointer Uniform %7
+ %27 = OpTypeInt 32 0
+ %32 = OpConstant %6 10
+ %47 = OpConstant %18 10
+ %51 = OpConstant %18 100
+ %60 = OpTypeBool
+ %62 = OpConstant %18 4
+ %65 = OpConstant %18 1000
+ %71 = OpConstant %18 1
+ %73 = OpTypePointer Output %10
+ %74 = OpVariable %73 Output
+ %75 = OpConstant %27 16
+ %76 = OpTypeArray %10 %75
+ %77 = OpConstant %6 0
+ %78 = OpConstant %6 1
+ %79 = OpConstantComposite %10 %77 %77 %77 %78
+ %80 = OpConstant %6 0.5
+ %81 = OpConstantComposite %10 %80 %77 %77 %78
+ %82 = OpConstantComposite %10 %77 %80 %77 %78
+ %83 = OpConstantComposite %10 %80 %80 %77 %78
+ %84 = OpConstantComposite %10 %77 %77 %80 %78
+ %85 = OpConstantComposite %10 %80 %77 %80 %78
+ %86 = OpConstantComposite %10 %77 %80 %80 %78
+ %87 = OpConstantComposite %10 %80 %80 %80 %78
+ %88 = OpConstantComposite %10 %78 %77 %77 %78
+ %89 = OpConstantComposite %10 %77 %78 %77 %78
+ %90 = OpConstantComposite %10 %78 %78 %77 %78
+ %91 = OpConstantComposite %10 %77 %77 %78 %78
+ %92 = OpConstantComposite %10 %78 %77 %78 %78
+ %93 = OpConstantComposite %10 %77 %78 %78 %78
+ %94 = OpConstantComposite %10 %78 %78 %78 %78
+ %95 = OpConstantComposite %76 %79 %81 %82 %83 %84 %85 %86 %87 %79 %88 %89 %90 %91 %92 %93 %94
+ %97 = OpConstant %18 16
+ %99 = OpTypePointer Function %76
+ %101 = OpTypePointer Function %10
+ %234 = OpConstant %6 0
+ %235 = OpConstantComposite %10 %234 %234 %234 %234
+ %236 = OpConstantComposite %76 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235 %235
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %100 = OpVariable %99 Function
+ %13 = OpLoad %10 %12
+ %14 = OpVectorShuffle %7 %13 %13 0 1
+ %21 = OpAccessChain %20 %17 %19
+ %22 = OpLoad %7 %21
+ %23 = OpFDiv %7 %14 %22
+ %31 = OpCompositeExtract %6 %23 0
+ %33 = OpFMul %6 %31 %32
+ %34 = OpConvertFToS %18 %33
+ %37 = OpCompositeExtract %6 %23 1
+ %38 = OpFMul %6 %37 %32
+ %39 = OpConvertFToS %18 %38
+ %48 = OpIMul %18 %39 %47
+ %49 = OpIAdd %18 %34 %48
+ OpBranch %53
+ %53 = OpLabel
+ %106 = OpPhi %18 %51 %5 %69 %54
+ %104 = OpPhi %18 %19 %5 %72 %54
+ %61 = OpSLessThan %60 %104 %49
+ OpLoopMerge %55 %54 None
+ OpBranchConditional %61 %54 %55
+ %54 = OpLabel
+ %64 = OpIMul %18 %62 %106
+ %67 = OpISub %18 %65 %106
+ %68 = OpIMul %18 %64 %67
+ %69 = OpSDiv %18 %68 %65
+ %72 = OpIAdd %18 %104 %71
+ OpBranch %53
+ %55 = OpLabel
+ %98 = OpSMod %18 %106 %97
+ OpStore %100 %95
+ %231 = OpVectorShuffle %7 %89 %85 1 4
+ %102 = OpAccessChain %101 %100 %98
+ %103 = OpLoad %10 %102
+ OpStore %74 %103
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# resolution
+BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract.amber
new file mode 100644
index 0000000..c9766f5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract.amber
@@ -0,0 +1,329 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Two shaders diff: mutate var, comp extract/construct
+
+# The test renders two images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 138
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %47 %76
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %47 "gl_FragCoord"
+ OpName %50 "buf0"
+ OpMemberName %50 0 "resolution"
+ OpName %52 ""
+ OpName %76 "_GLF_color"
+ OpName %104 "indexable"
+ OpDecorate %47 BuiltIn FragCoord
+ OpMemberDecorate %50 0 Offset 0
+ OpDecorate %50 Block
+ OpDecorate %52 DescriptorSet 0
+ OpDecorate %52 Binding 0
+ OpDecorate %76 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %13 = OpConstant %6 0
+ %20 = OpConstant %6 1
+ %21 = OpTypeBool
+ %28 = OpConstant %6 3
+ %33 = OpConstant %6 2
+ %41 = OpTypeFloat 32
+ %42 = OpTypeVector %41 2
+ %45 = OpTypeVector %41 4
+ %46 = OpTypePointer Input %45
+ %47 = OpVariable %46 Input
+ %50 = OpTypeStruct %42
+ %51 = OpTypePointer Uniform %50
+ %52 = OpVariable %51 Uniform
+ %53 = OpTypePointer Uniform %42
+ %58 = OpConstant %41 8
+ %62 = OpTypeInt 32 0
+ %68 = OpConstant %6 8
+ %75 = OpTypePointer Output %45
+ %76 = OpVariable %75 Output
+ %77 = OpConstant %62 16
+ %78 = OpTypeArray %45 %77
+ %79 = OpConstant %41 0
+ %80 = OpConstant %41 1
+ %81 = OpConstantComposite %45 %79 %79 %79 %80
+ %82 = OpConstant %41 0.5
+ %83 = OpConstantComposite %45 %82 %79 %79 %80
+ %84 = OpConstantComposite %45 %79 %82 %79 %80
+ %85 = OpConstantComposite %45 %82 %82 %79 %80
+ %86 = OpConstantComposite %45 %79 %79 %82 %80
+ %87 = OpConstantComposite %45 %82 %79 %82 %80
+ %88 = OpConstantComposite %45 %79 %82 %82 %80
+ %89 = OpConstantComposite %45 %82 %82 %82 %80
+ %90 = OpConstantComposite %45 %80 %79 %79 %80
+ %91 = OpConstantComposite %45 %79 %80 %79 %80
+ %92 = OpConstantComposite %45 %80 %80 %79 %80
+ %93 = OpConstantComposite %45 %79 %79 %80 %80
+ %94 = OpConstantComposite %45 %80 %79 %80 %80
+ %95 = OpConstantComposite %45 %79 %80 %80 %80
+ %96 = OpConstantComposite %45 %80 %80 %80 %80
+ %97 = OpConstantComposite %78 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+ %101 = OpConstant %6 16
+ %103 = OpTypePointer Function %78
+ %105 = OpTypePointer Function %45
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %104 = OpVariable %103 Function
+ %48 = OpLoad %45 %47
+ %49 = OpVectorShuffle %42 %48 %48 0 1
+ %54 = OpAccessChain %53 %52 %13
+ %55 = OpLoad %42 %54
+ %56 = OpFDiv %42 %49 %55
+ %59 = OpVectorTimesScalar %42 %56 %58
+ %60 = OpExtInst %42 %1 Floor %59
+ %66 = OpCompositeExtract %41 %60 0
+ %67 = OpConvertFToS %6 %66
+ %69 = OpIMul %6 %67 %68
+ %72 = OpCompositeExtract %41 %60 1
+ %73 = OpConvertFToS %6 %72
+ %74 = OpIAdd %6 %69 %73
+ OpBranch %111
+ %111 = OpLabel
+ %135 = OpPhi %6 %13 %5 %128 %129
+ %134 = OpPhi %6 %74 %5 %137 %129
+ %114 = OpSGreaterThan %21 %134 %20
+ OpLoopMerge %130 %129 None
+ OpBranchConditional %114 %115 %130
+ %115 = OpLabel
+ %117 = OpBitwiseAnd %6 %134 %20
+ %118 = OpIEqual %21 %117 %20
+ OpSelectionMerge %126 None
+ OpBranchConditional %118 %119 %123
+ %119 = OpLabel
+ %121 = OpIMul %6 %28 %134
+ %122 = OpIAdd %6 %121 %20
+ OpBranch %126
+ %123 = OpLabel
+ %125 = OpSDiv %6 %134 %33
+ OpBranch %126
+ %126 = OpLabel
+ %137 = OpPhi %6 %122 %119 %125 %123
+ %128 = OpIAdd %6 %135 %20
+ OpBranch %129
+ %129 = OpLabel
+ OpBranch %111
+ %130 = OpLabel
+ %102 = OpSMod %6 %135 %101
+ OpStore %104 %97
+ %106 = OpAccessChain %105 %104 %102
+ %107 = OpLoad %45 %106
+ OpStore %76 %107
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 502
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %47 %76
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %47 "gl_FragCoord"
+ OpName %50 "buf0"
+ OpMemberName %50 0 "resolution"
+ OpName %52 ""
+ OpName %76 "_GLF_color"
+ OpName %104 "indexable"
+ OpDecorate %47 BuiltIn FragCoord
+ OpMemberDecorate %50 0 Offset 0
+ OpDecorate %50 Block
+ OpDecorate %52 DescriptorSet 0
+ OpDecorate %52 Binding 0
+ OpDecorate %76 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %13 = OpConstant %6 0
+ %20 = OpConstant %6 1
+ %21 = OpTypeBool
+ %28 = OpConstant %6 3
+ %33 = OpConstant %6 2
+ %41 = OpTypeFloat 32
+ %42 = OpTypeVector %41 2
+ %45 = OpTypeVector %41 4
+ %46 = OpTypePointer Input %45
+ %47 = OpVariable %46 Input
+ %50 = OpTypeStruct %42
+ %51 = OpTypePointer Uniform %50
+ %52 = OpVariable %51 Uniform
+ %53 = OpTypePointer Uniform %42
+ %58 = OpConstant %41 8
+ %62 = OpTypeInt 32 0
+ %68 = OpConstant %6 8
+ %75 = OpTypePointer Output %45
+ %76 = OpVariable %75 Output
+ %77 = OpConstant %62 16
+ %78 = OpTypeArray %45 %77
+ %79 = OpConstant %41 0
+ %80 = OpConstant %41 1
+ %81 = OpConstantComposite %45 %79 %79 %79 %80
+ %82 = OpConstant %41 0.5
+ %83 = OpConstantComposite %45 %82 %79 %79 %80
+ %84 = OpConstantComposite %45 %79 %82 %79 %80
+ %85 = OpConstantComposite %45 %82 %82 %79 %80
+ %86 = OpConstantComposite %45 %79 %79 %82 %80
+ %87 = OpConstantComposite %45 %82 %79 %82 %80
+ %88 = OpConstantComposite %45 %79 %82 %82 %80
+ %89 = OpConstantComposite %45 %82 %82 %82 %80
+ %90 = OpConstantComposite %45 %80 %79 %79 %80
+ %91 = OpConstantComposite %45 %79 %80 %79 %80
+ %92 = OpConstantComposite %45 %80 %80 %79 %80
+ %93 = OpConstantComposite %45 %79 %79 %80 %80
+ %94 = OpConstantComposite %45 %80 %79 %80 %80
+ %95 = OpConstantComposite %45 %79 %80 %80 %80
+ %96 = OpConstantComposite %45 %80 %80 %80 %80
+ %97 = OpConstantComposite %78 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+ %101 = OpConstant %6 16
+ %103 = OpTypePointer Function %78
+ %105 = OpTypePointer Function %45
+ %403 = OpConstant %41 0
+ %404 = OpConstantComposite %45 %403 %403 %403 %403
+ %405 = OpConstantComposite %78 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404 %404
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %104 = OpVariable %103 Function
+ %48 = OpLoad %45 %47
+ %49 = OpVectorShuffle %42 %48 %48 0 1
+ %238 = OpCompositeConstruct %45 %79 %58 %49
+ %54 = OpAccessChain %53 %52 %13
+ %55 = OpLoad %42 %54
+ %239 = OpCompositeConstruct %78 %86 %94 %88 %95 %96 %88 %88 %87 %92 %48 %86 %85 %84 %83 %91 %90
+ %56 = OpFDiv %42 %49 %55
+ %59 = OpVectorTimesScalar %42 %56 %58
+ %60 = OpExtInst %42 %1 Floor %59
+ %241 = OpCompositeConstruct %45 %59 %82 %80
+ %66 = OpCompositeExtract %41 %60 0
+ %67 = OpConvertFToS %6 %66
+ %69 = OpIMul %6 %67 %68
+ %72 = OpCompositeExtract %41 %60 1
+ %73 = OpConvertFToS %6 %72
+ %74 = OpIAdd %6 %69 %73
+ OpBranch %111
+ %111 = OpLabel
+ %135 = OpPhi %6 %13 %5 %128 %129
+ %134 = OpPhi %6 %74 %5 %137 %129
+ %114 = OpSGreaterThan %21 %134 %20
+ OpLoopMerge %130 %129 None
+ OpBranchConditional %114 %115 %130
+ %115 = OpLabel
+ %117 = OpBitwiseAnd %6 %134 %20
+ %118 = OpIEqual %21 %117 %20
+ OpSelectionMerge %126 None
+ OpBranchConditional %118 %119 %123
+ %119 = OpLabel
+ %121 = OpIMul %6 %28 %134
+ %122 = OpIAdd %6 %121 %20
+ OpBranch %126
+ %123 = OpLabel
+ %125 = OpSDiv %6 %134 %33
+ OpBranch %126
+ %126 = OpLabel
+ %137 = OpPhi %6 %122 %119 %125 %123
+ %128 = OpIAdd %6 %135 %20
+ OpBranch %129
+ %129 = OpLabel
+ OpBranch %111
+ %130 = OpLabel
+ %102 = OpSMod %6 %135 %101
+ OpStore %104 %97
+ %501 = OpLoad %78 %104
+ OpStore %104 %405
+ OpStore %104 %501
+ %248 = OpCompositeExtract %45 %239 1
+ %245 = OpCompositeConstruct %78 %87 %87 %91 %81 %87 %89 %94 %81 %91 %238 %86 %88 %87 %92 %94 %241
+ %106 = OpAccessChain %105 %104 %102
+ %107 = OpLoad %45 %106
+ OpStore %76 %107
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down.amber
new file mode 100644
index 0000000..041141a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down.amber
@@ -0,0 +1,536 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Two shaders with diff: some blocks moved down
+
+# The test renders two images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 290
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %85 %137
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %66 "c"
+ OpName %73 "buf0"
+ OpMemberName %73 0 "resolution"
+ OpName %75 ""
+ OpName %85 "gl_FragCoord"
+ OpName %137 "_GLF_color"
+ OpMemberDecorate %73 0 Offset 0
+ OpDecorate %73 Block
+ OpDecorate %75 DescriptorSet 0
+ OpDecorate %75 Binding 0
+ OpDecorate %85 BuiltIn FragCoord
+ OpDecorate %137 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %14 = OpConstant %6 -0.5
+ %15 = OpTypeInt 32 1
+ %18 = OpConstant %15 1
+ %25 = OpConstant %15 800
+ %26 = OpTypeBool
+ %29 = OpConstant %15 32
+ %31 = OpConstant %15 0
+ %35 = OpConstant %6 0.400000006
+ %44 = OpConstant %6 0.00999999978
+ %48 = OpConstant %6 100
+ %64 = OpTypeVector %6 3
+ %65 = OpTypePointer Function %64
+ %67 = OpConstant %6 7
+ %68 = OpConstant %6 8
+ %69 = OpConstant %6 9
+ %70 = OpConstantComposite %64 %67 %68 %69
+ %72 = OpTypeVector %6 2
+ %73 = OpTypeStruct %72
+ %74 = OpTypePointer Uniform %73
+ %75 = OpVariable %74 Uniform
+ %76 = OpTypeInt 32 0
+ %77 = OpConstant %76 0
+ %78 = OpTypePointer Uniform %6
+ %83 = OpTypeVector %6 4
+ %84 = OpTypePointer Input %83
+ %85 = OpVariable %84 Input
+ %87 = OpTypePointer Input %6
+ %95 = OpConstant %76 1
+ %107 = OpConstant %76 2
+ %116 = OpConstant %15 3
+ %121 = OpConstant %6 1
+ %136 = OpTypePointer Output %83
+ %137 = OpVariable %136 Output
+ %149 = OpConstantFalse %26
+ %152 = OpConstantTrue %26
+ %261 = OpUndef %6
+ %289 = OpConstant %6 0.125
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %66 = OpVariable %65 Function
+ OpStore %66 %70
+ %79 = OpAccessChain %78 %75 %31 %77
+ %80 = OpLoad %6 %79
+ %81 = OpFMul %6 %80 %289
+ %82 = OpExtInst %6 %1 Round %81
+ %88 = OpAccessChain %87 %85 %77
+ %89 = OpLoad %6 %88
+ OpSelectionMerge %199 None
+ OpSwitch %77 %161
+ %161 = OpLabel
+ OpBranch %162
+ %162 = OpLabel
+ %248 = OpPhi %6 %14 %161 %251 %192
+ %247 = OpPhi %15 %18 %161 %194 %192
+ %165 = OpSLessThan %26 %247 %25
+ OpLoopMerge %195 %192 None
+ OpBranchConditional %165 %166 %195
+ %166 = OpLabel
+ %168 = OpSMod %15 %247 %29
+ %169 = OpIEqual %26 %168 %31
+ OpSelectionMerge %184 None
+ OpBranchConditional %169 %170 %173
+ %170 = OpLabel
+ %172 = OpFAdd %6 %248 %35
+ OpBranch %184
+ %173 = OpLabel
+ %175 = OpConvertSToF %6 %247
+ %177 = OpExtInst %6 %1 Round %82
+ %178 = OpFMod %6 %175 %177
+ %179 = OpFOrdLessThanEqual %26 %178 %44
+ OpSelectionMerge %183 None
+ OpBranchConditional %179 %180 %183
+ %180 = OpLabel
+ %182 = OpFAdd %6 %248 %48
+ OpBranch %183
+ %183 = OpLabel
+ %252 = OpPhi %6 %248 %173 %182 %180
+ OpBranch %184
+ %184 = OpLabel
+ %251 = OpPhi %6 %172 %170 %252 %183
+ %186 = OpConvertSToF %6 %247
+ %188 = OpFOrdGreaterThanEqual %26 %186 %89
+ OpSelectionMerge %191 None
+ OpBranchConditional %188 %189 %191
+ %189 = OpLabel
+ OpBranch %195
+ %191 = OpLabel
+ OpBranch %192
+ %192 = OpLabel
+ %194 = OpIAdd %15 %247 %18
+ OpBranch %162
+ %195 = OpLabel
+ %259 = OpPhi %6 %261 %162 %251 %189
+ %257 = OpPhi %6 %248 %162 %251 %189
+ %253 = OpPhi %26 %149 %162 %152 %189
+ OpSelectionMerge %197 None
+ OpBranchConditional %253 %199 %197
+ %197 = OpLabel
+ OpBranch %199
+ %199 = OpLabel
+ %258 = OpPhi %6 %259 %195 %257 %197
+ %93 = OpAccessChain %7 %66 %77
+ OpStore %93 %258
+ %96 = OpAccessChain %87 %85 %95
+ %97 = OpLoad %6 %96
+ OpSelectionMerge %245 None
+ OpSwitch %77 %207
+ %207 = OpLabel
+ OpBranch %208
+ %208 = OpLabel
+ %265 = OpPhi %6 %14 %207 %268 %238
+ %264 = OpPhi %15 %18 %207 %240 %238
+ %211 = OpSLessThan %26 %264 %25
+ OpLoopMerge %241 %238 None
+ OpBranchConditional %211 %212 %241
+ %212 = OpLabel
+ %214 = OpSMod %15 %264 %29
+ %215 = OpIEqual %26 %214 %31
+ OpSelectionMerge %230 None
+ OpBranchConditional %215 %216 %219
+ %216 = OpLabel
+ %218 = OpFAdd %6 %265 %35
+ OpBranch %230
+ %219 = OpLabel
+ %221 = OpConvertSToF %6 %264
+ %223 = OpExtInst %6 %1 Round %82
+ %224 = OpFMod %6 %221 %223
+ %225 = OpFOrdLessThanEqual %26 %224 %44
+ OpSelectionMerge %229 None
+ OpBranchConditional %225 %226 %229
+ %226 = OpLabel
+ %228 = OpFAdd %6 %265 %48
+ OpBranch %229
+ %229 = OpLabel
+ %269 = OpPhi %6 %265 %219 %228 %226
+ OpBranch %230
+ %230 = OpLabel
+ %268 = OpPhi %6 %218 %216 %269 %229
+ %232 = OpConvertSToF %6 %264
+ %234 = OpFOrdGreaterThanEqual %26 %232 %97
+ OpSelectionMerge %237 None
+ OpBranchConditional %234 %235 %237
+ %235 = OpLabel
+ OpBranch %241
+ %237 = OpLabel
+ OpBranch %238
+ %238 = OpLabel
+ %240 = OpIAdd %15 %264 %18
+ OpBranch %208
+ %241 = OpLabel
+ %276 = OpPhi %6 %261 %208 %268 %235
+ %274 = OpPhi %6 %265 %208 %268 %235
+ %270 = OpPhi %26 %149 %208 %152 %235
+ OpSelectionMerge %243 None
+ OpBranchConditional %270 %245 %243
+ %243 = OpLabel
+ OpBranch %245
+ %245 = OpLabel
+ %275 = OpPhi %6 %276 %241 %274 %243
+ %101 = OpAccessChain %7 %66 %95
+ OpStore %101 %275
+ %103 = OpLoad %6 %93
+ %105 = OpLoad %6 %101
+ %106 = OpFAdd %6 %103 %105
+ %108 = OpAccessChain %7 %66 %107
+ OpStore %108 %106
+ OpBranch %110
+ %110 = OpLabel
+ %285 = OpPhi %15 %31 %245 %135 %113
+ %117 = OpSLessThan %26 %285 %116
+ OpLoopMerge %112 %113 None
+ OpBranchConditional %117 %111 %112
+ %111 = OpLabel
+ %119 = OpAccessChain %7 %66 %285
+ %120 = OpLoad %6 %119
+ %122 = OpFOrdGreaterThanEqual %26 %120 %121
+ OpSelectionMerge %124 None
+ OpBranchConditional %122 %123 %124
+ %123 = OpLabel
+ %128 = OpLoad %6 %119
+ %131 = OpLoad %6 %119
+ %132 = OpFMul %6 %128 %131
+ OpStore %119 %132
+ OpBranch %124
+ %124 = OpLabel
+ OpBranch %113
+ %113 = OpLabel
+ %135 = OpIAdd %15 %285 %18
+ OpBranch %110
+ %112 = OpLabel
+ %138 = OpLoad %64 %66
+ %139 = OpExtInst %64 %1 FAbs %138
+ %140 = OpExtInst %64 %1 Normalize %139
+ %141 = OpCompositeExtract %6 %140 0
+ %142 = OpCompositeExtract %6 %140 1
+ %143 = OpCompositeExtract %6 %140 2
+ %144 = OpCompositeConstruct %83 %141 %142 %143 %121
+ OpStore %137 %144
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 290
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %85 %137
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %66 "c"
+ OpName %73 "buf0"
+ OpMemberName %73 0 "resolution"
+ OpName %75 ""
+ OpName %85 "gl_FragCoord"
+ OpName %137 "_GLF_color"
+ OpMemberDecorate %73 0 Offset 0
+ OpDecorate %73 Block
+ OpDecorate %75 DescriptorSet 0
+ OpDecorate %75 Binding 0
+ OpDecorate %85 BuiltIn FragCoord
+ OpDecorate %137 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %14 = OpConstant %6 -0.5
+ %15 = OpTypeInt 32 1
+ %18 = OpConstant %15 1
+ %25 = OpConstant %15 800
+ %26 = OpTypeBool
+ %29 = OpConstant %15 32
+ %31 = OpConstant %15 0
+ %35 = OpConstant %6 0.400000006
+ %44 = OpConstant %6 0.00999999978
+ %48 = OpConstant %6 100
+ %64 = OpTypeVector %6 3
+ %65 = OpTypePointer Function %64
+ %67 = OpConstant %6 7
+ %68 = OpConstant %6 8
+ %69 = OpConstant %6 9
+ %70 = OpConstantComposite %64 %67 %68 %69
+ %72 = OpTypeVector %6 2
+ %73 = OpTypeStruct %72
+ %74 = OpTypePointer Uniform %73
+ %75 = OpVariable %74 Uniform
+ %76 = OpTypeInt 32 0
+ %77 = OpConstant %76 0
+ %78 = OpTypePointer Uniform %6
+ %83 = OpTypeVector %6 4
+ %84 = OpTypePointer Input %83
+ %85 = OpVariable %84 Input
+ %87 = OpTypePointer Input %6
+ %95 = OpConstant %76 1
+ %107 = OpConstant %76 2
+ %116 = OpConstant %15 3
+ %121 = OpConstant %6 1
+ %136 = OpTypePointer Output %83
+ %137 = OpVariable %136 Output
+ %149 = OpConstantFalse %26
+ %152 = OpConstantTrue %26
+ %261 = OpUndef %6
+ %289 = OpConstant %6 0.125
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %66 = OpVariable %65 Function
+ OpStore %66 %70
+ %79 = OpAccessChain %78 %75 %31 %77
+ %80 = OpLoad %6 %79
+ %81 = OpFMul %6 %80 %289
+ %82 = OpExtInst %6 %1 Round %81
+ %88 = OpAccessChain %87 %85 %77
+ %89 = OpLoad %6 %88
+ OpSelectionMerge %199 None
+ OpSwitch %77 %161
+ %161 = OpLabel
+ OpBranch %162
+ %162 = OpLabel
+ %248 = OpPhi %6 %14 %161 %251 %192
+ %247 = OpPhi %15 %18 %161 %194 %192
+ %165 = OpSLessThan %26 %247 %25
+ OpLoopMerge %195 %192 None
+ OpBranchConditional %165 %166 %195
+ %166 = OpLabel
+ %168 = OpSMod %15 %247 %29
+ %169 = OpIEqual %26 %168 %31
+ OpSelectionMerge %184 None
+ OpBranchConditional %169 %170 %173
+ %170 = OpLabel
+ %172 = OpFAdd %6 %248 %35
+ OpBranch %184
+ %173 = OpLabel
+ %175 = OpConvertSToF %6 %247
+ %177 = OpExtInst %6 %1 Round %82
+ %178 = OpFMod %6 %175 %177
+ %179 = OpFOrdLessThanEqual %26 %178 %44
+ OpSelectionMerge %183 None
+ OpBranchConditional %179 %180 %183
+ %180 = OpLabel
+ %182 = OpFAdd %6 %248 %48
+ OpBranch %183
+ %183 = OpLabel
+ %252 = OpPhi %6 %248 %173 %182 %180
+ OpBranch %184
+ %184 = OpLabel
+ %251 = OpPhi %6 %172 %170 %252 %183
+ %186 = OpConvertSToF %6 %247
+ %188 = OpFOrdGreaterThanEqual %26 %186 %89
+ OpSelectionMerge %191 None
+ OpBranchConditional %188 %189 %191
+ %189 = OpLabel
+ OpBranch %195
+ %191 = OpLabel
+ OpBranch %192
+ %192 = OpLabel
+ %194 = OpIAdd %15 %247 %18
+ OpBranch %162
+ %195 = OpLabel
+ %259 = OpPhi %6 %261 %162 %251 %189
+ %257 = OpPhi %6 %248 %162 %251 %189
+ %253 = OpPhi %26 %149 %162 %152 %189
+ OpSelectionMerge %197 None
+ OpBranchConditional %253 %199 %197
+ %197 = OpLabel
+ OpBranch %199
+ %199 = OpLabel
+ %258 = OpPhi %6 %259 %195 %257 %197
+ %93 = OpAccessChain %7 %66 %77
+ OpStore %93 %258
+ %96 = OpAccessChain %87 %85 %95
+ %97 = OpLoad %6 %96
+ OpSelectionMerge %245 None
+ OpSwitch %77 %207
+ %207 = OpLabel
+ OpBranch %208
+ %208 = OpLabel
+ %265 = OpPhi %6 %14 %207 %268 %238
+ %264 = OpPhi %15 %18 %207 %240 %238
+ %211 = OpSLessThan %26 %264 %25
+ OpLoopMerge %241 %238 None
+ OpBranchConditional %211 %212 %241
+ %212 = OpLabel
+ %214 = OpSMod %15 %264 %29
+ %215 = OpIEqual %26 %214 %31
+ OpSelectionMerge %230 None
+ OpBranchConditional %215 %216 %219
+ %219 = OpLabel
+ %221 = OpConvertSToF %6 %264
+ %223 = OpExtInst %6 %1 Round %82
+ %224 = OpFMod %6 %221 %223
+ %225 = OpFOrdLessThanEqual %26 %224 %44
+ OpSelectionMerge %229 None
+ OpBranchConditional %225 %226 %229
+ %226 = OpLabel
+ %228 = OpFAdd %6 %265 %48
+ OpBranch %229
+ %229 = OpLabel
+ %269 = OpPhi %6 %265 %219 %228 %226
+ OpBranch %230
+ %230 = OpLabel
+ %268 = OpPhi %6 %218 %216 %269 %229
+ %232 = OpConvertSToF %6 %264
+ %234 = OpFOrdGreaterThanEqual %26 %232 %97
+ OpSelectionMerge %237 None
+ OpBranchConditional %234 %235 %237
+ %235 = OpLabel
+ OpBranch %241
+ %241 = OpLabel
+ %276 = OpPhi %6 %261 %208 %268 %235
+ %274 = OpPhi %6 %265 %208 %268 %235
+ %270 = OpPhi %26 %149 %208 %152 %235
+ OpSelectionMerge %243 None
+ OpBranchConditional %270 %245 %243
+ %216 = OpLabel
+ %218 = OpFAdd %6 %265 %35
+ OpBranch %230
+ %237 = OpLabel
+ OpBranch %238
+ %238 = OpLabel
+ %240 = OpIAdd %15 %264 %18
+ OpBranch %208
+ %243 = OpLabel
+ OpBranch %245
+ %245 = OpLabel
+ %275 = OpPhi %6 %276 %241 %274 %243
+ %101 = OpAccessChain %7 %66 %95
+ OpStore %101 %275
+ %103 = OpLoad %6 %93
+ %105 = OpLoad %6 %101
+ %106 = OpFAdd %6 %103 %105
+ %108 = OpAccessChain %7 %66 %107
+ OpStore %108 %106
+ OpBranch %110
+ %110 = OpLabel
+ %285 = OpPhi %15 %31 %245 %135 %113
+ %117 = OpSLessThan %26 %285 %116
+ OpLoopMerge %112 %113 None
+ OpBranchConditional %117 %111 %112
+ %111 = OpLabel
+ %119 = OpAccessChain %7 %66 %285
+ %120 = OpLoad %6 %119
+ %122 = OpFOrdGreaterThanEqual %26 %120 %121
+ OpSelectionMerge %124 None
+ OpBranchConditional %122 %123 %124
+ %123 = OpLabel
+ %128 = OpLoad %6 %119
+ %131 = OpLoad %6 %119
+ %132 = OpFMul %6 %128 %131
+ OpStore %119 %132
+ OpBranch %124
+ %124 = OpLabel
+ OpBranch %113
+ %113 = OpLabel
+ %135 = OpIAdd %15 %285 %18
+ OpBranch %110
+ %112 = OpLabel
+ %138 = OpLoad %64 %66
+ %139 = OpExtInst %64 %1 FAbs %138
+ %140 = OpExtInst %64 %1 Normalize %139
+ %141 = OpCompositeExtract %6 %140 0
+ %142 = OpCompositeExtract %6 %140 1
+ %143 = OpCompositeExtract %6 %140 2
+ %144 = OpCompositeConstruct %83 %141 %142 %143 %121
+ OpStore %137 %144
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-maze-flatten-copy-composite.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-maze-flatten-copy-composite.amber
new file mode 100644
index 0000000..eadf828
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-maze-flatten-copy-composite.amber
@@ -0,0 +1,2011 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Three shaders with diff: conditional %270 is flattened
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 442
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %435
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %9 "pos"
+ OpName %12 "gl_FragCoord"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "resolution"
+ OpName %17 ""
+ OpName %26 "ipos"
+ OpName %42 "i"
+ OpName %55 "map"
+ OpName %62 "p"
+ OpName %65 "canwalk"
+ OpName %67 "v"
+ OpName %74 "directions"
+ OpName %171 "j"
+ OpName %208 "d"
+ OpName %435 "_GLF_color"
+ OpDecorate %12 BuiltIn FragCoord
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %435 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeVector %6 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %15 = OpTypeStruct %7
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpTypeInt 32 1
+ %19 = OpConstant %18 0
+ %20 = OpTypePointer Uniform %7
+ %24 = OpTypeVector %18 2
+ %25 = OpTypePointer Function %24
+ %27 = OpTypeInt 32 0
+ %28 = OpConstant %27 0
+ %29 = OpTypePointer Function %6
+ %32 = OpConstant %6 16
+ %35 = OpConstant %27 1
+ %41 = OpTypePointer Function %18
+ %49 = OpConstant %18 256
+ %50 = OpTypeBool
+ %52 = OpConstant %27 256
+ %53 = OpTypeArray %18 %52
+ %54 = OpTypePointer Private %53
+ %55 = OpVariable %54 Private
+ %57 = OpTypePointer Private %18
+ %60 = OpConstant %18 1
+ %63 = OpConstantComposite %24 %19 %19
+ %64 = OpTypePointer Function %50
+ %66 = OpConstantTrue %50
+ %82 = OpConstant %18 2
+ %86 = OpConstant %18 16
+ %119 = OpConstant %18 14
+ %162 = OpConstantFalse %50
+ %169 = OpConstant %18 8
+ %434 = OpTypePointer Output %10
+ %435 = OpVariable %434 Output
+ %436 = OpConstant %6 1
+ %437 = OpConstantComposite %10 %436 %436 %436 %436
+ %440 = OpConstant %6 0
+ %441 = OpConstantComposite %10 %440 %440 %440 %436
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %26 = OpVariable %25 Function
+ %42 = OpVariable %41 Function
+ %62 = OpVariable %25 Function
+ %65 = OpVariable %64 Function
+ %67 = OpVariable %41 Function
+ %74 = OpVariable %41 Function
+ %171 = OpVariable %41 Function
+ %208 = OpVariable %41 Function
+ %13 = OpLoad %10 %12
+ %14 = OpVectorShuffle %7 %13 %13 0 1
+ %21 = OpAccessChain %20 %17 %19
+ %22 = OpLoad %7 %21
+ %23 = OpFDiv %7 %14 %22
+ OpStore %9 %23
+ %30 = OpAccessChain %29 %9 %28
+ %31 = OpLoad %6 %30
+ %33 = OpFMul %6 %31 %32
+ %34 = OpConvertFToS %18 %33
+ %36 = OpAccessChain %29 %9 %35
+ %37 = OpLoad %6 %36
+ %38 = OpFMul %6 %37 %32
+ %39 = OpConvertFToS %18 %38
+ %40 = OpCompositeConstruct %24 %34 %39
+ OpStore %26 %40
+ OpStore %42 %19
+ OpBranch %43
+ %43 = OpLabel
+ OpLoopMerge %45 %46 None
+ OpBranch %47
+ %47 = OpLabel
+ %48 = OpLoad %18 %42
+ %51 = OpSLessThan %50 %48 %49
+ OpBranchConditional %51 %44 %45
+ %44 = OpLabel
+ %56 = OpLoad %18 %42
+ %58 = OpAccessChain %57 %55 %56
+ OpStore %58 %19
+ OpBranch %46
+ %46 = OpLabel
+ %59 = OpLoad %18 %42
+ %61 = OpIAdd %18 %59 %60
+ OpStore %42 %61
+ OpBranch %43
+ %45 = OpLabel
+ OpStore %62 %63
+ OpStore %65 %66
+ OpStore %67 %19
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %69
+ %69 = OpLabel
+ %72 = OpLoad %18 %67
+ %73 = OpIAdd %18 %72 %60
+ OpStore %67 %73
+ OpStore %74 %19
+ %75 = OpAccessChain %41 %62 %28
+ %76 = OpLoad %18 %75
+ %77 = OpSGreaterThan %50 %76 %19
+ OpSelectionMerge %79 None
+ OpBranchConditional %77 %78 %79
+ %78 = OpLabel
+ %80 = OpAccessChain %41 %62 %28
+ %81 = OpLoad %18 %80
+ %83 = OpISub %18 %81 %82
+ %84 = OpAccessChain %41 %62 %35
+ %85 = OpLoad %18 %84
+ %87 = OpIMul %18 %85 %86
+ %88 = OpIAdd %18 %83 %87
+ %89 = OpAccessChain %57 %55 %88
+ %90 = OpLoad %18 %89
+ %91 = OpIEqual %50 %90 %19
+ OpBranch %79
+ %79 = OpLabel
+ %92 = OpPhi %50 %77 %69 %91 %78
+ OpSelectionMerge %94 None
+ OpBranchConditional %92 %93 %94
+ %93 = OpLabel
+ %95 = OpLoad %18 %74
+ %96 = OpIAdd %18 %95 %60
+ OpStore %74 %96
+ OpBranch %94
+ %94 = OpLabel
+ %97 = OpAccessChain %41 %62 %35
+ %98 = OpLoad %18 %97
+ %99 = OpSGreaterThan %50 %98 %19
+ OpSelectionMerge %101 None
+ OpBranchConditional %99 %100 %101
+ %100 = OpLabel
+ %102 = OpAccessChain %41 %62 %28
+ %103 = OpLoad %18 %102
+ %104 = OpAccessChain %41 %62 %35
+ %105 = OpLoad %18 %104
+ %106 = OpISub %18 %105 %82
+ %107 = OpIMul %18 %106 %86
+ %108 = OpIAdd %18 %103 %107
+ %109 = OpAccessChain %57 %55 %108
+ %110 = OpLoad %18 %109
+ %111 = OpIEqual %50 %110 %19
+ OpBranch %101
+ %101 = OpLabel
+ %112 = OpPhi %50 %99 %94 %111 %100
+ OpSelectionMerge %114 None
+ OpBranchConditional %112 %113 %114
+ %113 = OpLabel
+ %115 = OpLoad %18 %74
+ %116 = OpIAdd %18 %115 %60
+ OpStore %74 %116
+ OpBranch %114
+ %114 = OpLabel
+ %117 = OpAccessChain %41 %62 %28
+ %118 = OpLoad %18 %117
+ %120 = OpSLessThan %50 %118 %119
+ OpSelectionMerge %122 None
+ OpBranchConditional %120 %121 %122
+ %121 = OpLabel
+ %123 = OpAccessChain %41 %62 %28
+ %124 = OpLoad %18 %123
+ %125 = OpIAdd %18 %124 %82
+ %126 = OpAccessChain %41 %62 %35
+ %127 = OpLoad %18 %126
+ %128 = OpIMul %18 %127 %86
+ %129 = OpIAdd %18 %125 %128
+ %130 = OpAccessChain %57 %55 %129
+ %131 = OpLoad %18 %130
+ %132 = OpIEqual %50 %131 %19
+ OpBranch %122
+ %122 = OpLabel
+ %133 = OpPhi %50 %120 %114 %132 %121
+ OpSelectionMerge %135 None
+ OpBranchConditional %133 %134 %135
+ %134 = OpLabel
+ %136 = OpLoad %18 %74
+ %137 = OpIAdd %18 %136 %60
+ OpStore %74 %137
+ OpBranch %135
+ %135 = OpLabel
+ %138 = OpAccessChain %41 %62 %35
+ %139 = OpLoad %18 %138
+ %140 = OpSLessThan %50 %139 %119
+ OpSelectionMerge %142 None
+ OpBranchConditional %140 %141 %142
+ %141 = OpLabel
+ %143 = OpAccessChain %41 %62 %28
+ %144 = OpLoad %18 %143
+ %145 = OpAccessChain %41 %62 %35
+ %146 = OpLoad %18 %145
+ %147 = OpIAdd %18 %146 %82
+ %148 = OpIMul %18 %147 %86
+ %149 = OpIAdd %18 %144 %148
+ %150 = OpAccessChain %57 %55 %149
+ %151 = OpLoad %18 %150
+ %152 = OpIEqual %50 %151 %19
+ OpBranch %142
+ %142 = OpLabel
+ %153 = OpPhi %50 %140 %135 %152 %141
+ OpSelectionMerge %155 None
+ OpBranchConditional %153 %154 %155
+ %154 = OpLabel
+ %156 = OpLoad %18 %74
+ %157 = OpIAdd %18 %156 %60
+ OpStore %74 %157
+ OpBranch %155
+ %155 = OpLabel
+ %158 = OpLoad %18 %74
+ %159 = OpIEqual %50 %158 %19
+ OpSelectionMerge %161 None
+ OpBranchConditional %159 %160 %207
+ %160 = OpLabel
+ OpStore %65 %162
+ OpStore %42 %19
+ OpBranch %163
+ %163 = OpLabel
+ OpLoopMerge %165 %166 None
+ OpBranch %167
+ %167 = OpLabel
+ %168 = OpLoad %18 %42
+ %170 = OpSLessThan %50 %168 %169
+ OpBranchConditional %170 %164 %165
+ %164 = OpLabel
+ OpStore %171 %19
+ OpBranch %172
+ %172 = OpLabel
+ OpLoopMerge %174 %175 None
+ OpBranch %176
+ %176 = OpLabel
+ %177 = OpLoad %18 %171
+ %178 = OpSLessThan %50 %177 %169
+ OpBranchConditional %178 %173 %174
+ %173 = OpLabel
+ %179 = OpLoad %18 %171
+ %180 = OpIMul %18 %179 %82
+ %181 = OpLoad %18 %42
+ %182 = OpIMul %18 %181 %82
+ %183 = OpIMul %18 %182 %86
+ %184 = OpIAdd %18 %180 %183
+ %185 = OpAccessChain %57 %55 %184
+ %186 = OpLoad %18 %185
+ %187 = OpIEqual %50 %186 %19
+ OpSelectionMerge %189 None
+ OpBranchConditional %187 %188 %189
+ %188 = OpLabel
+ %190 = OpLoad %18 %171
+ %191 = OpIMul %18 %190 %82
+ %192 = OpAccessChain %41 %62 %28
+ OpStore %192 %191
+ %193 = OpLoad %18 %42
+ %194 = OpIMul %18 %193 %82
+ %195 = OpAccessChain %41 %62 %35
+ OpStore %195 %194
+ OpStore %65 %66
+ OpBranch %189
+ %189 = OpLabel
+ OpBranch %175
+ %175 = OpLabel
+ %196 = OpLoad %18 %171
+ %197 = OpIAdd %18 %196 %60
+ OpStore %171 %197
+ OpBranch %172
+ %174 = OpLabel
+ OpBranch %166
+ %166 = OpLabel
+ %198 = OpLoad %18 %42
+ %199 = OpIAdd %18 %198 %60
+ OpStore %42 %199
+ OpBranch %163
+ %165 = OpLabel
+ %200 = OpAccessChain %41 %62 %28
+ %201 = OpLoad %18 %200
+ %202 = OpAccessChain %41 %62 %35
+ %203 = OpLoad %18 %202
+ %204 = OpIMul %18 %203 %86
+ %205 = OpIAdd %18 %201 %204
+ %206 = OpAccessChain %57 %55 %205
+ OpStore %206 %60
+ OpBranch %161
+ %207 = OpLabel
+ %209 = OpLoad %18 %67
+ %210 = OpLoad %18 %74
+ %211 = OpSMod %18 %209 %210
+ OpStore %208 %211
+ %212 = OpLoad %18 %74
+ %213 = OpLoad %18 %67
+ %214 = OpIAdd %18 %213 %212
+ OpStore %67 %214
+ %215 = OpLoad %18 %208
+ %216 = OpSGreaterThanEqual %50 %215 %19
+ OpSelectionMerge %218 None
+ OpBranchConditional %216 %217 %218
+ %217 = OpLabel
+ %219 = OpAccessChain %41 %62 %28
+ %220 = OpLoad %18 %219
+ %221 = OpSGreaterThan %50 %220 %19
+ OpBranch %218
+ %218 = OpLabel
+ %222 = OpPhi %50 %216 %207 %221 %217
+ OpSelectionMerge %224 None
+ OpBranchConditional %222 %223 %224
+ %223 = OpLabel
+ %225 = OpAccessChain %41 %62 %28
+ %226 = OpLoad %18 %225
+ %227 = OpISub %18 %226 %82
+ %228 = OpAccessChain %41 %62 %35
+ %229 = OpLoad %18 %228
+ %230 = OpIMul %18 %229 %86
+ %231 = OpIAdd %18 %227 %230
+ %232 = OpAccessChain %57 %55 %231
+ %233 = OpLoad %18 %232
+ %234 = OpIEqual %50 %233 %19
+ OpBranch %224
+ %224 = OpLabel
+ %235 = OpPhi %50 %222 %218 %234 %223
+ OpSelectionMerge %237 None
+ OpBranchConditional %235 %236 %237
+ %236 = OpLabel
+ %238 = OpLoad %18 %208
+ %239 = OpISub %18 %238 %60
+ OpStore %208 %239
+ %240 = OpAccessChain %41 %62 %28
+ %241 = OpLoad %18 %240
+ %242 = OpAccessChain %41 %62 %35
+ %243 = OpLoad %18 %242
+ %244 = OpIMul %18 %243 %86
+ %245 = OpIAdd %18 %241 %244
+ %246 = OpAccessChain %57 %55 %245
+ OpStore %246 %60
+ %247 = OpAccessChain %41 %62 %28
+ %248 = OpLoad %18 %247
+ %249 = OpISub %18 %248 %60
+ %250 = OpAccessChain %41 %62 %35
+ %251 = OpLoad %18 %250
+ %252 = OpIMul %18 %251 %86
+ %253 = OpIAdd %18 %249 %252
+ %254 = OpAccessChain %57 %55 %253
+ OpStore %254 %60
+ %255 = OpAccessChain %41 %62 %28
+ %256 = OpLoad %18 %255
+ %257 = OpISub %18 %256 %82
+ %258 = OpAccessChain %41 %62 %35
+ %259 = OpLoad %18 %258
+ %260 = OpIMul %18 %259 %86
+ %261 = OpIAdd %18 %257 %260
+ %262 = OpAccessChain %57 %55 %261
+ OpStore %262 %60
+ %263 = OpAccessChain %41 %62 %28
+ %264 = OpLoad %18 %263
+ %265 = OpISub %18 %264 %82
+ %266 = OpAccessChain %41 %62 %28
+ OpStore %266 %265
+ OpBranch %237
+ %237 = OpLabel
+ %267 = OpLoad %18 %208
+ %268 = OpSGreaterThanEqual %50 %267 %19
+ OpSelectionMerge %270 None
+ OpBranchConditional %268 %269 %270
+ %269 = OpLabel
+ %271 = OpAccessChain %41 %62 %35
+ %272 = OpLoad %18 %271
+ %273 = OpSGreaterThan %50 %272 %19
+ OpBranch %270
+ %270 = OpLabel
+ %274 = OpPhi %50 %268 %237 %273 %269
+ OpSelectionMerge %276 None
+ OpBranchConditional %274 %275 %276
+ %275 = OpLabel
+ %277 = OpAccessChain %41 %62 %28
+ %278 = OpLoad %18 %277
+ %279 = OpAccessChain %41 %62 %35
+ %280 = OpLoad %18 %279
+ %281 = OpISub %18 %280 %82
+ %282 = OpIMul %18 %281 %86
+ %283 = OpIAdd %18 %278 %282
+ %284 = OpAccessChain %57 %55 %283
+ %285 = OpLoad %18 %284
+ %286 = OpIEqual %50 %285 %19
+ OpBranch %276
+ %276 = OpLabel
+ %287 = OpPhi %50 %274 %270 %286 %275
+ OpSelectionMerge %289 None
+ OpBranchConditional %287 %288 %289
+ %288 = OpLabel
+ %290 = OpLoad %18 %208
+ %291 = OpISub %18 %290 %60
+ OpStore %208 %291
+ %292 = OpAccessChain %41 %62 %28
+ %293 = OpLoad %18 %292
+ %294 = OpAccessChain %41 %62 %35
+ %295 = OpLoad %18 %294
+ %296 = OpIMul %18 %295 %86
+ %297 = OpIAdd %18 %293 %296
+ %298 = OpAccessChain %57 %55 %297
+ OpStore %298 %60
+ %299 = OpAccessChain %41 %62 %28
+ %300 = OpLoad %18 %299
+ %301 = OpAccessChain %41 %62 %35
+ %302 = OpLoad %18 %301
+ %303 = OpISub %18 %302 %60
+ %304 = OpIMul %18 %303 %86
+ %305 = OpIAdd %18 %300 %304
+ %306 = OpAccessChain %57 %55 %305
+ OpStore %306 %60
+ %307 = OpAccessChain %41 %62 %28
+ %308 = OpLoad %18 %307
+ %309 = OpAccessChain %41 %62 %35
+ %310 = OpLoad %18 %309
+ %311 = OpISub %18 %310 %82
+ %312 = OpIMul %18 %311 %86
+ %313 = OpIAdd %18 %308 %312
+ %314 = OpAccessChain %57 %55 %313
+ OpStore %314 %60
+ %315 = OpAccessChain %41 %62 %35
+ %316 = OpLoad %18 %315
+ %317 = OpISub %18 %316 %82
+ %318 = OpAccessChain %41 %62 %35
+ OpStore %318 %317
+ OpBranch %289
+ %289 = OpLabel
+ %319 = OpLoad %18 %208
+ %320 = OpSGreaterThanEqual %50 %319 %19
+ OpSelectionMerge %322 None
+ OpBranchConditional %320 %321 %322
+ %321 = OpLabel
+ %323 = OpAccessChain %41 %62 %28
+ %324 = OpLoad %18 %323
+ %325 = OpSLessThan %50 %324 %119
+ OpBranch %322
+ %322 = OpLabel
+ %326 = OpPhi %50 %320 %289 %325 %321
+ OpSelectionMerge %328 None
+ OpBranchConditional %326 %327 %328
+ %327 = OpLabel
+ %329 = OpAccessChain %41 %62 %28
+ %330 = OpLoad %18 %329
+ %331 = OpIAdd %18 %330 %82
+ %332 = OpAccessChain %41 %62 %35
+ %333 = OpLoad %18 %332
+ %334 = OpIMul %18 %333 %86
+ %335 = OpIAdd %18 %331 %334
+ %336 = OpAccessChain %57 %55 %335
+ %337 = OpLoad %18 %336
+ %338 = OpIEqual %50 %337 %19
+ OpBranch %328
+ %328 = OpLabel
+ %339 = OpPhi %50 %326 %322 %338 %327
+ OpSelectionMerge %341 None
+ OpBranchConditional %339 %340 %341
+ %340 = OpLabel
+ %342 = OpLoad %18 %208
+ %343 = OpISub %18 %342 %60
+ OpStore %208 %343
+ %344 = OpAccessChain %41 %62 %28
+ %345 = OpLoad %18 %344
+ %346 = OpAccessChain %41 %62 %35
+ %347 = OpLoad %18 %346
+ %348 = OpIMul %18 %347 %86
+ %349 = OpIAdd %18 %345 %348
+ %350 = OpAccessChain %57 %55 %349
+ OpStore %350 %60
+ %351 = OpAccessChain %41 %62 %28
+ %352 = OpLoad %18 %351
+ %353 = OpIAdd %18 %352 %60
+ %354 = OpAccessChain %41 %62 %35
+ %355 = OpLoad %18 %354
+ %356 = OpIMul %18 %355 %86
+ %357 = OpIAdd %18 %353 %356
+ %358 = OpAccessChain %57 %55 %357
+ OpStore %358 %60
+ %359 = OpAccessChain %41 %62 %28
+ %360 = OpLoad %18 %359
+ %361 = OpIAdd %18 %360 %82
+ %362 = OpAccessChain %41 %62 %35
+ %363 = OpLoad %18 %362
+ %364 = OpIMul %18 %363 %86
+ %365 = OpIAdd %18 %361 %364
+ %366 = OpAccessChain %57 %55 %365
+ OpStore %366 %60
+ %367 = OpAccessChain %41 %62 %28
+ %368 = OpLoad %18 %367
+ %369 = OpIAdd %18 %368 %82
+ %370 = OpAccessChain %41 %62 %28
+ OpStore %370 %369
+ OpBranch %341
+ %341 = OpLabel
+ %371 = OpLoad %18 %208
+ %372 = OpSGreaterThanEqual %50 %371 %19
+ OpSelectionMerge %374 None
+ OpBranchConditional %372 %373 %374
+ %373 = OpLabel
+ %375 = OpAccessChain %41 %62 %35
+ %376 = OpLoad %18 %375
+ %377 = OpSLessThan %50 %376 %119
+ OpBranch %374
+ %374 = OpLabel
+ %378 = OpPhi %50 %372 %341 %377 %373
+ OpSelectionMerge %380 None
+ OpBranchConditional %378 %379 %380
+ %379 = OpLabel
+ %381 = OpAccessChain %41 %62 %28
+ %382 = OpLoad %18 %381
+ %383 = OpAccessChain %41 %62 %35
+ %384 = OpLoad %18 %383
+ %385 = OpIAdd %18 %384 %82
+ %386 = OpIMul %18 %385 %86
+ %387 = OpIAdd %18 %382 %386
+ %388 = OpAccessChain %57 %55 %387
+ %389 = OpLoad %18 %388
+ %390 = OpIEqual %50 %389 %19
+ OpBranch %380
+ %380 = OpLabel
+ %391 = OpPhi %50 %378 %374 %390 %379
+ OpSelectionMerge %393 None
+ OpBranchConditional %391 %392 %393
+ %392 = OpLabel
+ %394 = OpLoad %18 %208
+ %395 = OpISub %18 %394 %60
+ OpStore %208 %395
+ %396 = OpAccessChain %41 %62 %28
+ %397 = OpLoad %18 %396
+ %398 = OpAccessChain %41 %62 %35
+ %399 = OpLoad %18 %398
+ %400 = OpIMul %18 %399 %86
+ %401 = OpIAdd %18 %397 %400
+ %402 = OpAccessChain %57 %55 %401
+ OpStore %402 %60
+ %403 = OpAccessChain %41 %62 %28
+ %404 = OpLoad %18 %403
+ %405 = OpAccessChain %41 %62 %35
+ %406 = OpLoad %18 %405
+ %407 = OpIAdd %18 %406 %60
+ %408 = OpIMul %18 %407 %86
+ %409 = OpIAdd %18 %404 %408
+ %410 = OpAccessChain %57 %55 %409
+ OpStore %410 %60
+ %411 = OpAccessChain %41 %62 %28
+ %412 = OpLoad %18 %411
+ %413 = OpAccessChain %41 %62 %35
+ %414 = OpLoad %18 %413
+ %415 = OpIAdd %18 %414 %82
+ %416 = OpIMul %18 %415 %86
+ %417 = OpIAdd %18 %412 %416
+ %418 = OpAccessChain %57 %55 %417
+ OpStore %418 %60
+ %419 = OpAccessChain %41 %62 %35
+ %420 = OpLoad %18 %419
+ %421 = OpIAdd %18 %420 %82
+ %422 = OpAccessChain %41 %62 %35
+ OpStore %422 %421
+ OpBranch %393
+ %393 = OpLabel
+ OpBranch %161
+ %161 = OpLabel
+ %423 = OpAccessChain %41 %26 %35
+ %424 = OpLoad %18 %423
+ %425 = OpIMul %18 %424 %86
+ %426 = OpAccessChain %41 %26 %28
+ %427 = OpLoad %18 %426
+ %428 = OpIAdd %18 %425 %427
+ %429 = OpAccessChain %57 %55 %428
+ %430 = OpLoad %18 %429
+ %431 = OpIEqual %50 %430 %60
+ OpSelectionMerge %433 None
+ OpBranchConditional %431 %432 %433
+ %432 = OpLabel
+ OpStore %435 %437
+ OpReturn
+ %433 = OpLabel
+ OpBranch %71
+ %71 = OpLabel
+ %439 = OpLoad %50 %65
+ OpBranchConditional %439 %68 %70
+ %70 = OpLabel
+ OpStore %435 %441
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 1443
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %435
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %9 "pos"
+ OpName %12 "gl_FragCoord"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "resolution"
+ OpName %17 ""
+ OpName %26 "ipos"
+ OpName %42 "i"
+ OpName %55 "map"
+ OpName %62 "p"
+ OpName %65 "canwalk"
+ OpName %67 "v"
+ OpName %74 "directions"
+ OpName %171 "j"
+ OpName %208 "d"
+ OpName %435 "_GLF_color"
+ OpDecorate %12 BuiltIn FragCoord
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %435 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeVector %6 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %15 = OpTypeStruct %7
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpTypeInt 32 1
+ %19 = OpConstant %18 0
+ %20 = OpTypePointer Uniform %7
+ %24 = OpTypeVector %18 2
+ %25 = OpTypePointer Function %24
+ %27 = OpTypeInt 32 0
+ %28 = OpConstant %27 0
+ %29 = OpTypePointer Function %6
+ %32 = OpConstant %6 16
+ %35 = OpConstant %27 1
+ %41 = OpTypePointer Function %18
+ %49 = OpConstant %18 256
+ %50 = OpTypeBool
+ %52 = OpConstant %27 256
+ %53 = OpTypeArray %18 %52
+ %54 = OpTypePointer Private %53
+ %55 = OpVariable %54 Private
+ %57 = OpTypePointer Private %18
+ %60 = OpConstant %18 1
+ %63 = OpConstantComposite %24 %19 %19
+ %64 = OpTypePointer Function %50
+ %66 = OpConstantTrue %50
+ %82 = OpConstant %18 2
+ %86 = OpConstant %18 16
+ %119 = OpConstant %18 14
+ %162 = OpConstantFalse %50
+ %169 = OpConstant %18 8
+ %434 = OpTypePointer Output %10
+ %435 = OpVariable %434 Output
+ %436 = OpConstant %6 1
+ %437 = OpConstantComposite %10 %436 %436 %436 %436
+ %440 = OpConstant %6 0
+ %441 = OpConstantComposite %10 %440 %440 %440 %436
+ %542 = OpConstant %18 0
+ %566 = OpConstantComposite %53 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %26 = OpVariable %25 Function
+ %42 = OpVariable %41 Function
+ %62 = OpVariable %25 Function
+ %65 = OpVariable %64 Function
+ %67 = OpVariable %41 Function
+ %74 = OpVariable %41 Function
+ %171 = OpVariable %41 Function
+ %208 = OpVariable %41 Function
+ %13 = OpLoad %10 %12
+ %14 = OpVectorShuffle %7 %13 %13 0 1
+ %21 = OpAccessChain %20 %17 %19
+ %22 = OpLoad %7 %21
+ %23 = OpFDiv %7 %14 %22
+ OpStore %9 %23
+ %30 = OpAccessChain %29 %9 %28
+ %31 = OpLoad %6 %30
+ %33 = OpFMul %6 %31 %32
+ %34 = OpConvertFToS %18 %33
+ %36 = OpAccessChain %29 %9 %35
+ %37 = OpLoad %6 %36
+ %38 = OpFMul %6 %37 %32
+ %39 = OpConvertFToS %18 %38
+ %40 = OpCompositeConstruct %24 %34 %39
+ OpStore %26 %40
+ OpStore %42 %19
+ OpBranch %43
+ %43 = OpLabel
+ OpLoopMerge %45 %46 None
+ OpBranch %47
+ %47 = OpLabel
+ %48 = OpLoad %18 %42
+ %51 = OpSLessThan %50 %48 %49
+ OpBranchConditional %51 %44 %45
+ %44 = OpLabel
+ %56 = OpLoad %18 %42
+ %58 = OpAccessChain %57 %55 %56
+ OpStore %58 %19
+ OpBranch %46
+ %46 = OpLabel
+ %59 = OpLoad %18 %42
+ %61 = OpIAdd %18 %59 %60
+ OpStore %42 %61
+ OpBranch %43
+ %45 = OpLabel
+ OpStore %62 %63
+ OpStore %65 %66
+ OpStore %67 %19
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %69
+ %69 = OpLabel
+ %72 = OpLoad %18 %67
+ %73 = OpIAdd %18 %72 %60
+ OpStore %67 %73
+ OpStore %74 %19
+ %75 = OpAccessChain %41 %62 %28
+ %76 = OpLoad %18 %75
+ %77 = OpSGreaterThan %50 %76 %19
+ OpSelectionMerge %79 None
+ OpBranchConditional %77 %78 %79
+ %78 = OpLabel
+ %80 = OpAccessChain %41 %62 %28
+ %81 = OpLoad %18 %80
+ %83 = OpISub %18 %81 %82
+ %84 = OpAccessChain %41 %62 %35
+ %85 = OpLoad %18 %84
+ %87 = OpIMul %18 %85 %86
+ %88 = OpIAdd %18 %83 %87
+ %89 = OpAccessChain %57 %55 %88
+ %90 = OpLoad %18 %89
+ %91 = OpIEqual %50 %90 %19
+ OpBranch %79
+ %79 = OpLabel
+ %92 = OpPhi %50 %77 %69 %91 %78
+ OpSelectionMerge %94 None
+ OpBranchConditional %92 %93 %94
+ %93 = OpLabel
+ %95 = OpLoad %18 %74
+ %96 = OpIAdd %18 %95 %60
+ OpStore %74 %96
+ OpBranch %94
+ %94 = OpLabel
+ %97 = OpAccessChain %41 %62 %35
+ %98 = OpLoad %18 %97
+ %99 = OpSGreaterThan %50 %98 %19
+ OpSelectionMerge %101 None
+ OpBranchConditional %99 %100 %101
+ %100 = OpLabel
+ %102 = OpAccessChain %41 %62 %28
+ %103 = OpLoad %18 %102
+ %104 = OpAccessChain %41 %62 %35
+ %105 = OpLoad %18 %104
+ %106 = OpISub %18 %105 %82
+ %107 = OpIMul %18 %106 %86
+ %108 = OpIAdd %18 %103 %107
+ %109 = OpAccessChain %57 %55 %108
+ %110 = OpLoad %18 %109
+ %111 = OpIEqual %50 %110 %19
+ OpBranch %101
+ %101 = OpLabel
+ %112 = OpPhi %50 %99 %94 %111 %100
+ OpSelectionMerge %114 None
+ OpBranchConditional %112 %113 %114
+ %113 = OpLabel
+ %115 = OpLoad %18 %74
+ %116 = OpIAdd %18 %115 %60
+ OpStore %74 %116
+ OpBranch %114
+ %114 = OpLabel
+ %117 = OpAccessChain %41 %62 %28
+ %118 = OpLoad %18 %117
+ %120 = OpSLessThan %50 %118 %119
+ OpSelectionMerge %122 None
+ OpBranchConditional %120 %121 %122
+ %121 = OpLabel
+ %123 = OpAccessChain %41 %62 %28
+ %124 = OpLoad %18 %123
+ %125 = OpIAdd %18 %124 %82
+ %126 = OpAccessChain %41 %62 %35
+ %127 = OpLoad %18 %126
+ %128 = OpIMul %18 %127 %86
+ %129 = OpIAdd %18 %125 %128
+ %130 = OpAccessChain %57 %55 %129
+ %131 = OpLoad %18 %130
+ %132 = OpIEqual %50 %131 %19
+ OpBranch %122
+ %122 = OpLabel
+ %133 = OpPhi %50 %120 %114 %132 %121
+ OpSelectionMerge %135 None
+ OpBranchConditional %133 %134 %135
+ %134 = OpLabel
+ %136 = OpLoad %18 %74
+ %137 = OpIAdd %18 %136 %60
+ OpStore %74 %137
+ OpBranch %135
+ %135 = OpLabel
+ %138 = OpAccessChain %41 %62 %35
+ %139 = OpLoad %18 %138
+ %140 = OpSLessThan %50 %139 %119
+ OpSelectionMerge %142 None
+ OpBranchConditional %140 %141 %142
+ %141 = OpLabel
+ %143 = OpAccessChain %41 %62 %28
+ %144 = OpLoad %18 %143
+ %145 = OpAccessChain %41 %62 %35
+ %146 = OpLoad %18 %145
+ %147 = OpIAdd %18 %146 %82
+ %148 = OpIMul %18 %147 %86
+ %149 = OpIAdd %18 %144 %148
+ %150 = OpAccessChain %57 %55 %149
+ %151 = OpLoad %18 %150
+ %152 = OpIEqual %50 %151 %19
+ OpBranch %142
+ %142 = OpLabel
+ %153 = OpPhi %50 %140 %135 %152 %141
+ OpSelectionMerge %155 None
+ OpBranchConditional %153 %154 %155
+ %154 = OpLabel
+ %156 = OpLoad %18 %74
+ %157 = OpIAdd %18 %156 %60
+ OpStore %74 %157
+ OpBranch %155
+ %155 = OpLabel
+ %158 = OpLoad %18 %74
+ %159 = OpIEqual %50 %158 %19
+ OpSelectionMerge %161 None
+ OpBranchConditional %159 %160 %207
+ %160 = OpLabel
+ OpStore %65 %162
+ OpStore %42 %19
+ OpBranch %163
+ %163 = OpLabel
+ OpLoopMerge %165 %166 None
+ OpBranch %167
+ %167 = OpLabel
+ %168 = OpLoad %18 %42
+ %170 = OpSLessThan %50 %168 %169
+ OpBranchConditional %170 %164 %165
+ %164 = OpLabel
+ OpStore %171 %19
+ OpBranch %172
+ %172 = OpLabel
+ OpLoopMerge %174 %175 None
+ OpBranch %176
+ %176 = OpLabel
+ %177 = OpLoad %18 %171
+ %178 = OpSLessThan %50 %177 %169
+ OpBranchConditional %178 %173 %174
+ %173 = OpLabel
+ %179 = OpLoad %18 %171
+ %180 = OpIMul %18 %179 %82
+ %181 = OpLoad %18 %42
+ %182 = OpIMul %18 %181 %82
+ %183 = OpIMul %18 %182 %86
+ %184 = OpIAdd %18 %180 %183
+ %185 = OpAccessChain %57 %55 %184
+ %186 = OpLoad %18 %185
+ %187 = OpIEqual %50 %186 %19
+ OpSelectionMerge %189 None
+ OpBranchConditional %187 %188 %189
+ %188 = OpLabel
+ %190 = OpLoad %18 %171
+ %191 = OpIMul %18 %190 %82
+ %192 = OpAccessChain %41 %62 %28
+ OpStore %192 %191
+ %193 = OpLoad %18 %42
+ %194 = OpIMul %18 %193 %82
+ %195 = OpAccessChain %41 %62 %35
+ OpStore %195 %194
+ OpStore %65 %66
+ OpBranch %189
+ %189 = OpLabel
+ OpBranch %175
+ %175 = OpLabel
+ %196 = OpLoad %18 %171
+ %197 = OpIAdd %18 %196 %60
+ OpStore %171 %197
+ OpBranch %172
+ %174 = OpLabel
+ OpBranch %166
+ %166 = OpLabel
+ %198 = OpLoad %18 %42
+ %199 = OpIAdd %18 %198 %60
+ OpStore %42 %199
+ OpBranch %163
+ %165 = OpLabel
+ %200 = OpAccessChain %41 %62 %28
+ %201 = OpLoad %18 %200
+ %202 = OpAccessChain %41 %62 %35
+ %203 = OpLoad %18 %202
+ %204 = OpIMul %18 %203 %86
+ %205 = OpIAdd %18 %201 %204
+ %206 = OpAccessChain %57 %55 %205
+ OpStore %206 %60
+ OpBranch %161
+ %207 = OpLabel
+ %209 = OpLoad %18 %67
+ %210 = OpLoad %18 %74
+ %211 = OpSMod %18 %209 %210
+ OpStore %208 %211
+ %212 = OpLoad %18 %74
+ %213 = OpLoad %18 %67
+ %214 = OpIAdd %18 %213 %212
+ OpStore %67 %214
+ %215 = OpLoad %18 %208
+ %216 = OpSGreaterThanEqual %50 %215 %19
+ OpSelectionMerge %218 None
+ OpBranchConditional %216 %217 %218
+ %217 = OpLabel
+ %219 = OpAccessChain %41 %62 %28
+ %220 = OpLoad %18 %219
+ %221 = OpSGreaterThan %50 %220 %19
+ OpBranch %218
+ %218 = OpLabel
+ %222 = OpPhi %50 %216 %207 %221 %217
+ OpSelectionMerge %224 None
+ OpBranchConditional %222 %223 %224
+ %223 = OpLabel
+ %225 = OpAccessChain %41 %62 %28
+ %226 = OpLoad %18 %225
+ %227 = OpISub %18 %226 %82
+ %228 = OpAccessChain %41 %62 %35
+ %229 = OpLoad %18 %228
+ %230 = OpIMul %18 %229 %86
+ %231 = OpIAdd %18 %227 %230
+ %232 = OpAccessChain %57 %55 %231
+ %233 = OpLoad %18 %232
+ %234 = OpIEqual %50 %233 %19
+ OpBranch %224
+ %224 = OpLabel
+ %235 = OpPhi %50 %222 %218 %234 %223
+ OpSelectionMerge %237 None
+ OpBranchConditional %235 %236 %237
+ %236 = OpLabel
+ %238 = OpLoad %18 %208
+ %239 = OpISub %18 %238 %60
+ OpStore %208 %239
+ %240 = OpAccessChain %41 %62 %28
+ %241 = OpLoad %18 %240
+ %242 = OpAccessChain %41 %62 %35
+ %243 = OpLoad %18 %242
+ %244 = OpIMul %18 %243 %86
+ %245 = OpIAdd %18 %241 %244
+ %246 = OpAccessChain %57 %55 %245
+ OpStore %246 %60
+ %247 = OpAccessChain %41 %62 %28
+ %248 = OpLoad %18 %247
+ %249 = OpISub %18 %248 %60
+ %250 = OpAccessChain %41 %62 %35
+ %251 = OpLoad %18 %250
+ %252 = OpIMul %18 %251 %86
+ %253 = OpIAdd %18 %249 %252
+ %254 = OpAccessChain %57 %55 %253
+ OpStore %254 %60
+ %255 = OpAccessChain %41 %62 %28
+ %256 = OpLoad %18 %255
+ %257 = OpISub %18 %256 %82
+ %258 = OpAccessChain %41 %62 %35
+ %259 = OpLoad %18 %258
+ %260 = OpIMul %18 %259 %86
+ %261 = OpIAdd %18 %257 %260
+ %262 = OpAccessChain %57 %55 %261
+ OpStore %262 %60
+ %263 = OpAccessChain %41 %62 %28
+ %264 = OpLoad %18 %263
+ %265 = OpISub %18 %264 %82
+ %266 = OpAccessChain %41 %62 %28
+ OpStore %266 %265
+ OpBranch %237
+ %237 = OpLabel
+ %267 = OpLoad %18 %208
+ %268 = OpSGreaterThanEqual %50 %267 %19
+ OpSelectionMerge %270 None
+ OpBranchConditional %268 %269 %270
+ %269 = OpLabel
+ %271 = OpAccessChain %41 %62 %35
+ %272 = OpLoad %18 %271
+ %273 = OpSGreaterThan %50 %272 %19
+ OpBranch %270
+ %270 = OpLabel
+ %274 = OpPhi %50 %268 %237 %273 %269
+ OpBranch %275
+ %275 = OpLabel
+ %277 = OpAccessChain %41 %62 %28
+ OpSelectionMerge %1419 None
+ OpBranchConditional %274 %1420 %1422
+ %1420 = OpLabel
+ %1421 = OpLoad %18 %277
+ OpBranch %1419
+ %1422 = OpLabel
+ %1423 = OpCopyObject %18 %542
+ OpBranch %1419
+ %1419 = OpLabel
+ %278 = OpPhi %18 %1421 %1420 %1423 %1422
+ %279 = OpAccessChain %41 %62 %35
+ OpSelectionMerge %1424 None
+ OpBranchConditional %274 %1425 %1427
+ %1425 = OpLabel
+ %1426 = OpLoad %18 %279
+ OpBranch %1424
+ %1427 = OpLabel
+ %1428 = OpCopyObject %18 %542
+ OpBranch %1424
+ %1424 = OpLabel
+ %280 = OpPhi %18 %1426 %1425 %1428 %1427
+ %281 = OpISub %18 %280 %82
+ %282 = OpIMul %18 %281 %86
+ OpSelectionMerge %1434 None
+ OpBranchConditional %274 %1435 %1437
+ %1435 = OpLabel
+ %1436 = OpLoad %53 %55
+ OpBranch %1434
+ %1437 = OpLabel
+ %1438 = OpCopyObject %53 %566
+ OpBranch %1434
+ %1434 = OpLabel
+ %773 = OpPhi %53 %1436 %1435 %1438 %1437
+ OpSelectionMerge %1439 None
+ OpBranchConditional %274 %1440 %1439
+ %1440 = OpLabel
+ OpStore %55 %566
+ OpBranch %1439
+ %1439 = OpLabel
+ OpSelectionMerge %1441 None
+ OpBranchConditional %274 %1442 %1441
+ %1442 = OpLabel
+ OpStore %55 %773
+ OpBranch %1441
+ %1441 = OpLabel
+ %283 = OpIAdd %18 %278 %282
+ %284 = OpAccessChain %57 %55 %283
+ OpSelectionMerge %1429 None
+ OpBranchConditional %274 %1430 %1432
+ %1430 = OpLabel
+ %1431 = OpLoad %18 %284
+ OpBranch %1429
+ %1432 = OpLabel
+ %1433 = OpCopyObject %18 %542
+ OpBranch %1429
+ %1429 = OpLabel
+ %285 = OpPhi %18 %1431 %1430 %1433 %1432
+ %286 = OpIEqual %50 %285 %19
+ OpBranch %276
+ %276 = OpLabel
+ %287 = OpSelect %50 %274 %286 %274
+ OpSelectionMerge %289 None
+ OpBranchConditional %287 %288 %289
+ %288 = OpLabel
+ %290 = OpLoad %18 %208
+ %291 = OpISub %18 %290 %60
+ OpStore %208 %291
+ %292 = OpAccessChain %41 %62 %28
+ %293 = OpLoad %18 %292
+ %294 = OpAccessChain %41 %62 %35
+ %295 = OpLoad %18 %294
+ %296 = OpIMul %18 %295 %86
+ %297 = OpIAdd %18 %293 %296
+ %298 = OpAccessChain %57 %55 %297
+ OpStore %298 %60
+ %299 = OpAccessChain %41 %62 %28
+ %300 = OpLoad %18 %299
+ %301 = OpAccessChain %41 %62 %35
+ %302 = OpLoad %18 %301
+ %303 = OpISub %18 %302 %60
+ %304 = OpIMul %18 %303 %86
+ %305 = OpIAdd %18 %300 %304
+ %306 = OpAccessChain %57 %55 %305
+ OpStore %306 %60
+ %307 = OpAccessChain %41 %62 %28
+ %308 = OpLoad %18 %307
+ %309 = OpAccessChain %41 %62 %35
+ %310 = OpLoad %18 %309
+ %311 = OpISub %18 %310 %82
+ %800 = OpLoad %53 %55
+ OpStore %55 %566
+ OpStore %55 %800
+ %312 = OpIMul %18 %311 %86
+ %313 = OpIAdd %18 %308 %312
+ %314 = OpAccessChain %57 %55 %313
+ OpStore %314 %60
+ %315 = OpAccessChain %41 %62 %35
+ %316 = OpLoad %18 %315
+ %317 = OpISub %18 %316 %82
+ %318 = OpAccessChain %41 %62 %35
+ OpStore %318 %317
+ OpBranch %289
+ %289 = OpLabel
+ %319 = OpLoad %18 %208
+ %320 = OpSGreaterThanEqual %50 %319 %19
+ OpSelectionMerge %322 None
+ OpBranchConditional %320 %321 %322
+ %321 = OpLabel
+ %323 = OpAccessChain %41 %62 %28
+ %324 = OpLoad %18 %323
+ %325 = OpSLessThan %50 %324 %119
+ OpBranch %322
+ %322 = OpLabel
+ %326 = OpPhi %50 %320 %289 %325 %321
+ OpSelectionMerge %328 None
+ OpBranchConditional %326 %327 %328
+ %327 = OpLabel
+ %329 = OpAccessChain %41 %62 %28
+ %330 = OpLoad %18 %329
+ %331 = OpIAdd %18 %330 %82
+ %332 = OpAccessChain %41 %62 %35
+ %333 = OpLoad %18 %332
+ %334 = OpIMul %18 %333 %86
+ %335 = OpIAdd %18 %331 %334
+ %336 = OpAccessChain %57 %55 %335
+ %337 = OpLoad %18 %336
+ %338 = OpIEqual %50 %337 %19
+ OpBranch %328
+ %328 = OpLabel
+ %339 = OpPhi %50 %326 %322 %338 %327
+ OpSelectionMerge %341 None
+ OpBranchConditional %339 %340 %341
+ %340 = OpLabel
+ %342 = OpLoad %18 %208
+ %343 = OpISub %18 %342 %60
+ OpStore %208 %343
+ %344 = OpAccessChain %41 %62 %28
+ %345 = OpLoad %18 %344
+ %346 = OpAccessChain %41 %62 %35
+ %347 = OpLoad %18 %346
+ %348 = OpIMul %18 %347 %86
+ %349 = OpIAdd %18 %345 %348
+ %350 = OpAccessChain %57 %55 %349
+ OpStore %350 %60
+ %351 = OpAccessChain %41 %62 %28
+ %352 = OpLoad %18 %351
+ %353 = OpIAdd %18 %352 %60
+ %354 = OpAccessChain %41 %62 %35
+ %355 = OpLoad %18 %354
+ %356 = OpIMul %18 %355 %86
+ %357 = OpIAdd %18 %353 %356
+ %358 = OpAccessChain %57 %55 %357
+ OpStore %358 %60
+ %359 = OpAccessChain %41 %62 %28
+ %360 = OpLoad %18 %359
+ %361 = OpIAdd %18 %360 %82
+ %362 = OpAccessChain %41 %62 %35
+ %363 = OpLoad %18 %362
+ %364 = OpIMul %18 %363 %86
+ %365 = OpIAdd %18 %361 %364
+ %366 = OpAccessChain %57 %55 %365
+ OpStore %366 %60
+ %367 = OpAccessChain %41 %62 %28
+ %368 = OpLoad %18 %367
+ %369 = OpIAdd %18 %368 %82
+ %370 = OpAccessChain %41 %62 %28
+ OpStore %370 %369
+ OpBranch %341
+ %341 = OpLabel
+ %371 = OpLoad %18 %208
+ %372 = OpSGreaterThanEqual %50 %371 %19
+ OpSelectionMerge %374 None
+ OpBranchConditional %372 %373 %374
+ %373 = OpLabel
+ %375 = OpAccessChain %41 %62 %35
+ %376 = OpLoad %18 %375
+ %377 = OpSLessThan %50 %376 %119
+ OpBranch %374
+ %374 = OpLabel
+ %378 = OpPhi %50 %372 %341 %377 %373
+ OpSelectionMerge %380 None
+ OpBranchConditional %378 %379 %380
+ %379 = OpLabel
+ %381 = OpAccessChain %41 %62 %28
+ %382 = OpLoad %18 %381
+ %383 = OpAccessChain %41 %62 %35
+ %384 = OpLoad %18 %383
+ %385 = OpIAdd %18 %384 %82
+ %386 = OpIMul %18 %385 %86
+ %387 = OpIAdd %18 %382 %386
+ %388 = OpAccessChain %57 %55 %387
+ %389 = OpLoad %18 %388
+ %390 = OpIEqual %50 %389 %19
+ OpBranch %380
+ %380 = OpLabel
+ %391 = OpPhi %50 %378 %374 %390 %379
+ OpSelectionMerge %393 None
+ OpBranchConditional %391 %392 %393
+ %392 = OpLabel
+ %394 = OpLoad %18 %208
+ %395 = OpISub %18 %394 %60
+ OpStore %208 %395
+ %396 = OpAccessChain %41 %62 %28
+ %397 = OpLoad %18 %396
+ %398 = OpAccessChain %41 %62 %35
+ %399 = OpLoad %18 %398
+ %400 = OpIMul %18 %399 %86
+ %401 = OpIAdd %18 %397 %400
+ %402 = OpAccessChain %57 %55 %401
+ OpStore %402 %60
+ %403 = OpAccessChain %41 %62 %28
+ %404 = OpLoad %18 %403
+ %405 = OpAccessChain %41 %62 %35
+ %406 = OpLoad %18 %405
+ %407 = OpIAdd %18 %406 %60
+ %408 = OpIMul %18 %407 %86
+ %409 = OpIAdd %18 %404 %408
+ %410 = OpAccessChain %57 %55 %409
+ OpStore %410 %60
+ %411 = OpAccessChain %41 %62 %28
+ %412 = OpLoad %18 %411
+ %413 = OpAccessChain %41 %62 %35
+ %414 = OpLoad %18 %413
+ %415 = OpIAdd %18 %414 %82
+ %416 = OpIMul %18 %415 %86
+ %417 = OpIAdd %18 %412 %416
+ %418 = OpAccessChain %57 %55 %417
+ OpStore %418 %60
+ %419 = OpAccessChain %41 %62 %35
+ %420 = OpLoad %18 %419
+ %421 = OpIAdd %18 %420 %82
+ %422 = OpAccessChain %41 %62 %35
+ OpStore %422 %421
+ OpBranch %393
+ %393 = OpLabel
+ OpBranch %161
+ %161 = OpLabel
+ %423 = OpAccessChain %41 %26 %35
+ %424 = OpLoad %18 %423
+ %425 = OpIMul %18 %424 %86
+ %426 = OpAccessChain %41 %26 %28
+ %427 = OpLoad %18 %426
+ %428 = OpIAdd %18 %425 %427
+ %429 = OpAccessChain %57 %55 %428
+ %430 = OpLoad %18 %429
+ %431 = OpIEqual %50 %430 %60
+ OpSelectionMerge %433 None
+ OpBranchConditional %431 %432 %433
+ %432 = OpLabel
+ OpStore %435 %437
+ OpReturn
+ %433 = OpLabel
+ OpBranch %71
+ %71 = OpLabel
+ %439 = OpLoad %50 %65
+ OpBranchConditional %439 %68 %70
+ %70 = OpLabel
+ OpStore %435 %441
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 801
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %12 %435
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %9 "pos"
+ OpName %12 "gl_FragCoord"
+ OpName %15 "buf0"
+ OpMemberName %15 0 "resolution"
+ OpName %17 ""
+ OpName %26 "ipos"
+ OpName %42 "i"
+ OpName %55 "map"
+ OpName %62 "p"
+ OpName %65 "canwalk"
+ OpName %67 "v"
+ OpName %74 "directions"
+ OpName %171 "j"
+ OpName %208 "d"
+ OpName %435 "_GLF_color"
+ OpDecorate %12 BuiltIn FragCoord
+ OpMemberDecorate %15 0 Offset 0
+ OpDecorate %15 Block
+ OpDecorate %17 DescriptorSet 0
+ OpDecorate %17 Binding 0
+ OpDecorate %435 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpTypeVector %6 4
+ %11 = OpTypePointer Input %10
+ %12 = OpVariable %11 Input
+ %15 = OpTypeStruct %7
+ %16 = OpTypePointer Uniform %15
+ %17 = OpVariable %16 Uniform
+ %18 = OpTypeInt 32 1
+ %19 = OpConstant %18 0
+ %20 = OpTypePointer Uniform %7
+ %24 = OpTypeVector %18 2
+ %25 = OpTypePointer Function %24
+ %27 = OpTypeInt 32 0
+ %28 = OpConstant %27 0
+ %29 = OpTypePointer Function %6
+ %32 = OpConstant %6 16
+ %35 = OpConstant %27 1
+ %41 = OpTypePointer Function %18
+ %49 = OpConstant %18 256
+ %50 = OpTypeBool
+ %52 = OpConstant %27 256
+ %53 = OpTypeArray %18 %52
+ %54 = OpTypePointer Private %53
+ %55 = OpVariable %54 Private
+ %57 = OpTypePointer Private %18
+ %60 = OpConstant %18 1
+ %63 = OpConstantComposite %24 %19 %19
+ %64 = OpTypePointer Function %50
+ %66 = OpConstantTrue %50
+ %82 = OpConstant %18 2
+ %86 = OpConstant %18 16
+ %119 = OpConstant %18 14
+ %162 = OpConstantFalse %50
+ %169 = OpConstant %18 8
+ %434 = OpTypePointer Output %10
+ %435 = OpVariable %434 Output
+ %436 = OpConstant %6 1
+ %437 = OpConstantComposite %10 %436 %436 %436 %436
+ %440 = OpConstant %6 0
+ %441 = OpConstantComposite %10 %440 %440 %440 %436
+ %542 = OpConstant %18 0
+ %566 = OpConstantComposite %53 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542 %542
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ %26 = OpVariable %25 Function
+ %42 = OpVariable %41 Function
+ %62 = OpVariable %25 Function
+ %65 = OpVariable %64 Function
+ %67 = OpVariable %41 Function
+ %74 = OpVariable %41 Function
+ %171 = OpVariable %41 Function
+ %208 = OpVariable %41 Function
+ %13 = OpLoad %10 %12
+ %14 = OpVectorShuffle %7 %13 %13 0 1
+ %21 = OpAccessChain %20 %17 %19
+ %22 = OpLoad %7 %21
+ %23 = OpFDiv %7 %14 %22
+ OpStore %9 %23
+ %30 = OpAccessChain %29 %9 %28
+ %31 = OpLoad %6 %30
+ %33 = OpFMul %6 %31 %32
+ %34 = OpConvertFToS %18 %33
+ %36 = OpAccessChain %29 %9 %35
+ %37 = OpLoad %6 %36
+ %38 = OpFMul %6 %37 %32
+ %39 = OpConvertFToS %18 %38
+ %40 = OpCompositeConstruct %24 %34 %39
+ OpStore %26 %40
+ OpStore %42 %19
+ OpBranch %43
+ %43 = OpLabel
+ OpLoopMerge %45 %46 None
+ OpBranch %47
+ %47 = OpLabel
+ %48 = OpLoad %18 %42
+ %51 = OpSLessThan %50 %48 %49
+ OpBranchConditional %51 %44 %45
+ %44 = OpLabel
+ %56 = OpLoad %18 %42
+ %58 = OpAccessChain %57 %55 %56
+ OpStore %58 %19
+ OpBranch %46
+ %46 = OpLabel
+ %59 = OpLoad %18 %42
+ %61 = OpIAdd %18 %59 %60
+ OpStore %42 %61
+ OpBranch %43
+ %45 = OpLabel
+ OpStore %62 %63
+ OpStore %65 %66
+ OpStore %67 %19
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %69
+ %69 = OpLabel
+ %72 = OpLoad %18 %67
+ %73 = OpIAdd %18 %72 %60
+ OpStore %67 %73
+ OpStore %74 %19
+ %75 = OpAccessChain %41 %62 %28
+ %76 = OpLoad %18 %75
+ %77 = OpSGreaterThan %50 %76 %19
+ OpSelectionMerge %79 None
+ OpBranchConditional %77 %78 %79
+ %78 = OpLabel
+ %80 = OpAccessChain %41 %62 %28
+ %81 = OpLoad %18 %80
+ %83 = OpISub %18 %81 %82
+ %84 = OpAccessChain %41 %62 %35
+ %85 = OpLoad %18 %84
+ %87 = OpIMul %18 %85 %86
+ %88 = OpIAdd %18 %83 %87
+ %89 = OpAccessChain %57 %55 %88
+ %90 = OpLoad %18 %89
+ %91 = OpIEqual %50 %90 %19
+ OpBranch %79
+ %79 = OpLabel
+ %92 = OpPhi %50 %77 %69 %91 %78
+ OpSelectionMerge %94 None
+ OpBranchConditional %92 %93 %94
+ %93 = OpLabel
+ %95 = OpLoad %18 %74
+ %96 = OpIAdd %18 %95 %60
+ OpStore %74 %96
+ OpBranch %94
+ %94 = OpLabel
+ %97 = OpAccessChain %41 %62 %35
+ %98 = OpLoad %18 %97
+ %99 = OpSGreaterThan %50 %98 %19
+ OpSelectionMerge %101 None
+ OpBranchConditional %99 %100 %101
+ %100 = OpLabel
+ %102 = OpAccessChain %41 %62 %28
+ %103 = OpLoad %18 %102
+ %104 = OpAccessChain %41 %62 %35
+ %105 = OpLoad %18 %104
+ %106 = OpISub %18 %105 %82
+ %107 = OpIMul %18 %106 %86
+ %108 = OpIAdd %18 %103 %107
+ %109 = OpAccessChain %57 %55 %108
+ %110 = OpLoad %18 %109
+ %111 = OpIEqual %50 %110 %19
+ OpBranch %101
+ %101 = OpLabel
+ %112 = OpPhi %50 %99 %94 %111 %100
+ OpSelectionMerge %114 None
+ OpBranchConditional %112 %113 %114
+ %113 = OpLabel
+ %115 = OpLoad %18 %74
+ %116 = OpIAdd %18 %115 %60
+ OpStore %74 %116
+ OpBranch %114
+ %114 = OpLabel
+ %117 = OpAccessChain %41 %62 %28
+ %118 = OpLoad %18 %117
+ %120 = OpSLessThan %50 %118 %119
+ OpSelectionMerge %122 None
+ OpBranchConditional %120 %121 %122
+ %121 = OpLabel
+ %123 = OpAccessChain %41 %62 %28
+ %124 = OpLoad %18 %123
+ %125 = OpIAdd %18 %124 %82
+ %126 = OpAccessChain %41 %62 %35
+ %127 = OpLoad %18 %126
+ %128 = OpIMul %18 %127 %86
+ %129 = OpIAdd %18 %125 %128
+ %130 = OpAccessChain %57 %55 %129
+ %131 = OpLoad %18 %130
+ %132 = OpIEqual %50 %131 %19
+ OpBranch %122
+ %122 = OpLabel
+ %133 = OpPhi %50 %120 %114 %132 %121
+ OpSelectionMerge %135 None
+ OpBranchConditional %133 %134 %135
+ %134 = OpLabel
+ %136 = OpLoad %18 %74
+ %137 = OpIAdd %18 %136 %60
+ OpStore %74 %137
+ OpBranch %135
+ %135 = OpLabel
+ %138 = OpAccessChain %41 %62 %35
+ %139 = OpLoad %18 %138
+ %140 = OpSLessThan %50 %139 %119
+ OpSelectionMerge %142 None
+ OpBranchConditional %140 %141 %142
+ %141 = OpLabel
+ %143 = OpAccessChain %41 %62 %28
+ %144 = OpLoad %18 %143
+ %145 = OpAccessChain %41 %62 %35
+ %146 = OpLoad %18 %145
+ %147 = OpIAdd %18 %146 %82
+ %148 = OpIMul %18 %147 %86
+ %149 = OpIAdd %18 %144 %148
+ %150 = OpAccessChain %57 %55 %149
+ %151 = OpLoad %18 %150
+ %152 = OpIEqual %50 %151 %19
+ OpBranch %142
+ %142 = OpLabel
+ %153 = OpPhi %50 %140 %135 %152 %141
+ OpSelectionMerge %155 None
+ OpBranchConditional %153 %154 %155
+ %154 = OpLabel
+ %156 = OpLoad %18 %74
+ %157 = OpIAdd %18 %156 %60
+ OpStore %74 %157
+ OpBranch %155
+ %155 = OpLabel
+ %158 = OpLoad %18 %74
+ %159 = OpIEqual %50 %158 %19
+ OpSelectionMerge %161 None
+ OpBranchConditional %159 %160 %207
+ %160 = OpLabel
+ OpStore %65 %162
+ OpStore %42 %19
+ OpBranch %163
+ %163 = OpLabel
+ OpLoopMerge %165 %166 None
+ OpBranch %167
+ %167 = OpLabel
+ %168 = OpLoad %18 %42
+ %170 = OpSLessThan %50 %168 %169
+ OpBranchConditional %170 %164 %165
+ %164 = OpLabel
+ OpStore %171 %19
+ OpBranch %172
+ %172 = OpLabel
+ OpLoopMerge %174 %175 None
+ OpBranch %176
+ %176 = OpLabel
+ %177 = OpLoad %18 %171
+ %178 = OpSLessThan %50 %177 %169
+ OpBranchConditional %178 %173 %174
+ %173 = OpLabel
+ %179 = OpLoad %18 %171
+ %180 = OpIMul %18 %179 %82
+ %181 = OpLoad %18 %42
+ %182 = OpIMul %18 %181 %82
+ %183 = OpIMul %18 %182 %86
+ %184 = OpIAdd %18 %180 %183
+ %185 = OpAccessChain %57 %55 %184
+ %186 = OpLoad %18 %185
+ %187 = OpIEqual %50 %186 %19
+ OpSelectionMerge %189 None
+ OpBranchConditional %187 %188 %189
+ %188 = OpLabel
+ %190 = OpLoad %18 %171
+ %191 = OpIMul %18 %190 %82
+ %192 = OpAccessChain %41 %62 %28
+ OpStore %192 %191
+ %193 = OpLoad %18 %42
+ %194 = OpIMul %18 %193 %82
+ %195 = OpAccessChain %41 %62 %35
+ OpStore %195 %194
+ OpStore %65 %66
+ OpBranch %189
+ %189 = OpLabel
+ OpBranch %175
+ %175 = OpLabel
+ %196 = OpLoad %18 %171
+ %197 = OpIAdd %18 %196 %60
+ OpStore %171 %197
+ OpBranch %172
+ %174 = OpLabel
+ OpBranch %166
+ %166 = OpLabel
+ %198 = OpLoad %18 %42
+ %199 = OpIAdd %18 %198 %60
+ OpStore %42 %199
+ OpBranch %163
+ %165 = OpLabel
+ %200 = OpAccessChain %41 %62 %28
+ %201 = OpLoad %18 %200
+ %202 = OpAccessChain %41 %62 %35
+ %203 = OpLoad %18 %202
+ %204 = OpIMul %18 %203 %86
+ %205 = OpIAdd %18 %201 %204
+ %206 = OpAccessChain %57 %55 %205
+ OpStore %206 %60
+ OpBranch %161
+ %207 = OpLabel
+ %209 = OpLoad %18 %67
+ %210 = OpLoad %18 %74
+ %211 = OpSMod %18 %209 %210
+ OpStore %208 %211
+ %212 = OpLoad %18 %74
+ %213 = OpLoad %18 %67
+ %214 = OpIAdd %18 %213 %212
+ OpStore %67 %214
+ %215 = OpLoad %18 %208
+ %216 = OpSGreaterThanEqual %50 %215 %19
+ OpSelectionMerge %218 None
+ OpBranchConditional %216 %217 %218
+ %217 = OpLabel
+ %219 = OpAccessChain %41 %62 %28
+ %220 = OpLoad %18 %219
+ %221 = OpSGreaterThan %50 %220 %19
+ OpBranch %218
+ %218 = OpLabel
+ %222 = OpPhi %50 %216 %207 %221 %217
+ OpSelectionMerge %224 None
+ OpBranchConditional %222 %223 %224
+ %223 = OpLabel
+ %225 = OpAccessChain %41 %62 %28
+ %226 = OpLoad %18 %225
+ %227 = OpISub %18 %226 %82
+ %228 = OpAccessChain %41 %62 %35
+ %229 = OpLoad %18 %228
+ %230 = OpIMul %18 %229 %86
+ %231 = OpIAdd %18 %227 %230
+ %232 = OpAccessChain %57 %55 %231
+ %233 = OpLoad %18 %232
+ %234 = OpIEqual %50 %233 %19
+ OpBranch %224
+ %224 = OpLabel
+ %235 = OpPhi %50 %222 %218 %234 %223
+ OpSelectionMerge %237 None
+ OpBranchConditional %235 %236 %237
+ %236 = OpLabel
+ %238 = OpLoad %18 %208
+ %239 = OpISub %18 %238 %60
+ OpStore %208 %239
+ %240 = OpAccessChain %41 %62 %28
+ %241 = OpLoad %18 %240
+ %242 = OpAccessChain %41 %62 %35
+ %243 = OpLoad %18 %242
+ %244 = OpIMul %18 %243 %86
+ %245 = OpIAdd %18 %241 %244
+ %246 = OpAccessChain %57 %55 %245
+ OpStore %246 %60
+ %247 = OpAccessChain %41 %62 %28
+ %248 = OpLoad %18 %247
+ %249 = OpISub %18 %248 %60
+ %250 = OpAccessChain %41 %62 %35
+ %251 = OpLoad %18 %250
+ %252 = OpIMul %18 %251 %86
+ %253 = OpIAdd %18 %249 %252
+ %254 = OpAccessChain %57 %55 %253
+ OpStore %254 %60
+ %255 = OpAccessChain %41 %62 %28
+ %256 = OpLoad %18 %255
+ %257 = OpISub %18 %256 %82
+ %258 = OpAccessChain %41 %62 %35
+ %259 = OpLoad %18 %258
+ %260 = OpIMul %18 %259 %86
+ %261 = OpIAdd %18 %257 %260
+ %262 = OpAccessChain %57 %55 %261
+ OpStore %262 %60
+ %263 = OpAccessChain %41 %62 %28
+ %264 = OpLoad %18 %263
+ %265 = OpISub %18 %264 %82
+ %266 = OpAccessChain %41 %62 %28
+ OpStore %266 %265
+ OpBranch %237
+ %237 = OpLabel
+ %267 = OpLoad %18 %208
+ %268 = OpSGreaterThanEqual %50 %267 %19
+ OpSelectionMerge %270 None
+ OpBranchConditional %268 %269 %270
+ %269 = OpLabel
+ %271 = OpAccessChain %41 %62 %35
+ %272 = OpLoad %18 %271
+ %273 = OpSGreaterThan %50 %272 %19
+ OpBranch %270
+ %270 = OpLabel
+ %274 = OpPhi %50 %268 %237 %273 %269
+ OpSelectionMerge %276 None
+ OpBranchConditional %274 %275 %276
+ %275 = OpLabel
+ %277 = OpAccessChain %41 %62 %28
+ %278 = OpLoad %18 %277
+ %279 = OpAccessChain %41 %62 %35
+ %280 = OpLoad %18 %279
+ %281 = OpISub %18 %280 %82
+ %282 = OpIMul %18 %281 %86
+ %773 = OpLoad %53 %55
+ OpStore %55 %566
+ OpStore %55 %773
+ %283 = OpIAdd %18 %278 %282
+ %284 = OpAccessChain %57 %55 %283
+ %285 = OpLoad %18 %284
+ %286 = OpIEqual %50 %285 %19
+ OpBranch %276
+ %276 = OpLabel
+ %287 = OpPhi %50 %274 %270 %286 %275
+ OpSelectionMerge %289 None
+ OpBranchConditional %287 %288 %289
+ %288 = OpLabel
+ %290 = OpLoad %18 %208
+ %291 = OpISub %18 %290 %60
+ OpStore %208 %291
+ %292 = OpAccessChain %41 %62 %28
+ %293 = OpLoad %18 %292
+ %294 = OpAccessChain %41 %62 %35
+ %295 = OpLoad %18 %294
+ %296 = OpIMul %18 %295 %86
+ %297 = OpIAdd %18 %293 %296
+ %298 = OpAccessChain %57 %55 %297
+ OpStore %298 %60
+ %299 = OpAccessChain %41 %62 %28
+ %300 = OpLoad %18 %299
+ %301 = OpAccessChain %41 %62 %35
+ %302 = OpLoad %18 %301
+ %303 = OpISub %18 %302 %60
+ %304 = OpIMul %18 %303 %86
+ %305 = OpIAdd %18 %300 %304
+ %306 = OpAccessChain %57 %55 %305
+ OpStore %306 %60
+ %307 = OpAccessChain %41 %62 %28
+ %308 = OpLoad %18 %307
+ %309 = OpAccessChain %41 %62 %35
+ %310 = OpLoad %18 %309
+ %311 = OpISub %18 %310 %82
+ %800 = OpLoad %53 %55
+ OpStore %55 %566
+ OpStore %55 %800
+ %312 = OpIMul %18 %311 %86
+ %313 = OpIAdd %18 %308 %312
+ %314 = OpAccessChain %57 %55 %313
+ OpStore %314 %60
+ %315 = OpAccessChain %41 %62 %35
+ %316 = OpLoad %18 %315
+ %317 = OpISub %18 %316 %82
+ %318 = OpAccessChain %41 %62 %35
+ OpStore %318 %317
+ OpBranch %289
+ %289 = OpLabel
+ %319 = OpLoad %18 %208
+ %320 = OpSGreaterThanEqual %50 %319 %19
+ OpSelectionMerge %322 None
+ OpBranchConditional %320 %321 %322
+ %321 = OpLabel
+ %323 = OpAccessChain %41 %62 %28
+ %324 = OpLoad %18 %323
+ %325 = OpSLessThan %50 %324 %119
+ OpBranch %322
+ %322 = OpLabel
+ %326 = OpPhi %50 %320 %289 %325 %321
+ OpSelectionMerge %328 None
+ OpBranchConditional %326 %327 %328
+ %327 = OpLabel
+ %329 = OpAccessChain %41 %62 %28
+ %330 = OpLoad %18 %329
+ %331 = OpIAdd %18 %330 %82
+ %332 = OpAccessChain %41 %62 %35
+ %333 = OpLoad %18 %332
+ %334 = OpIMul %18 %333 %86
+ %335 = OpIAdd %18 %331 %334
+ %336 = OpAccessChain %57 %55 %335
+ %337 = OpLoad %18 %336
+ %338 = OpIEqual %50 %337 %19
+ OpBranch %328
+ %328 = OpLabel
+ %339 = OpPhi %50 %326 %322 %338 %327
+ OpSelectionMerge %341 None
+ OpBranchConditional %339 %340 %341
+ %340 = OpLabel
+ %342 = OpLoad %18 %208
+ %343 = OpISub %18 %342 %60
+ OpStore %208 %343
+ %344 = OpAccessChain %41 %62 %28
+ %345 = OpLoad %18 %344
+ %346 = OpAccessChain %41 %62 %35
+ %347 = OpLoad %18 %346
+ %348 = OpIMul %18 %347 %86
+ %349 = OpIAdd %18 %345 %348
+ %350 = OpAccessChain %57 %55 %349
+ OpStore %350 %60
+ %351 = OpAccessChain %41 %62 %28
+ %352 = OpLoad %18 %351
+ %353 = OpIAdd %18 %352 %60
+ %354 = OpAccessChain %41 %62 %35
+ %355 = OpLoad %18 %354
+ %356 = OpIMul %18 %355 %86
+ %357 = OpIAdd %18 %353 %356
+ %358 = OpAccessChain %57 %55 %357
+ OpStore %358 %60
+ %359 = OpAccessChain %41 %62 %28
+ %360 = OpLoad %18 %359
+ %361 = OpIAdd %18 %360 %82
+ %362 = OpAccessChain %41 %62 %35
+ %363 = OpLoad %18 %362
+ %364 = OpIMul %18 %363 %86
+ %365 = OpIAdd %18 %361 %364
+ %366 = OpAccessChain %57 %55 %365
+ OpStore %366 %60
+ %367 = OpAccessChain %41 %62 %28
+ %368 = OpLoad %18 %367
+ %369 = OpIAdd %18 %368 %82
+ %370 = OpAccessChain %41 %62 %28
+ OpStore %370 %369
+ OpBranch %341
+ %341 = OpLabel
+ %371 = OpLoad %18 %208
+ %372 = OpSGreaterThanEqual %50 %371 %19
+ OpSelectionMerge %374 None
+ OpBranchConditional %372 %373 %374
+ %373 = OpLabel
+ %375 = OpAccessChain %41 %62 %35
+ %376 = OpLoad %18 %375
+ %377 = OpSLessThan %50 %376 %119
+ OpBranch %374
+ %374 = OpLabel
+ %378 = OpPhi %50 %372 %341 %377 %373
+ OpSelectionMerge %380 None
+ OpBranchConditional %378 %379 %380
+ %379 = OpLabel
+ %381 = OpAccessChain %41 %62 %28
+ %382 = OpLoad %18 %381
+ %383 = OpAccessChain %41 %62 %35
+ %384 = OpLoad %18 %383
+ %385 = OpIAdd %18 %384 %82
+ %386 = OpIMul %18 %385 %86
+ %387 = OpIAdd %18 %382 %386
+ %388 = OpAccessChain %57 %55 %387
+ %389 = OpLoad %18 %388
+ %390 = OpIEqual %50 %389 %19
+ OpBranch %380
+ %380 = OpLabel
+ %391 = OpPhi %50 %378 %374 %390 %379
+ OpSelectionMerge %393 None
+ OpBranchConditional %391 %392 %393
+ %392 = OpLabel
+ %394 = OpLoad %18 %208
+ %395 = OpISub %18 %394 %60
+ OpStore %208 %395
+ %396 = OpAccessChain %41 %62 %28
+ %397 = OpLoad %18 %396
+ %398 = OpAccessChain %41 %62 %35
+ %399 = OpLoad %18 %398
+ %400 = OpIMul %18 %399 %86
+ %401 = OpIAdd %18 %397 %400
+ %402 = OpAccessChain %57 %55 %401
+ OpStore %402 %60
+ %403 = OpAccessChain %41 %62 %28
+ %404 = OpLoad %18 %403
+ %405 = OpAccessChain %41 %62 %35
+ %406 = OpLoad %18 %405
+ %407 = OpIAdd %18 %406 %60
+ %408 = OpIMul %18 %407 %86
+ %409 = OpIAdd %18 %404 %408
+ %410 = OpAccessChain %57 %55 %409
+ OpStore %410 %60
+ %411 = OpAccessChain %41 %62 %28
+ %412 = OpLoad %18 %411
+ %413 = OpAccessChain %41 %62 %35
+ %414 = OpLoad %18 %413
+ %415 = OpIAdd %18 %414 %82
+ %416 = OpIMul %18 %415 %86
+ %417 = OpIAdd %18 %412 %416
+ %418 = OpAccessChain %57 %55 %417
+ OpStore %418 %60
+ %419 = OpAccessChain %41 %62 %35
+ %420 = OpLoad %18 %419
+ %421 = OpIAdd %18 %420 %82
+ %422 = OpAccessChain %41 %62 %35
+ OpStore %422 %421
+ OpBranch %393
+ %393 = OpLabel
+ OpBranch %161
+ %161 = OpLabel
+ %423 = OpAccessChain %41 %26 %35
+ %424 = OpLoad %18 %423
+ %425 = OpIMul %18 %424 %86
+ %426 = OpAccessChain %41 %26 %28
+ %427 = OpLoad %18 %426
+ %428 = OpIAdd %18 %425 %427
+ %429 = OpAccessChain %57 %55 %428
+ %430 = OpLoad %18 %429
+ %431 = OpIEqual %50 %430 %60
+ OpSelectionMerge %433 None
+ OpBranchConditional %431 %432 %433
+ %432 = OpLabel
+ OpStore %435 %437
+ OpReturn
+ %433 = OpLabel
+ OpBranch %71
+ %71 = OpLabel
+ %439 = OpLoad %50 %65
+ OpBranchConditional %439 %68 %70
+ %70 = OpLabel
+ OpStore %435 %441
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# resolution
+BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var.amber
new file mode 100644
index 0000000..9e989cf
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var.amber
@@ -0,0 +1,1262 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Three shaders with diff: mutate var
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 540
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %243 "gl_FragCoord"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %255 = OpConstant %157 0.5
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %373 = OpConstant %157 1
+ %507 = OpTypePointer Function %39
+ %539 = OpConstant %157 0.100000001
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %52 = OpVariable %507 Function
+ %41 = OpVariable %507 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpBranch %167
+ %167 = OpLabel
+ %508 = OpPhi %6 %166 %5 %222 %170
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ OpSelectionMerge %182 None
+ OpSwitch %508 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %185 = OpAccessChain %7 %41 %508
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %189 = OpAccessChain %7 %41 %508
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %192 = OpAccessChain %7 %41 %508
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %195 = OpAccessChain %7 %41 %508
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %198 = OpAccessChain %7 %41 %508
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %202 = OpAccessChain %7 %41 %508
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %206 = OpAccessChain %7 %41 %508
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %210 = OpAccessChain %7 %41 %508
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %214 = OpAccessChain %7 %41 %508
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %218 = OpAccessChain %7 %41 %508
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %222 = OpIAdd %6 %508 %22
+ OpBranch %170
+ %170 = OpLabel
+ %224 = OpSLessThan %31 %222 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpBranch %226
+ %226 = OpLabel
+ %510 = OpPhi %6 %105 %169 %239 %227
+ %232 = OpSLessThan %31 %510 %74
+ OpLoopMerge %228 %227 None
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %235 = OpAccessChain %7 %41 %510
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %7 %52 %510
+ OpStore %237 %236
+ %239 = OpIAdd %6 %510 %22
+ OpBranch %226
+ %228 = OpLabel
+ OpBranch %389
+ %389 = OpLabel
+ %511 = OpPhi %6 %22 %228 %426 %424
+ %393 = OpSLessThanEqual %31 %511 %107
+ OpLoopMerge %427 %424 None
+ OpBranchConditional %393 %394 %427
+ %394 = OpLabel
+ OpBranch %396
+ %396 = OpLabel
+ %519 = OpPhi %6 %105 %394 %410 %418
+ %400 = OpSLessThan %31 %519 %107
+ OpLoopMerge %423 %418 None
+ OpBranchConditional %400 %401 %423
+ %401 = OpLabel
+ %405 = OpIAdd %6 %519 %511
+ %406 = OpISub %6 %405 %22
+ %409 = OpIMul %6 %136 %511
+ %410 = OpIAdd %6 %519 %409
+ %411 = OpISub %6 %410 %22
+ %413 = OpExtInst %6 %1 SMin %411 %107
+ OpBranch %437
+ %437 = OpLabel
+ %532 = OpPhi %6 %519 %401 %456 %471
+ %522 = OpPhi %6 %405 %401 %534 %471
+ %521 = OpPhi %6 %519 %401 %533 %471
+ %441 = OpSLessThanEqual %31 %521 %406
+ %444 = OpSLessThanEqual %31 %522 %413
+ %445 = OpLogicalAnd %31 %441 %444
+ OpLoopMerge %472 %471 None
+ OpBranchConditional %445 %446 %472
+ %446 = OpLabel
+ %448 = OpAccessChain %7 %41 %521
+ %449 = OpLoad %6 %448
+ %451 = OpAccessChain %7 %41 %522
+ %452 = OpLoad %6 %451
+ %453 = OpSLessThan %31 %449 %452
+ %456 = OpIAdd %6 %532 %22
+ OpSelectionMerge %470 None
+ OpBranchConditional %453 %454 %462
+ %454 = OpLabel
+ %458 = OpIAdd %6 %521 %22
+ %460 = OpLoad %6 %448
+ %461 = OpAccessChain %7 %52 %532
+ OpStore %461 %460
+ OpBranch %470
+ %462 = OpLabel
+ %466 = OpIAdd %6 %522 %22
+ %468 = OpLoad %6 %451
+ %469 = OpAccessChain %7 %52 %532
+ OpStore %469 %468
+ OpBranch %470
+ %470 = OpLabel
+ %534 = OpPhi %6 %522 %454 %466 %462
+ %533 = OpPhi %6 %458 %454 %521 %462
+ OpBranch %471
+ %471 = OpLabel
+ OpBranch %437
+ %472 = OpLabel
+ OpBranch %473
+ %473 = OpLabel
+ %531 = OpPhi %6 %532 %472 %483 %481
+ %523 = OpPhi %6 %521 %472 %485 %481
+ %476 = OpSLessThan %31 %523 %74
+ %479 = OpSLessThanEqual %31 %523 %406
+ %480 = OpLogicalAnd %31 %476 %479
+ OpLoopMerge %490 %481 None
+ OpBranchConditional %480 %481 %490
+ %481 = OpLabel
+ %483 = OpIAdd %6 %531 %22
+ %485 = OpIAdd %6 %523 %22
+ %486 = OpAccessChain %7 %41 %523
+ %487 = OpLoad %6 %486
+ %488 = OpAccessChain %7 %52 %531
+ OpStore %488 %487
+ OpBranch %473
+ %490 = OpLabel
+ OpBranch %492
+ %492 = OpLabel
+ %524 = OpPhi %6 %519 %490 %505 %497
+ %496 = OpSLessThanEqual %31 %524 %413
+ OpLoopMerge %506 %497 None
+ OpBranchConditional %496 %497 %506
+ %497 = OpLabel
+ %500 = OpAccessChain %7 %52 %524
+ %501 = OpLoad %6 %500
+ %502 = OpAccessChain %7 %41 %524
+ OpStore %502 %501
+ %505 = OpIAdd %6 %524 %22
+ OpBranch %492
+ %506 = OpLabel
+ OpBranch %418
+ %418 = OpLabel
+ OpBranch %396
+ %423 = OpLabel
+ OpBranch %424
+ %424 = OpLabel
+ %426 = OpIMul %6 %136 %511
+ OpBranch %389
+ %427 = OpLabel
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %7 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFMul %157 %258 %539
+ %261 = OpFAdd %157 %255 %260
+ OpBranch %252
+ %262 = OpLabel
+ %267 = OpSLessThan %31 %248 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %7 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFMul %157 %272 %539
+ %274 = OpFAdd %157 %255 %273
+ OpBranch %269
+ %275 = OpLabel
+ %280 = OpSLessThan %31 %248 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %7 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFMul %157 %285 %539
+ %287 = OpFAdd %157 %255 %286
+ OpBranch %282
+ %288 = OpLabel
+ %293 = OpSLessThan %31 %248 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %7 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFMul %157 %298 %539
+ %300 = OpFAdd %157 %255 %299
+ OpBranch %295
+ %301 = OpLabel
+ %306 = OpSLessThan %31 %248 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %315 = OpSLessThan %31 %248 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %7 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFMul %157 %321 %539
+ %323 = OpFAdd %157 %255 %322
+ OpBranch %317
+ %324 = OpLabel
+ %329 = OpSLessThan %31 %248 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %7 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFMul %157 %335 %539
+ %337 = OpFAdd %157 %255 %336
+ OpBranch %331
+ %338 = OpLabel
+ %343 = OpSLessThan %31 %248 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %7 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFMul %157 %349 %539
+ %351 = OpFAdd %157 %255 %350
+ OpBranch %345
+ %352 = OpLabel
+ %357 = OpSLessThan %31 %248 %356
+ OpSelectionMerge %358 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %7 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFMul %157 %363 %539
+ %365 = OpFAdd %157 %255 %364
+ OpBranch %345
+ %366 = OpLabel
+ OpKill
+ %345 = OpLabel
+ %518 = OpPhi %157 %351 %344 %365 %358
+ OpBranch %331
+ %331 = OpLabel
+ %517 = OpPhi %157 %337 %330 %518 %345
+ OpBranch %317
+ %317 = OpLabel
+ %516 = OpPhi %157 %323 %316 %517 %331
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ %515 = OpPhi %157 %300 %294 %516 %308
+ OpBranch %282
+ %282 = OpLabel
+ %514 = OpPhi %157 %287 %281 %515 %295
+ OpBranch %269
+ %269 = OpLabel
+ %513 = OpPhi %157 %274 %268 %514 %282
+ OpBranch %252
+ %252 = OpLabel
+ %512 = OpPhi %157 %261 %251 %513 %269
+ %377 = OpCompositeConstruct %241 %512 %512 %512 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# injectionSwitch
+BUFFER reference_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 677
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %243 "gl_FragCoord"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %255 = OpConstant %157 0.5
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %373 = OpConstant %157 1
+ %507 = OpTypePointer Function %39
+ %539 = OpConstant %157 0.100000001
+ %670 = OpConstant %6 0
+ %671 = OpConstantComposite %39 %670 %670 %670 %670 %670 %670 %670 %670 %670 %670
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %52 = OpVariable %507 Function
+ %41 = OpVariable %507 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpBranch %167
+ %167 = OpLabel
+ %508 = OpPhi %6 %166 %5 %222 %170
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %676 = OpLoad %39 %41
+ OpStore %41 %671
+ OpStore %41 %676
+ %651 = OpIAdd %6 %508 %22
+ OpSelectionMerge %182 None
+ OpSwitch %508 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %185 = OpAccessChain %7 %41 %508
+ OpStore %185 %184
+ %652 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %173 = OpLabel
+ %189 = OpAccessChain %7 %41 %508
+ OpStore %189 %188
+ %653 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %174 = OpLabel
+ %192 = OpAccessChain %7 %41 %508
+ OpStore %192 %136
+ %654 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %175 = OpLabel
+ %195 = OpAccessChain %7 %41 %508
+ OpStore %195 %22
+ %655 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %176 = OpLabel
+ %198 = OpAccessChain %7 %41 %508
+ OpStore %198 %105
+ %656 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %177 = OpLabel
+ %202 = OpAccessChain %7 %41 %508
+ OpStore %202 %201
+ %657 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %178 = OpLabel
+ %206 = OpAccessChain %7 %41 %508
+ OpStore %206 %205
+ %658 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %179 = OpLabel
+ %210 = OpAccessChain %7 %41 %508
+ OpStore %210 %209
+ %659 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %180 = OpLabel
+ %214 = OpAccessChain %7 %41 %508
+ OpStore %214 %213
+ %660 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %181 = OpLabel
+ %218 = OpAccessChain %7 %41 %508
+ OpStore %218 %217
+ %661 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %182 = OpLabel
+ %222 = OpPhi %6 %651 %168 %652 %172 %653 %173 %654 %174 %655 %175 %656 %176 %657 %177 %658 %178 %659 %179 %660 %180 %661 %181
+ OpBranch %170
+ %170 = OpLabel
+ %224 = OpSLessThan %31 %222 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpBranch %226
+ %226 = OpLabel
+ %510 = OpPhi %6 %105 %169 %239 %227
+ %232 = OpSLessThan %31 %510 %74
+ OpLoopMerge %228 %227 None
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %235 = OpAccessChain %7 %41 %510
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %7 %52 %510
+ OpStore %237 %236
+ %239 = OpIAdd %6 %510 %22
+ OpBranch %226
+ %228 = OpLabel
+ OpBranch %389
+ %389 = OpLabel
+ %511 = OpPhi %6 %22 %228 %426 %424
+ %393 = OpSLessThanEqual %31 %511 %107
+ OpLoopMerge %427 %424 None
+ OpBranchConditional %393 %394 %427
+ %394 = OpLabel
+ OpBranch %396
+ %396 = OpLabel
+ %519 = OpPhi %6 %105 %394 %410 %418
+ %400 = OpSLessThan %31 %519 %107
+ OpLoopMerge %423 %418 None
+ OpBranchConditional %400 %401 %423
+ %401 = OpLabel
+ %405 = OpIAdd %6 %519 %511
+ %406 = OpISub %6 %405 %22
+ %409 = OpIMul %6 %136 %511
+ %410 = OpIAdd %6 %519 %409
+ %411 = OpISub %6 %410 %22
+ %413 = OpExtInst %6 %1 SMin %411 %107
+ OpBranch %437
+ %437 = OpLabel
+ %532 = OpPhi %6 %519 %401 %456 %471
+ %522 = OpPhi %6 %405 %401 %534 %471
+ %521 = OpPhi %6 %519 %401 %533 %471
+ %441 = OpSLessThanEqual %31 %521 %406
+ %444 = OpSLessThanEqual %31 %522 %413
+ %445 = OpLogicalAnd %31 %441 %444
+ OpLoopMerge %472 %471 None
+ OpBranchConditional %445 %446 %472
+ %446 = OpLabel
+ %448 = OpAccessChain %7 %41 %521
+ %449 = OpLoad %6 %448
+ %451 = OpAccessChain %7 %41 %522
+ %452 = OpLoad %6 %451
+ %453 = OpSLessThan %31 %449 %452
+ %456 = OpIAdd %6 %532 %22
+ OpSelectionMerge %470 None
+ OpBranchConditional %453 %454 %462
+ %454 = OpLabel
+ %458 = OpIAdd %6 %521 %22
+ %460 = OpLoad %6 %448
+ %461 = OpAccessChain %7 %52 %532
+ OpStore %461 %460
+ OpBranch %470
+ %462 = OpLabel
+ %466 = OpIAdd %6 %522 %22
+ %468 = OpLoad %6 %451
+ %469 = OpAccessChain %7 %52 %532
+ OpStore %469 %468
+ OpBranch %470
+ %470 = OpLabel
+ %534 = OpPhi %6 %522 %454 %466 %462
+ %533 = OpPhi %6 %458 %454 %521 %462
+ OpBranch %471
+ %471 = OpLabel
+ OpBranch %437
+ %472 = OpLabel
+ OpBranch %473
+ %473 = OpLabel
+ %531 = OpPhi %6 %532 %472 %483 %481
+ %523 = OpPhi %6 %521 %472 %485 %481
+ %476 = OpSLessThan %31 %523 %74
+ %479 = OpSLessThanEqual %31 %523 %406
+ %480 = OpLogicalAnd %31 %476 %479
+ OpLoopMerge %490 %481 None
+ OpBranchConditional %480 %481 %490
+ %481 = OpLabel
+ %483 = OpIAdd %6 %531 %22
+ %485 = OpIAdd %6 %523 %22
+ %486 = OpAccessChain %7 %41 %523
+ %487 = OpLoad %6 %486
+ %488 = OpAccessChain %7 %52 %531
+ OpStore %488 %487
+ OpBranch %473
+ %490 = OpLabel
+ OpBranch %492
+ %492 = OpLabel
+ %524 = OpPhi %6 %519 %490 %505 %497
+ %496 = OpSLessThanEqual %31 %524 %413
+ OpLoopMerge %506 %497 None
+ OpBranchConditional %496 %497 %506
+ %497 = OpLabel
+ %500 = OpAccessChain %7 %52 %524
+ %501 = OpLoad %6 %500
+ %502 = OpAccessChain %7 %41 %524
+ OpStore %502 %501
+ %505 = OpIAdd %6 %524 %22
+ OpBranch %492
+ %506 = OpLabel
+ OpBranch %418
+ %418 = OpLabel
+ OpBranch %396
+ %423 = OpLabel
+ OpBranch %424
+ %424 = OpLabel
+ %426 = OpIMul %6 %136 %511
+ OpBranch %389
+ %427 = OpLabel
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %7 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFMul %157 %258 %539
+ %261 = OpFAdd %157 %255 %260
+ OpBranch %252
+ %262 = OpLabel
+ %267 = OpSLessThan %31 %248 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %7 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFMul %157 %272 %539
+ %274 = OpFAdd %157 %255 %273
+ OpBranch %269
+ %275 = OpLabel
+ %280 = OpSLessThan %31 %248 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %7 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFMul %157 %285 %539
+ %287 = OpFAdd %157 %255 %286
+ OpBranch %282
+ %288 = OpLabel
+ %293 = OpSLessThan %31 %248 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %7 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFMul %157 %298 %539
+ %300 = OpFAdd %157 %255 %299
+ OpBranch %295
+ %301 = OpLabel
+ %306 = OpSLessThan %31 %248 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %315 = OpSLessThan %31 %248 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %7 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFMul %157 %321 %539
+ %323 = OpFAdd %157 %255 %322
+ OpBranch %317
+ %324 = OpLabel
+ %329 = OpSLessThan %31 %248 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %7 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFMul %157 %335 %539
+ %337 = OpFAdd %157 %255 %336
+ OpBranch %331
+ %338 = OpLabel
+ %343 = OpSLessThan %31 %248 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %7 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFMul %157 %349 %539
+ %351 = OpFAdd %157 %255 %350
+ OpBranch %345
+ %352 = OpLabel
+ %357 = OpSLessThan %31 %248 %356
+ OpSelectionMerge %358 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %7 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFMul %157 %363 %539
+ %365 = OpFAdd %157 %255 %364
+ OpBranch %345
+ %366 = OpLabel
+ OpKill
+ %345 = OpLabel
+ %518 = OpPhi %157 %351 %344 %365 %358
+ OpBranch %331
+ %331 = OpLabel
+ %517 = OpPhi %157 %337 %330 %518 %345
+ OpBranch %317
+ %317 = OpLabel
+ %516 = OpPhi %157 %323 %316 %517 %331
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ %515 = OpPhi %157 %300 %294 %516 %308
+ OpBranch %282
+ %282 = OpLabel
+ %514 = OpPhi %157 %287 %281 %515 %295
+ OpBranch %269
+ %269 = OpLabel
+ %513 = OpPhi %157 %274 %268 %514 %282
+ OpBranch %252
+ %252 = OpLabel
+ %512 = OpPhi %157 %261 %251 %513 %269
+ %377 = OpCompositeConstruct %241 %512 %512 %512 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 672
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %243 "gl_FragCoord"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %255 = OpConstant %157 0.5
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %373 = OpConstant %157 1
+ %507 = OpTypePointer Function %39
+ %539 = OpConstant %157 0.100000001
+ %670 = OpConstant %6 0
+ %671 = OpConstantComposite %39 %670 %670 %670 %670 %670 %670 %670 %670 %670 %670
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %52 = OpVariable %507 Function
+ %41 = OpVariable %507 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpBranch %167
+ %167 = OpLabel
+ %508 = OpPhi %6 %166 %5 %222 %170
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %651 = OpIAdd %6 %508 %22
+ OpSelectionMerge %182 None
+ OpSwitch %508 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %185 = OpAccessChain %7 %41 %508
+ OpStore %185 %184
+ %652 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %173 = OpLabel
+ %189 = OpAccessChain %7 %41 %508
+ OpStore %189 %188
+ %653 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %174 = OpLabel
+ %192 = OpAccessChain %7 %41 %508
+ OpStore %192 %136
+ %654 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %175 = OpLabel
+ %195 = OpAccessChain %7 %41 %508
+ OpStore %195 %22
+ %655 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %176 = OpLabel
+ %198 = OpAccessChain %7 %41 %508
+ OpStore %198 %105
+ %656 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %177 = OpLabel
+ %202 = OpAccessChain %7 %41 %508
+ OpStore %202 %201
+ %657 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %178 = OpLabel
+ %206 = OpAccessChain %7 %41 %508
+ OpStore %206 %205
+ %658 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %179 = OpLabel
+ %210 = OpAccessChain %7 %41 %508
+ OpStore %210 %209
+ %659 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %180 = OpLabel
+ %214 = OpAccessChain %7 %41 %508
+ OpStore %214 %213
+ %660 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %181 = OpLabel
+ %218 = OpAccessChain %7 %41 %508
+ OpStore %218 %217
+ %661 = OpIAdd %6 %508 %22
+ OpBranch %182
+ %182 = OpLabel
+ %222 = OpPhi %6 %651 %168 %652 %172 %653 %173 %654 %174 %655 %175 %656 %176 %657 %177 %658 %178 %659 %179 %660 %180 %661 %181
+ OpBranch %170
+ %170 = OpLabel
+ %224 = OpSLessThan %31 %222 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpBranch %226
+ %226 = OpLabel
+ %510 = OpPhi %6 %105 %169 %239 %227
+ %232 = OpSLessThan %31 %510 %74
+ OpLoopMerge %228 %227 None
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %235 = OpAccessChain %7 %41 %510
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %7 %52 %510
+ OpStore %237 %236
+ %239 = OpIAdd %6 %510 %22
+ OpBranch %226
+ %228 = OpLabel
+ OpBranch %389
+ %389 = OpLabel
+ %511 = OpPhi %6 %22 %228 %426 %424
+ %393 = OpSLessThanEqual %31 %511 %107
+ OpLoopMerge %427 %424 None
+ OpBranchConditional %393 %394 %427
+ %394 = OpLabel
+ OpBranch %396
+ %396 = OpLabel
+ %519 = OpPhi %6 %105 %394 %410 %418
+ %400 = OpSLessThan %31 %519 %107
+ OpLoopMerge %423 %418 None
+ OpBranchConditional %400 %401 %423
+ %401 = OpLabel
+ %405 = OpIAdd %6 %519 %511
+ %406 = OpISub %6 %405 %22
+ %409 = OpIMul %6 %136 %511
+ %410 = OpIAdd %6 %519 %409
+ %411 = OpISub %6 %410 %22
+ %413 = OpExtInst %6 %1 SMin %411 %107
+ OpBranch %437
+ %437 = OpLabel
+ %532 = OpPhi %6 %519 %401 %456 %471
+ %522 = OpPhi %6 %405 %401 %534 %471
+ %521 = OpPhi %6 %519 %401 %533 %471
+ %441 = OpSLessThanEqual %31 %521 %406
+ %444 = OpSLessThanEqual %31 %522 %413
+ %445 = OpLogicalAnd %31 %441 %444
+ OpLoopMerge %472 %471 None
+ OpBranchConditional %445 %446 %472
+ %446 = OpLabel
+ %448 = OpAccessChain %7 %41 %521
+ %449 = OpLoad %6 %448
+ %451 = OpAccessChain %7 %41 %522
+ %452 = OpLoad %6 %451
+ %453 = OpSLessThan %31 %449 %452
+ %456 = OpIAdd %6 %532 %22
+ OpSelectionMerge %470 None
+ OpBranchConditional %453 %454 %462
+ %454 = OpLabel
+ %458 = OpIAdd %6 %521 %22
+ %460 = OpLoad %6 %448
+ %461 = OpAccessChain %7 %52 %532
+ OpStore %461 %460
+ OpBranch %470
+ %462 = OpLabel
+ %466 = OpIAdd %6 %522 %22
+ %468 = OpLoad %6 %451
+ %469 = OpAccessChain %7 %52 %532
+ OpStore %469 %468
+ OpBranch %470
+ %470 = OpLabel
+ %534 = OpPhi %6 %522 %454 %466 %462
+ %533 = OpPhi %6 %458 %454 %521 %462
+ OpBranch %471
+ %471 = OpLabel
+ OpBranch %437
+ %472 = OpLabel
+ OpBranch %473
+ %473 = OpLabel
+ %531 = OpPhi %6 %532 %472 %483 %481
+ %523 = OpPhi %6 %521 %472 %485 %481
+ %476 = OpSLessThan %31 %523 %74
+ %479 = OpSLessThanEqual %31 %523 %406
+ %480 = OpLogicalAnd %31 %476 %479
+ OpLoopMerge %490 %481 None
+ OpBranchConditional %480 %481 %490
+ %481 = OpLabel
+ %483 = OpIAdd %6 %531 %22
+ %485 = OpIAdd %6 %523 %22
+ %486 = OpAccessChain %7 %41 %523
+ %487 = OpLoad %6 %486
+ %488 = OpAccessChain %7 %52 %531
+ OpStore %488 %487
+ OpBranch %473
+ %490 = OpLabel
+ OpBranch %492
+ %492 = OpLabel
+ %524 = OpPhi %6 %519 %490 %505 %497
+ %496 = OpSLessThanEqual %31 %524 %413
+ OpLoopMerge %506 %497 None
+ OpBranchConditional %496 %497 %506
+ %497 = OpLabel
+ %500 = OpAccessChain %7 %52 %524
+ %501 = OpLoad %6 %500
+ %502 = OpAccessChain %7 %41 %524
+ OpStore %502 %501
+ %505 = OpIAdd %6 %524 %22
+ OpBranch %492
+ %506 = OpLabel
+ OpBranch %418
+ %418 = OpLabel
+ OpBranch %396
+ %423 = OpLabel
+ OpBranch %424
+ %424 = OpLabel
+ %426 = OpIMul %6 %136 %511
+ OpBranch %389
+ %427 = OpLabel
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %7 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFMul %157 %258 %539
+ %261 = OpFAdd %157 %255 %260
+ OpBranch %252
+ %262 = OpLabel
+ %267 = OpSLessThan %31 %248 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %7 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFMul %157 %272 %539
+ %274 = OpFAdd %157 %255 %273
+ OpBranch %269
+ %275 = OpLabel
+ %280 = OpSLessThan %31 %248 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %7 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFMul %157 %285 %539
+ %287 = OpFAdd %157 %255 %286
+ OpBranch %282
+ %288 = OpLabel
+ %293 = OpSLessThan %31 %248 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %7 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFMul %157 %298 %539
+ %300 = OpFAdd %157 %255 %299
+ OpBranch %295
+ %301 = OpLabel
+ %306 = OpSLessThan %31 %248 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %315 = OpSLessThan %31 %248 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %7 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFMul %157 %321 %539
+ %323 = OpFAdd %157 %255 %322
+ OpBranch %317
+ %324 = OpLabel
+ %329 = OpSLessThan %31 %248 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %7 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFMul %157 %335 %539
+ %337 = OpFAdd %157 %255 %336
+ OpBranch %331
+ %338 = OpLabel
+ %343 = OpSLessThan %31 %248 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %7 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFMul %157 %349 %539
+ %351 = OpFAdd %157 %255 %350
+ OpBranch %345
+ %352 = OpLabel
+ %357 = OpSLessThan %31 %248 %356
+ OpSelectionMerge %358 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %7 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFMul %157 %363 %539
+ %365 = OpFAdd %157 %255 %364
+ OpBranch %345
+ %366 = OpLabel
+ OpKill
+ %345 = OpLabel
+ %518 = OpPhi %157 %351 %344 %365 %358
+ OpBranch %331
+ %331 = OpLabel
+ %517 = OpPhi %157 %337 %330 %518 %345
+ OpBranch %317
+ %317 = OpLabel
+ %516 = OpPhi %157 %323 %316 %517 %331
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ %515 = OpPhi %157 %300 %294 %516 %308
+ OpBranch %282
+ %282 = OpLabel
+ %514 = OpPhi %157 %287 %281 %515 %295
+ OpBranch %269
+ %269 = OpLabel
+ %513 = OpPhi %157 %274 %268 %514 %282
+ OpBranch %252
+ %252 = OpLabel
+ %512 = OpPhi %157 %261 %251 %513 %269
+ %377 = OpCompositeConstruct %241 %512 %512 %512 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# injectionSwitch
+BUFFER variant_2_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues.amber
new file mode 100644
index 0000000..6ccc769
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues.amber
@@ -0,0 +1,2052 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Shaders diff: selection %25 flattened; dead continues
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 378
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %371 = OpTypeVector %157 3
+ %373 = OpConstant %157 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ %240 = OpFunctionCall %2 %14
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %311 = OpAccessChain %245 %243 %244
+ %312 = OpLoad %157 %311
+ %313 = OpConvertFToS %6 %312
+ %315 = OpSLessThan %31 %313 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %43 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFDiv %157 %321 %259
+ %323 = OpFAdd %157 %255 %322
+ OpStore %254 %323
+ OpBranch %317
+ %324 = OpLabel
+ %325 = OpAccessChain %245 %243 %244
+ %326 = OpLoad %157 %325
+ %327 = OpConvertFToS %6 %326
+ %329 = OpSLessThan %31 %327 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %43 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFDiv %157 %335 %259
+ %337 = OpFAdd %157 %255 %336
+ OpStore %254 %337
+ OpBranch %331
+ %338 = OpLabel
+ %339 = OpAccessChain %245 %243 %244
+ %340 = OpLoad %157 %339
+ %341 = OpConvertFToS %6 %340
+ %343 = OpSLessThan %31 %341 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %43 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFDiv %157 %349 %259
+ %351 = OpFAdd %157 %255 %350
+ OpStore %254 %351
+ OpBranch %345
+ %352 = OpLabel
+ %353 = OpAccessChain %245 %243 %244
+ %354 = OpLoad %157 %353
+ %355 = OpConvertFToS %6 %354
+ %357 = OpSLessThan %31 %355 %356
+ OpSelectionMerge %359 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %43 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFDiv %157 %363 %259
+ %365 = OpFAdd %157 %255 %364
+ OpStore %254 %365
+ OpBranch %359
+ %366 = OpLabel
+ OpKill
+ %359 = OpLabel
+ OpBranch %345
+ %345 = OpLabel
+ OpBranch %331
+ %331 = OpLabel
+ OpBranch %317
+ %317 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %370 = OpLoad %157 %254
+ %372 = OpCompositeConstruct %371 %370 %370 %370
+ %374 = OpCompositeExtract %157 %372 0
+ %375 = OpCompositeExtract %157 %372 1
+ %376 = OpCompositeExtract %157 %372 2
+ %377 = OpCompositeConstruct %241 %374 %375 %376 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %60
+ %50 = OpLabel
+ %53 = OpLoad %6 %16
+ %54 = OpIAdd %6 %53 %22
+ OpStore %16 %54
+ %55 = OpLoad %6 %18
+ %56 = OpIAdd %6 %55 %22
+ OpStore %18 %56
+ %57 = OpAccessChain %43 %41 %55
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %43 %52 %53
+ OpStore %59 %58
+ OpBranch %51
+ %60 = OpLabel
+ %61 = OpLoad %6 %16
+ %62 = OpIAdd %6 %61 %22
+ OpStore %16 %62
+ %63 = OpLoad %6 %20
+ %64 = OpIAdd %6 %63 %22
+ OpStore %20 %64
+ %65 = OpAccessChain %43 %41 %63
+ %66 = OpLoad %6 %65
+ %67 = OpAccessChain %43 %52 %61
+ OpStore %67 %66
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# injectionSwitch
+BUFFER reference_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 648
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %371 = OpTypeVector %157 3
+ %373 = OpConstant %157 1
+ %484 = OpConstant %6 0
+ %573 = OpConstantTrue %31
+ %574 = OpConstantFalse %31
+ %575 = OpConstant %157 0
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ %240 = OpFunctionCall %2 %14
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %311 = OpAccessChain %245 %243 %244
+ %312 = OpLoad %157 %311
+ %313 = OpConvertFToS %6 %312
+ %315 = OpSLessThan %31 %313 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %43 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFDiv %157 %321 %259
+ %323 = OpFAdd %157 %255 %322
+ OpStore %254 %323
+ OpBranch %317
+ %324 = OpLabel
+ %325 = OpAccessChain %245 %243 %244
+ %326 = OpLoad %157 %325
+ %327 = OpConvertFToS %6 %326
+ %329 = OpSLessThan %31 %327 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %43 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFDiv %157 %335 %259
+ %337 = OpFAdd %157 %255 %336
+ OpStore %254 %337
+ OpBranch %331
+ %338 = OpLabel
+ %339 = OpAccessChain %245 %243 %244
+ %340 = OpLoad %157 %339
+ %341 = OpConvertFToS %6 %340
+ %343 = OpSLessThan %31 %341 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %43 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFDiv %157 %349 %259
+ %351 = OpFAdd %157 %255 %350
+ OpStore %254 %351
+ OpBranch %345
+ %352 = OpLabel
+ %353 = OpAccessChain %245 %243 %244
+ %354 = OpLoad %157 %353
+ %355 = OpConvertFToS %6 %354
+ %357 = OpSLessThan %31 %355 %356
+ OpSelectionMerge %359 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %43 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFDiv %157 %363 %259
+ %365 = OpFAdd %157 %255 %364
+ OpStore %254 %365
+ OpBranch %359
+ %366 = OpLabel
+ OpKill
+ %359 = OpLabel
+ OpBranch %345
+ %345 = OpLabel
+ OpBranch %331
+ %331 = OpLabel
+ OpBranch %317
+ %317 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %370 = OpLoad %157 %254
+ %372 = OpCompositeConstruct %371 %370 %370 %370
+ %374 = OpCompositeExtract %157 %372 0
+ %375 = OpCompositeExtract %157 %372 1
+ %376 = OpCompositeExtract %157 %372 2
+ %377 = OpCompositeConstruct %241 %374 %375 %376 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ %646 = OpAccessChain %163 %161 %105 %105
+ %647 = OpLoad %157 %646
+ %643 = OpFOrdGreaterThanEqual %31 %373 %647
+ OpLoopMerge %26 %27 None
+ OpBranchConditional %643 %28 %27
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpBranch %50
+ %50 = OpLabel
+ OpSelectionMerge %479 None
+ OpBranchConditional %49 %480 %482
+ %480 = OpLabel
+ %481 = OpLoad %6 %16
+ OpBranch %479
+ %482 = OpLabel
+ %483 = OpCopyObject %6 %484
+ OpBranch %479
+ %479 = OpLabel
+ %53 = OpPhi %6 %481 %480 %483 %482
+ %54 = OpIAdd %6 %53 %22
+ OpBranch %486
+ %486 = OpLabel
+ OpSelectionMerge %536 None
+ OpBranchConditional %49 %537 %536
+ %537 = OpLabel
+ OpStore %16 %54
+ %622 = OpAccessChain %163 %161 %105 %105
+ %623 = OpLoad %157 %622
+ %621 = OpFUnordGreaterThan %31 %373 %623
+ OpBranchConditional %621 %536 %27
+ %536 = OpLabel
+ OpBranch %485
+ %485 = OpLabel
+ %595 = OpAccessChain %163 %161 %105 %22
+ %596 = OpLoad %157 %595
+ %594 = OpFOrdGreaterThanEqual %31 %596 %575
+ OpBranchConditional %594 %490 %27
+ %490 = OpLabel
+ %491 = OpCopyObject %6 %484
+ OpBranch %488
+ %488 = OpLabel
+ OpSelectionMerge %538 None
+ OpBranchConditional %49 %539 %541
+ %539 = OpLabel
+ %540 = OpLoad %6 %18
+ OpBranch %538
+ %541 = OpLabel
+ %542 = OpCopyObject %6 %484
+ OpBranch %538
+ %538 = OpLabel
+ %489 = OpPhi %6 %540 %539 %542 %541
+ OpBranch %487
+ %487 = OpLabel
+ %55 = OpSelect %6 %49 %489 %491
+ %56 = OpIAdd %6 %55 %22
+ OpSelectionMerge %492 None
+ OpBranchConditional %49 %493 %492
+ %493 = OpLabel
+ OpStore %18 %56
+ OpBranch %492
+ %492 = OpLabel
+ %57 = OpAccessChain %43 %41 %55
+ OpBranch %497
+ %497 = OpLabel
+ %498 = OpCopyObject %6 %484
+ OpBranch %495
+ %495 = OpLabel
+ OpSelectionMerge %545 None
+ OpBranchConditional %49 %546 %548
+ %546 = OpLabel
+ %547 = OpLoad %6 %57
+ %598 = OpAccessChain %163 %161 %105 %22
+ %599 = OpLoad %157 %598
+ %597 = OpFUnordGreaterThan %31 %575 %599
+ OpBranchConditional %597 %27 %545
+ %548 = OpLabel
+ %549 = OpCopyObject %6 %484
+ %619 = OpAccessChain %163 %161 %105 %22
+ %620 = OpLoad %157 %619
+ %618 = OpFUnordGreaterThanEqual %31 %620 %575
+ OpBranchConditional %618 %545 %27
+ %545 = OpLabel
+ %496 = OpPhi %6 %547 %546 %549 %548
+ OpBranch %494
+ %494 = OpLabel
+ %58 = OpSelect %6 %49 %496 %498
+ %59 = OpAccessChain %43 %52 %53
+ OpSelectionMerge %499 None
+ OpBranchConditional %49 %500 %499
+ %500 = OpLabel
+ OpStore %59 %58
+ OpBranch %499
+ %499 = OpLabel
+ OpBranch %60
+ %60 = OpLabel
+ OpSelectionMerge %501 None
+ OpBranchConditional %49 %504 %502
+ %502 = OpLabel
+ %503 = OpLoad %6 %16
+ OpBranch %501
+ %504 = OpLabel
+ %505 = OpCopyObject %6 %484
+ OpBranch %501
+ %501 = OpLabel
+ %61 = OpPhi %6 %503 %502 %505 %504
+ %62 = OpIAdd %6 %61 %22
+ OpSelectionMerge %506 None
+ OpBranchConditional %49 %506 %507
+ %507 = OpLabel
+ OpStore %16 %62
+ OpBranch %506
+ %506 = OpLabel
+ %602 = OpAccessChain %163 %161 %105 %105
+ %603 = OpLoad %157 %602
+ %601 = OpFUnordGreaterThan %31 %373 %603
+ OpBranchConditional %601 %509 %27
+ %509 = OpLabel
+ OpSelectionMerge %559 None
+ OpBranchConditional %49 %562 %560
+ %560 = OpLabel
+ %561 = OpLoad %6 %20
+ OpBranch %559
+ %562 = OpLabel
+ %563 = OpCopyObject %6 %484
+ OpBranch %559
+ %559 = OpLabel
+ %510 = OpPhi %6 %561 %560 %563 %562
+ OpBranch %511
+ %511 = OpLabel
+ %512 = OpCopyObject %6 %484
+ OpBranch %508
+ %508 = OpLabel
+ %63 = OpSelect %6 %49 %512 %510
+ %64 = OpIAdd %6 %63 %22
+ OpSelectionMerge %513 None
+ OpBranchConditional %49 %513 %514
+ %514 = OpLabel
+ OpStore %20 %64
+ OpBranch %513
+ %513 = OpLabel
+ %65 = OpAccessChain %43 %41 %63
+ OpSelectionMerge %515 None
+ OpBranchConditional %49 %518 %516
+ %516 = OpLabel
+ %517 = OpLoad %6 %65
+ OpBranch %515
+ %518 = OpLabel
+ %519 = OpCopyObject %6 %484
+ OpBranch %515
+ %515 = OpLabel
+ %66 = OpPhi %6 %517 %516 %519 %518
+ %67 = OpAccessChain %43 %52 %61
+ OpSelectionMerge %520 None
+ OpBranchConditional %49 %520 %521
+ %521 = OpLabel
+ OpStore %67 %66
+ OpBranch %520
+ %520 = OpLabel
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 644
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %371 = OpTypeVector %157 3
+ %373 = OpConstant %157 1
+ %484 = OpConstant %6 0
+ %573 = OpConstantTrue %31
+ %574 = OpConstantFalse %31
+ %575 = OpConstant %157 0
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ %240 = OpFunctionCall %2 %14
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %311 = OpAccessChain %245 %243 %244
+ %312 = OpLoad %157 %311
+ %313 = OpConvertFToS %6 %312
+ %315 = OpSLessThan %31 %313 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %43 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFDiv %157 %321 %259
+ %323 = OpFAdd %157 %255 %322
+ OpStore %254 %323
+ OpBranch %317
+ %324 = OpLabel
+ %325 = OpAccessChain %245 %243 %244
+ %326 = OpLoad %157 %325
+ %327 = OpConvertFToS %6 %326
+ %329 = OpSLessThan %31 %327 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %43 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFDiv %157 %335 %259
+ %337 = OpFAdd %157 %255 %336
+ OpStore %254 %337
+ OpBranch %331
+ %338 = OpLabel
+ %339 = OpAccessChain %245 %243 %244
+ %340 = OpLoad %157 %339
+ %341 = OpConvertFToS %6 %340
+ %343 = OpSLessThan %31 %341 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %43 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFDiv %157 %349 %259
+ %351 = OpFAdd %157 %255 %350
+ OpStore %254 %351
+ OpBranch %345
+ %352 = OpLabel
+ %353 = OpAccessChain %245 %243 %244
+ %354 = OpLoad %157 %353
+ %355 = OpConvertFToS %6 %354
+ %357 = OpSLessThan %31 %355 %356
+ OpSelectionMerge %359 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %43 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFDiv %157 %363 %259
+ %365 = OpFAdd %157 %255 %364
+ OpStore %254 %365
+ OpBranch %359
+ %366 = OpLabel
+ OpKill
+ %359 = OpLabel
+ OpBranch %345
+ %345 = OpLabel
+ OpBranch %331
+ %331 = OpLabel
+ OpBranch %317
+ %317 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %370 = OpLoad %157 %254
+ %372 = OpCompositeConstruct %371 %370 %370 %370
+ %374 = OpCompositeExtract %157 %372 0
+ %375 = OpCompositeExtract %157 %372 1
+ %376 = OpCompositeExtract %157 %372 2
+ %377 = OpCompositeConstruct %241 %374 %375 %376 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ %643 = OpFOrdGreaterThanEqual %31 %373 %575
+ OpLoopMerge %26 %27 None
+ OpBranchConditional %643 %28 %27
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpBranch %50
+ %50 = OpLabel
+ OpSelectionMerge %479 None
+ OpBranchConditional %49 %480 %482
+ %480 = OpLabel
+ %481 = OpLoad %6 %16
+ OpBranch %479
+ %482 = OpLabel
+ %483 = OpCopyObject %6 %484
+ OpBranch %479
+ %479 = OpLabel
+ %53 = OpPhi %6 %481 %480 %483 %482
+ %54 = OpIAdd %6 %53 %22
+ OpBranch %486
+ %486 = OpLabel
+ OpSelectionMerge %536 None
+ OpBranchConditional %49 %537 %536
+ %537 = OpLabel
+ OpStore %16 %54
+ %622 = OpAccessChain %163 %161 %105 %105
+ %623 = OpLoad %157 %622
+ %621 = OpFUnordGreaterThan %31 %373 %623
+ OpBranchConditional %621 %536 %27
+ %536 = OpLabel
+ OpBranch %485
+ %485 = OpLabel
+ %595 = OpAccessChain %163 %161 %105 %22
+ %596 = OpLoad %157 %595
+ %594 = OpFOrdGreaterThanEqual %31 %596 %575
+ OpBranchConditional %594 %490 %27
+ %490 = OpLabel
+ %491 = OpCopyObject %6 %484
+ OpBranch %488
+ %488 = OpLabel
+ OpSelectionMerge %538 None
+ OpBranchConditional %49 %539 %541
+ %539 = OpLabel
+ %540 = OpLoad %6 %18
+ OpBranch %538
+ %541 = OpLabel
+ %542 = OpCopyObject %6 %484
+ OpBranch %538
+ %538 = OpLabel
+ %489 = OpPhi %6 %540 %539 %542 %541
+ OpBranch %487
+ %487 = OpLabel
+ %55 = OpSelect %6 %49 %489 %491
+ %56 = OpIAdd %6 %55 %22
+ OpSelectionMerge %492 None
+ OpBranchConditional %49 %493 %492
+ %493 = OpLabel
+ OpStore %18 %56
+ OpBranch %492
+ %492 = OpLabel
+ %57 = OpAccessChain %43 %41 %55
+ OpBranch %497
+ %497 = OpLabel
+ %498 = OpCopyObject %6 %484
+ OpBranch %495
+ %495 = OpLabel
+ OpSelectionMerge %545 None
+ OpBranchConditional %49 %546 %548
+ %546 = OpLabel
+ %547 = OpLoad %6 %57
+ %598 = OpAccessChain %163 %161 %105 %22
+ %599 = OpLoad %157 %598
+ %597 = OpFUnordGreaterThan %31 %575 %599
+ OpBranchConditional %597 %27 %545
+ %548 = OpLabel
+ %549 = OpCopyObject %6 %484
+ %619 = OpAccessChain %163 %161 %105 %22
+ %620 = OpLoad %157 %619
+ %618 = OpFUnordGreaterThanEqual %31 %620 %575
+ OpBranchConditional %618 %545 %27
+ %545 = OpLabel
+ %496 = OpPhi %6 %547 %546 %549 %548
+ OpBranch %494
+ %494 = OpLabel
+ %58 = OpSelect %6 %49 %496 %498
+ %59 = OpAccessChain %43 %52 %53
+ OpSelectionMerge %499 None
+ OpBranchConditional %49 %500 %499
+ %500 = OpLabel
+ OpStore %59 %58
+ OpBranch %499
+ %499 = OpLabel
+ OpBranch %60
+ %60 = OpLabel
+ OpSelectionMerge %501 None
+ OpBranchConditional %49 %504 %502
+ %502 = OpLabel
+ %503 = OpLoad %6 %16
+ OpBranch %501
+ %504 = OpLabel
+ %505 = OpCopyObject %6 %484
+ OpBranch %501
+ %501 = OpLabel
+ %61 = OpPhi %6 %503 %502 %505 %504
+ %62 = OpIAdd %6 %61 %22
+ OpSelectionMerge %506 None
+ OpBranchConditional %49 %506 %507
+ %507 = OpLabel
+ OpStore %16 %62
+ OpBranch %506
+ %506 = OpLabel
+ %602 = OpAccessChain %163 %161 %105 %105
+ %603 = OpLoad %157 %602
+ %601 = OpFUnordGreaterThan %31 %373 %603
+ OpBranchConditional %601 %509 %27
+ %509 = OpLabel
+ OpSelectionMerge %559 None
+ OpBranchConditional %49 %562 %560
+ %560 = OpLabel
+ %561 = OpLoad %6 %20
+ OpBranch %559
+ %562 = OpLabel
+ %563 = OpCopyObject %6 %484
+ OpBranch %559
+ %559 = OpLabel
+ %510 = OpPhi %6 %561 %560 %563 %562
+ OpBranch %511
+ %511 = OpLabel
+ %512 = OpCopyObject %6 %484
+ OpBranch %508
+ %508 = OpLabel
+ %63 = OpSelect %6 %49 %512 %510
+ %64 = OpIAdd %6 %63 %22
+ OpSelectionMerge %513 None
+ OpBranchConditional %49 %513 %514
+ %514 = OpLabel
+ OpStore %20 %64
+ OpBranch %513
+ %513 = OpLabel
+ %65 = OpAccessChain %43 %41 %63
+ OpSelectionMerge %515 None
+ OpBranchConditional %49 %518 %516
+ %516 = OpLabel
+ %517 = OpLoad %6 %65
+ OpBranch %515
+ %518 = OpLabel
+ %519 = OpCopyObject %6 %484
+ OpBranch %515
+ %515 = OpLabel
+ %66 = OpPhi %6 %517 %516 %519 %518
+ %67 = OpAccessChain %43 %52 %61
+ OpSelectionMerge %520 None
+ OpBranchConditional %49 %520 %521
+ %521 = OpLabel
+ OpStore %67 %66
+ OpBranch %520
+ %520 = OpLabel
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# injectionSwitch
+BUFFER variant_2_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var.amber
new file mode 100644
index 0000000..6ab170d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var.amber
@@ -0,0 +1,1943 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Three shaders diff: mutated var
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 378
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %371 = OpTypeVector %157 3
+ %373 = OpConstant %157 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ %240 = OpFunctionCall %2 %14
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %311 = OpAccessChain %245 %243 %244
+ %312 = OpLoad %157 %311
+ %313 = OpConvertFToS %6 %312
+ %315 = OpSLessThan %31 %313 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %43 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFDiv %157 %321 %259
+ %323 = OpFAdd %157 %255 %322
+ OpStore %254 %323
+ OpBranch %317
+ %324 = OpLabel
+ %325 = OpAccessChain %245 %243 %244
+ %326 = OpLoad %157 %325
+ %327 = OpConvertFToS %6 %326
+ %329 = OpSLessThan %31 %327 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %43 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFDiv %157 %335 %259
+ %337 = OpFAdd %157 %255 %336
+ OpStore %254 %337
+ OpBranch %331
+ %338 = OpLabel
+ %339 = OpAccessChain %245 %243 %244
+ %340 = OpLoad %157 %339
+ %341 = OpConvertFToS %6 %340
+ %343 = OpSLessThan %31 %341 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %43 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFDiv %157 %349 %259
+ %351 = OpFAdd %157 %255 %350
+ OpStore %254 %351
+ OpBranch %345
+ %352 = OpLabel
+ %353 = OpAccessChain %245 %243 %244
+ %354 = OpLoad %157 %353
+ %355 = OpConvertFToS %6 %354
+ %357 = OpSLessThan %31 %355 %356
+ OpSelectionMerge %359 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %43 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFDiv %157 %363 %259
+ %365 = OpFAdd %157 %255 %364
+ OpStore %254 %365
+ OpBranch %359
+ %366 = OpLabel
+ OpKill
+ %359 = OpLabel
+ OpBranch %345
+ %345 = OpLabel
+ OpBranch %331
+ %331 = OpLabel
+ OpBranch %317
+ %317 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %370 = OpLoad %157 %254
+ %372 = OpCompositeConstruct %371 %370 %370 %370
+ %374 = OpCompositeExtract %157 %372 0
+ %375 = OpCompositeExtract %157 %372 1
+ %376 = OpCompositeExtract %157 %372 2
+ %377 = OpCompositeConstruct %241 %374 %375 %376 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %60
+ %50 = OpLabel
+ %53 = OpLoad %6 %16
+ %54 = OpIAdd %6 %53 %22
+ OpStore %16 %54
+ %55 = OpLoad %6 %18
+ %56 = OpIAdd %6 %55 %22
+ OpStore %18 %56
+ %57 = OpAccessChain %43 %41 %55
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %43 %52 %53
+ OpStore %59 %58
+ OpBranch %51
+ %60 = OpLabel
+ %61 = OpLoad %6 %16
+ %62 = OpIAdd %6 %61 %22
+ OpStore %16 %62
+ %63 = OpLoad %6 %20
+ %64 = OpIAdd %6 %63 %22
+ OpStore %20 %64
+ %65 = OpAccessChain %43 %41 %63
+ %66 = OpLoad %6 %65
+ %67 = OpAccessChain %43 %52 %61
+ OpStore %67 %66
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# injectionSwitch
+BUFFER reference_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 679
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %371 = OpTypeVector %157 3
+ %373 = OpConstant %157 1
+ %637 = OpConstant %6 0
+ %638 = OpConstantComposite %39 %637 %637 %637 %637 %637 %637 %637 %637 %637 %637
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %488 = OpVariable %7 Function
+ %487 = OpVariable %7 Function
+ %486 = OpVariable %7 Function
+ %485 = OpVariable %7 Function
+ %484 = OpVariable %7 Function
+ %483 = OpVariable %7 Function
+ %482 = OpVariable %7 Function
+ %481 = OpVariable %7 Function
+ %480 = OpVariable %7 Function
+ %479 = OpVariable %7 Function
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ OpStore %479 %105
+ OpStore %480 %107
+ OpStore %481 %22
+ OpBranch %489
+ %489 = OpLabel
+ OpLoopMerge %527 %524 None
+ OpBranch %490
+ %490 = OpLabel
+ %491 = OpLoad %6 %481
+ %492 = OpLoad %6 %480
+ %493 = OpSLessThanEqual %31 %491 %492
+ OpBranchConditional %493 %494 %527
+ %494 = OpLabel
+ %495 = OpLoad %6 %479
+ OpStore %482 %495
+ OpBranch %496
+ %496 = OpLabel
+ OpLoopMerge %523 %518 None
+ OpBranch %497
+ %497 = OpLabel
+ %498 = OpLoad %6 %482
+ %499 = OpLoad %6 %480
+ %500 = OpSLessThan %31 %498 %499
+ OpBranchConditional %500 %501 %523
+ %501 = OpLabel
+ %502 = OpLoad %6 %482
+ OpStore %483 %502
+ %503 = OpLoad %6 %482
+ %504 = OpLoad %6 %481
+ %505 = OpIAdd %6 %503 %504
+ %678 = OpLoad %39 %41
+ OpStore %41 %638
+ OpStore %41 %678
+ %506 = OpISub %6 %505 %22
+ OpStore %484 %506
+ %507 = OpLoad %6 %482
+ %508 = OpLoad %6 %481
+ %509 = OpIMul %6 %136 %508
+ %510 = OpIAdd %6 %507 %509
+ %511 = OpISub %6 %510 %22
+ %512 = OpLoad %6 %480
+ %513 = OpExtInst %6 %1 SMin %511 %512
+ OpStore %485 %513
+ %514 = OpLoad %6 %483
+ OpStore %486 %514
+ %515 = OpLoad %6 %484
+ OpStore %487 %515
+ %516 = OpLoad %6 %485
+ OpStore %488 %516
+ %517 = OpFunctionCall %2 %12 %486 %487 %488
+ OpBranch %518
+ %518 = OpLabel
+ %519 = OpLoad %6 %481
+ %520 = OpIMul %6 %136 %519
+ %521 = OpLoad %6 %482
+ %522 = OpIAdd %6 %521 %520
+ OpStore %482 %522
+ OpBranch %496
+ %523 = OpLabel
+ OpBranch %524
+ %524 = OpLabel
+ %525 = OpLoad %6 %481
+ %526 = OpIMul %6 %136 %525
+ OpStore %481 %526
+ OpBranch %489
+ %527 = OpLabel
+ OpBranch %478
+ %478 = OpLabel
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %311 = OpAccessChain %245 %243 %244
+ %312 = OpLoad %157 %311
+ %313 = OpConvertFToS %6 %312
+ %315 = OpSLessThan %31 %313 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %43 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFDiv %157 %321 %259
+ %323 = OpFAdd %157 %255 %322
+ OpStore %254 %323
+ OpBranch %317
+ %324 = OpLabel
+ %325 = OpAccessChain %245 %243 %244
+ %326 = OpLoad %157 %325
+ %327 = OpConvertFToS %6 %326
+ %329 = OpSLessThan %31 %327 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %43 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFDiv %157 %335 %259
+ %337 = OpFAdd %157 %255 %336
+ OpStore %254 %337
+ OpBranch %331
+ %338 = OpLabel
+ %339 = OpAccessChain %245 %243 %244
+ %340 = OpLoad %157 %339
+ %341 = OpConvertFToS %6 %340
+ %343 = OpSLessThan %31 %341 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %43 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFDiv %157 %349 %259
+ %351 = OpFAdd %157 %255 %350
+ OpStore %254 %351
+ OpBranch %345
+ %352 = OpLabel
+ %353 = OpAccessChain %245 %243 %244
+ %354 = OpLoad %157 %353
+ %355 = OpConvertFToS %6 %354
+ %357 = OpSLessThan %31 %355 %356
+ OpSelectionMerge %359 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %43 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFDiv %157 %363 %259
+ %365 = OpFAdd %157 %255 %364
+ OpStore %254 %365
+ OpBranch %359
+ %366 = OpLabel
+ OpKill
+ %359 = OpLabel
+ OpBranch %345
+ %345 = OpLabel
+ OpBranch %331
+ %331 = OpLabel
+ OpBranch %317
+ %317 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %370 = OpLoad %157 %254
+ %372 = OpCompositeConstruct %371 %370 %370 %370
+ %374 = OpCompositeExtract %157 %372 0
+ %375 = OpCompositeExtract %157 %372 1
+ %376 = OpCompositeExtract %157 %372 2
+ %377 = OpCompositeConstruct %241 %374 %375 %376 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %60
+ %50 = OpLabel
+ %53 = OpLoad %6 %16
+ %54 = OpIAdd %6 %53 %22
+ OpStore %16 %54
+ %55 = OpLoad %6 %18
+ %56 = OpIAdd %6 %55 %22
+ OpStore %18 %56
+ %57 = OpAccessChain %43 %41 %55
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %43 %52 %53
+ OpStore %59 %58
+ OpBranch %51
+ %60 = OpLabel
+ %61 = OpLoad %6 %16
+ %62 = OpIAdd %6 %61 %22
+ OpStore %16 %62
+ %63 = OpLoad %6 %20
+ %64 = OpIAdd %6 %63 %22
+ OpStore %20 %64
+ %65 = OpAccessChain %43 %41 %63
+ %66 = OpLoad %6 %65
+ %67 = OpAccessChain %43 %52 %61
+ OpStore %67 %66
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 639
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %371 = OpTypeVector %157 3
+ %373 = OpConstant %157 1
+ %637 = OpConstant %6 0
+ %638 = OpConstantComposite %39 %637 %637 %637 %637 %637 %637 %637 %637 %637 %637
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %488 = OpVariable %7 Function
+ %487 = OpVariable %7 Function
+ %486 = OpVariable %7 Function
+ %485 = OpVariable %7 Function
+ %484 = OpVariable %7 Function
+ %483 = OpVariable %7 Function
+ %482 = OpVariable %7 Function
+ %481 = OpVariable %7 Function
+ %480 = OpVariable %7 Function
+ %479 = OpVariable %7 Function
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ OpStore %479 %105
+ OpStore %480 %107
+ OpStore %481 %22
+ OpBranch %489
+ %489 = OpLabel
+ OpLoopMerge %527 %524 None
+ OpBranch %490
+ %490 = OpLabel
+ %491 = OpLoad %6 %481
+ %492 = OpLoad %6 %480
+ %493 = OpSLessThanEqual %31 %491 %492
+ OpBranchConditional %493 %494 %527
+ %494 = OpLabel
+ %495 = OpLoad %6 %479
+ OpStore %482 %495
+ OpBranch %496
+ %496 = OpLabel
+ OpLoopMerge %523 %518 None
+ OpBranch %497
+ %497 = OpLabel
+ %498 = OpLoad %6 %482
+ %499 = OpLoad %6 %480
+ %500 = OpSLessThan %31 %498 %499
+ OpBranchConditional %500 %501 %523
+ %501 = OpLabel
+ %502 = OpLoad %6 %482
+ OpStore %483 %502
+ %503 = OpLoad %6 %482
+ %504 = OpLoad %6 %481
+ %505 = OpIAdd %6 %503 %504
+ %506 = OpISub %6 %505 %22
+ OpStore %484 %506
+ %507 = OpLoad %6 %482
+ %508 = OpLoad %6 %481
+ %509 = OpIMul %6 %136 %508
+ %510 = OpIAdd %6 %507 %509
+ %511 = OpISub %6 %510 %22
+ %512 = OpLoad %6 %480
+ %513 = OpExtInst %6 %1 SMin %511 %512
+ OpStore %485 %513
+ %514 = OpLoad %6 %483
+ OpStore %486 %514
+ %515 = OpLoad %6 %484
+ OpStore %487 %515
+ %516 = OpLoad %6 %485
+ OpStore %488 %516
+ %517 = OpFunctionCall %2 %12 %486 %487 %488
+ OpBranch %518
+ %518 = OpLabel
+ %519 = OpLoad %6 %481
+ %520 = OpIMul %6 %136 %519
+ %521 = OpLoad %6 %482
+ %522 = OpIAdd %6 %521 %520
+ OpStore %482 %522
+ OpBranch %496
+ %523 = OpLabel
+ OpBranch %524
+ %524 = OpLabel
+ %525 = OpLoad %6 %481
+ %526 = OpIMul %6 %136 %525
+ OpStore %481 %526
+ OpBranch %489
+ %527 = OpLabel
+ OpBranch %478
+ %478 = OpLabel
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %311 = OpAccessChain %245 %243 %244
+ %312 = OpLoad %157 %311
+ %313 = OpConvertFToS %6 %312
+ %315 = OpSLessThan %31 %313 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %43 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFDiv %157 %321 %259
+ %323 = OpFAdd %157 %255 %322
+ OpStore %254 %323
+ OpBranch %317
+ %324 = OpLabel
+ %325 = OpAccessChain %245 %243 %244
+ %326 = OpLoad %157 %325
+ %327 = OpConvertFToS %6 %326
+ %329 = OpSLessThan %31 %327 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %43 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFDiv %157 %335 %259
+ %337 = OpFAdd %157 %255 %336
+ OpStore %254 %337
+ OpBranch %331
+ %338 = OpLabel
+ %339 = OpAccessChain %245 %243 %244
+ %340 = OpLoad %157 %339
+ %341 = OpConvertFToS %6 %340
+ %343 = OpSLessThan %31 %341 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %43 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFDiv %157 %349 %259
+ %351 = OpFAdd %157 %255 %350
+ OpStore %254 %351
+ OpBranch %345
+ %352 = OpLabel
+ %353 = OpAccessChain %245 %243 %244
+ %354 = OpLoad %157 %353
+ %355 = OpConvertFToS %6 %354
+ %357 = OpSLessThan %31 %355 %356
+ OpSelectionMerge %359 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %43 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFDiv %157 %363 %259
+ %365 = OpFAdd %157 %255 %364
+ OpStore %254 %365
+ OpBranch %359
+ %366 = OpLabel
+ OpKill
+ %359 = OpLabel
+ OpBranch %345
+ %345 = OpLabel
+ OpBranch %331
+ %331 = OpLabel
+ OpBranch %317
+ %317 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %370 = OpLoad %157 %254
+ %372 = OpCompositeConstruct %371 %370 %370 %370
+ %374 = OpCompositeExtract %157 %372 0
+ %375 = OpCompositeExtract %157 %372 1
+ %376 = OpCompositeExtract %157 %372 2
+ %377 = OpCompositeConstruct %241 %374 %375 %376 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %60
+ %50 = OpLabel
+ %53 = OpLoad %6 %16
+ %54 = OpIAdd %6 %53 %22
+ OpStore %16 %54
+ %55 = OpLoad %6 %18
+ %56 = OpIAdd %6 %55 %22
+ OpStore %18 %56
+ %57 = OpAccessChain %43 %41 %55
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %43 %52 %53
+ OpStore %59 %58
+ OpBranch %51
+ %60 = OpLabel
+ %61 = OpLoad %6 %16
+ %62 = OpIAdd %6 %61 %22
+ OpStore %16 %62
+ %63 = OpLoad %6 %20
+ %64 = OpIAdd %6 %63 %22
+ OpStore %20 %64
+ %65 = OpAccessChain %43 %41 %63
+ %66 = OpLoad %6 %65
+ %67 = OpAccessChain %43 %52 %61
+ OpStore %67 %66
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# injectionSwitch
+BUFFER variant_2_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-orbit-O-mutate-variable.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-orbit-O-mutate-variable.amber
new file mode 100644
index 0000000..d8dace3
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-orbit-O-mutate-variable.amber
@@ -0,0 +1,418 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Two shaders with diff: variable mutated
+
+# The test renders two images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 230
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53 %138
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %53 "gl_FragCoord"
+ OpName %56 "buf0"
+ OpMemberName %56 0 "resolution"
+ OpName %58 ""
+ OpName %138 "_GLF_color"
+ OpName %163 "indexable"
+ OpDecorate %53 BuiltIn FragCoord
+ OpMemberDecorate %56 0 Offset 0
+ OpDecorate %56 Block
+ OpDecorate %58 DescriptorSet 0
+ OpDecorate %58 Binding 0
+ OpDecorate %138 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %13 = OpTypeInt 32 0
+ %18 = OpConstant %6 0
+ %19 = OpTypeBool
+ %26 = OpConstant %6 1
+ %38 = OpConstant %6 2
+ %47 = OpTypeFloat 32
+ %48 = OpTypeVector %47 2
+ %51 = OpTypeVector %47 4
+ %52 = OpTypePointer Input %51
+ %53 = OpVariable %52 Input
+ %56 = OpTypeStruct %48
+ %57 = OpTypePointer Uniform %56
+ %58 = OpVariable %57 Uniform
+ %59 = OpTypePointer Uniform %48
+ %67 = OpConstant %47 8
+ %78 = OpConstant %6 5
+ %82 = OpConstant %6 10
+ %95 = OpConstant %6 8
+ %107 = OpConstant %6 100
+ %130 = OpConstant %6 15
+ %132 = OpConstant %6 16
+ %137 = OpTypePointer Output %51
+ %138 = OpVariable %137 Output
+ %139 = OpConstant %13 16
+ %140 = OpTypeArray %51 %139
+ %141 = OpConstant %47 0
+ %142 = OpConstant %47 1
+ %143 = OpConstantComposite %51 %141 %141 %141 %142
+ %144 = OpConstant %47 0.5
+ %145 = OpConstantComposite %51 %144 %141 %141 %142
+ %146 = OpConstantComposite %51 %141 %144 %141 %142
+ %147 = OpConstantComposite %51 %144 %144 %141 %142
+ %148 = OpConstantComposite %51 %141 %141 %144 %142
+ %149 = OpConstantComposite %51 %144 %141 %144 %142
+ %150 = OpConstantComposite %51 %141 %144 %144 %142
+ %151 = OpConstantComposite %51 %144 %144 %144 %142
+ %152 = OpConstantComposite %51 %142 %141 %141 %142
+ %153 = OpConstantComposite %51 %141 %142 %141 %142
+ %154 = OpConstantComposite %51 %142 %142 %141 %142
+ %155 = OpConstantComposite %51 %141 %141 %142 %142
+ %156 = OpConstantComposite %51 %142 %141 %142 %142
+ %157 = OpConstantComposite %51 %141 %142 %142 %142
+ %158 = OpConstantComposite %51 %142 %142 %142 %142
+ %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
+ %162 = OpTypePointer Function %140
+ %164 = OpTypePointer Function %51
+ %229 = OpUndef %7
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %163 = OpVariable %162 Function
+ %54 = OpLoad %51 %53
+ %55 = OpVectorShuffle %48 %54 %54 0 1
+ %60 = OpAccessChain %59 %58 %18
+ %61 = OpLoad %48 %60
+ %62 = OpFDiv %48 %55 %61
+ %66 = OpCompositeExtract %47 %62 0
+ %68 = OpFMul %47 %66 %67
+ %69 = OpConvertFToS %6 %68
+ %71 = OpCompositeExtract %47 %62 1
+ %72 = OpFMul %47 %71 %67
+ %73 = OpConvertFToS %6 %72
+ %79 = OpBitwiseAnd %6 %69 %78
+ %83 = OpBitwiseAnd %6 %73 %82
+ %84 = OpBitwiseOr %6 %79 %83
+ %88 = OpBitwiseAnd %6 %73 %78
+ %91 = OpBitwiseAnd %6 %69 %82
+ %92 = OpBitwiseOr %6 %88 %91
+ %96 = OpIMul %6 %84 %95
+ %98 = OpIAdd %6 %96 %92
+ %99 = OpCompositeConstruct %7 %98 %18
+ OpBranch %101
+ %101 = OpLabel
+ %221 = OpPhi %7 %99 %5 %210 %104
+ %220 = OpPhi %6 %18 %5 %113 %104
+ %108 = OpSLessThan %19 %220 %107
+ OpLoopMerge %103 %104 None
+ OpBranchConditional %108 %102 %103
+ %102 = OpLabel
+ %170 = OpCompositeExtract %6 %221 0
+ %171 = OpSGreaterThan %19 %170 %18
+ OpSelectionMerge %176 None
+ OpBranchConditional %171 %172 %176
+ %172 = OpLabel
+ %174 = OpCompositeExtract %6 %221 1
+ %175 = OpISub %6 %174 %26
+ %202 = OpCompositeInsert %7 %175 %221 1
+ OpBranch %176
+ %176 = OpLabel
+ %224 = OpPhi %7 %221 %102 %202 %172
+ %178 = OpCompositeExtract %6 %224 0
+ %179 = OpSLessThan %19 %178 %18
+ OpSelectionMerge %184 None
+ OpBranchConditional %179 %180 %184
+ %180 = OpLabel
+ %182 = OpCompositeExtract %6 %224 1
+ %183 = OpIAdd %6 %182 %26
+ %206 = OpCompositeInsert %7 %183 %224 1
+ OpBranch %184
+ %184 = OpLabel
+ %225 = OpPhi %7 %224 %176 %206 %180
+ %186 = OpCompositeExtract %6 %225 1
+ %187 = OpSDiv %6 %186 %38
+ %189 = OpCompositeExtract %6 %225 0
+ %190 = OpIAdd %6 %189 %187
+ %210 = OpCompositeInsert %7 %190 %225 0
+ OpBranch %104
+ %104 = OpLabel
+ %113 = OpIAdd %6 %220 %26
+ OpBranch %101
+ %103 = OpLabel
+ %115 = OpCompositeExtract %6 %221 0
+ %116 = OpSLessThan %19 %115 %18
+ OpSelectionMerge %118 None
+ OpBranchConditional %116 %117 %118
+ %117 = OpLabel
+ %121 = OpSNegate %6 %115
+ %214 = OpCompositeInsert %7 %121 %229 0
+ OpBranch %118
+ %118 = OpLabel
+ %223 = OpPhi %7 %221 %103 %214 %117
+ OpBranch %123
+ %123 = OpLabel
+ %222 = OpPhi %7 %223 %118 %218 %124
+ %129 = OpCompositeExtract %6 %222 0
+ %131 = OpSGreaterThan %19 %129 %130
+ OpLoopMerge %125 %124 None
+ OpBranchConditional %131 %124 %125
+ %124 = OpLabel
+ %135 = OpISub %6 %129 %132
+ %218 = OpCompositeInsert %7 %135 %229 0
+ OpBranch %123
+ %125 = OpLabel
+ OpStore %163 %159
+ %165 = OpAccessChain %164 %163 %129
+ %166 = OpLoad %51 %165
+ OpStore %138 %166
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 399
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53 %138
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %53 "gl_FragCoord"
+ OpName %56 "buf0"
+ OpMemberName %56 0 "resolution"
+ OpName %58 ""
+ OpName %138 "_GLF_color"
+ OpName %163 "indexable"
+ OpDecorate %53 BuiltIn FragCoord
+ OpMemberDecorate %56 0 Offset 0
+ OpDecorate %56 Block
+ OpDecorate %58 DescriptorSet 0
+ OpDecorate %58 Binding 0
+ OpDecorate %138 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %13 = OpTypeInt 32 0
+ %18 = OpConstant %6 0
+ %19 = OpTypeBool
+ %26 = OpConstant %6 1
+ %38 = OpConstant %6 2
+ %47 = OpTypeFloat 32
+ %48 = OpTypeVector %47 2
+ %51 = OpTypeVector %47 4
+ %52 = OpTypePointer Input %51
+ %53 = OpVariable %52 Input
+ %56 = OpTypeStruct %48
+ %57 = OpTypePointer Uniform %56
+ %58 = OpVariable %57 Uniform
+ %59 = OpTypePointer Uniform %48
+ %67 = OpConstant %47 8
+ %78 = OpConstant %6 5
+ %82 = OpConstant %6 10
+ %95 = OpConstant %6 8
+ %107 = OpConstant %6 100
+ %130 = OpConstant %6 15
+ %132 = OpConstant %6 16
+ %137 = OpTypePointer Output %51
+ %138 = OpVariable %137 Output
+ %139 = OpConstant %13 16
+ %140 = OpTypeArray %51 %139
+ %141 = OpConstant %47 0
+ %142 = OpConstant %47 1
+ %143 = OpConstantComposite %51 %141 %141 %141 %142
+ %144 = OpConstant %47 0.5
+ %145 = OpConstantComposite %51 %144 %141 %141 %142
+ %146 = OpConstantComposite %51 %141 %144 %141 %142
+ %147 = OpConstantComposite %51 %144 %144 %141 %142
+ %148 = OpConstantComposite %51 %141 %141 %144 %142
+ %149 = OpConstantComposite %51 %144 %141 %144 %142
+ %150 = OpConstantComposite %51 %141 %144 %144 %142
+ %151 = OpConstantComposite %51 %144 %144 %144 %142
+ %152 = OpConstantComposite %51 %142 %141 %141 %142
+ %153 = OpConstantComposite %51 %141 %142 %141 %142
+ %154 = OpConstantComposite %51 %142 %142 %141 %142
+ %155 = OpConstantComposite %51 %141 %141 %142 %142
+ %156 = OpConstantComposite %51 %142 %141 %142 %142
+ %157 = OpConstantComposite %51 %141 %142 %142 %142
+ %158 = OpConstantComposite %51 %142 %142 %142 %142
+ %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
+ %162 = OpTypePointer Function %140
+ %164 = OpTypePointer Function %51
+ %229 = OpUndef %7
+ %354 = OpConstant %47 0
+ %355 = OpConstantComposite %51 %354 %354 %354 %354
+ %356 = OpConstantComposite %140 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355 %355
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %163 = OpVariable %162 Function
+ %54 = OpLoad %51 %53
+ %55 = OpVectorShuffle %48 %54 %54 0 1
+ %60 = OpAccessChain %59 %58 %18
+ %61 = OpLoad %48 %60
+ %62 = OpFDiv %48 %55 %61
+ %66 = OpCompositeExtract %47 %62 0
+ %68 = OpFMul %47 %66 %67
+ %69 = OpConvertFToS %6 %68
+ %71 = OpCompositeExtract %47 %62 1
+ %72 = OpFMul %47 %71 %67
+ %73 = OpConvertFToS %6 %72
+ %79 = OpBitwiseAnd %6 %69 %78
+ %83 = OpBitwiseAnd %6 %73 %82
+ %84 = OpBitwiseOr %6 %79 %83
+ %88 = OpBitwiseAnd %6 %73 %78
+ %91 = OpBitwiseAnd %6 %69 %82
+ %92 = OpBitwiseOr %6 %88 %91
+ %96 = OpIMul %6 %84 %95
+ %98 = OpIAdd %6 %96 %92
+ %99 = OpCompositeConstruct %7 %98 %18
+ OpBranch %101
+ %101 = OpLabel
+ %221 = OpPhi %7 %99 %5 %210 %104
+ %220 = OpPhi %6 %18 %5 %113 %104
+ %108 = OpSLessThan %19 %220 %107
+ OpLoopMerge %103 %104 None
+ OpBranchConditional %108 %102 %103
+ %102 = OpLabel
+ %170 = OpCompositeExtract %6 %221 0
+ %171 = OpSGreaterThan %19 %170 %18
+ OpSelectionMerge %176 None
+ OpBranchConditional %171 %172 %176
+ %172 = OpLabel
+ %174 = OpCompositeExtract %6 %221 1
+ %175 = OpISub %6 %174 %26
+ %202 = OpCompositeInsert %7 %175 %221 1
+ OpBranch %176
+ %176 = OpLabel
+ %224 = OpPhi %7 %221 %102 %202 %172
+ %178 = OpCompositeExtract %6 %224 0
+ %179 = OpSLessThan %19 %178 %18
+ OpSelectionMerge %184 None
+ OpBranchConditional %179 %180 %184
+ %180 = OpLabel
+ %182 = OpCompositeExtract %6 %224 1
+ %183 = OpIAdd %6 %182 %26
+ %206 = OpCompositeInsert %7 %183 %224 1
+ OpBranch %184
+ %184 = OpLabel
+ %225 = OpPhi %7 %224 %176 %206 %180
+ %186 = OpCompositeExtract %6 %225 1
+ %187 = OpSDiv %6 %186 %38
+ %189 = OpCompositeExtract %6 %225 0
+ %190 = OpIAdd %6 %189 %187
+ %210 = OpCompositeInsert %7 %190 %225 0
+ OpBranch %104
+ %104 = OpLabel
+ %113 = OpIAdd %6 %220 %26
+ OpBranch %101
+ %103 = OpLabel
+ %115 = OpCompositeExtract %6 %221 0
+ %116 = OpSLessThan %19 %115 %18
+ OpSelectionMerge %118 None
+ OpBranchConditional %116 %117 %118
+ %117 = OpLabel
+ %121 = OpSNegate %6 %115
+ %214 = OpCompositeInsert %7 %121 %229 0
+ OpBranch %118
+ %118 = OpLabel
+ %223 = OpPhi %7 %221 %103 %214 %117
+ OpBranch %123
+ %123 = OpLabel
+ %222 = OpPhi %7 %223 %118 %218 %124
+ %129 = OpCompositeExtract %6 %222 0
+ %131 = OpSGreaterThan %19 %129 %130
+ OpLoopMerge %125 %124 None
+ OpBranchConditional %131 %124 %125
+ %124 = OpLabel
+ %135 = OpISub %6 %129 %132
+ %218 = OpCompositeInsert %7 %135 %229 0
+ OpBranch %123
+ %125 = OpLabel
+ OpStore %163 %159
+ %398 = OpLoad %140 %163
+ OpStore %163 %356
+ OpStore %163 %398
+ %165 = OpAccessChain %164 %163 %129
+ %166 = OpLoad %51 %165
+ OpStore %138 %166
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer.amber
new file mode 100644
index 0000000..1f046a5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer.amber
@@ -0,0 +1,614 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Three shaders with diff: added mutate pointer
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 229
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53 %138
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %53 "gl_FragCoord"
+ OpName %56 "buf0"
+ OpMemberName %56 0 "resolution"
+ OpName %58 ""
+ OpName %138 "_GLF_color"
+ OpName %163 "indexable"
+ OpDecorate %53 BuiltIn FragCoord
+ OpMemberDecorate %56 0 Offset 0
+ OpDecorate %56 Block
+ OpDecorate %58 DescriptorSet 0
+ OpDecorate %58 Binding 0
+ OpDecorate %138 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %13 = OpTypeInt 32 0
+ %18 = OpConstant %6 0
+ %19 = OpTypeBool
+ %26 = OpConstant %6 1
+ %38 = OpConstant %6 2
+ %47 = OpTypeFloat 32
+ %48 = OpTypeVector %47 2
+ %51 = OpTypeVector %47 4
+ %52 = OpTypePointer Input %51
+ %53 = OpVariable %52 Input
+ %56 = OpTypeStruct %48
+ %57 = OpTypePointer Uniform %56
+ %58 = OpVariable %57 Uniform
+ %59 = OpTypePointer Uniform %48
+ %67 = OpConstant %47 8
+ %78 = OpConstant %6 5
+ %82 = OpConstant %6 10
+ %95 = OpConstant %6 8
+ %107 = OpConstant %6 100
+ %130 = OpConstant %6 15
+ %132 = OpConstant %6 16
+ %137 = OpTypePointer Output %51
+ %138 = OpVariable %137 Output
+ %139 = OpConstant %13 16
+ %140 = OpTypeArray %51 %139
+ %141 = OpConstant %47 0
+ %142 = OpConstant %47 1
+ %143 = OpConstantComposite %51 %141 %141 %141 %142
+ %144 = OpConstant %47 0.5
+ %145 = OpConstantComposite %51 %144 %141 %141 %142
+ %146 = OpConstantComposite %51 %141 %144 %141 %142
+ %147 = OpConstantComposite %51 %144 %144 %141 %142
+ %148 = OpConstantComposite %51 %141 %141 %144 %142
+ %149 = OpConstantComposite %51 %144 %141 %144 %142
+ %150 = OpConstantComposite %51 %141 %144 %144 %142
+ %151 = OpConstantComposite %51 %144 %144 %144 %142
+ %152 = OpConstantComposite %51 %142 %141 %141 %142
+ %153 = OpConstantComposite %51 %141 %142 %141 %142
+ %154 = OpConstantComposite %51 %142 %142 %141 %142
+ %155 = OpConstantComposite %51 %141 %141 %142 %142
+ %156 = OpConstantComposite %51 %142 %141 %142 %142
+ %157 = OpConstantComposite %51 %141 %142 %142 %142
+ %158 = OpConstantComposite %51 %142 %142 %142 %142
+ %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
+ %162 = OpTypePointer Function %140
+ %164 = OpTypePointer Function %51
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %163 = OpVariable %162 Function
+ %54 = OpLoad %51 %53
+ %55 = OpVectorShuffle %48 %54 %54 0 1
+ %60 = OpAccessChain %59 %58 %18
+ %61 = OpLoad %48 %60
+ %62 = OpFDiv %48 %55 %61
+ %66 = OpCompositeExtract %47 %62 0
+ %68 = OpFMul %47 %66 %67
+ %69 = OpConvertFToS %6 %68
+ %71 = OpCompositeExtract %47 %62 1
+ %72 = OpFMul %47 %71 %67
+ %73 = OpConvertFToS %6 %72
+ %79 = OpBitwiseAnd %6 %69 %78
+ %83 = OpBitwiseAnd %6 %73 %82
+ %84 = OpBitwiseOr %6 %79 %83
+ %88 = OpBitwiseAnd %6 %73 %78
+ %91 = OpBitwiseAnd %6 %69 %82
+ %92 = OpBitwiseOr %6 %88 %91
+ %96 = OpIMul %6 %84 %95
+ %98 = OpIAdd %6 %96 %92
+ %99 = OpCompositeConstruct %7 %98 %18
+ OpBranch %101
+ %101 = OpLabel
+ %224 = OpPhi %7 %99 %5 %214 %104
+ %193 = OpPhi %6 %18 %5 %113 %104
+ %108 = OpSLessThan %19 %193 %107
+ OpLoopMerge %103 %104 None
+ OpBranchConditional %108 %102 %103
+ %102 = OpLabel
+ %170 = OpCompositeExtract %6 %224 0
+ %171 = OpSGreaterThan %19 %170 %18
+ OpSelectionMerge %176 None
+ OpBranchConditional %171 %172 %176
+ %172 = OpLabel
+ %174 = OpCompositeExtract %6 %224 1
+ %175 = OpISub %6 %174 %26
+ %206 = OpCompositeInsert %7 %175 %224 1
+ OpBranch %176
+ %176 = OpLabel
+ %227 = OpPhi %7 %224 %102 %206 %172
+ %178 = OpCompositeExtract %6 %227 0
+ %179 = OpSLessThan %19 %178 %18
+ OpSelectionMerge %184 None
+ OpBranchConditional %179 %180 %184
+ %180 = OpLabel
+ %182 = OpCompositeExtract %6 %227 1
+ %183 = OpIAdd %6 %182 %26
+ %210 = OpCompositeInsert %7 %183 %227 1
+ OpBranch %184
+ %184 = OpLabel
+ %228 = OpPhi %7 %227 %176 %210 %180
+ %186 = OpCompositeExtract %6 %228 1
+ %187 = OpSDiv %6 %186 %38
+ %189 = OpCompositeExtract %6 %228 0
+ %190 = OpIAdd %6 %189 %187
+ %214 = OpCompositeInsert %7 %190 %228 0
+ OpBranch %104
+ %104 = OpLabel
+ %113 = OpIAdd %6 %193 %26
+ OpBranch %101
+ %103 = OpLabel
+ %115 = OpCompositeExtract %6 %224 0
+ %116 = OpSLessThan %19 %115 %18
+ OpSelectionMerge %118 None
+ OpBranchConditional %116 %117 %118
+ %117 = OpLabel
+ %121 = OpSNegate %6 %115
+ %218 = OpCompositeInsert %7 %121 %224 0
+ OpBranch %118
+ %118 = OpLabel
+ %226 = OpPhi %7 %224 %103 %218 %117
+ OpBranch %123
+ %123 = OpLabel
+ %225 = OpPhi %7 %226 %118 %222 %124
+ %129 = OpCompositeExtract %6 %225 0
+ %131 = OpSGreaterThan %19 %129 %130
+ OpLoopMerge %125 %124 None
+ OpBranchConditional %131 %124 %125
+ %124 = OpLabel
+ %135 = OpISub %6 %129 %132
+ %222 = OpCompositeInsert %7 %135 %225 0
+ OpBranch %123
+ %125 = OpLabel
+ OpStore %163 %159
+ %165 = OpAccessChain %164 %163 %129
+ %166 = OpLoad %51 %165
+ OpStore %138 %166
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 549
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53 %138
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %53 "gl_FragCoord"
+ OpName %56 "buf0"
+ OpMemberName %56 0 "resolution"
+ OpName %58 ""
+ OpName %138 "_GLF_color"
+ OpName %163 "indexable"
+ OpDecorate %53 BuiltIn FragCoord
+ OpMemberDecorate %56 0 Offset 0
+ OpDecorate %56 Block
+ OpDecorate %58 DescriptorSet 0
+ OpDecorate %58 Binding 0
+ OpDecorate %138 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %13 = OpTypeInt 32 0
+ %18 = OpConstant %6 0
+ %19 = OpTypeBool
+ %26 = OpConstant %6 1
+ %38 = OpConstant %6 2
+ %47 = OpTypeFloat 32
+ %48 = OpTypeVector %47 2
+ %51 = OpTypeVector %47 4
+ %52 = OpTypePointer Input %51
+ %53 = OpVariable %52 Input
+ %56 = OpTypeStruct %48
+ %57 = OpTypePointer Uniform %56
+ %58 = OpVariable %57 Uniform
+ %59 = OpTypePointer Uniform %48
+ %67 = OpConstant %47 8
+ %78 = OpConstant %6 5
+ %82 = OpConstant %6 10
+ %95 = OpConstant %6 8
+ %107 = OpConstant %6 100
+ %130 = OpConstant %6 15
+ %132 = OpConstant %6 16
+ %137 = OpTypePointer Output %51
+ %138 = OpVariable %137 Output
+ %139 = OpConstant %13 16
+ %140 = OpTypeArray %51 %139
+ %141 = OpConstant %47 0
+ %142 = OpConstant %47 1
+ %143 = OpConstantComposite %51 %141 %141 %141 %142
+ %144 = OpConstant %47 0.5
+ %145 = OpConstantComposite %51 %144 %141 %141 %142
+ %146 = OpConstantComposite %51 %141 %144 %141 %142
+ %147 = OpConstantComposite %51 %144 %144 %141 %142
+ %148 = OpConstantComposite %51 %141 %141 %144 %142
+ %149 = OpConstantComposite %51 %144 %141 %144 %142
+ %150 = OpConstantComposite %51 %141 %144 %144 %142
+ %151 = OpConstantComposite %51 %144 %144 %144 %142
+ %152 = OpConstantComposite %51 %142 %141 %141 %142
+ %153 = OpConstantComposite %51 %141 %142 %141 %142
+ %154 = OpConstantComposite %51 %142 %142 %141 %142
+ %155 = OpConstantComposite %51 %141 %141 %142 %142
+ %156 = OpConstantComposite %51 %142 %141 %142 %142
+ %157 = OpConstantComposite %51 %141 %142 %142 %142
+ %158 = OpConstantComposite %51 %142 %142 %142 %142
+ %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
+ %162 = OpTypePointer Function %140
+ %164 = OpTypePointer Function %51
+ %440 = OpConstant %47 0
+ %441 = OpConstantComposite %51 %440 %440 %440 %440
+ %442 = OpConstantComposite %140 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %163 = OpVariable %162 Function
+ %54 = OpLoad %51 %53
+ %55 = OpVectorShuffle %48 %54 %54 0 1
+ %60 = OpAccessChain %59 %58 %18
+ %61 = OpLoad %48 %60
+ %62 = OpFDiv %48 %55 %61
+ %66 = OpCompositeExtract %47 %62 0
+ %68 = OpFMul %47 %66 %67
+ %69 = OpConvertFToS %6 %68
+ %330 = OpAccessChain %162 %163
+ %71 = OpCompositeExtract %47 %62 1
+ %72 = OpFMul %47 %71 %67
+ %73 = OpConvertFToS %6 %72
+ %79 = OpBitwiseAnd %6 %69 %78
+ %83 = OpBitwiseAnd %6 %73 %82
+ %84 = OpBitwiseOr %6 %79 %83
+ %88 = OpBitwiseAnd %6 %73 %78
+ %91 = OpBitwiseAnd %6 %69 %82
+ %92 = OpBitwiseOr %6 %88 %91
+ %96 = OpIMul %6 %84 %95
+ %98 = OpIAdd %6 %96 %92
+ %99 = OpCompositeConstruct %7 %98 %18
+ OpBranch %101
+ %101 = OpLabel
+ %224 = OpPhi %7 %99 %5 %214 %104
+ %193 = OpPhi %6 %18 %5 %113 %104
+ %108 = OpSLessThan %19 %193 %107
+ OpLoopMerge %103 %104 None
+ OpBranchConditional %108 %102 %103
+ %102 = OpLabel
+ %170 = OpCompositeExtract %6 %224 0
+ %171 = OpSGreaterThan %19 %170 %18
+ OpSelectionMerge %176 None
+ OpBranchConditional %171 %172 %176
+ %172 = OpLabel
+ %174 = OpCompositeExtract %6 %224 1
+ %175 = OpISub %6 %174 %26
+ %206 = OpCompositeInsert %7 %175 %224 1
+ OpBranch %176
+ %176 = OpLabel
+ %227 = OpPhi %7 %224 %102 %206 %172
+ %178 = OpCompositeExtract %6 %227 0
+ %179 = OpSLessThan %19 %178 %18
+ OpSelectionMerge %184 None
+ OpBranchConditional %179 %180 %184
+ %180 = OpLabel
+ %182 = OpCompositeExtract %6 %227 1
+ %183 = OpIAdd %6 %182 %26
+ %210 = OpCompositeInsert %7 %183 %227 1
+ OpBranch %184
+ %184 = OpLabel
+ %228 = OpPhi %7 %227 %176 %210 %180
+ %186 = OpCompositeExtract %6 %228 1
+ %187 = OpSDiv %6 %186 %38
+ %189 = OpCompositeExtract %6 %228 0
+ %190 = OpIAdd %6 %189 %187
+ %214 = OpCompositeInsert %7 %190 %228 0
+ OpBranch %104
+ %104 = OpLabel
+ %113 = OpIAdd %6 %193 %26
+ OpBranch %101
+ %103 = OpLabel
+ %115 = OpCompositeExtract %6 %224 0
+ %116 = OpSLessThan %19 %115 %18
+ OpSelectionMerge %118 None
+ OpBranchConditional %116 %117 %118
+ %117 = OpLabel
+ %121 = OpSNegate %6 %115
+ %218 = OpCompositeInsert %7 %121 %224 0
+ OpBranch %118
+ %118 = OpLabel
+ %226 = OpPhi %7 %224 %103 %218 %117
+ OpBranch %123
+ %123 = OpLabel
+ %225 = OpPhi %7 %226 %118 %222 %124
+ %129 = OpCompositeExtract %6 %225 0
+ %131 = OpSGreaterThan %19 %129 %130
+ OpLoopMerge %125 %124 None
+ OpBranchConditional %131 %124 %125
+ %124 = OpLabel
+ %135 = OpISub %6 %129 %132
+ %222 = OpCompositeInsert %7 %135 %225 0
+ OpBranch %123
+ %125 = OpLabel
+ OpStore %163 %159
+ %165 = OpAccessChain %164 %163 %129
+ %548 = OpLoad %140 %330
+ OpStore %330 %442
+ OpStore %330 %548
+ %166 = OpLoad %51 %165
+ OpStore %138 %166
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 443
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %53 %138
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %53 "gl_FragCoord"
+ OpName %56 "buf0"
+ OpMemberName %56 0 "resolution"
+ OpName %58 ""
+ OpName %138 "_GLF_color"
+ OpName %163 "indexable"
+ OpDecorate %53 BuiltIn FragCoord
+ OpMemberDecorate %56 0 Offset 0
+ OpDecorate %56 Block
+ OpDecorate %58 DescriptorSet 0
+ OpDecorate %58 Binding 0
+ OpDecorate %138 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %13 = OpTypeInt 32 0
+ %18 = OpConstant %6 0
+ %19 = OpTypeBool
+ %26 = OpConstant %6 1
+ %38 = OpConstant %6 2
+ %47 = OpTypeFloat 32
+ %48 = OpTypeVector %47 2
+ %51 = OpTypeVector %47 4
+ %52 = OpTypePointer Input %51
+ %53 = OpVariable %52 Input
+ %56 = OpTypeStruct %48
+ %57 = OpTypePointer Uniform %56
+ %58 = OpVariable %57 Uniform
+ %59 = OpTypePointer Uniform %48
+ %67 = OpConstant %47 8
+ %78 = OpConstant %6 5
+ %82 = OpConstant %6 10
+ %95 = OpConstant %6 8
+ %107 = OpConstant %6 100
+ %130 = OpConstant %6 15
+ %132 = OpConstant %6 16
+ %137 = OpTypePointer Output %51
+ %138 = OpVariable %137 Output
+ %139 = OpConstant %13 16
+ %140 = OpTypeArray %51 %139
+ %141 = OpConstant %47 0
+ %142 = OpConstant %47 1
+ %143 = OpConstantComposite %51 %141 %141 %141 %142
+ %144 = OpConstant %47 0.5
+ %145 = OpConstantComposite %51 %144 %141 %141 %142
+ %146 = OpConstantComposite %51 %141 %144 %141 %142
+ %147 = OpConstantComposite %51 %144 %144 %141 %142
+ %148 = OpConstantComposite %51 %141 %141 %144 %142
+ %149 = OpConstantComposite %51 %144 %141 %144 %142
+ %150 = OpConstantComposite %51 %141 %144 %144 %142
+ %151 = OpConstantComposite %51 %144 %144 %144 %142
+ %152 = OpConstantComposite %51 %142 %141 %141 %142
+ %153 = OpConstantComposite %51 %141 %142 %141 %142
+ %154 = OpConstantComposite %51 %142 %142 %141 %142
+ %155 = OpConstantComposite %51 %141 %141 %142 %142
+ %156 = OpConstantComposite %51 %142 %141 %142 %142
+ %157 = OpConstantComposite %51 %141 %142 %142 %142
+ %158 = OpConstantComposite %51 %142 %142 %142 %142
+ %159 = OpConstantComposite %140 %143 %145 %146 %147 %148 %149 %150 %151 %143 %152 %153 %154 %155 %156 %157 %158
+ %162 = OpTypePointer Function %140
+ %164 = OpTypePointer Function %51
+ %440 = OpConstant %47 0
+ %441 = OpConstantComposite %51 %440 %440 %440 %440
+ %442 = OpConstantComposite %140 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441 %441
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %163 = OpVariable %162 Function
+ %54 = OpLoad %51 %53
+ %55 = OpVectorShuffle %48 %54 %54 0 1
+ %60 = OpAccessChain %59 %58 %18
+ %61 = OpLoad %48 %60
+ %62 = OpFDiv %48 %55 %61
+ %66 = OpCompositeExtract %47 %62 0
+ %68 = OpFMul %47 %66 %67
+ %69 = OpConvertFToS %6 %68
+ %330 = OpAccessChain %162 %163
+ %71 = OpCompositeExtract %47 %62 1
+ %72 = OpFMul %47 %71 %67
+ %73 = OpConvertFToS %6 %72
+ %79 = OpBitwiseAnd %6 %69 %78
+ %83 = OpBitwiseAnd %6 %73 %82
+ %84 = OpBitwiseOr %6 %79 %83
+ %88 = OpBitwiseAnd %6 %73 %78
+ %91 = OpBitwiseAnd %6 %69 %82
+ %92 = OpBitwiseOr %6 %88 %91
+ %96 = OpIMul %6 %84 %95
+ %98 = OpIAdd %6 %96 %92
+ %99 = OpCompositeConstruct %7 %98 %18
+ OpBranch %101
+ %101 = OpLabel
+ %224 = OpPhi %7 %99 %5 %214 %104
+ %193 = OpPhi %6 %18 %5 %113 %104
+ %108 = OpSLessThan %19 %193 %107
+ OpLoopMerge %103 %104 None
+ OpBranchConditional %108 %102 %103
+ %102 = OpLabel
+ %170 = OpCompositeExtract %6 %224 0
+ %171 = OpSGreaterThan %19 %170 %18
+ OpSelectionMerge %176 None
+ OpBranchConditional %171 %172 %176
+ %172 = OpLabel
+ %174 = OpCompositeExtract %6 %224 1
+ %175 = OpISub %6 %174 %26
+ %206 = OpCompositeInsert %7 %175 %224 1
+ OpBranch %176
+ %176 = OpLabel
+ %227 = OpPhi %7 %224 %102 %206 %172
+ %178 = OpCompositeExtract %6 %227 0
+ %179 = OpSLessThan %19 %178 %18
+ OpSelectionMerge %184 None
+ OpBranchConditional %179 %180 %184
+ %180 = OpLabel
+ %182 = OpCompositeExtract %6 %227 1
+ %183 = OpIAdd %6 %182 %26
+ %210 = OpCompositeInsert %7 %183 %227 1
+ OpBranch %184
+ %184 = OpLabel
+ %228 = OpPhi %7 %227 %176 %210 %180
+ %186 = OpCompositeExtract %6 %228 1
+ %187 = OpSDiv %6 %186 %38
+ %189 = OpCompositeExtract %6 %228 0
+ %190 = OpIAdd %6 %189 %187
+ %214 = OpCompositeInsert %7 %190 %228 0
+ OpBranch %104
+ %104 = OpLabel
+ %113 = OpIAdd %6 %193 %26
+ OpBranch %101
+ %103 = OpLabel
+ %115 = OpCompositeExtract %6 %224 0
+ %116 = OpSLessThan %19 %115 %18
+ OpSelectionMerge %118 None
+ OpBranchConditional %116 %117 %118
+ %117 = OpLabel
+ %121 = OpSNegate %6 %115
+ %218 = OpCompositeInsert %7 %121 %224 0
+ OpBranch %118
+ %118 = OpLabel
+ %226 = OpPhi %7 %224 %103 %218 %117
+ OpBranch %123
+ %123 = OpLabel
+ %225 = OpPhi %7 %226 %118 %222 %124
+ %129 = OpCompositeExtract %6 %225 0
+ %131 = OpSGreaterThan %19 %129 %130
+ OpLoopMerge %125 %124 None
+ OpBranchConditional %131 %124 %125
+ %124 = OpLabel
+ %135 = OpISub %6 %129 %132
+ %222 = OpCompositeInsert %7 %135 %225 0
+ OpBranch %123
+ %125 = OpLabel
+ OpStore %163 %159
+ %165 = OpAccessChain %164 %163 %129
+ %166 = OpLoad %51 %165
+ OpStore %138 %166
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# resolution
+BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi.amber
new file mode 100644
index 0000000..236f38c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi.amber
@@ -0,0 +1,1011 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Three shaders diff: OpSelect -> OpPhi
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 366
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %246 %268
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %246 "gl_FragCoord"
+ OpName %249 "buf0"
+ OpMemberName %249 0 "resolution"
+ OpName %251 ""
+ OpName %268 "_GLF_color"
+ OpDecorate %246 BuiltIn FragCoord
+ OpMemberDecorate %249 0 Offset 0
+ OpDecorate %249 Block
+ OpDecorate %251 DescriptorSet 0
+ OpDecorate %251 Binding 0
+ OpDecorate %268 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %9 = OpTypeFloat 32
+ %10 = OpTypeVector %9 4
+ %20 = OpTypeInt 32 0
+ %22 = OpTypePointer Function %6
+ %25 = OpConstant %6 256
+ %26 = OpTypeBool
+ %28 = OpConstant %20 0
+ %31 = OpConstant %20 256
+ %32 = OpTypeArray %6 %31
+ %33 = OpConstant %6 115
+ %34 = OpConstant %6 133
+ %35 = OpConstant %6 150
+ %36 = OpConstant %6 164
+ %37 = OpConstant %6 176
+ %38 = OpConstant %6 184
+ %39 = OpConstant %6 190
+ %40 = OpConstant %6 192
+ %41 = OpConstant %6 191
+ %42 = OpConstant %6 187
+ %43 = OpConstant %6 181
+ %44 = OpConstant %6 172
+ %45 = OpConstant %6 163
+ %46 = OpConstant %6 153
+ %47 = OpConstant %6 143
+ %48 = OpConstant %6 134
+ %49 = OpConstant %6 126
+ %50 = OpConstant %6 120
+ %51 = OpConstant %6 116
+ %52 = OpConstant %6 114
+ %53 = OpConstant %6 117
+ %54 = OpConstant %6 121
+ %55 = OpConstant %6 127
+ %56 = OpConstant %6 141
+ %57 = OpConstant %6 148
+ %58 = OpConstant %6 154
+ %59 = OpConstant %6 159
+ %60 = OpConstant %6 162
+ %61 = OpConstant %6 161
+ %62 = OpConstant %6 157
+ %63 = OpConstant %6 151
+ %64 = OpConstant %6 124
+ %65 = OpConstant %6 113
+ %66 = OpConstant %6 103
+ %67 = OpConstant %6 94
+ %68 = OpConstant %6 87
+ %69 = OpConstant %6 82
+ %70 = OpConstant %6 79
+ %71 = OpConstant %6 80
+ %72 = OpConstant %6 84
+ %73 = OpConstant %6 91
+ %74 = OpConstant %6 101
+ %75 = OpConstant %6 130
+ %76 = OpConstant %6 146
+ %77 = OpConstant %6 182
+ %78 = OpConstant %6 199
+ %79 = OpConstant %6 215
+ %80 = OpConstant %6 229
+ %81 = OpConstant %6 240
+ %82 = OpConstant %6 249
+ %83 = OpConstant %6 254
+ %84 = OpConstant %6 250
+ %85 = OpConstant %6 243
+ %86 = OpConstant %6 233
+ %87 = OpConstant %6 223
+ %88 = OpConstant %6 212
+ %89 = OpConstant %6 200
+ %90 = OpConstant %6 180
+ %91 = OpConstant %6 166
+ %92 = OpConstant %6 169
+ %93 = OpConstant %6 174
+ %94 = OpConstant %6 179
+ %95 = OpConstant %6 185
+ %96 = OpConstant %6 193
+ %97 = OpConstant %6 195
+ %98 = OpConstant %6 188
+ %99 = OpConstant %6 171
+ %100 = OpConstant %6 149
+ %101 = OpConstant %6 137
+ %102 = OpConstant %6 125
+ %103 = OpConstant %6 105
+ %104 = OpConstant %6 97
+ %105 = OpConstant %6 93
+ %106 = OpConstant %6 98
+ %107 = OpConstant %6 106
+ %108 = OpConstant %6 145
+ %109 = OpConstant %6 177
+ %110 = OpConstant %6 208
+ %111 = OpConstant %6 221
+ %112 = OpConstant %6 231
+ %113 = OpConstant %6 239
+ %114 = OpConstant %6 244
+ %115 = OpConstant %6 242
+ %116 = OpConstant %6 236
+ %117 = OpConstant %6 228
+ %118 = OpConstant %6 218
+ %119 = OpConstant %6 207
+ %120 = OpConstant %6 194
+ %121 = OpConstant %6 158
+ %122 = OpConstant %6 135
+ %123 = OpConstant %6 132
+ %124 = OpConstant %6 131
+ %125 = OpConstant %6 138
+ %126 = OpConstant %6 147
+ %127 = OpConstant %6 155
+ %128 = OpConstant %6 152
+ %129 = OpConstant %6 139
+ %130 = OpConstant %6 129
+ %131 = OpConstant %6 118
+ %132 = OpConstant %6 68
+ %133 = OpConstant %6 58
+ %134 = OpConstant %6 49
+ %135 = OpConstant %6 43
+ %136 = OpConstant %6 40
+ %137 = OpConstant %6 41
+ %138 = OpConstant %6 44
+ %139 = OpConstant %6 51
+ %140 = OpConstant %6 61
+ %141 = OpConstant %6 73
+ %142 = OpConstant %6 119
+ %143 = OpConstant %6 173
+ %144 = OpConstant %6 186
+ %145 = OpConstant %6 128
+ %146 = OpConstant %6 104
+ %147 = OpConstant %6 86
+ %148 = OpConstant %6 81
+ %149 = OpConstant %6 77
+ %150 = OpConstant %6 76
+ %151 = OpConstant %6 89
+ %152 = OpConstant %6 102
+ %153 = OpConstant %6 92
+ %154 = OpConstant %6 83
+ %155 = OpConstant %6 62
+ %156 = OpConstant %6 50
+ %157 = OpConstant %6 38
+ %158 = OpConstant %6 26
+ %159 = OpConstant %6 16
+ %160 = OpConstant %6 8
+ %161 = OpConstant %6 2
+ %162 = OpConstant %6 0
+ %163 = OpConstant %6 4
+ %164 = OpConstant %6 11
+ %165 = OpConstant %6 21
+ %166 = OpConstant %6 33
+ %167 = OpConstant %6 48
+ %168 = OpConstant %6 64
+ %169 = OpConstant %6 144
+ %170 = OpConstant %6 123
+ %171 = OpConstant %6 112
+ %172 = OpConstant %6 100
+ %173 = OpConstant %6 90
+ %174 = OpConstant %6 65
+ %175 = OpConstant %6 67
+ %176 = OpConstant %6 70
+ %177 = OpConstant %6 75
+ %178 = OpConstant %6 95
+ %179 = OpConstant %6 88
+ %180 = OpConstant %6 69
+ %181 = OpConstant %6 47
+ %182 = OpConstant %6 36
+ %183 = OpConstant %6 18
+ %184 = OpConstant %6 13
+ %185 = OpConstant %6 15
+ %186 = OpConstant %6 22
+ %187 = OpConstant %6 32
+ %188 = OpConstant %6 45
+ %189 = OpConstant %6 60
+ %190 = OpConstantComposite %32 %33 %34 %35 %36 %37 %38 %39 %40 %41 %42 %43 %44 %45 %46 %47 %48 %49 %50 %51 %52 %52 %53 %54 %55 %48 %56 %57 %58 %59 %60 %45 %61 %62 %63 %47 %48 %64 %65 %66 %67 %68 %69 %70 %71 %72 %73 %74 %52 %75 %76 %36 %77 %78 %79 %80 %81 %82 %83 %25 %83 %84 %85 %86 %87 %88 %89 %39 %90 %44 %91 %45 %61 %60 %36 %92 %93 %94 %95 %39 %96 %97 %97 %40 %98 %90 %99 %61 %100 %101 %102 %52 %103 %104 %105 %73 %105 %106 %107 %53 %75 %108 %61 %109 %96 %110 %111 %112 %113 %85 %114 %115 %116 %117 %118 %119 %120 %43 %92 %121 %57 %56 %122 %123 %124 %123 %122 %125 %47 %126 %63 %58 %127 %127 %128 %76 %129 %130 %131 %107 %105 %71 %132 %133 %134 %135 %136 %137 %138 %139 %140 %141 %68 %66 %142 %48 %100 %60 %143 %43 %144 %98 %144 %43 %93 %36 %46 %56 %145 %51 %146 %67 %147 %148 %149 %150 %149 %71 %72 %151 %67 %106 %152 %146 %146 %152 %106 %153 %154 %141 %155 %156 %157 %158 %159 %160 %161 %162 %162 %163 %164 %165 %166 %167 %168 %148 %106 %52 %130 %56 %63 %121 %61 %61 %121 %128 %169 %48 %170 %171 %172 %173 %148 %141 %132 %174 %174 %175 %176 %177 %148 %68 %153 %104 %74 %66 %152 %172 %178 %179 %70 %180 %133 %181 %182 %158 %183 %184 %164 %164 %185 %186 %187 %188 %189 %149 %67
+ %193 = OpTypePointer Function %32
+ %215 = OpConstant %9 15
+ %231 = OpConstant %9 1
+ %236 = OpConstant %6 1
+ %238 = OpConstant %9 0
+ %239 = OpConstantComposite %10 %238 %238 %238 %231
+ %242 = OpTypeVector %9 2
+ %245 = OpTypePointer Input %10
+ %246 = OpVariable %245 Input
+ %249 = OpTypeStruct %242
+ %250 = OpTypePointer Uniform %249
+ %251 = OpVariable %250 Uniform
+ %252 = OpTypePointer Uniform %242
+ %259 = OpConstant %9 256
+ %267 = OpTypePointer Output %10
+ %268 = OpVariable %267 Output
+ %277 = OpConstantFalse %26
+ %280 = OpConstantTrue %26
+ %363 = OpUndef %10
+ %365 = OpConstant %9 0.0666666701
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %285 = OpVariable %193 Function
+ %286 = OpVariable %193 Function
+ %288 = OpVariable %193 Function
+ %247 = OpLoad %10 %246
+ %248 = OpVectorShuffle %242 %247 %247 0 1
+ %253 = OpAccessChain %252 %251 %162
+ %254 = OpLoad %242 %253
+ %255 = OpFDiv %242 %248 %254
+ %258 = OpCompositeExtract %9 %255 0
+ %260 = OpFMul %9 %258 %259
+ %261 = OpConvertFToS %6 %260
+ %263 = OpCompositeExtract %9 %255 1
+ %264 = OpFMul %9 %263 %259
+ %265 = OpConvertFToS %6 %264
+ %266 = OpCompositeConstruct %7 %261 %265
+ OpSelectionMerge %341 None
+ OpSwitch %28 %291
+ %291 = OpLabel
+ OpBranch %292
+ %292 = OpLabel
+ %355 = OpPhi %7 %266 %291 %354 %337
+ %295 = OpCompositeExtract %6 %355 1
+ %296 = OpINotEqual %26 %295 %25
+ OpLoopMerge %338 %337 None
+ OpBranchConditional %296 %297 %338
+ %297 = OpLabel
+ %299 = OpCompositeExtract %6 %355 0
+ OpStore %285 %190
+ %302 = OpAccessChain %22 %285 %295
+ %303 = OpLoad %6 %302
+ %304 = OpIAdd %6 %303 %185
+ %305 = OpSLessThan %26 %299 %304
+ OpSelectionMerge %315 None
+ OpBranchConditional %305 %306 %315
+ %306 = OpLabel
+ OpStore %286 %190
+ %311 = OpAccessChain %22 %286 %295
+ %312 = OpLoad %6 %311
+ %313 = OpISub %6 %312 %185
+ %314 = OpSGreaterThan %26 %299 %313
+ OpBranch %315
+ %315 = OpLabel
+ %316 = OpPhi %26 %305 %297 %314 %306
+ OpSelectionMerge %333 None
+ OpBranchConditional %316 %317 %333
+ %317 = OpLabel
+ OpStore %288 %190
+ %322 = OpAccessChain %22 %288 %295
+ %323 = OpLoad %6 %322
+ %324 = OpISub %6 %299 %323
+ %325 = OpConvertSToF %9 %324
+ %326 = OpExtInst %9 %1 FAbs %325
+ %327 = OpFSub %9 %215 %326
+ %328 = OpFMul %9 %327 %365
+ %332 = OpCompositeConstruct %10 %328 %328 %328 %231
+ OpBranch %338
+ %333 = OpLabel
+ %336 = OpIAdd %6 %295 %236
+ %354 = OpCompositeInsert %7 %336 %355 1
+ OpBranch %337
+ %337 = OpLabel
+ OpBranch %292
+ %338 = OpLabel
+ %361 = OpPhi %10 %363 %292 %332 %317
+ %357 = OpPhi %26 %277 %292 %280 %317
+ OpSelectionMerge %340 None
+ OpBranchConditional %357 %341 %340
+ %340 = OpLabel
+ OpBranch %341
+ %341 = OpLabel
+ %360 = OpPhi %10 %361 %338 %239 %340
+ OpStore %268 %360
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 534
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %246 %268
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %246 "gl_FragCoord"
+ OpName %249 "buf0"
+ OpMemberName %249 0 "resolution"
+ OpName %251 ""
+ OpName %268 "_GLF_color"
+ OpDecorate %246 BuiltIn FragCoord
+ OpMemberDecorate %249 0 Offset 0
+ OpDecorate %249 Block
+ OpDecorate %251 DescriptorSet 0
+ OpDecorate %251 Binding 0
+ OpDecorate %268 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %9 = OpTypeFloat 32
+ %10 = OpTypeVector %9 4
+ %20 = OpTypeInt 32 0
+ %22 = OpTypePointer Function %6
+ %25 = OpConstant %6 256
+ %26 = OpTypeBool
+ %28 = OpConstant %20 0
+ %31 = OpConstant %20 256
+ %32 = OpTypeArray %6 %31
+ %33 = OpConstant %6 115
+ %34 = OpConstant %6 133
+ %35 = OpConstant %6 150
+ %36 = OpConstant %6 164
+ %37 = OpConstant %6 176
+ %38 = OpConstant %6 184
+ %39 = OpConstant %6 190
+ %40 = OpConstant %6 192
+ %41 = OpConstant %6 191
+ %42 = OpConstant %6 187
+ %43 = OpConstant %6 181
+ %44 = OpConstant %6 172
+ %45 = OpConstant %6 163
+ %46 = OpConstant %6 153
+ %47 = OpConstant %6 143
+ %48 = OpConstant %6 134
+ %49 = OpConstant %6 126
+ %50 = OpConstant %6 120
+ %51 = OpConstant %6 116
+ %52 = OpConstant %6 114
+ %53 = OpConstant %6 117
+ %54 = OpConstant %6 121
+ %55 = OpConstant %6 127
+ %56 = OpConstant %6 141
+ %57 = OpConstant %6 148
+ %58 = OpConstant %6 154
+ %59 = OpConstant %6 159
+ %60 = OpConstant %6 162
+ %61 = OpConstant %6 161
+ %62 = OpConstant %6 157
+ %63 = OpConstant %6 151
+ %64 = OpConstant %6 124
+ %65 = OpConstant %6 113
+ %66 = OpConstant %6 103
+ %67 = OpConstant %6 94
+ %68 = OpConstant %6 87
+ %69 = OpConstant %6 82
+ %70 = OpConstant %6 79
+ %71 = OpConstant %6 80
+ %72 = OpConstant %6 84
+ %73 = OpConstant %6 91
+ %74 = OpConstant %6 101
+ %75 = OpConstant %6 130
+ %76 = OpConstant %6 146
+ %77 = OpConstant %6 182
+ %78 = OpConstant %6 199
+ %79 = OpConstant %6 215
+ %80 = OpConstant %6 229
+ %81 = OpConstant %6 240
+ %82 = OpConstant %6 249
+ %83 = OpConstant %6 254
+ %84 = OpConstant %6 250
+ %85 = OpConstant %6 243
+ %86 = OpConstant %6 233
+ %87 = OpConstant %6 223
+ %88 = OpConstant %6 212
+ %89 = OpConstant %6 200
+ %90 = OpConstant %6 180
+ %91 = OpConstant %6 166
+ %92 = OpConstant %6 169
+ %93 = OpConstant %6 174
+ %94 = OpConstant %6 179
+ %95 = OpConstant %6 185
+ %96 = OpConstant %6 193
+ %97 = OpConstant %6 195
+ %98 = OpConstant %6 188
+ %99 = OpConstant %6 171
+ %100 = OpConstant %6 149
+ %101 = OpConstant %6 137
+ %102 = OpConstant %6 125
+ %103 = OpConstant %6 105
+ %104 = OpConstant %6 97
+ %105 = OpConstant %6 93
+ %106 = OpConstant %6 98
+ %107 = OpConstant %6 106
+ %108 = OpConstant %6 145
+ %109 = OpConstant %6 177
+ %110 = OpConstant %6 208
+ %111 = OpConstant %6 221
+ %112 = OpConstant %6 231
+ %113 = OpConstant %6 239
+ %114 = OpConstant %6 244
+ %115 = OpConstant %6 242
+ %116 = OpConstant %6 236
+ %117 = OpConstant %6 228
+ %118 = OpConstant %6 218
+ %119 = OpConstant %6 207
+ %120 = OpConstant %6 194
+ %121 = OpConstant %6 158
+ %122 = OpConstant %6 135
+ %123 = OpConstant %6 132
+ %124 = OpConstant %6 131
+ %125 = OpConstant %6 138
+ %126 = OpConstant %6 147
+ %127 = OpConstant %6 155
+ %128 = OpConstant %6 152
+ %129 = OpConstant %6 139
+ %130 = OpConstant %6 129
+ %131 = OpConstant %6 118
+ %132 = OpConstant %6 68
+ %133 = OpConstant %6 58
+ %134 = OpConstant %6 49
+ %135 = OpConstant %6 43
+ %136 = OpConstant %6 40
+ %137 = OpConstant %6 41
+ %138 = OpConstant %6 44
+ %139 = OpConstant %6 51
+ %140 = OpConstant %6 61
+ %141 = OpConstant %6 73
+ %142 = OpConstant %6 119
+ %143 = OpConstant %6 173
+ %144 = OpConstant %6 186
+ %145 = OpConstant %6 128
+ %146 = OpConstant %6 104
+ %147 = OpConstant %6 86
+ %148 = OpConstant %6 81
+ %149 = OpConstant %6 77
+ %150 = OpConstant %6 76
+ %151 = OpConstant %6 89
+ %152 = OpConstant %6 102
+ %153 = OpConstant %6 92
+ %154 = OpConstant %6 83
+ %155 = OpConstant %6 62
+ %156 = OpConstant %6 50
+ %157 = OpConstant %6 38
+ %158 = OpConstant %6 26
+ %159 = OpConstant %6 16
+ %160 = OpConstant %6 8
+ %161 = OpConstant %6 2
+ %162 = OpConstant %6 0
+ %163 = OpConstant %6 4
+ %164 = OpConstant %6 11
+ %165 = OpConstant %6 21
+ %166 = OpConstant %6 33
+ %167 = OpConstant %6 48
+ %168 = OpConstant %6 64
+ %169 = OpConstant %6 144
+ %170 = OpConstant %6 123
+ %171 = OpConstant %6 112
+ %172 = OpConstant %6 100
+ %173 = OpConstant %6 90
+ %174 = OpConstant %6 65
+ %175 = OpConstant %6 67
+ %176 = OpConstant %6 70
+ %177 = OpConstant %6 75
+ %178 = OpConstant %6 95
+ %179 = OpConstant %6 88
+ %180 = OpConstant %6 69
+ %181 = OpConstant %6 47
+ %182 = OpConstant %6 36
+ %183 = OpConstant %6 18
+ %184 = OpConstant %6 13
+ %185 = OpConstant %6 15
+ %186 = OpConstant %6 22
+ %187 = OpConstant %6 32
+ %188 = OpConstant %6 45
+ %189 = OpConstant %6 60
+ %190 = OpConstantComposite %32 %33 %34 %35 %36 %37 %38 %39 %40 %41 %42 %43 %44 %45 %46 %47 %48 %49 %50 %51 %52 %52 %53 %54 %55 %48 %56 %57 %58 %59 %60 %45 %61 %62 %63 %47 %48 %64 %65 %66 %67 %68 %69 %70 %71 %72 %73 %74 %52 %75 %76 %36 %77 %78 %79 %80 %81 %82 %83 %25 %83 %84 %85 %86 %87 %88 %89 %39 %90 %44 %91 %45 %61 %60 %36 %92 %93 %94 %95 %39 %96 %97 %97 %40 %98 %90 %99 %61 %100 %101 %102 %52 %103 %104 %105 %73 %105 %106 %107 %53 %75 %108 %61 %109 %96 %110 %111 %112 %113 %85 %114 %115 %116 %117 %118 %119 %120 %43 %92 %121 %57 %56 %122 %123 %124 %123 %122 %125 %47 %126 %63 %58 %127 %127 %128 %76 %129 %130 %131 %107 %105 %71 %132 %133 %134 %135 %136 %137 %138 %139 %140 %141 %68 %66 %142 %48 %100 %60 %143 %43 %144 %98 %144 %43 %93 %36 %46 %56 %145 %51 %146 %67 %147 %148 %149 %150 %149 %71 %72 %151 %67 %106 %152 %146 %146 %152 %106 %153 %154 %141 %155 %156 %157 %158 %159 %160 %161 %162 %162 %163 %164 %165 %166 %167 %168 %148 %106 %52 %130 %56 %63 %121 %61 %61 %121 %128 %169 %48 %170 %171 %172 %173 %148 %141 %132 %174 %174 %175 %176 %177 %148 %68 %153 %104 %74 %66 %152 %172 %178 %179 %70 %180 %133 %181 %182 %158 %183 %184 %164 %164 %185 %186 %187 %188 %189 %149 %67
+ %193 = OpTypePointer Function %32
+ %215 = OpConstant %9 15
+ %231 = OpConstant %9 1
+ %236 = OpConstant %6 1
+ %238 = OpConstant %9 0
+ %239 = OpConstantComposite %10 %238 %238 %238 %231
+ %242 = OpTypeVector %9 2
+ %245 = OpTypePointer Input %10
+ %246 = OpVariable %245 Input
+ %249 = OpTypeStruct %242
+ %250 = OpTypePointer Uniform %249
+ %251 = OpVariable %250 Uniform
+ %252 = OpTypePointer Uniform %242
+ %259 = OpConstant %9 256
+ %267 = OpTypePointer Output %10
+ %268 = OpVariable %267 Output
+ %277 = OpConstantFalse %26
+ %280 = OpConstantTrue %26
+ %363 = OpUndef %10
+ %365 = OpConstant %9 0.0666666701
+ %523 = OpConstant %6 0
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %285 = OpVariable %193 Function
+ %286 = OpVariable %193 Function
+ %288 = OpVariable %193 Function
+ %247 = OpLoad %10 %246
+ %248 = OpVectorShuffle %242 %247 %247 0 1
+ %253 = OpAccessChain %252 %251 %162
+ %254 = OpLoad %242 %253
+ %255 = OpFDiv %242 %248 %254
+ %258 = OpCompositeExtract %9 %255 0
+ %260 = OpFMul %9 %258 %259
+ %261 = OpConvertFToS %6 %260
+ %263 = OpCompositeExtract %9 %255 1
+ %264 = OpFMul %9 %263 %259
+ %265 = OpConvertFToS %6 %264
+ %266 = OpCompositeConstruct %7 %261 %265
+ OpSelectionMerge %341 None
+ OpSwitch %28 %291
+ %291 = OpLabel
+ OpBranch %292
+ %292 = OpLabel
+ %355 = OpPhi %7 %266 %291 %354 %337
+ %295 = OpCompositeExtract %6 %355 1
+ %296 = OpINotEqual %26 %295 %25
+ OpLoopMerge %338 %337 None
+ OpBranchConditional %296 %297 %338
+ %297 = OpLabel
+ %299 = OpCompositeExtract %6 %355 0
+ OpStore %285 %190
+ %302 = OpAccessChain %22 %285 %295
+ %303 = OpLoad %6 %302
+ %304 = OpIAdd %6 %303 %185
+ %305 = OpSLessThan %26 %299 %304
+ OpBranch %306
+ %306 = OpLabel
+ OpSelectionMerge %516 None
+ OpBranchConditional %305 %517 %516
+ %517 = OpLabel
+ OpStore %286 %190
+ OpBranch %516
+ %516 = OpLabel
+ %311 = OpAccessChain %22 %286 %295
+ OpSelectionMerge %518 None
+ OpBranchConditional %305 %519 %521
+ %519 = OpLabel
+ %520 = OpLoad %6 %311
+ OpBranch %518
+ %521 = OpLabel
+ %522 = OpCopyObject %6 %523
+ OpBranch %518
+ %518 = OpLabel
+ %312 = OpPhi %6 %520 %519 %522 %521
+ %313 = OpISub %6 %312 %185
+ %314 = OpSGreaterThan %26 %299 %313
+ OpSelectionMerge %315 None
+ OpBranchConditional %305 %532 %533
+ %532 = OpLabel
+ OpBranch %315
+ %533 = OpLabel
+ OpBranch %315
+ %315 = OpLabel
+ %316 = OpPhi %26 %314 %532 %305 %533
+ OpSelectionMerge %333 None
+ OpBranchConditional %316 %317 %333
+ %317 = OpLabel
+ OpStore %288 %190
+ %322 = OpAccessChain %22 %288 %295
+ %323 = OpLoad %6 %322
+ %324 = OpISub %6 %299 %323
+ %325 = OpConvertSToF %9 %324
+ %326 = OpExtInst %9 %1 FAbs %325
+ %327 = OpFSub %9 %215 %326
+ %328 = OpFMul %9 %327 %365
+ %332 = OpCompositeConstruct %10 %328 %328 %328 %231
+ OpBranch %338
+ %333 = OpLabel
+ %336 = OpIAdd %6 %295 %236
+ %354 = OpCompositeInsert %7 %336 %355 1
+ OpBranch %337
+ %337 = OpLabel
+ OpBranch %292
+ %338 = OpLabel
+ %361 = OpPhi %10 %363 %292 %332 %317
+ %357 = OpPhi %26 %277 %292 %280 %317
+ OpSelectionMerge %340 None
+ OpBranchConditional %357 %341 %340
+ %340 = OpLabel
+ OpBranch %341
+ %341 = OpLabel
+ %360 = OpPhi %10 %361 %338 %239 %340
+ OpStore %268 %360
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 524
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %246 %268
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %246 "gl_FragCoord"
+ OpName %249 "buf0"
+ OpMemberName %249 0 "resolution"
+ OpName %251 ""
+ OpName %268 "_GLF_color"
+ OpDecorate %246 BuiltIn FragCoord
+ OpMemberDecorate %249 0 Offset 0
+ OpDecorate %249 Block
+ OpDecorate %251 DescriptorSet 0
+ OpDecorate %251 Binding 0
+ OpDecorate %268 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeVector %6 2
+ %9 = OpTypeFloat 32
+ %10 = OpTypeVector %9 4
+ %20 = OpTypeInt 32 0
+ %22 = OpTypePointer Function %6
+ %25 = OpConstant %6 256
+ %26 = OpTypeBool
+ %28 = OpConstant %20 0
+ %31 = OpConstant %20 256
+ %32 = OpTypeArray %6 %31
+ %33 = OpConstant %6 115
+ %34 = OpConstant %6 133
+ %35 = OpConstant %6 150
+ %36 = OpConstant %6 164
+ %37 = OpConstant %6 176
+ %38 = OpConstant %6 184
+ %39 = OpConstant %6 190
+ %40 = OpConstant %6 192
+ %41 = OpConstant %6 191
+ %42 = OpConstant %6 187
+ %43 = OpConstant %6 181
+ %44 = OpConstant %6 172
+ %45 = OpConstant %6 163
+ %46 = OpConstant %6 153
+ %47 = OpConstant %6 143
+ %48 = OpConstant %6 134
+ %49 = OpConstant %6 126
+ %50 = OpConstant %6 120
+ %51 = OpConstant %6 116
+ %52 = OpConstant %6 114
+ %53 = OpConstant %6 117
+ %54 = OpConstant %6 121
+ %55 = OpConstant %6 127
+ %56 = OpConstant %6 141
+ %57 = OpConstant %6 148
+ %58 = OpConstant %6 154
+ %59 = OpConstant %6 159
+ %60 = OpConstant %6 162
+ %61 = OpConstant %6 161
+ %62 = OpConstant %6 157
+ %63 = OpConstant %6 151
+ %64 = OpConstant %6 124
+ %65 = OpConstant %6 113
+ %66 = OpConstant %6 103
+ %67 = OpConstant %6 94
+ %68 = OpConstant %6 87
+ %69 = OpConstant %6 82
+ %70 = OpConstant %6 79
+ %71 = OpConstant %6 80
+ %72 = OpConstant %6 84
+ %73 = OpConstant %6 91
+ %74 = OpConstant %6 101
+ %75 = OpConstant %6 130
+ %76 = OpConstant %6 146
+ %77 = OpConstant %6 182
+ %78 = OpConstant %6 199
+ %79 = OpConstant %6 215
+ %80 = OpConstant %6 229
+ %81 = OpConstant %6 240
+ %82 = OpConstant %6 249
+ %83 = OpConstant %6 254
+ %84 = OpConstant %6 250
+ %85 = OpConstant %6 243
+ %86 = OpConstant %6 233
+ %87 = OpConstant %6 223
+ %88 = OpConstant %6 212
+ %89 = OpConstant %6 200
+ %90 = OpConstant %6 180
+ %91 = OpConstant %6 166
+ %92 = OpConstant %6 169
+ %93 = OpConstant %6 174
+ %94 = OpConstant %6 179
+ %95 = OpConstant %6 185
+ %96 = OpConstant %6 193
+ %97 = OpConstant %6 195
+ %98 = OpConstant %6 188
+ %99 = OpConstant %6 171
+ %100 = OpConstant %6 149
+ %101 = OpConstant %6 137
+ %102 = OpConstant %6 125
+ %103 = OpConstant %6 105
+ %104 = OpConstant %6 97
+ %105 = OpConstant %6 93
+ %106 = OpConstant %6 98
+ %107 = OpConstant %6 106
+ %108 = OpConstant %6 145
+ %109 = OpConstant %6 177
+ %110 = OpConstant %6 208
+ %111 = OpConstant %6 221
+ %112 = OpConstant %6 231
+ %113 = OpConstant %6 239
+ %114 = OpConstant %6 244
+ %115 = OpConstant %6 242
+ %116 = OpConstant %6 236
+ %117 = OpConstant %6 228
+ %118 = OpConstant %6 218
+ %119 = OpConstant %6 207
+ %120 = OpConstant %6 194
+ %121 = OpConstant %6 158
+ %122 = OpConstant %6 135
+ %123 = OpConstant %6 132
+ %124 = OpConstant %6 131
+ %125 = OpConstant %6 138
+ %126 = OpConstant %6 147
+ %127 = OpConstant %6 155
+ %128 = OpConstant %6 152
+ %129 = OpConstant %6 139
+ %130 = OpConstant %6 129
+ %131 = OpConstant %6 118
+ %132 = OpConstant %6 68
+ %133 = OpConstant %6 58
+ %134 = OpConstant %6 49
+ %135 = OpConstant %6 43
+ %136 = OpConstant %6 40
+ %137 = OpConstant %6 41
+ %138 = OpConstant %6 44
+ %139 = OpConstant %6 51
+ %140 = OpConstant %6 61
+ %141 = OpConstant %6 73
+ %142 = OpConstant %6 119
+ %143 = OpConstant %6 173
+ %144 = OpConstant %6 186
+ %145 = OpConstant %6 128
+ %146 = OpConstant %6 104
+ %147 = OpConstant %6 86
+ %148 = OpConstant %6 81
+ %149 = OpConstant %6 77
+ %150 = OpConstant %6 76
+ %151 = OpConstant %6 89
+ %152 = OpConstant %6 102
+ %153 = OpConstant %6 92
+ %154 = OpConstant %6 83
+ %155 = OpConstant %6 62
+ %156 = OpConstant %6 50
+ %157 = OpConstant %6 38
+ %158 = OpConstant %6 26
+ %159 = OpConstant %6 16
+ %160 = OpConstant %6 8
+ %161 = OpConstant %6 2
+ %162 = OpConstant %6 0
+ %163 = OpConstant %6 4
+ %164 = OpConstant %6 11
+ %165 = OpConstant %6 21
+ %166 = OpConstant %6 33
+ %167 = OpConstant %6 48
+ %168 = OpConstant %6 64
+ %169 = OpConstant %6 144
+ %170 = OpConstant %6 123
+ %171 = OpConstant %6 112
+ %172 = OpConstant %6 100
+ %173 = OpConstant %6 90
+ %174 = OpConstant %6 65
+ %175 = OpConstant %6 67
+ %176 = OpConstant %6 70
+ %177 = OpConstant %6 75
+ %178 = OpConstant %6 95
+ %179 = OpConstant %6 88
+ %180 = OpConstant %6 69
+ %181 = OpConstant %6 47
+ %182 = OpConstant %6 36
+ %183 = OpConstant %6 18
+ %184 = OpConstant %6 13
+ %185 = OpConstant %6 15
+ %186 = OpConstant %6 22
+ %187 = OpConstant %6 32
+ %188 = OpConstant %6 45
+ %189 = OpConstant %6 60
+ %190 = OpConstantComposite %32 %33 %34 %35 %36 %37 %38 %39 %40 %41 %42 %43 %44 %45 %46 %47 %48 %49 %50 %51 %52 %52 %53 %54 %55 %48 %56 %57 %58 %59 %60 %45 %61 %62 %63 %47 %48 %64 %65 %66 %67 %68 %69 %70 %71 %72 %73 %74 %52 %75 %76 %36 %77 %78 %79 %80 %81 %82 %83 %25 %83 %84 %85 %86 %87 %88 %89 %39 %90 %44 %91 %45 %61 %60 %36 %92 %93 %94 %95 %39 %96 %97 %97 %40 %98 %90 %99 %61 %100 %101 %102 %52 %103 %104 %105 %73 %105 %106 %107 %53 %75 %108 %61 %109 %96 %110 %111 %112 %113 %85 %114 %115 %116 %117 %118 %119 %120 %43 %92 %121 %57 %56 %122 %123 %124 %123 %122 %125 %47 %126 %63 %58 %127 %127 %128 %76 %129 %130 %131 %107 %105 %71 %132 %133 %134 %135 %136 %137 %138 %139 %140 %141 %68 %66 %142 %48 %100 %60 %143 %43 %144 %98 %144 %43 %93 %36 %46 %56 %145 %51 %146 %67 %147 %148 %149 %150 %149 %71 %72 %151 %67 %106 %152 %146 %146 %152 %106 %153 %154 %141 %155 %156 %157 %158 %159 %160 %161 %162 %162 %163 %164 %165 %166 %167 %168 %148 %106 %52 %130 %56 %63 %121 %61 %61 %121 %128 %169 %48 %170 %171 %172 %173 %148 %141 %132 %174 %174 %175 %176 %177 %148 %68 %153 %104 %74 %66 %152 %172 %178 %179 %70 %180 %133 %181 %182 %158 %183 %184 %164 %164 %185 %186 %187 %188 %189 %149 %67
+ %193 = OpTypePointer Function %32
+ %215 = OpConstant %9 15
+ %231 = OpConstant %9 1
+ %236 = OpConstant %6 1
+ %238 = OpConstant %9 0
+ %239 = OpConstantComposite %10 %238 %238 %238 %231
+ %242 = OpTypeVector %9 2
+ %245 = OpTypePointer Input %10
+ %246 = OpVariable %245 Input
+ %249 = OpTypeStruct %242
+ %250 = OpTypePointer Uniform %249
+ %251 = OpVariable %250 Uniform
+ %252 = OpTypePointer Uniform %242
+ %259 = OpConstant %9 256
+ %267 = OpTypePointer Output %10
+ %268 = OpVariable %267 Output
+ %277 = OpConstantFalse %26
+ %280 = OpConstantTrue %26
+ %363 = OpUndef %10
+ %365 = OpConstant %9 0.0666666701
+ %523 = OpConstant %6 0
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %285 = OpVariable %193 Function
+ %286 = OpVariable %193 Function
+ %288 = OpVariable %193 Function
+ %247 = OpLoad %10 %246
+ %248 = OpVectorShuffle %242 %247 %247 0 1
+ %253 = OpAccessChain %252 %251 %162
+ %254 = OpLoad %242 %253
+ %255 = OpFDiv %242 %248 %254
+ %258 = OpCompositeExtract %9 %255 0
+ %260 = OpFMul %9 %258 %259
+ %261 = OpConvertFToS %6 %260
+ %263 = OpCompositeExtract %9 %255 1
+ %264 = OpFMul %9 %263 %259
+ %265 = OpConvertFToS %6 %264
+ %266 = OpCompositeConstruct %7 %261 %265
+ OpSelectionMerge %341 None
+ OpSwitch %28 %291
+ %291 = OpLabel
+ OpBranch %292
+ %292 = OpLabel
+ %355 = OpPhi %7 %266 %291 %354 %337
+ %295 = OpCompositeExtract %6 %355 1
+ %296 = OpINotEqual %26 %295 %25
+ OpLoopMerge %338 %337 None
+ OpBranchConditional %296 %297 %338
+ %297 = OpLabel
+ %299 = OpCompositeExtract %6 %355 0
+ OpStore %285 %190
+ %302 = OpAccessChain %22 %285 %295
+ %303 = OpLoad %6 %302
+ %304 = OpIAdd %6 %303 %185
+ %305 = OpSLessThan %26 %299 %304
+ OpBranch %306
+ %306 = OpLabel
+ OpSelectionMerge %516 None
+ OpBranchConditional %305 %517 %516
+ %517 = OpLabel
+ OpStore %286 %190
+ OpBranch %516
+ %516 = OpLabel
+ %311 = OpAccessChain %22 %286 %295
+ OpSelectionMerge %518 None
+ OpBranchConditional %305 %519 %521
+ %519 = OpLabel
+ %520 = OpLoad %6 %311
+ OpBranch %518
+ %521 = OpLabel
+ %522 = OpCopyObject %6 %523
+ OpBranch %518
+ %518 = OpLabel
+ %312 = OpPhi %6 %520 %519 %522 %521
+ %313 = OpISub %6 %312 %185
+ %314 = OpSGreaterThan %26 %299 %313
+ OpBranch %315
+ %315 = OpLabel
+ %316 = OpSelect %26 %305 %314 %305
+ OpSelectionMerge %333 None
+ OpBranchConditional %316 %317 %333
+ %317 = OpLabel
+ OpStore %288 %190
+ %322 = OpAccessChain %22 %288 %295
+ %323 = OpLoad %6 %322
+ %324 = OpISub %6 %299 %323
+ %325 = OpConvertSToF %9 %324
+ %326 = OpExtInst %9 %1 FAbs %325
+ %327 = OpFSub %9 %215 %326
+ %328 = OpFMul %9 %327 %365
+ %332 = OpCompositeConstruct %10 %328 %328 %328 %231
+ OpBranch %338
+ %333 = OpLabel
+ %336 = OpIAdd %6 %295 %236
+ %354 = OpCompositeInsert %7 %336 %355 1
+ OpBranch %337
+ %337 = OpLabel
+ OpBranch %292
+ %338 = OpLabel
+ %361 = OpPhi %10 %363 %292 %332 %317
+ %357 = OpPhi %26 %277 %292 %280 %317
+ OpSelectionMerge %340 None
+ OpBranchConditional %357 %341 %340
+ %340 = OpLabel
+ OpBranch %341
+ %341 = OpLabel
+ %360 = OpPhi %10 %361 %338 %239 %340
+ OpStore %268 %360
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# resolution
+BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-quicksort-mat-func-param.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-quicksort-mat-func-param.amber
new file mode 100644
index 0000000..6d21882
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-quicksort-mat-func-param.amber
@@ -0,0 +1,1057 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Two shaders with diff: added mat3x3 func param
+
+# The test renders two images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 331
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %183 %324
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %11 "swap(i1;i1;"
+ OpName %9 "i"
+ OpName %10 "j"
+ OpName %16 "performPartition(i1;i1;"
+ OpName %14 "l"
+ OpName %15 "h"
+ OpName %18 "quicksort("
+ OpName %20 "temp"
+ OpName %24 "QuicksortObject"
+ OpMemberName %24 0 "numbers"
+ OpName %26 "obj"
+ OpName %40 "pivot"
+ OpName %44 "i"
+ OpName %48 "j"
+ OpName %69 "param"
+ OpName %71 "param"
+ OpName %78 "param"
+ OpName %80 "param"
+ OpName %86 "l"
+ OpName %87 "h"
+ OpName %89 "top"
+ OpName %92 "stack"
+ OpName %116 "p"
+ OpName %117 "param"
+ OpName %119 "param"
+ OpName %152 "i"
+ OpName %180 "uv"
+ OpName %183 "gl_FragCoord"
+ OpName %186 "buf0"
+ OpMemberName %186 0 "resolution"
+ OpName %188 ""
+ OpName %195 "color"
+ OpName %324 "_GLF_color"
+ OpDecorate %183 BuiltIn FragCoord
+ OpMemberDecorate %186 0 Offset 0
+ OpDecorate %186 Block
+ OpDecorate %188 DescriptorSet 0
+ OpDecorate %188 Binding 0
+ OpDecorate %324 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7
+ %13 = OpTypeFunction %6 %7 %7
+ %21 = OpTypeInt 32 0
+ %22 = OpConstant %21 10
+ %23 = OpTypeArray %6 %22
+ %24 = OpTypeStruct %23
+ %25 = OpTypePointer Private %24
+ %26 = OpVariable %25 Private
+ %27 = OpConstant %6 0
+ %29 = OpTypePointer Private %6
+ %46 = OpConstant %6 1
+ %58 = OpTypeBool
+ %88 = OpConstant %6 9
+ %90 = OpConstant %6 -1
+ %91 = OpTypePointer Function %23
+ %159 = OpConstant %6 10
+ %177 = OpTypeFloat 32
+ %178 = OpTypeVector %177 2
+ %179 = OpTypePointer Function %178
+ %181 = OpTypeVector %177 4
+ %182 = OpTypePointer Input %181
+ %183 = OpVariable %182 Input
+ %186 = OpTypeStruct %178
+ %187 = OpTypePointer Uniform %186
+ %188 = OpVariable %187 Uniform
+ %189 = OpTypePointer Uniform %178
+ %193 = OpTypeVector %177 3
+ %194 = OpTypePointer Function %193
+ %196 = OpConstant %177 1
+ %197 = OpConstant %177 2
+ %198 = OpConstant %177 3
+ %199 = OpConstantComposite %193 %196 %197 %198
+ %203 = OpConstant %21 0
+ %204 = OpTypePointer Function %177
+ %211 = OpConstant %177 0.25
+ %224 = OpConstant %177 0.5
+ %228 = OpConstant %6 2
+ %232 = OpConstant %21 1
+ %239 = OpConstant %177 0.75
+ %243 = OpConstant %6 3
+ %247 = OpConstant %21 2
+ %252 = OpConstant %6 4
+ %265 = OpConstant %6 5
+ %278 = OpConstant %6 6
+ %291 = OpConstant %6 7
+ %299 = OpConstant %6 8
+ %323 = OpTypePointer Output %181
+ %324 = OpVariable %323 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %152 = OpVariable %7 Function
+ %180 = OpVariable %179 Function
+ %195 = OpVariable %194 Function
+ OpStore %152 %27
+ OpBranch %153
+ %153 = OpLabel
+ OpLoopMerge %155 %156 None
+ OpBranch %157
+ %157 = OpLabel
+ %158 = OpLoad %6 %152
+ %160 = OpSLessThan %58 %158 %159
+ OpBranchConditional %160 %154 %155
+ %154 = OpLabel
+ %161 = OpLoad %6 %152
+ %162 = OpLoad %6 %152
+ %163 = OpISub %6 %159 %162
+ %164 = OpAccessChain %29 %26 %27 %161
+ OpStore %164 %163
+ %165 = OpLoad %6 %152
+ %166 = OpLoad %6 %152
+ %167 = OpAccessChain %29 %26 %27 %166
+ %168 = OpLoad %6 %167
+ %169 = OpLoad %6 %152
+ %170 = OpAccessChain %29 %26 %27 %169
+ %171 = OpLoad %6 %170
+ %172 = OpIMul %6 %168 %171
+ %173 = OpAccessChain %29 %26 %27 %165
+ OpStore %173 %172
+ OpBranch %156
+ %156 = OpLabel
+ %174 = OpLoad %6 %152
+ %175 = OpIAdd %6 %174 %46
+ OpStore %152 %175
+ OpBranch %153
+ %155 = OpLabel
+ %176 = OpFunctionCall %2 %18
+ %184 = OpLoad %181 %183
+ %185 = OpVectorShuffle %178 %184 %184 0 1
+ %190 = OpAccessChain %189 %188 %27
+ %191 = OpLoad %178 %190
+ %192 = OpFDiv %178 %185 %191
+ OpStore %180 %192
+ OpStore %195 %199
+ %200 = OpAccessChain %29 %26 %27 %27
+ %201 = OpLoad %6 %200
+ %202 = OpConvertSToF %177 %201
+ %205 = OpAccessChain %204 %195 %203
+ %206 = OpLoad %177 %205
+ %207 = OpFAdd %177 %206 %202
+ %208 = OpAccessChain %204 %195 %203
+ OpStore %208 %207
+ %209 = OpAccessChain %204 %180 %203
+ %210 = OpLoad %177 %209
+ %212 = OpFOrdGreaterThan %58 %210 %211
+ OpSelectionMerge %214 None
+ OpBranchConditional %212 %213 %214
+ %213 = OpLabel
+ %215 = OpAccessChain %29 %26 %27 %46
+ %216 = OpLoad %6 %215
+ %217 = OpConvertSToF %177 %216
+ %218 = OpAccessChain %204 %195 %203
+ %219 = OpLoad %177 %218
+ %220 = OpFAdd %177 %219 %217
+ %221 = OpAccessChain %204 %195 %203
+ OpStore %221 %220
+ OpBranch %214
+ %214 = OpLabel
+ %222 = OpAccessChain %204 %180 %203
+ %223 = OpLoad %177 %222
+ %225 = OpFOrdGreaterThan %58 %223 %224
+ OpSelectionMerge %227 None
+ OpBranchConditional %225 %226 %227
+ %226 = OpLabel
+ %229 = OpAccessChain %29 %26 %27 %228
+ %230 = OpLoad %6 %229
+ %231 = OpConvertSToF %177 %230
+ %233 = OpAccessChain %204 %195 %232
+ %234 = OpLoad %177 %233
+ %235 = OpFAdd %177 %234 %231
+ %236 = OpAccessChain %204 %195 %232
+ OpStore %236 %235
+ OpBranch %227
+ %227 = OpLabel
+ %237 = OpAccessChain %204 %180 %203
+ %238 = OpLoad %177 %237
+ %240 = OpFOrdGreaterThan %58 %238 %239
+ OpSelectionMerge %242 None
+ OpBranchConditional %240 %241 %242
+ %241 = OpLabel
+ %244 = OpAccessChain %29 %26 %27 %243
+ %245 = OpLoad %6 %244
+ %246 = OpConvertSToF %177 %245
+ %248 = OpAccessChain %204 %195 %247
+ %249 = OpLoad %177 %248
+ %250 = OpFAdd %177 %249 %246
+ %251 = OpAccessChain %204 %195 %247
+ OpStore %251 %250
+ OpBranch %242
+ %242 = OpLabel
+ %253 = OpAccessChain %29 %26 %27 %252
+ %254 = OpLoad %6 %253
+ %255 = OpConvertSToF %177 %254
+ %256 = OpAccessChain %204 %195 %232
+ %257 = OpLoad %177 %256
+ %258 = OpFAdd %177 %257 %255
+ %259 = OpAccessChain %204 %195 %232
+ OpStore %259 %258
+ %260 = OpAccessChain %204 %180 %232
+ %261 = OpLoad %177 %260
+ %262 = OpFOrdGreaterThan %58 %261 %211
+ OpSelectionMerge %264 None
+ OpBranchConditional %262 %263 %264
+ %263 = OpLabel
+ %266 = OpAccessChain %29 %26 %27 %265
+ %267 = OpLoad %6 %266
+ %268 = OpConvertSToF %177 %267
+ %269 = OpAccessChain %204 %195 %203
+ %270 = OpLoad %177 %269
+ %271 = OpFAdd %177 %270 %268
+ %272 = OpAccessChain %204 %195 %203
+ OpStore %272 %271
+ OpBranch %264
+ %264 = OpLabel
+ %273 = OpAccessChain %204 %180 %232
+ %274 = OpLoad %177 %273
+ %275 = OpFOrdGreaterThan %58 %274 %224
+ OpSelectionMerge %277 None
+ OpBranchConditional %275 %276 %277
+ %276 = OpLabel
+ %279 = OpAccessChain %29 %26 %27 %278
+ %280 = OpLoad %6 %279
+ %281 = OpConvertSToF %177 %280
+ %282 = OpAccessChain %204 %195 %232
+ %283 = OpLoad %177 %282
+ %284 = OpFAdd %177 %283 %281
+ %285 = OpAccessChain %204 %195 %232
+ OpStore %285 %284
+ OpBranch %277
+ %277 = OpLabel
+ %286 = OpAccessChain %204 %180 %232
+ %287 = OpLoad %177 %286
+ %288 = OpFOrdGreaterThan %58 %287 %239
+ OpSelectionMerge %290 None
+ OpBranchConditional %288 %289 %290
+ %289 = OpLabel
+ %292 = OpAccessChain %29 %26 %27 %291
+ %293 = OpLoad %6 %292
+ %294 = OpConvertSToF %177 %293
+ %295 = OpAccessChain %204 %195 %247
+ %296 = OpLoad %177 %295
+ %297 = OpFAdd %177 %296 %294
+ %298 = OpAccessChain %204 %195 %247
+ OpStore %298 %297
+ OpBranch %290
+ %290 = OpLabel
+ %300 = OpAccessChain %29 %26 %27 %299
+ %301 = OpLoad %6 %300
+ %302 = OpConvertSToF %177 %301
+ %303 = OpAccessChain %204 %195 %247
+ %304 = OpLoad %177 %303
+ %305 = OpFAdd %177 %304 %302
+ %306 = OpAccessChain %204 %195 %247
+ OpStore %306 %305
+ %307 = OpAccessChain %204 %180 %203
+ %308 = OpLoad %177 %307
+ %309 = OpAccessChain %204 %180 %232
+ %310 = OpLoad %177 %309
+ %311 = OpFSub %177 %308 %310
+ %312 = OpExtInst %177 %1 FAbs %311
+ %313 = OpFOrdLessThan %58 %312 %211
+ OpSelectionMerge %315 None
+ OpBranchConditional %313 %314 %315
+ %314 = OpLabel
+ %316 = OpAccessChain %29 %26 %27 %88
+ %317 = OpLoad %6 %316
+ %318 = OpConvertSToF %177 %317
+ %319 = OpAccessChain %204 %195 %203
+ %320 = OpLoad %177 %319
+ %321 = OpFAdd %177 %320 %318
+ %322 = OpAccessChain %204 %195 %203
+ OpStore %322 %321
+ OpBranch %315
+ %315 = OpLabel
+ %325 = OpLoad %193 %195
+ %326 = OpExtInst %193 %1 Normalize %325
+ %327 = OpCompositeExtract %177 %326 0
+ %328 = OpCompositeExtract %177 %326 1
+ %329 = OpCompositeExtract %177 %326 2
+ %330 = OpCompositeConstruct %181 %327 %328 %329 %196
+ OpStore %324 %330
+ OpReturn
+ OpFunctionEnd
+ %11 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %12 = OpLabel
+ %20 = OpVariable %7 Function
+ %28 = OpLoad %6 %9
+ %30 = OpAccessChain %29 %26 %27 %28
+ %31 = OpLoad %6 %30
+ OpStore %20 %31
+ %32 = OpLoad %6 %9
+ %33 = OpLoad %6 %10
+ %34 = OpAccessChain %29 %26 %27 %33
+ %35 = OpLoad %6 %34
+ %36 = OpAccessChain %29 %26 %27 %32
+ OpStore %36 %35
+ %37 = OpLoad %6 %10
+ %38 = OpLoad %6 %20
+ %39 = OpAccessChain %29 %26 %27 %37
+ OpStore %39 %38
+ OpReturn
+ OpFunctionEnd
+ %16 = OpFunction %6 None %13
+ %14 = OpFunctionParameter %7
+ %15 = OpFunctionParameter %7
+ %17 = OpLabel
+ %40 = OpVariable %7 Function
+ %44 = OpVariable %7 Function
+ %48 = OpVariable %7 Function
+ %69 = OpVariable %7 Function
+ %71 = OpVariable %7 Function
+ %78 = OpVariable %7 Function
+ %80 = OpVariable %7 Function
+ %41 = OpLoad %6 %15
+ %42 = OpAccessChain %29 %26 %27 %41
+ %43 = OpLoad %6 %42
+ OpStore %40 %43
+ %45 = OpLoad %6 %14
+ %47 = OpISub %6 %45 %46
+ OpStore %44 %47
+ %49 = OpLoad %6 %14
+ OpStore %48 %49
+ OpBranch %50
+ %50 = OpLabel
+ OpLoopMerge %52 %53 None
+ OpBranch %54
+ %54 = OpLabel
+ %55 = OpLoad %6 %48
+ %56 = OpLoad %6 %15
+ %57 = OpISub %6 %56 %46
+ %59 = OpSLessThanEqual %58 %55 %57
+ OpBranchConditional %59 %51 %52
+ %51 = OpLabel
+ %60 = OpLoad %6 %48
+ %61 = OpAccessChain %29 %26 %27 %60
+ %62 = OpLoad %6 %61
+ %63 = OpLoad %6 %40
+ %64 = OpSLessThanEqual %58 %62 %63
+ OpSelectionMerge %66 None
+ OpBranchConditional %64 %65 %66
+ %65 = OpLabel
+ %67 = OpLoad %6 %44
+ %68 = OpIAdd %6 %67 %46
+ OpStore %44 %68
+ %70 = OpLoad %6 %44
+ OpStore %69 %70
+ %72 = OpLoad %6 %48
+ OpStore %71 %72
+ %73 = OpFunctionCall %2 %11 %69 %71
+ OpBranch %66
+ %66 = OpLabel
+ OpBranch %53
+ %53 = OpLabel
+ %74 = OpLoad %6 %48
+ %75 = OpIAdd %6 %74 %46
+ OpStore %48 %75
+ OpBranch %50
+ %52 = OpLabel
+ %76 = OpLoad %6 %44
+ %77 = OpIAdd %6 %76 %46
+ OpStore %44 %77
+ %79 = OpLoad %6 %44
+ OpStore %78 %79
+ %81 = OpLoad %6 %15
+ OpStore %80 %81
+ %82 = OpFunctionCall %2 %11 %78 %80
+ %83 = OpLoad %6 %44
+ OpReturnValue %83
+ OpFunctionEnd
+ %18 = OpFunction %2 None %3
+ %19 = OpLabel
+ %86 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %89 = OpVariable %7 Function
+ %92 = OpVariable %91 Function
+ %116 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %119 = OpVariable %7 Function
+ OpStore %86 %27
+ OpStore %87 %88
+ OpStore %89 %90
+ %93 = OpLoad %6 %89
+ %94 = OpIAdd %6 %93 %46
+ OpStore %89 %94
+ %95 = OpLoad %6 %86
+ %96 = OpAccessChain %7 %92 %94
+ OpStore %96 %95
+ %97 = OpLoad %6 %89
+ %98 = OpIAdd %6 %97 %46
+ OpStore %89 %98
+ %99 = OpLoad %6 %87
+ %100 = OpAccessChain %7 %92 %98
+ OpStore %100 %99
+ OpBranch %101
+ %101 = OpLabel
+ OpLoopMerge %103 %104 None
+ OpBranch %105
+ %105 = OpLabel
+ %106 = OpLoad %6 %89
+ %107 = OpSGreaterThanEqual %58 %106 %27
+ OpBranchConditional %107 %102 %103
+ %102 = OpLabel
+ %108 = OpLoad %6 %89
+ %109 = OpISub %6 %108 %46
+ OpStore %89 %109
+ %110 = OpAccessChain %7 %92 %108
+ %111 = OpLoad %6 %110
+ OpStore %87 %111
+ %112 = OpLoad %6 %89
+ %113 = OpISub %6 %112 %46
+ OpStore %89 %113
+ %114 = OpAccessChain %7 %92 %112
+ %115 = OpLoad %6 %114
+ OpStore %86 %115
+ %118 = OpLoad %6 %86
+ OpStore %117 %118
+ %120 = OpLoad %6 %87
+ OpStore %119 %120
+ %121 = OpFunctionCall %6 %16 %117 %119
+ OpStore %116 %121
+ %122 = OpLoad %6 %116
+ %123 = OpISub %6 %122 %46
+ %124 = OpLoad %6 %86
+ %125 = OpSGreaterThan %58 %123 %124
+ OpSelectionMerge %127 None
+ OpBranchConditional %125 %126 %127
+ %126 = OpLabel
+ %128 = OpLoad %6 %89
+ %129 = OpIAdd %6 %128 %46
+ OpStore %89 %129
+ %130 = OpLoad %6 %86
+ %131 = OpAccessChain %7 %92 %129
+ OpStore %131 %130
+ %132 = OpLoad %6 %89
+ %133 = OpIAdd %6 %132 %46
+ OpStore %89 %133
+ %134 = OpLoad %6 %116
+ %135 = OpISub %6 %134 %46
+ %136 = OpAccessChain %7 %92 %133
+ OpStore %136 %135
+ OpBranch %127
+ %127 = OpLabel
+ %137 = OpLoad %6 %116
+ %138 = OpIAdd %6 %137 %46
+ %139 = OpLoad %6 %87
+ %140 = OpSLessThan %58 %138 %139
+ OpSelectionMerge %142 None
+ OpBranchConditional %140 %141 %142
+ %141 = OpLabel
+ %143 = OpLoad %6 %89
+ %144 = OpIAdd %6 %143 %46
+ OpStore %89 %144
+ %145 = OpLoad %6 %116
+ %146 = OpIAdd %6 %145 %46
+ %147 = OpAccessChain %7 %92 %144
+ OpStore %147 %146
+ %148 = OpLoad %6 %89
+ %149 = OpIAdd %6 %148 %46
+ OpStore %89 %149
+ %150 = OpLoad %6 %87
+ %151 = OpAccessChain %7 %92 %149
+ OpStore %151 %150
+ OpBranch %142
+ %142 = OpLabel
+ OpBranch %104
+ %104 = OpLabel
+ OpBranch %101
+ %103 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 529
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %183 %324
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %11 "swap(i1;i1;"
+ OpName %9 "i"
+ OpName %10 "j"
+ OpName %16 "performPartition(i1;i1;"
+ OpName %14 "l"
+ OpName %15 "h"
+ OpName %18 "quicksort("
+ OpName %20 "temp"
+ OpName %24 "QuicksortObject"
+ OpMemberName %24 0 "numbers"
+ OpName %26 "obj"
+ OpName %40 "pivot"
+ OpName %44 "i"
+ OpName %48 "j"
+ OpName %69 "param"
+ OpName %71 "param"
+ OpName %78 "param"
+ OpName %80 "param"
+ OpName %86 "l"
+ OpName %87 "h"
+ OpName %89 "top"
+ OpName %92 "stack"
+ OpName %116 "p"
+ OpName %117 "param"
+ OpName %119 "param"
+ OpName %152 "i"
+ OpName %180 "uv"
+ OpName %183 "gl_FragCoord"
+ OpName %186 "buf0"
+ OpMemberName %186 0 "resolution"
+ OpName %188 ""
+ OpName %195 "color"
+ OpName %324 "_GLF_color"
+ OpDecorate %183 BuiltIn FragCoord
+ OpMemberDecorate %186 0 Offset 0
+ OpDecorate %186 Block
+ OpDecorate %188 DescriptorSet 0
+ OpDecorate %188 Binding 0
+ OpDecorate %324 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %13 = OpTypeFunction %6 %7 %7
+ %21 = OpTypeInt 32 0
+ %22 = OpConstant %21 10
+ %23 = OpTypeArray %6 %22
+ %24 = OpTypeStruct %23
+ %25 = OpTypePointer Private %24
+ %26 = OpVariable %25 Private
+ %27 = OpConstant %6 0
+ %29 = OpTypePointer Private %6
+ %46 = OpConstant %6 1
+ %58 = OpTypeBool
+ %88 = OpConstant %6 9
+ %90 = OpConstant %6 -1
+ %91 = OpTypePointer Function %23
+ %159 = OpConstant %6 10
+ %177 = OpTypeFloat 32
+ %178 = OpTypeVector %177 2
+ %179 = OpTypePointer Function %178
+ %181 = OpTypeVector %177 4
+ %182 = OpTypePointer Input %181
+ %183 = OpVariable %182 Input
+ %186 = OpTypeStruct %178
+ %187 = OpTypePointer Uniform %186
+ %188 = OpVariable %187 Uniform
+ %189 = OpTypePointer Uniform %178
+ %193 = OpTypeVector %177 3
+ %194 = OpTypePointer Function %193
+ %196 = OpConstant %177 1
+ %197 = OpConstant %177 2
+ %198 = OpConstant %177 3
+ %199 = OpConstantComposite %193 %196 %197 %198
+ %203 = OpConstant %21 0
+ %204 = OpTypePointer Function %177
+ %211 = OpConstant %177 0.25
+ %224 = OpConstant %177 0.5
+ %228 = OpConstant %6 2
+ %232 = OpConstant %21 1
+ %239 = OpConstant %177 0.75
+ %243 = OpConstant %6 3
+ %247 = OpConstant %21 2
+ %252 = OpConstant %6 4
+ %265 = OpConstant %6 5
+ %278 = OpConstant %6 6
+ %291 = OpConstant %6 7
+ %299 = OpConstant %6 8
+ %323 = OpTypePointer Output %181
+ %324 = OpVariable %323 Output
+ %438 = OpTypeMatrix %193 3
+ %521 = OpConstant %177 0
+ %522 = OpConstantComposite %193 %521 %521 %521
+ %527 = OpConstantComposite %438 %522 %522 %522
+ %8 = OpTypeFunction %2 %7 %7 %438
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %152 = OpVariable %7 Function
+ %180 = OpVariable %179 Function
+ %195 = OpVariable %194 Function
+ OpStore %152 %27
+ OpBranch %153
+ %153 = OpLabel
+ OpLoopMerge %155 %156 None
+ OpBranch %157
+ %157 = OpLabel
+ %158 = OpLoad %6 %152
+ %160 = OpSLessThan %58 %158 %159
+ OpBranchConditional %160 %154 %155
+ %154 = OpLabel
+ %161 = OpLoad %6 %152
+ %162 = OpLoad %6 %152
+ %163 = OpISub %6 %159 %162
+ %164 = OpAccessChain %29 %26 %27 %161
+ OpStore %164 %163
+ %165 = OpLoad %6 %152
+ %166 = OpLoad %6 %152
+ %167 = OpAccessChain %29 %26 %27 %166
+ %168 = OpLoad %6 %167
+ %169 = OpLoad %6 %152
+ %170 = OpAccessChain %29 %26 %27 %169
+ %171 = OpLoad %6 %170
+ %172 = OpIMul %6 %168 %171
+ %173 = OpAccessChain %29 %26 %27 %165
+ OpStore %173 %172
+ OpBranch %156
+ %156 = OpLabel
+ %174 = OpLoad %6 %152
+ %175 = OpIAdd %6 %174 %46
+ OpStore %152 %175
+ OpBranch %153
+ %155 = OpLabel
+ %176 = OpFunctionCall %2 %18
+ %184 = OpLoad %181 %183
+ %185 = OpVectorShuffle %178 %184 %184 0 1
+ %190 = OpAccessChain %189 %188 %27
+ %191 = OpLoad %178 %190
+ %192 = OpFDiv %178 %185 %191
+ OpStore %180 %192
+ OpStore %195 %199
+ %200 = OpAccessChain %29 %26 %27 %27
+ %201 = OpLoad %6 %200
+ %202 = OpConvertSToF %177 %201
+ %205 = OpAccessChain %204 %195 %203
+ %206 = OpLoad %177 %205
+ %207 = OpFAdd %177 %206 %202
+ %208 = OpAccessChain %204 %195 %203
+ OpStore %208 %207
+ %209 = OpAccessChain %204 %180 %203
+ %210 = OpLoad %177 %209
+ %212 = OpFOrdGreaterThan %58 %210 %211
+ OpSelectionMerge %214 None
+ OpBranchConditional %212 %213 %214
+ %213 = OpLabel
+ %215 = OpAccessChain %29 %26 %27 %46
+ %216 = OpLoad %6 %215
+ %217 = OpConvertSToF %177 %216
+ %218 = OpAccessChain %204 %195 %203
+ %219 = OpLoad %177 %218
+ %220 = OpFAdd %177 %219 %217
+ %221 = OpAccessChain %204 %195 %203
+ OpStore %221 %220
+ OpBranch %214
+ %214 = OpLabel
+ %222 = OpAccessChain %204 %180 %203
+ %223 = OpLoad %177 %222
+ %225 = OpFOrdGreaterThan %58 %223 %224
+ OpSelectionMerge %227 None
+ OpBranchConditional %225 %226 %227
+ %226 = OpLabel
+ %229 = OpAccessChain %29 %26 %27 %228
+ %230 = OpLoad %6 %229
+ %231 = OpConvertSToF %177 %230
+ %233 = OpAccessChain %204 %195 %232
+ %234 = OpLoad %177 %233
+ %235 = OpFAdd %177 %234 %231
+ %236 = OpAccessChain %204 %195 %232
+ OpStore %236 %235
+ OpBranch %227
+ %227 = OpLabel
+ %237 = OpAccessChain %204 %180 %203
+ %238 = OpLoad %177 %237
+ %240 = OpFOrdGreaterThan %58 %238 %239
+ OpSelectionMerge %242 None
+ OpBranchConditional %240 %241 %242
+ %241 = OpLabel
+ %244 = OpAccessChain %29 %26 %27 %243
+ %245 = OpLoad %6 %244
+ %246 = OpConvertSToF %177 %245
+ %248 = OpAccessChain %204 %195 %247
+ %249 = OpLoad %177 %248
+ %250 = OpFAdd %177 %249 %246
+ %251 = OpAccessChain %204 %195 %247
+ OpStore %251 %250
+ OpBranch %242
+ %242 = OpLabel
+ %253 = OpAccessChain %29 %26 %27 %252
+ %254 = OpLoad %6 %253
+ %255 = OpConvertSToF %177 %254
+ %256 = OpAccessChain %204 %195 %232
+ %257 = OpLoad %177 %256
+ %258 = OpFAdd %177 %257 %255
+ %259 = OpAccessChain %204 %195 %232
+ OpStore %259 %258
+ %260 = OpAccessChain %204 %180 %232
+ %261 = OpLoad %177 %260
+ %262 = OpFOrdGreaterThan %58 %261 %211
+ OpSelectionMerge %264 None
+ OpBranchConditional %262 %263 %264
+ %263 = OpLabel
+ %266 = OpAccessChain %29 %26 %27 %265
+ %267 = OpLoad %6 %266
+ %268 = OpConvertSToF %177 %267
+ %269 = OpAccessChain %204 %195 %203
+ %270 = OpLoad %177 %269
+ %271 = OpFAdd %177 %270 %268
+ %272 = OpAccessChain %204 %195 %203
+ OpStore %272 %271
+ OpBranch %264
+ %264 = OpLabel
+ %273 = OpAccessChain %204 %180 %232
+ %274 = OpLoad %177 %273
+ %275 = OpFOrdGreaterThan %58 %274 %224
+ OpSelectionMerge %277 None
+ OpBranchConditional %275 %276 %277
+ %276 = OpLabel
+ %279 = OpAccessChain %29 %26 %27 %278
+ %280 = OpLoad %6 %279
+ %281 = OpConvertSToF %177 %280
+ %282 = OpAccessChain %204 %195 %232
+ %283 = OpLoad %177 %282
+ %284 = OpFAdd %177 %283 %281
+ %285 = OpAccessChain %204 %195 %232
+ OpStore %285 %284
+ OpBranch %277
+ %277 = OpLabel
+ %286 = OpAccessChain %204 %180 %232
+ %287 = OpLoad %177 %286
+ %288 = OpFOrdGreaterThan %58 %287 %239
+ OpSelectionMerge %290 None
+ OpBranchConditional %288 %289 %290
+ %289 = OpLabel
+ %292 = OpAccessChain %29 %26 %27 %291
+ %293 = OpLoad %6 %292
+ %294 = OpConvertSToF %177 %293
+ %295 = OpAccessChain %204 %195 %247
+ %296 = OpLoad %177 %295
+ %297 = OpFAdd %177 %296 %294
+ %298 = OpAccessChain %204 %195 %247
+ OpStore %298 %297
+ OpBranch %290
+ %290 = OpLabel
+ %300 = OpAccessChain %29 %26 %27 %299
+ %301 = OpLoad %6 %300
+ %302 = OpConvertSToF %177 %301
+ %303 = OpAccessChain %204 %195 %247
+ %304 = OpLoad %177 %303
+ %305 = OpFAdd %177 %304 %302
+ %306 = OpAccessChain %204 %195 %247
+ OpStore %306 %305
+ %307 = OpAccessChain %204 %180 %203
+ %308 = OpLoad %177 %307
+ %309 = OpAccessChain %204 %180 %232
+ %310 = OpLoad %177 %309
+ %311 = OpFSub %177 %308 %310
+ %312 = OpExtInst %177 %1 FAbs %311
+ %313 = OpFOrdLessThan %58 %312 %211
+ OpSelectionMerge %315 None
+ OpBranchConditional %313 %314 %315
+ %314 = OpLabel
+ %316 = OpAccessChain %29 %26 %27 %88
+ %317 = OpLoad %6 %316
+ %318 = OpConvertSToF %177 %317
+ %319 = OpAccessChain %204 %195 %203
+ %320 = OpLoad %177 %319
+ %321 = OpFAdd %177 %320 %318
+ %322 = OpAccessChain %204 %195 %203
+ OpStore %322 %321
+ OpBranch %315
+ %315 = OpLabel
+ %325 = OpLoad %193 %195
+ %326 = OpExtInst %193 %1 Normalize %325
+ %327 = OpCompositeExtract %177 %326 0
+ %328 = OpCompositeExtract %177 %326 1
+ %329 = OpCompositeExtract %177 %326 2
+ %330 = OpCompositeConstruct %181 %327 %328 %329 %196
+ OpStore %324 %330
+ OpReturn
+ OpFunctionEnd
+ %11 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %528 = OpFunctionParameter %438
+ %12 = OpLabel
+ %20 = OpVariable %7 Function
+ %28 = OpLoad %6 %9
+ %30 = OpAccessChain %29 %26 %27 %28
+ %31 = OpLoad %6 %30
+ OpStore %20 %31
+ %32 = OpLoad %6 %9
+ %33 = OpLoad %6 %10
+ %34 = OpAccessChain %29 %26 %27 %33
+ %35 = OpLoad %6 %34
+ %36 = OpAccessChain %29 %26 %27 %32
+ OpStore %36 %35
+ %37 = OpLoad %6 %10
+ %38 = OpLoad %6 %20
+ %39 = OpAccessChain %29 %26 %27 %37
+ OpStore %39 %38
+ OpReturn
+ OpFunctionEnd
+ %16 = OpFunction %6 None %13
+ %14 = OpFunctionParameter %7
+ %15 = OpFunctionParameter %7
+ %17 = OpLabel
+ %40 = OpVariable %7 Function
+ %44 = OpVariable %7 Function
+ %48 = OpVariable %7 Function
+ %69 = OpVariable %7 Function
+ %71 = OpVariable %7 Function
+ %78 = OpVariable %7 Function
+ %80 = OpVariable %7 Function
+ %41 = OpLoad %6 %15
+ %42 = OpAccessChain %29 %26 %27 %41
+ %43 = OpLoad %6 %42
+ OpStore %40 %43
+ %45 = OpLoad %6 %14
+ %47 = OpISub %6 %45 %46
+ OpStore %44 %47
+ %49 = OpLoad %6 %14
+ OpStore %48 %49
+ OpBranch %50
+ %50 = OpLabel
+ OpLoopMerge %52 %53 None
+ OpBranch %54
+ %54 = OpLabel
+ %55 = OpLoad %6 %48
+ %56 = OpLoad %6 %15
+ %57 = OpISub %6 %56 %46
+ %59 = OpSLessThanEqual %58 %55 %57
+ OpBranchConditional %59 %51 %52
+ %51 = OpLabel
+ %60 = OpLoad %6 %48
+ %61 = OpAccessChain %29 %26 %27 %60
+ %62 = OpLoad %6 %61
+ %63 = OpLoad %6 %40
+ %64 = OpSLessThanEqual %58 %62 %63
+ OpSelectionMerge %66 None
+ OpBranchConditional %64 %65 %66
+ %65 = OpLabel
+ %67 = OpLoad %6 %44
+ %68 = OpIAdd %6 %67 %46
+ OpStore %44 %68
+ %70 = OpLoad %6 %44
+ OpStore %69 %70
+ %72 = OpLoad %6 %48
+ OpStore %71 %72
+ %73 = OpFunctionCall %2 %11 %69 %71 %527
+ OpBranch %66
+ %66 = OpLabel
+ OpBranch %53
+ %53 = OpLabel
+ %74 = OpLoad %6 %48
+ %75 = OpIAdd %6 %74 %46
+ OpStore %48 %75
+ OpBranch %50
+ %52 = OpLabel
+ %76 = OpLoad %6 %44
+ %77 = OpIAdd %6 %76 %46
+ OpStore %44 %77
+ %79 = OpLoad %6 %44
+ OpStore %78 %79
+ %81 = OpLoad %6 %15
+ OpStore %80 %81
+ %82 = OpFunctionCall %2 %11 %78 %80 %527
+ %83 = OpLoad %6 %44
+ OpReturnValue %83
+ OpFunctionEnd
+ %18 = OpFunction %2 None %3
+ %19 = OpLabel
+ %86 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %89 = OpVariable %7 Function
+ %92 = OpVariable %91 Function
+ %116 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %119 = OpVariable %7 Function
+ OpStore %86 %27
+ OpStore %87 %88
+ OpStore %89 %90
+ %93 = OpLoad %6 %89
+ %94 = OpIAdd %6 %93 %46
+ OpStore %89 %94
+ %95 = OpLoad %6 %86
+ %96 = OpAccessChain %7 %92 %94
+ OpStore %96 %95
+ %97 = OpLoad %6 %89
+ %98 = OpIAdd %6 %97 %46
+ OpStore %89 %98
+ %99 = OpLoad %6 %87
+ %100 = OpAccessChain %7 %92 %98
+ OpStore %100 %99
+ OpBranch %101
+ %101 = OpLabel
+ OpLoopMerge %103 %104 None
+ OpBranch %105
+ %105 = OpLabel
+ %106 = OpLoad %6 %89
+ %107 = OpSGreaterThanEqual %58 %106 %27
+ OpBranchConditional %107 %102 %103
+ %102 = OpLabel
+ %108 = OpLoad %6 %89
+ %109 = OpISub %6 %108 %46
+ OpStore %89 %109
+ %110 = OpAccessChain %7 %92 %108
+ %111 = OpLoad %6 %110
+ OpStore %87 %111
+ %112 = OpLoad %6 %89
+ %113 = OpISub %6 %112 %46
+ OpStore %89 %113
+ %114 = OpAccessChain %7 %92 %112
+ %115 = OpLoad %6 %114
+ OpStore %86 %115
+ %118 = OpLoad %6 %86
+ OpStore %117 %118
+ %120 = OpLoad %6 %87
+ OpStore %119 %120
+ %121 = OpFunctionCall %6 %16 %117 %119
+ OpStore %116 %121
+ %122 = OpLoad %6 %116
+ %123 = OpISub %6 %122 %46
+ %124 = OpLoad %6 %86
+ %125 = OpSGreaterThan %58 %123 %124
+ OpSelectionMerge %127 None
+ OpBranchConditional %125 %126 %127
+ %126 = OpLabel
+ %128 = OpLoad %6 %89
+ %129 = OpIAdd %6 %128 %46
+ OpStore %89 %129
+ %130 = OpLoad %6 %86
+ %131 = OpAccessChain %7 %92 %129
+ OpStore %131 %130
+ %132 = OpLoad %6 %89
+ %133 = OpIAdd %6 %132 %46
+ OpStore %89 %133
+ %134 = OpLoad %6 %116
+ %135 = OpISub %6 %134 %46
+ %136 = OpAccessChain %7 %92 %133
+ OpStore %136 %135
+ OpBranch %127
+ %127 = OpLabel
+ %137 = OpLoad %6 %116
+ %138 = OpIAdd %6 %137 %46
+ %139 = OpLoad %6 %87
+ %140 = OpSLessThan %58 %138 %139
+ OpSelectionMerge %142 None
+ OpBranchConditional %140 %141 %142
+ %141 = OpLabel
+ %143 = OpLoad %6 %89
+ %144 = OpIAdd %6 %143 %46
+ OpStore %89 %144
+ %145 = OpLoad %6 %116
+ %146 = OpIAdd %6 %145 %46
+ %147 = OpAccessChain %7 %92 %144
+ OpStore %147 %146
+ %148 = OpLoad %6 %89
+ %149 = OpIAdd %6 %148 %46
+ OpStore %89 %149
+ %150 = OpLoad %6 %87
+ %151 = OpAccessChain %7 %92 %149
+ OpStore %151 %150
+ OpBranch %142
+ %142 = OpLabel
+ OpBranch %104
+ %104 = OpLabel
+ OpBranch %101
+ %103 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var.amber
new file mode 100644
index 0000000..745c128
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var.amber
@@ -0,0 +1,688 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: Three shaders diff: new variable used and mutated
+
+# The test renders three images using semantically equivalent shaders, and then
+# checks that the images are similar.
+# The test passes because the shaders have the same semantics and so the images
+# should be the same.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 286
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %165 %180
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %165 "gl_FragCoord"
+ OpName %168 "buf0"
+ OpMemberName %168 0 "resolution"
+ OpName %170 ""
+ OpName %180 "_GLF_color"
+ OpDecorate %165 BuiltIn FragCoord
+ OpMemberDecorate %168 0 Offset 0
+ OpDecorate %168 Block
+ OpDecorate %170 DescriptorSet 0
+ OpDecorate %170 Binding 0
+ OpDecorate %180 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %9 = OpTypeVector %6 4
+ %10 = OpTypePointer Function %9
+ %11 = OpTypeBool
+ %21 = OpTypeInt 32 0
+ %22 = OpConstant %21 0
+ %23 = OpTypePointer Function %6
+ %31 = OpConstantFalse %11
+ %33 = OpConstant %21 1
+ %66 = OpConstantTrue %11
+ %70 = OpConstant %6 0.5
+ %71 = OpConstant %6 1
+ %72 = OpConstantComposite %9 %70 %70 %71 %71
+ %73 = OpTypeInt 32 1
+ %76 = OpConstant %73 0
+ %83 = OpConstant %73 8
+ %85 = OpConstant %21 8
+ %86 = OpTypeArray %9 %85
+ %87 = OpConstant %6 4
+ %88 = OpConstant %6 20
+ %89 = OpConstantComposite %9 %87 %87 %88 %87
+ %90 = OpConstantComposite %9 %87 %87 %87 %88
+ %91 = OpConstantComposite %9 %87 %88 %88 %87
+ %92 = OpConstant %6 8
+ %93 = OpConstantComposite %9 %88 %87 %87 %92
+ %94 = OpConstant %6 6
+ %95 = OpConstant %6 2
+ %96 = OpConstantComposite %9 %92 %94 %87 %95
+ %97 = OpConstant %6 12
+ %98 = OpConstantComposite %9 %95 %97 %95 %87
+ %99 = OpConstant %6 16
+ %100 = OpConstantComposite %9 %99 %95 %87 %87
+ %101 = OpConstant %6 22
+ %102 = OpConstantComposite %9 %97 %101 %87 %87
+ %103 = OpConstantComposite %86 %89 %90 %91 %93 %96 %98 %100 %102
+ %108 = OpTypePointer Function %86
+ %115 = OpConstant %21 16
+ %116 = OpTypeArray %9 %115
+ %117 = OpConstant %6 0
+ %118 = OpConstantComposite %9 %117 %117 %117 %71
+ %119 = OpConstantComposite %9 %70 %117 %117 %71
+ %120 = OpConstantComposite %9 %117 %70 %117 %71
+ %121 = OpConstantComposite %9 %70 %70 %117 %71
+ %122 = OpConstantComposite %9 %117 %117 %70 %71
+ %123 = OpConstantComposite %9 %70 %117 %70 %71
+ %124 = OpConstantComposite %9 %117 %70 %70 %71
+ %125 = OpConstantComposite %9 %70 %70 %70 %71
+ %126 = OpConstantComposite %9 %71 %117 %117 %71
+ %127 = OpConstantComposite %9 %117 %71 %117 %71
+ %128 = OpConstantComposite %9 %71 %71 %117 %71
+ %129 = OpConstantComposite %9 %117 %117 %71 %71
+ %130 = OpConstantComposite %9 %71 %117 %71 %71
+ %131 = OpConstantComposite %9 %117 %71 %71 %71
+ %132 = OpConstantComposite %9 %71 %71 %71 %71
+ %133 = OpConstantComposite %116 %118 %119 %120 %121 %122 %123 %124 %125 %118 %126 %127 %128 %129 %130 %131 %132
+ %146 = OpConstant %73 9
+ %149 = OpConstant %73 11
+ %151 = OpConstant %73 16
+ %153 = OpTypePointer Function %116
+ %158 = OpConstant %73 1
+ %164 = OpTypePointer Input %9
+ %165 = OpVariable %164 Input
+ %168 = OpTypeStruct %7
+ %169 = OpTypePointer Uniform %168
+ %170 = OpVariable %169 Uniform
+ %171 = OpTypePointer Uniform %7
+ %176 = OpConstant %6 32
+ %179 = OpTypePointer Output %9
+ %180 = OpVariable %179 Output
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %199 = OpVariable %108 Function
+ %200 = OpVariable %108 Function
+ %201 = OpVariable %108 Function
+ %202 = OpVariable %153 Function
+ %166 = OpLoad %9 %165
+ %167 = OpVectorShuffle %7 %166 %166 0 1
+ %172 = OpAccessChain %171 %170 %76
+ %173 = OpLoad %7 %172
+ %174 = OpFDiv %7 %167 %173
+ %177 = OpVectorTimesScalar %7 %174 %176
+ %178 = OpExtInst %7 %1 Floor %177
+ OpBranch %205
+ %205 = OpLabel
+ %280 = OpPhi %9 %72 %5 %285 %233
+ %279 = OpPhi %73 %76 %5 %235 %233
+ %208 = OpSLessThan %11 %279 %83
+ OpLoopMerge %236 %233 None
+ OpBranchConditional %208 %209 %236
+ %209 = OpLabel
+ OpStore %199 %103
+ %212 = OpAccessChain %10 %199 %279
+ %213 = OpLoad %9 %212
+ OpSelectionMerge %277 None
+ OpSwitch %22 %242
+ %242 = OpLabel
+ %244 = OpCompositeExtract %6 %178 0
+ %246 = OpCompositeExtract %6 %213 0
+ %247 = OpFOrdLessThan %11 %244 %246
+ OpSelectionMerge %249 None
+ OpBranchConditional %247 %248 %249
+ %248 = OpLabel
+ OpBranch %277
+ %249 = OpLabel
+ %251 = OpCompositeExtract %6 %178 1
+ %253 = OpCompositeExtract %6 %213 1
+ %254 = OpFOrdLessThan %11 %251 %253
+ OpSelectionMerge %256 None
+ OpBranchConditional %254 %255 %256
+ %255 = OpLabel
+ OpBranch %277
+ %256 = OpLabel
+ %262 = OpCompositeExtract %6 %213 2
+ %263 = OpFAdd %6 %246 %262
+ %264 = OpFOrdGreaterThan %11 %244 %263
+ OpSelectionMerge %266 None
+ OpBranchConditional %264 %265 %266
+ %265 = OpLabel
+ OpBranch %277
+ %266 = OpLabel
+ %272 = OpCompositeExtract %6 %213 3
+ %273 = OpFAdd %6 %253 %272
+ %274 = OpFOrdGreaterThan %11 %251 %273
+ OpSelectionMerge %276 None
+ OpBranchConditional %274 %275 %276
+ %275 = OpLabel
+ OpBranch %277
+ %276 = OpLabel
+ OpBranch %277
+ %277 = OpLabel
+ %282 = OpPhi %11 %31 %248 %31 %255 %31 %265 %31 %275 %66 %276
+ OpSelectionMerge %232 None
+ OpBranchConditional %282 %215 %232
+ %215 = OpLabel
+ OpStore %200 %103
+ %217 = OpAccessChain %23 %200 %279 %22
+ %218 = OpLoad %6 %217
+ %219 = OpConvertFToS %73 %218
+ OpStore %201 %103
+ %221 = OpAccessChain %23 %201 %279 %33
+ %222 = OpLoad %6 %221
+ %223 = OpConvertFToS %73 %222
+ %224 = OpIMul %73 %219 %223
+ %226 = OpIMul %73 %279 %146
+ %227 = OpIAdd %73 %224 %226
+ %228 = OpIAdd %73 %227 %149
+ %229 = OpSMod %73 %228 %151
+ OpStore %202 %133
+ %230 = OpAccessChain %10 %202 %229
+ %231 = OpLoad %9 %230
+ OpBranch %232
+ %232 = OpLabel
+ %285 = OpPhi %9 %280 %277 %231 %215
+ OpBranch %233
+ %233 = OpLabel
+ %235 = OpIAdd %73 %279 %158
+ OpBranch %205
+ %236 = OpLabel
+ OpStore %180 %280
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 517
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %165 %180
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %165 "gl_FragCoord"
+ OpName %168 "buf0"
+ OpMemberName %168 0 "resolution"
+ OpName %170 ""
+ OpName %180 "_GLF_color"
+ OpDecorate %165 BuiltIn FragCoord
+ OpMemberDecorate %168 0 Offset 0
+ OpDecorate %168 Block
+ OpDecorate %170 DescriptorSet 0
+ OpDecorate %170 Binding 0
+ OpDecorate %180 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %9 = OpTypeVector %6 4
+ %10 = OpTypePointer Function %9
+ %11 = OpTypeBool
+ %21 = OpTypeInt 32 0
+ %22 = OpConstant %21 0
+ %23 = OpTypePointer Function %6
+ %31 = OpConstantFalse %11
+ %33 = OpConstant %21 1
+ %66 = OpConstantTrue %11
+ %70 = OpConstant %6 0.5
+ %71 = OpConstant %6 1
+ %72 = OpConstantComposite %9 %70 %70 %71 %71
+ %73 = OpTypeInt 32 1
+ %76 = OpConstant %73 0
+ %83 = OpConstant %73 8
+ %85 = OpConstant %21 8
+ %86 = OpTypeArray %9 %85
+ %87 = OpConstant %6 4
+ %88 = OpConstant %6 20
+ %89 = OpConstantComposite %9 %87 %87 %88 %87
+ %90 = OpConstantComposite %9 %87 %87 %87 %88
+ %91 = OpConstantComposite %9 %87 %88 %88 %87
+ %92 = OpConstant %6 8
+ %93 = OpConstantComposite %9 %88 %87 %87 %92
+ %94 = OpConstant %6 6
+ %95 = OpConstant %6 2
+ %96 = OpConstantComposite %9 %92 %94 %87 %95
+ %97 = OpConstant %6 12
+ %98 = OpConstantComposite %9 %95 %97 %95 %87
+ %99 = OpConstant %6 16
+ %100 = OpConstantComposite %9 %99 %95 %87 %87
+ %101 = OpConstant %6 22
+ %102 = OpConstantComposite %9 %97 %101 %87 %87
+ %103 = OpConstantComposite %86 %89 %90 %91 %93 %96 %98 %100 %102
+ %108 = OpTypePointer Function %86
+ %115 = OpConstant %21 16
+ %116 = OpTypeArray %9 %115
+ %117 = OpConstant %6 0
+ %118 = OpConstantComposite %9 %117 %117 %117 %71
+ %119 = OpConstantComposite %9 %70 %117 %117 %71
+ %120 = OpConstantComposite %9 %117 %70 %117 %71
+ %121 = OpConstantComposite %9 %70 %70 %117 %71
+ %122 = OpConstantComposite %9 %117 %117 %70 %71
+ %123 = OpConstantComposite %9 %70 %117 %70 %71
+ %124 = OpConstantComposite %9 %117 %70 %70 %71
+ %125 = OpConstantComposite %9 %70 %70 %70 %71
+ %126 = OpConstantComposite %9 %71 %117 %117 %71
+ %127 = OpConstantComposite %9 %117 %71 %117 %71
+ %128 = OpConstantComposite %9 %71 %71 %117 %71
+ %129 = OpConstantComposite %9 %117 %117 %71 %71
+ %130 = OpConstantComposite %9 %71 %117 %71 %71
+ %131 = OpConstantComposite %9 %117 %71 %71 %71
+ %132 = OpConstantComposite %9 %71 %71 %71 %71
+ %133 = OpConstantComposite %116 %118 %119 %120 %121 %122 %123 %124 %125 %118 %126 %127 %128 %129 %130 %131 %132
+ %146 = OpConstant %73 9
+ %149 = OpConstant %73 11
+ %151 = OpConstant %73 16
+ %153 = OpTypePointer Function %116
+ %158 = OpConstant %73 1
+ %164 = OpTypePointer Input %9
+ %165 = OpVariable %164 Input
+ %168 = OpTypeStruct %7
+ %169 = OpTypePointer Uniform %168
+ %170 = OpVariable %169 Uniform
+ %171 = OpTypePointer Uniform %7
+ %176 = OpConstant %6 32
+ %179 = OpTypePointer Output %9
+ %180 = OpVariable %179 Output
+ %386 = OpConstantComposite %9 %117 %117 %117 %117
+ %387 = OpConstantComposite %86 %386 %386 %386 %386 %386 %386 %386 %386
+ %498 = OpConstant %6 0
+ %499 = OpConstantComposite %9 %498 %498 %498 %498
+ %503 = OpConstantComposite %86 %499 %499 %499 %499 %499 %499 %499 %499
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %389 = OpVariable %108 Function %387
+ %199 = OpVariable %108 Function
+ %200 = OpVariable %108 Function
+ %201 = OpVariable %108 Function
+ %202 = OpVariable %153 Function
+ OpStore %389 %103
+ %388 = OpLoad %86 %389
+ %166 = OpLoad %9 %165
+ %167 = OpVectorShuffle %7 %166 %166 0 1
+ %172 = OpAccessChain %171 %170 %76
+ %173 = OpLoad %7 %172
+ %174 = OpFDiv %7 %167 %173
+ %177 = OpVectorTimesScalar %7 %174 %176
+ %178 = OpExtInst %7 %1 Floor %177
+ OpBranch %205
+ %205 = OpLabel
+ %280 = OpPhi %9 %72 %5 %285 %233
+ %279 = OpPhi %73 %76 %5 %235 %233
+ %208 = OpSLessThan %11 %279 %83
+ OpLoopMerge %236 %233 None
+ OpBranchConditional %208 %209 %236
+ %209 = OpLabel
+ OpStore %199 %388
+ %212 = OpAccessChain %10 %199 %279
+ %213 = OpLoad %9 %212
+ OpSelectionMerge %277 None
+ OpSwitch %22 %242
+ %242 = OpLabel
+ %244 = OpCompositeExtract %6 %178 0
+ %246 = OpCompositeExtract %6 %213 0
+ %247 = OpFOrdLessThan %11 %244 %246
+ OpSelectionMerge %249 None
+ OpBranchConditional %247 %248 %249
+ %248 = OpLabel
+ OpBranch %277
+ %249 = OpLabel
+ %251 = OpCompositeExtract %6 %178 1
+ %253 = OpCompositeExtract %6 %213 1
+ %254 = OpFOrdLessThan %11 %251 %253
+ OpSelectionMerge %256 None
+ OpBranchConditional %254 %255 %256
+ %255 = OpLabel
+ OpBranch %277
+ %256 = OpLabel
+ %262 = OpCompositeExtract %6 %213 2
+ %263 = OpFAdd %6 %246 %262
+ %264 = OpFOrdGreaterThan %11 %244 %263
+ OpSelectionMerge %266 None
+ OpBranchConditional %264 %265 %266
+ %265 = OpLabel
+ OpBranch %277
+ %266 = OpLabel
+ %272 = OpCompositeExtract %6 %213 3
+ %273 = OpFAdd %6 %253 %272
+ %274 = OpFOrdGreaterThan %11 %251 %273
+ OpSelectionMerge %276 None
+ OpBranchConditional %274 %275 %276
+ %275 = OpLabel
+ OpBranch %277
+ %276 = OpLabel
+ OpBranch %277
+ %277 = OpLabel
+ %282 = OpPhi %11 %31 %248 %31 %255 %31 %265 %31 %275 %66 %276
+ OpSelectionMerge %232 None
+ OpBranchConditional %282 %215 %232
+ %215 = OpLabel
+ OpStore %200 %103
+ %217 = OpAccessChain %23 %200 %279 %22
+ %218 = OpLoad %6 %217
+ %219 = OpConvertFToS %73 %218
+ OpStore %201 %103
+ %221 = OpAccessChain %23 %201 %279 %33
+ %222 = OpLoad %6 %221
+ %516 = OpLoad %86 %389
+ OpStore %389 %503
+ OpStore %389 %516
+ %223 = OpConvertFToS %73 %222
+ %224 = OpIMul %73 %219 %223
+ %226 = OpIMul %73 %279 %146
+ %227 = OpIAdd %73 %224 %226
+ %228 = OpIAdd %73 %227 %149
+ %229 = OpSMod %73 %228 %151
+ OpStore %202 %133
+ %230 = OpAccessChain %10 %202 %229
+ %231 = OpLoad %9 %230
+ OpBranch %232
+ %232 = OpLabel
+ %285 = OpPhi %9 %280 %277 %231 %215
+ OpBranch %233
+ %233 = OpLabel
+ %235 = OpIAdd %73 %279 %158
+ OpBranch %205
+ %236 = OpLabel
+ OpStore %180 %280
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_2_vertex_shader PASSTHROUGH
+
+SHADER fragment variant_2_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 504
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %165 %180
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %165 "gl_FragCoord"
+ OpName %168 "buf0"
+ OpMemberName %168 0 "resolution"
+ OpName %170 ""
+ OpName %180 "_GLF_color"
+ OpDecorate %165 BuiltIn FragCoord
+ OpMemberDecorate %168 0 Offset 0
+ OpDecorate %168 Block
+ OpDecorate %170 DescriptorSet 0
+ OpDecorate %170 Binding 0
+ OpDecorate %180 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %9 = OpTypeVector %6 4
+ %10 = OpTypePointer Function %9
+ %11 = OpTypeBool
+ %21 = OpTypeInt 32 0
+ %22 = OpConstant %21 0
+ %23 = OpTypePointer Function %6
+ %31 = OpConstantFalse %11
+ %33 = OpConstant %21 1
+ %66 = OpConstantTrue %11
+ %70 = OpConstant %6 0.5
+ %71 = OpConstant %6 1
+ %72 = OpConstantComposite %9 %70 %70 %71 %71
+ %73 = OpTypeInt 32 1
+ %76 = OpConstant %73 0
+ %83 = OpConstant %73 8
+ %85 = OpConstant %21 8
+ %86 = OpTypeArray %9 %85
+ %87 = OpConstant %6 4
+ %88 = OpConstant %6 20
+ %89 = OpConstantComposite %9 %87 %87 %88 %87
+ %90 = OpConstantComposite %9 %87 %87 %87 %88
+ %91 = OpConstantComposite %9 %87 %88 %88 %87
+ %92 = OpConstant %6 8
+ %93 = OpConstantComposite %9 %88 %87 %87 %92
+ %94 = OpConstant %6 6
+ %95 = OpConstant %6 2
+ %96 = OpConstantComposite %9 %92 %94 %87 %95
+ %97 = OpConstant %6 12
+ %98 = OpConstantComposite %9 %95 %97 %95 %87
+ %99 = OpConstant %6 16
+ %100 = OpConstantComposite %9 %99 %95 %87 %87
+ %101 = OpConstant %6 22
+ %102 = OpConstantComposite %9 %97 %101 %87 %87
+ %103 = OpConstantComposite %86 %89 %90 %91 %93 %96 %98 %100 %102
+ %108 = OpTypePointer Function %86
+ %115 = OpConstant %21 16
+ %116 = OpTypeArray %9 %115
+ %117 = OpConstant %6 0
+ %118 = OpConstantComposite %9 %117 %117 %117 %71
+ %119 = OpConstantComposite %9 %70 %117 %117 %71
+ %120 = OpConstantComposite %9 %117 %70 %117 %71
+ %121 = OpConstantComposite %9 %70 %70 %117 %71
+ %122 = OpConstantComposite %9 %117 %117 %70 %71
+ %123 = OpConstantComposite %9 %70 %117 %70 %71
+ %124 = OpConstantComposite %9 %117 %70 %70 %71
+ %125 = OpConstantComposite %9 %70 %70 %70 %71
+ %126 = OpConstantComposite %9 %71 %117 %117 %71
+ %127 = OpConstantComposite %9 %117 %71 %117 %71
+ %128 = OpConstantComposite %9 %71 %71 %117 %71
+ %129 = OpConstantComposite %9 %117 %117 %71 %71
+ %130 = OpConstantComposite %9 %71 %117 %71 %71
+ %131 = OpConstantComposite %9 %117 %71 %71 %71
+ %132 = OpConstantComposite %9 %71 %71 %71 %71
+ %133 = OpConstantComposite %116 %118 %119 %120 %121 %122 %123 %124 %125 %118 %126 %127 %128 %129 %130 %131 %132
+ %146 = OpConstant %73 9
+ %149 = OpConstant %73 11
+ %151 = OpConstant %73 16
+ %153 = OpTypePointer Function %116
+ %158 = OpConstant %73 1
+ %164 = OpTypePointer Input %9
+ %165 = OpVariable %164 Input
+ %168 = OpTypeStruct %7
+ %169 = OpTypePointer Uniform %168
+ %170 = OpVariable %169 Uniform
+ %171 = OpTypePointer Uniform %7
+ %176 = OpConstant %6 32
+ %179 = OpTypePointer Output %9
+ %180 = OpVariable %179 Output
+ %386 = OpConstantComposite %9 %117 %117 %117 %117
+ %387 = OpConstantComposite %86 %386 %386 %386 %386 %386 %386 %386 %386
+ %498 = OpConstant %6 0
+ %499 = OpConstantComposite %9 %498 %498 %498 %498
+ %503 = OpConstantComposite %86 %499 %499 %499 %499 %499 %499 %499 %499
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %389 = OpVariable %108 Function %387
+ %199 = OpVariable %108 Function
+ %200 = OpVariable %108 Function
+ %201 = OpVariable %108 Function
+ %202 = OpVariable %153 Function
+ OpStore %389 %103
+ %388 = OpLoad %86 %389
+ %166 = OpLoad %9 %165
+ %167 = OpVectorShuffle %7 %166 %166 0 1
+ %172 = OpAccessChain %171 %170 %76
+ %173 = OpLoad %7 %172
+ %174 = OpFDiv %7 %167 %173
+ %177 = OpVectorTimesScalar %7 %174 %176
+ %178 = OpExtInst %7 %1 Floor %177
+ OpBranch %205
+ %205 = OpLabel
+ %280 = OpPhi %9 %72 %5 %285 %233
+ %279 = OpPhi %73 %76 %5 %235 %233
+ %208 = OpSLessThan %11 %279 %83
+ OpLoopMerge %236 %233 None
+ OpBranchConditional %208 %209 %236
+ %209 = OpLabel
+ OpStore %199 %388
+ %212 = OpAccessChain %10 %199 %279
+ %213 = OpLoad %9 %212
+ OpSelectionMerge %277 None
+ OpSwitch %22 %242
+ %242 = OpLabel
+ %244 = OpCompositeExtract %6 %178 0
+ %246 = OpCompositeExtract %6 %213 0
+ %247 = OpFOrdLessThan %11 %244 %246
+ OpSelectionMerge %249 None
+ OpBranchConditional %247 %248 %249
+ %248 = OpLabel
+ OpBranch %277
+ %249 = OpLabel
+ %251 = OpCompositeExtract %6 %178 1
+ %253 = OpCompositeExtract %6 %213 1
+ %254 = OpFOrdLessThan %11 %251 %253
+ OpSelectionMerge %256 None
+ OpBranchConditional %254 %255 %256
+ %255 = OpLabel
+ OpBranch %277
+ %256 = OpLabel
+ %262 = OpCompositeExtract %6 %213 2
+ %263 = OpFAdd %6 %246 %262
+ %264 = OpFOrdGreaterThan %11 %244 %263
+ OpSelectionMerge %266 None
+ OpBranchConditional %264 %265 %266
+ %265 = OpLabel
+ OpBranch %277
+ %266 = OpLabel
+ %272 = OpCompositeExtract %6 %213 3
+ %273 = OpFAdd %6 %253 %272
+ %274 = OpFOrdGreaterThan %11 %251 %273
+ OpSelectionMerge %276 None
+ OpBranchConditional %274 %275 %276
+ %275 = OpLabel
+ OpBranch %277
+ %276 = OpLabel
+ OpBranch %277
+ %277 = OpLabel
+ %282 = OpPhi %11 %31 %248 %31 %255 %31 %265 %31 %275 %66 %276
+ OpSelectionMerge %232 None
+ OpBranchConditional %282 %215 %232
+ %215 = OpLabel
+ OpStore %200 %103
+ %217 = OpAccessChain %23 %200 %279 %22
+ %218 = OpLoad %6 %217
+ %219 = OpConvertFToS %73 %218
+ OpStore %201 %103
+ %221 = OpAccessChain %23 %201 %279 %33
+ %222 = OpLoad %6 %221
+ %223 = OpConvertFToS %73 %222
+ %224 = OpIMul %73 %219 %223
+ %226 = OpIMul %73 %279 %146
+ %227 = OpIAdd %73 %224 %226
+ %228 = OpIAdd %73 %227 %149
+ %229 = OpSMod %73 %228 %151
+ OpStore %202 %133
+ %230 = OpAccessChain %10 %202 %229
+ %231 = OpLoad %9 %230
+ OpBranch %232
+ %232 = OpLabel
+ %285 = OpPhi %9 %280 %277 %231 %215
+ OpBranch %233
+ %233 = OpLabel
+ %235 = OpIAdd %73 %279 %158
+ OpBranch %205
+ %236 = OpLabel
+ OpStore %180 %280
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant_2
+
+# resolution
+BUFFER variant_2_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER variant_2_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_2_pipeline
+ ATTACH variant_2_vertex_shader
+ ATTACH variant_2_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_2_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_2_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_2_pipeline 0 0 0 255
+
+CLEAR variant_2_pipeline
+RUN variant_2_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_2_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop.amber
new file mode 100644
index 0000000..360fcaa
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop.amber
@@ -0,0 +1,2113 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with always false if with discard loop
+
+# The test passes because both shaders render the same image.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: 230f363e6da32791f640b02205e0645cc67c3f1d
+
+
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct BST
+# {
+# int data;
+# int leftIndex;
+# int rightIndex;
+# };
+#
+# BST tree[10];
+#
+# void makeTreeNode(inout BST tree, int data)
+# {
+# tree.data = data;
+# tree.leftIndex = -1;
+# tree.rightIndex = -1;
+# }
+# void insert(int treeIndex, int data)
+# {
+# int baseIndex = 0;
+# while (baseIndex <= treeIndex)
+# {
+# if (data <= tree[baseIndex].data)
+# {
+# if (tree[baseIndex].leftIndex == -1)
+# {
+# tree[baseIndex].leftIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].leftIndex;
+# continue;
+# }
+# }
+# else
+# {
+# if (tree[baseIndex].rightIndex == -1)
+# {
+# tree[baseIndex].rightIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].rightIndex;
+# continue;
+# }
+# }
+# }
+# }
+# int search(int target)
+# {
+# BST currentNode;
+# int index = 0;
+# while (index != -1)
+# {
+# currentNode = tree[index];
+# if (currentNode.data == target)
+# {
+# return target;
+# }
+# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
+# }
+# return -1;
+# }
+# void main()
+# {
+# int treeIndex = 0;
+# makeTreeNode(tree[0], 9);
+# treeIndex++;
+# insert(treeIndex, 5);
+# treeIndex++;
+# insert(treeIndex, 12);
+# treeIndex++;
+# insert(treeIndex, 15);
+# treeIndex++;
+# insert(treeIndex, 7);
+# treeIndex++;
+# insert(treeIndex, 8);
+# treeIndex++;
+# insert(treeIndex, 2);
+# treeIndex++;
+# insert(treeIndex, 6);
+# treeIndex++;
+# insert(treeIndex, 17);
+# treeIndex++;
+# insert(treeIndex, 13);
+# int count = 0;
+# for (int i = 0; i < 20; i++)
+# {
+# int result = search(i);
+# switch (i)
+# {
+# case 9:
+# case 5:
+# case 12:
+# case 15:
+# case 7:
+# case 8:
+# case 2:
+# case 6:
+# case 17:
+# case 13:
+# if (result == i)
+# {
+# count++;
+# }
+# break;
+# default:
+# if (result == -1)
+# {
+# count++;
+# }
+# break;
+# }
+# }
+# if (count == 20)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
+# }
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 1372
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %254
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %7 "BST"
+ OpMemberName %7 0 "data"
+ OpMemberName %7 1 "leftIndex"
+ OpMemberName %7 2 "rightIndex"
+ OpName %47 "tree"
+ OpName %254 "_GLF_color"
+ OpDecorate %254 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6 %6 %6
+ %8 = OpTypePointer Function %7
+ %9 = OpTypePointer Function %6
+ %24 = OpConstant %6 0
+ %27 = OpConstant %6 1
+ %28 = OpConstant %6 -1
+ %30 = OpConstant %6 2
+ %40 = OpTypeBool
+ %43 = OpTypeInt 32 0
+ %44 = OpConstant %43 10
+ %45 = OpTypeArray %7 %44
+ %141 = OpConstant %6 9
+ %151 = OpConstant %6 5
+ %158 = OpConstant %6 12
+ %165 = OpConstant %6 15
+ %172 = OpConstant %6 7
+ %179 = OpConstant %6 8
+ %192 = OpConstant %6 6
+ %199 = OpConstant %6 17
+ %206 = OpConstant %6 13
+ %219 = OpConstant %6 20
+ %251 = OpTypeFloat 32
+ %252 = OpTypeVector %251 4
+ %253 = OpTypePointer Output %252
+ %254 = OpVariable %253 Output
+ %255 = OpConstant %251 1
+ %256 = OpConstant %251 0
+ %257 = OpConstantComposite %252 %255 %256 %256 %255
+ %259 = OpConstantComposite %252 %256 %256 %255 %255
+ %262 = OpConstant %43 0
+ %263 = OpConstantFalse %40
+ %266 = OpConstantTrue %40
+ %1015 = OpTypePointer Function %45
+ %1318 = OpUndef %6
+ %1359 = OpConstantComposite %7 %141 %28 %28
+ %1360 = OpConstantComposite %7 %151 %28 %28
+ %1361 = OpConstantComposite %7 %158 %28 %28
+ %1362 = OpConstant %6 3
+ %1363 = OpConstantComposite %7 %165 %28 %28
+ %1364 = OpConstant %6 4
+ %1365 = OpConstantComposite %7 %172 %28 %28
+ %1366 = OpConstantComposite %7 %179 %28 %28
+ %1367 = OpConstantComposite %7 %30 %28 %28
+ %1368 = OpConstantComposite %7 %192 %28 %28
+ %1369 = OpConstantComposite %7 %199 %28 %28
+ %1370 = OpConstantComposite %7 %206 %28 %28
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %47 = OpVariable %1015 Function
+ %148 = OpAccessChain %8 %47 %24
+ OpStore %148 %1359
+ OpSelectionMerge %347 None
+ OpSwitch %262 %288
+ %288 = OpLabel
+ OpBranch %289
+ %289 = OpLabel
+ %1212 = OpPhi %6 %24 %288 %1342 %343
+ %293 = OpSLessThanEqual %40 %1212 %27
+ OpLoopMerge %344 %343 None
+ OpBranchConditional %293 %294 %344
+ %294 = OpLabel
+ %297 = OpAccessChain %9 %47 %1212 %24
+ %298 = OpLoad %6 %297
+ %299 = OpSLessThanEqual %40 %151 %298
+ OpSelectionMerge %342 None
+ OpBranchConditional %299 %300 %321
+ %321 = OpLabel
+ %323 = OpAccessChain %9 %47 %1212 %30
+ %324 = OpLoad %6 %323
+ %325 = OpIEqual %40 %324 %28
+ OpSelectionMerge %341 None
+ OpBranchConditional %325 %326 %337
+ %337 = OpLabel
+ %340 = OpLoad %6 %323
+ OpBranch %343
+ %326 = OpLabel
+ OpStore %323 %27
+ %336 = OpAccessChain %8 %47 %27
+ OpStore %336 %1360
+ OpBranch %344
+ %341 = OpLabel
+ OpUnreachable
+ %300 = OpLabel
+ %302 = OpAccessChain %9 %47 %1212 %27
+ %303 = OpLoad %6 %302
+ %304 = OpIEqual %40 %303 %28
+ OpSelectionMerge %320 None
+ OpBranchConditional %304 %305 %316
+ %316 = OpLabel
+ %319 = OpLoad %6 %302
+ OpBranch %343
+ %305 = OpLabel
+ OpStore %302 %27
+ %315 = OpAccessChain %8 %47 %27
+ OpStore %315 %1360
+ OpBranch %344
+ %320 = OpLabel
+ OpUnreachable
+ %342 = OpLabel
+ OpUnreachable
+ %343 = OpLabel
+ %1342 = OpPhi %6 %319 %316 %340 %337
+ OpBranch %289
+ %344 = OpLabel
+ %1213 = OpPhi %40 %263 %289 %266 %305 %266 %326
+ OpSelectionMerge %346 None
+ OpBranchConditional %1213 %347 %346
+ %346 = OpLabel
+ OpBranch %347
+ %347 = OpLabel
+ OpSelectionMerge %424 None
+ OpSwitch %262 %365
+ %365 = OpLabel
+ OpBranch %366
+ %366 = OpLabel
+ %1220 = OpPhi %6 %24 %365 %1344 %420
+ %370 = OpSLessThanEqual %40 %1220 %30
+ OpLoopMerge %421 %420 None
+ OpBranchConditional %370 %371 %421
+ %371 = OpLabel
+ %374 = OpAccessChain %9 %47 %1220 %24
+ %375 = OpLoad %6 %374
+ %376 = OpSLessThanEqual %40 %158 %375
+ OpSelectionMerge %419 None
+ OpBranchConditional %376 %377 %398
+ %398 = OpLabel
+ %400 = OpAccessChain %9 %47 %1220 %30
+ %401 = OpLoad %6 %400
+ %402 = OpIEqual %40 %401 %28
+ OpSelectionMerge %418 None
+ OpBranchConditional %402 %403 %414
+ %414 = OpLabel
+ %417 = OpLoad %6 %400
+ OpBranch %420
+ %403 = OpLabel
+ OpStore %400 %30
+ %413 = OpAccessChain %8 %47 %30
+ OpStore %413 %1361
+ OpBranch %421
+ %418 = OpLabel
+ OpUnreachable
+ %377 = OpLabel
+ %379 = OpAccessChain %9 %47 %1220 %27
+ %380 = OpLoad %6 %379
+ %381 = OpIEqual %40 %380 %28
+ OpSelectionMerge %397 None
+ OpBranchConditional %381 %382 %393
+ %393 = OpLabel
+ %396 = OpLoad %6 %379
+ OpBranch %420
+ %382 = OpLabel
+ OpStore %379 %30
+ %392 = OpAccessChain %8 %47 %30
+ OpStore %392 %1361
+ OpBranch %421
+ %397 = OpLabel
+ OpUnreachable
+ %419 = OpLabel
+ OpUnreachable
+ %420 = OpLabel
+ %1344 = OpPhi %6 %396 %393 %417 %414
+ OpBranch %366
+ %421 = OpLabel
+ %1221 = OpPhi %40 %263 %366 %266 %382 %266 %403
+ OpSelectionMerge %423 None
+ OpBranchConditional %1221 %424 %423
+ %423 = OpLabel
+ OpBranch %424
+ %424 = OpLabel
+ OpSelectionMerge %501 None
+ OpSwitch %262 %442
+ %442 = OpLabel
+ OpBranch %443
+ %443 = OpLabel
+ %1228 = OpPhi %6 %24 %442 %1345 %497
+ %447 = OpSLessThanEqual %40 %1228 %1362
+ OpLoopMerge %498 %497 None
+ OpBranchConditional %447 %448 %498
+ %448 = OpLabel
+ %451 = OpAccessChain %9 %47 %1228 %24
+ %452 = OpLoad %6 %451
+ %453 = OpSLessThanEqual %40 %165 %452
+ OpSelectionMerge %496 None
+ OpBranchConditional %453 %454 %475
+ %475 = OpLabel
+ %477 = OpAccessChain %9 %47 %1228 %30
+ %478 = OpLoad %6 %477
+ %479 = OpIEqual %40 %478 %28
+ OpSelectionMerge %495 None
+ OpBranchConditional %479 %480 %491
+ %491 = OpLabel
+ %494 = OpLoad %6 %477
+ OpBranch %497
+ %480 = OpLabel
+ OpStore %477 %1362
+ %490 = OpAccessChain %8 %47 %1362
+ OpStore %490 %1363
+ OpBranch %498
+ %495 = OpLabel
+ OpUnreachable
+ %454 = OpLabel
+ %456 = OpAccessChain %9 %47 %1228 %27
+ %457 = OpLoad %6 %456
+ %458 = OpIEqual %40 %457 %28
+ OpSelectionMerge %474 None
+ OpBranchConditional %458 %459 %470
+ %470 = OpLabel
+ %473 = OpLoad %6 %456
+ OpBranch %497
+ %459 = OpLabel
+ OpStore %456 %1362
+ %469 = OpAccessChain %8 %47 %1362
+ OpStore %469 %1363
+ OpBranch %498
+ %474 = OpLabel
+ OpUnreachable
+ %496 = OpLabel
+ OpUnreachable
+ %497 = OpLabel
+ %1345 = OpPhi %6 %473 %470 %494 %491
+ OpBranch %443
+ %498 = OpLabel
+ %1229 = OpPhi %40 %263 %443 %266 %459 %266 %480
+ OpSelectionMerge %500 None
+ OpBranchConditional %1229 %501 %500
+ %500 = OpLabel
+ OpBranch %501
+ %501 = OpLabel
+ OpSelectionMerge %578 None
+ OpSwitch %262 %519
+ %519 = OpLabel
+ OpBranch %520
+ %520 = OpLabel
+ %1236 = OpPhi %6 %24 %519 %1346 %574
+ %524 = OpSLessThanEqual %40 %1236 %1364
+ OpLoopMerge %575 %574 None
+ OpBranchConditional %524 %525 %575
+ %525 = OpLabel
+ %528 = OpAccessChain %9 %47 %1236 %24
+ %529 = OpLoad %6 %528
+ %530 = OpSLessThanEqual %40 %172 %529
+ OpSelectionMerge %573 None
+ OpBranchConditional %530 %531 %552
+ %552 = OpLabel
+ %554 = OpAccessChain %9 %47 %1236 %30
+ %555 = OpLoad %6 %554
+ %556 = OpIEqual %40 %555 %28
+ OpSelectionMerge %572 None
+ OpBranchConditional %556 %557 %568
+ %568 = OpLabel
+ %571 = OpLoad %6 %554
+ OpBranch %574
+ %557 = OpLabel
+ OpStore %554 %1364
+ %567 = OpAccessChain %8 %47 %1364
+ OpStore %567 %1365
+ OpBranch %575
+ %572 = OpLabel
+ OpUnreachable
+ %531 = OpLabel
+ %533 = OpAccessChain %9 %47 %1236 %27
+ %534 = OpLoad %6 %533
+ %535 = OpIEqual %40 %534 %28
+ OpSelectionMerge %551 None
+ OpBranchConditional %535 %536 %547
+ %547 = OpLabel
+ %550 = OpLoad %6 %533
+ OpBranch %574
+ %536 = OpLabel
+ OpStore %533 %1364
+ %546 = OpAccessChain %8 %47 %1364
+ OpStore %546 %1365
+ OpBranch %575
+ %551 = OpLabel
+ OpUnreachable
+ %573 = OpLabel
+ OpUnreachable
+ %574 = OpLabel
+ %1346 = OpPhi %6 %550 %547 %571 %568
+ OpBranch %520
+ %575 = OpLabel
+ %1237 = OpPhi %40 %263 %520 %266 %536 %266 %557
+ OpSelectionMerge %577 None
+ OpBranchConditional %1237 %578 %577
+ %577 = OpLabel
+ OpBranch %578
+ %578 = OpLabel
+ OpSelectionMerge %655 None
+ OpSwitch %262 %596
+ %596 = OpLabel
+ OpBranch %597
+ %597 = OpLabel
+ %1244 = OpPhi %6 %24 %596 %1347 %651
+ %601 = OpSLessThanEqual %40 %1244 %151
+ OpLoopMerge %652 %651 None
+ OpBranchConditional %601 %602 %652
+ %602 = OpLabel
+ %605 = OpAccessChain %9 %47 %1244 %24
+ %606 = OpLoad %6 %605
+ %607 = OpSLessThanEqual %40 %179 %606
+ OpSelectionMerge %650 None
+ OpBranchConditional %607 %608 %629
+ %629 = OpLabel
+ %631 = OpAccessChain %9 %47 %1244 %30
+ %632 = OpLoad %6 %631
+ %633 = OpIEqual %40 %632 %28
+ OpSelectionMerge %649 None
+ OpBranchConditional %633 %634 %645
+ %645 = OpLabel
+ %648 = OpLoad %6 %631
+ OpBranch %651
+ %634 = OpLabel
+ OpStore %631 %151
+ %644 = OpAccessChain %8 %47 %151
+ OpStore %644 %1366
+ OpBranch %652
+ %649 = OpLabel
+ OpUnreachable
+ %608 = OpLabel
+ %610 = OpAccessChain %9 %47 %1244 %27
+ %611 = OpLoad %6 %610
+ %612 = OpIEqual %40 %611 %28
+ OpSelectionMerge %628 None
+ OpBranchConditional %612 %613 %624
+ %624 = OpLabel
+ %627 = OpLoad %6 %610
+ OpBranch %651
+ %613 = OpLabel
+ OpStore %610 %151
+ %623 = OpAccessChain %8 %47 %151
+ OpStore %623 %1366
+ OpBranch %652
+ %628 = OpLabel
+ OpUnreachable
+ %650 = OpLabel
+ OpUnreachable
+ %651 = OpLabel
+ %1347 = OpPhi %6 %627 %624 %648 %645
+ OpBranch %597
+ %652 = OpLabel
+ %1245 = OpPhi %40 %263 %597 %266 %613 %266 %634
+ OpSelectionMerge %654 None
+ OpBranchConditional %1245 %655 %654
+ %654 = OpLabel
+ OpBranch %655
+ %655 = OpLabel
+ OpSelectionMerge %732 None
+ OpSwitch %262 %673
+ %673 = OpLabel
+ OpBranch %674
+ %674 = OpLabel
+ %1252 = OpPhi %6 %24 %673 %1348 %728
+ %678 = OpSLessThanEqual %40 %1252 %192
+ OpLoopMerge %729 %728 None
+ OpBranchConditional %678 %679 %729
+ %679 = OpLabel
+ %682 = OpAccessChain %9 %47 %1252 %24
+ %683 = OpLoad %6 %682
+ %684 = OpSLessThanEqual %40 %30 %683
+ OpSelectionMerge %727 None
+ OpBranchConditional %684 %685 %706
+ %706 = OpLabel
+ %708 = OpAccessChain %9 %47 %1252 %30
+ %709 = OpLoad %6 %708
+ %710 = OpIEqual %40 %709 %28
+ OpSelectionMerge %726 None
+ OpBranchConditional %710 %711 %722
+ %722 = OpLabel
+ %725 = OpLoad %6 %708
+ OpBranch %728
+ %711 = OpLabel
+ OpStore %708 %192
+ %721 = OpAccessChain %8 %47 %192
+ OpStore %721 %1367
+ OpBranch %729
+ %726 = OpLabel
+ OpUnreachable
+ %685 = OpLabel
+ %687 = OpAccessChain %9 %47 %1252 %27
+ %688 = OpLoad %6 %687
+ %689 = OpIEqual %40 %688 %28
+ OpSelectionMerge %705 None
+ OpBranchConditional %689 %690 %701
+ %701 = OpLabel
+ %704 = OpLoad %6 %687
+ OpBranch %728
+ %690 = OpLabel
+ OpStore %687 %192
+ %700 = OpAccessChain %8 %47 %192
+ OpStore %700 %1367
+ OpBranch %729
+ %705 = OpLabel
+ OpUnreachable
+ %727 = OpLabel
+ OpUnreachable
+ %728 = OpLabel
+ %1348 = OpPhi %6 %704 %701 %725 %722
+ OpBranch %674
+ %729 = OpLabel
+ %1253 = OpPhi %40 %263 %674 %266 %690 %266 %711
+ OpSelectionMerge %731 None
+ OpBranchConditional %1253 %732 %731
+ %731 = OpLabel
+ OpBranch %732
+ %732 = OpLabel
+ OpSelectionMerge %809 None
+ OpSwitch %262 %750
+ %750 = OpLabel
+ OpBranch %751
+ %751 = OpLabel
+ %1260 = OpPhi %6 %24 %750 %1349 %805
+ %755 = OpSLessThanEqual %40 %1260 %172
+ OpLoopMerge %806 %805 None
+ OpBranchConditional %755 %756 %806
+ %756 = OpLabel
+ %759 = OpAccessChain %9 %47 %1260 %24
+ %760 = OpLoad %6 %759
+ %761 = OpSLessThanEqual %40 %192 %760
+ OpSelectionMerge %804 None
+ OpBranchConditional %761 %762 %783
+ %783 = OpLabel
+ %785 = OpAccessChain %9 %47 %1260 %30
+ %786 = OpLoad %6 %785
+ %787 = OpIEqual %40 %786 %28
+ OpSelectionMerge %803 None
+ OpBranchConditional %787 %788 %799
+ %799 = OpLabel
+ %802 = OpLoad %6 %785
+ OpBranch %805
+ %788 = OpLabel
+ OpStore %785 %172
+ %798 = OpAccessChain %8 %47 %172
+ OpStore %798 %1368
+ OpBranch %806
+ %803 = OpLabel
+ OpUnreachable
+ %762 = OpLabel
+ %764 = OpAccessChain %9 %47 %1260 %27
+ %765 = OpLoad %6 %764
+ %766 = OpIEqual %40 %765 %28
+ OpSelectionMerge %782 None
+ OpBranchConditional %766 %767 %778
+ %778 = OpLabel
+ %781 = OpLoad %6 %764
+ OpBranch %805
+ %767 = OpLabel
+ OpStore %764 %172
+ %777 = OpAccessChain %8 %47 %172
+ OpStore %777 %1368
+ OpBranch %806
+ %782 = OpLabel
+ OpUnreachable
+ %804 = OpLabel
+ OpUnreachable
+ %805 = OpLabel
+ %1349 = OpPhi %6 %781 %778 %802 %799
+ OpBranch %751
+ %806 = OpLabel
+ %1261 = OpPhi %40 %263 %751 %266 %767 %266 %788
+ OpSelectionMerge %808 None
+ OpBranchConditional %1261 %809 %808
+ %808 = OpLabel
+ OpBranch %809
+ %809 = OpLabel
+ OpSelectionMerge %886 None
+ OpSwitch %262 %827
+ %827 = OpLabel
+ OpBranch %828
+ %828 = OpLabel
+ %1268 = OpPhi %6 %24 %827 %1350 %882
+ %832 = OpSLessThanEqual %40 %1268 %179
+ OpLoopMerge %883 %882 None
+ OpBranchConditional %832 %833 %883
+ %833 = OpLabel
+ %836 = OpAccessChain %9 %47 %1268 %24
+ %837 = OpLoad %6 %836
+ %838 = OpSLessThanEqual %40 %199 %837
+ OpSelectionMerge %881 None
+ OpBranchConditional %838 %839 %860
+ %860 = OpLabel
+ %862 = OpAccessChain %9 %47 %1268 %30
+ %863 = OpLoad %6 %862
+ %864 = OpIEqual %40 %863 %28
+ OpSelectionMerge %880 None
+ OpBranchConditional %864 %865 %876
+ %876 = OpLabel
+ %879 = OpLoad %6 %862
+ OpBranch %882
+ %865 = OpLabel
+ OpStore %862 %179
+ %875 = OpAccessChain %8 %47 %179
+ OpStore %875 %1369
+ OpBranch %883
+ %880 = OpLabel
+ OpUnreachable
+ %839 = OpLabel
+ %841 = OpAccessChain %9 %47 %1268 %27
+ %842 = OpLoad %6 %841
+ %843 = OpIEqual %40 %842 %28
+ OpSelectionMerge %859 None
+ OpBranchConditional %843 %844 %855
+ %855 = OpLabel
+ %858 = OpLoad %6 %841
+ OpBranch %882
+ %844 = OpLabel
+ OpStore %841 %179
+ %854 = OpAccessChain %8 %47 %179
+ OpStore %854 %1369
+ OpBranch %883
+ %859 = OpLabel
+ OpUnreachable
+ %881 = OpLabel
+ OpUnreachable
+ %882 = OpLabel
+ %1350 = OpPhi %6 %858 %855 %879 %876
+ OpBranch %828
+ %883 = OpLabel
+ %1269 = OpPhi %40 %263 %828 %266 %844 %266 %865
+ OpSelectionMerge %885 None
+ OpBranchConditional %1269 %886 %885
+ %885 = OpLabel
+ OpBranch %886
+ %886 = OpLabel
+ OpSelectionMerge %963 None
+ OpSwitch %262 %904
+ %904 = OpLabel
+ OpBranch %905
+ %905 = OpLabel
+ %1276 = OpPhi %6 %24 %904 %1351 %959
+ %909 = OpSLessThanEqual %40 %1276 %141
+ OpLoopMerge %960 %959 None
+ OpBranchConditional %909 %910 %960
+ %910 = OpLabel
+ %913 = OpAccessChain %9 %47 %1276 %24
+ %914 = OpLoad %6 %913
+ %915 = OpSLessThanEqual %40 %206 %914
+ OpSelectionMerge %958 None
+ OpBranchConditional %915 %916 %937
+ %937 = OpLabel
+ %939 = OpAccessChain %9 %47 %1276 %30
+ %940 = OpLoad %6 %939
+ %941 = OpIEqual %40 %940 %28
+ OpSelectionMerge %957 None
+ OpBranchConditional %941 %942 %953
+ %953 = OpLabel
+ %956 = OpLoad %6 %939
+ OpBranch %959
+ %942 = OpLabel
+ OpStore %939 %141
+ %952 = OpAccessChain %8 %47 %141
+ OpStore %952 %1370
+ OpBranch %960
+ %957 = OpLabel
+ OpUnreachable
+ %916 = OpLabel
+ %918 = OpAccessChain %9 %47 %1276 %27
+ %919 = OpLoad %6 %918
+ %920 = OpIEqual %40 %919 %28
+ OpSelectionMerge %936 None
+ OpBranchConditional %920 %921 %932
+ %932 = OpLabel
+ %935 = OpLoad %6 %918
+ OpBranch %959
+ %921 = OpLabel
+ OpStore %918 %141
+ %931 = OpAccessChain %8 %47 %141
+ OpStore %931 %1370
+ OpBranch %960
+ %936 = OpLabel
+ OpUnreachable
+ %958 = OpLabel
+ OpUnreachable
+ %959 = OpLabel
+ %1351 = OpPhi %6 %935 %932 %956 %953
+ OpBranch %905
+ %960 = OpLabel
+ %1277 = OpPhi %40 %263 %905 %266 %921 %266 %942
+ OpSelectionMerge %962 None
+ OpBranchConditional %1277 %963 %962
+ %962 = OpLabel
+ OpBranch %963
+ %963 = OpLabel
+ OpBranch %213
+ %213 = OpLabel
+ %1290 = OpPhi %6 %1318 %963 %1287 %216
+ %1281 = OpPhi %6 %24 %963 %1352 %216
+ %1280 = OpPhi %6 %24 %963 %246 %216
+ %220 = OpSLessThan %40 %1280 %219
+ OpLoopMerge %215 %216 None
+ OpBranchConditional %220 %214 %215
+ %214 = OpLabel
+ OpSelectionMerge %1013 None
+ OpSwitch %262 %981
+ %981 = OpLabel
+ OpBranch %982
+ %982 = OpLabel
+ %1282 = OpPhi %6 %24 %981 %1371 %1009
+ %985 = OpINotEqual %40 %1282 %28
+ OpLoopMerge %1010 %1009 None
+ OpBranchConditional %985 %986 %1010
+ %986 = OpLabel
+ %988 = OpAccessChain %8 %47 %1282
+ %989 = OpLoad %7 %988
+ %1019 = OpCompositeExtract %6 %989 0
+ %1020 = OpCompositeExtract %6 %989 1
+ %1021 = OpCompositeExtract %6 %989 2
+ %993 = OpIEqual %40 %1019 %1280
+ OpSelectionMerge %996 None
+ OpBranchConditional %993 %994 %996
+ %994 = OpLabel
+ OpBranch %1010
+ %996 = OpLabel
+ %1000 = OpSGreaterThan %40 %1280 %1019
+ %1371 = OpSelect %6 %1000 %1021 %1020
+ OpBranch %1009
+ %1009 = OpLabel
+ OpBranch %982
+ %1010 = OpLabel
+ %1288 = OpPhi %6 %1290 %982 %1280 %994
+ %1284 = OpPhi %40 %263 %982 %266 %994
+ OpSelectionMerge %1012 None
+ OpBranchConditional %1284 %1013 %1012
+ %1012 = OpLabel
+ OpBranch %1013
+ %1013 = OpLabel
+ %1287 = OpPhi %6 %1288 %1010 %28 %1012
+ OpSelectionMerge %228 None
+ OpSwitch %1280 %227 9 %226 5 %226 12 %226 15 %226 7 %226 8 %226 2 %226 6 %226 17 %226 13 %226
+ %226 = OpLabel
+ %231 = OpIEqual %40 %1287 %1280
+ OpSelectionMerge %233 None
+ OpBranchConditional %231 %232 %233
+ %232 = OpLabel
+ %235 = OpIAdd %6 %1281 %27
+ OpBranch %233
+ %233 = OpLabel
+ %1354 = OpPhi %6 %1281 %226 %235 %232
+ OpBranch %228
+ %227 = OpLabel
+ %238 = OpIEqual %40 %1287 %28
+ OpSelectionMerge %240 None
+ OpBranchConditional %238 %239 %240
+ %239 = OpLabel
+ %242 = OpIAdd %6 %1281 %27
+ OpBranch %240
+ %240 = OpLabel
+ %1353 = OpPhi %6 %1281 %227 %242 %239
+ OpBranch %228
+ %228 = OpLabel
+ %1352 = OpPhi %6 %1353 %240 %1354 %233
+ OpBranch %216
+ %216 = OpLabel
+ %246 = OpIAdd %6 %1280 %27
+ OpBranch %213
+ %215 = OpLabel
+ %248 = OpIEqual %40 %1281 %219
+ OpSelectionMerge %250 None
+ OpBranchConditional %248 %249 %258
+ %258 = OpLabel
+ OpStore %254 %259
+ OpBranch %250
+ %249 = OpLabel
+ OpStore %254 %257
+ OpBranch %250
+ %250 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch;
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct BST
+# {
+# int data;
+# int leftIndex;
+# int rightIndex;
+# };
+#
+# BST tree[10];
+#
+# void makeTreeNode(inout BST tree, int data)
+# {
+# tree.data = data;
+# tree.leftIndex = -1;
+# tree.rightIndex = -1;
+# }
+# void insert(int treeIndex, int data)
+# {
+# int baseIndex = 0;
+# while (baseIndex <= treeIndex)
+# {
+# if (data <= tree[baseIndex].data)
+# {
+# if (tree[baseIndex].leftIndex == -1)
+# {
+# // Always false.
+# if ((injectionSwitch.y < injectionSwitch.x))
+# {
+# do
+# {
+# // This is never reached.
+# discard;
+# }
+# // Always false.
+# while (injectionSwitch.y < injectionSwitch.x);
+# }
+# tree[baseIndex].leftIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# // Iterates once.
+# for (int int_i = 0; int_i < int((injectionSwitch.y)); int_i++)
+# {
+# return;
+# }
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].leftIndex;
+# continue;
+# }
+# }
+# else
+# {
+# if (tree[baseIndex].rightIndex == -1)
+# {
+# tree[baseIndex].rightIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].rightIndex;
+# continue;
+# }
+# }
+# }
+# }
+# int search(int target)
+# {
+# BST currentNode;
+# int index = 0;
+# while (index != -1)
+# {
+# currentNode = tree[index];
+# if (currentNode.data == target)
+# {
+# return target;
+# }
+# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
+# }
+# return -1;
+# }
+# void main()
+# {
+# int treeIndex = 0;
+# makeTreeNode(tree[0], 9);
+# treeIndex++;
+# insert(treeIndex, 5);
+# treeIndex++;
+# // gl_FragCoord.y < 0.0 == false
+# // Iterates once,
+# for (int int_i = 0; (gl_FragCoord.y < 0.0) || (int_i != int(injectionSwitch.y)); int_i++)
+# {
+# insert(treeIndex, 12);
+# }
+# treeIndex++;
+# insert(treeIndex, 15);
+# treeIndex++;
+# insert(treeIndex, 7);
+# treeIndex++;
+# insert(treeIndex, 8);
+# treeIndex++;
+# insert(treeIndex, 2);
+# treeIndex++;
+# insert(treeIndex, 6);
+# treeIndex++;
+# insert(treeIndex, 17);
+# treeIndex++;
+# insert(treeIndex, 13);
+# int count = 0;
+# for (int i = 0; i < 20; i++)
+# {
+# int result = search(i);
+# switch (i)
+# {
+# case 9:
+# case 5:
+# case 12:
+# case 15:
+# case 7:
+# case 8:
+# case 2:
+# case 6:
+# case 17:
+# case 13:
+# if (result == i)
+# {
+# count++;
+# }
+# break;
+# default:
+# if (result == -1)
+# {
+# count++;
+# }
+# break;
+# }
+# }
+# if (count == 20)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 1740
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %204 %315
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %7 "BST"
+ OpMemberName %7 0 "data"
+ OpMemberName %7 1 "leftIndex"
+ OpMemberName %7 2 "rightIndex"
+ OpName %47 "tree"
+ OpName %63 "buf0"
+ OpMemberName %63 0 "injectionSwitch"
+ OpName %65 ""
+ OpName %204 "gl_FragCoord"
+ OpName %315 "_GLF_color"
+ OpMemberDecorate %63 0 Offset 0
+ OpDecorate %63 Block
+ OpDecorate %65 DescriptorSet 0
+ OpDecorate %65 Binding 0
+ OpDecorate %204 BuiltIn FragCoord
+ OpDecorate %315 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6 %6 %6
+ %8 = OpTypePointer Function %7
+ %9 = OpTypePointer Function %6
+ %24 = OpConstant %6 0
+ %27 = OpConstant %6 1
+ %28 = OpConstant %6 -1
+ %30 = OpConstant %6 2
+ %40 = OpTypeBool
+ %43 = OpTypeInt 32 0
+ %44 = OpConstant %43 10
+ %45 = OpTypeArray %7 %44
+ %61 = OpTypeFloat 32
+ %62 = OpTypeVector %61 2
+ %63 = OpTypeStruct %62
+ %64 = OpTypePointer Uniform %63
+ %65 = OpVariable %64 Uniform
+ %66 = OpConstant %43 1
+ %67 = OpTypePointer Uniform %61
+ %70 = OpConstant %43 0
+ %179 = OpConstant %6 9
+ %189 = OpConstant %6 5
+ %202 = OpTypeVector %61 4
+ %203 = OpTypePointer Input %202
+ %204 = OpVariable %203 Input
+ %205 = OpTypePointer Input %61
+ %208 = OpConstant %61 0
+ %219 = OpConstant %6 12
+ %228 = OpConstant %6 15
+ %235 = OpConstant %6 7
+ %242 = OpConstant %6 8
+ %255 = OpConstant %6 6
+ %262 = OpConstant %6 17
+ %269 = OpConstant %6 13
+ %282 = OpConstant %6 20
+ %314 = OpTypePointer Output %202
+ %315 = OpVariable %314 Output
+ %316 = OpConstant %61 1
+ %317 = OpConstantComposite %202 %316 %208 %208 %316
+ %319 = OpConstantComposite %202 %208 %208 %316 %316
+ %322 = OpConstantFalse %40
+ %325 = OpConstantTrue %40
+ %1301 = OpTypePointer Function %45
+ %1620 = OpUndef %6
+ %1727 = OpConstantComposite %7 %179 %28 %28
+ %1728 = OpConstantComposite %7 %189 %28 %28
+ %1729 = OpConstant %6 3
+ %1730 = OpConstantComposite %7 %219 %28 %28
+ %1731 = OpConstantComposite %7 %228 %28 %28
+ %1732 = OpConstant %6 4
+ %1733 = OpConstantComposite %7 %235 %28 %28
+ %1734 = OpConstantComposite %7 %242 %28 %28
+ %1735 = OpConstantComposite %7 %30 %28 %28
+ %1736 = OpConstantComposite %7 %255 %28 %28
+ %1737 = OpConstantComposite %7 %262 %28 %28
+ %1738 = OpConstantComposite %7 %269 %28 %28
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %47 = OpVariable %1301 Function
+ %186 = OpAccessChain %8 %47 %24
+ OpStore %186 %1727
+ OpSelectionMerge %432 None
+ OpSwitch %70 %350
+ %350 = OpLabel
+ OpBranch %351
+ %351 = OpLabel
+ %1501 = OpPhi %40 %322 %350 %1674 %428
+ %1498 = OpPhi %6 %24 %350 %1671 %428
+ %355 = OpSLessThanEqual %40 %1498 %27
+ OpLoopMerge %429 %428 None
+ OpBranchConditional %355 %356 %429
+ %356 = OpLabel
+ %359 = OpAccessChain %9 %47 %1498 %24
+ %360 = OpLoad %6 %359
+ %361 = OpSLessThanEqual %40 %189 %360
+ OpSelectionMerge %427 None
+ OpBranchConditional %361 %362 %406
+ %406 = OpLabel
+ %408 = OpAccessChain %9 %47 %1498 %30
+ %409 = OpLoad %6 %408
+ %410 = OpIEqual %40 %409 %28
+ OpSelectionMerge %426 None
+ OpBranchConditional %410 %411 %422
+ %422 = OpLabel
+ %425 = OpLoad %6 %408
+ OpBranch %428
+ %411 = OpLabel
+ OpStore %408 %27
+ %421 = OpAccessChain %8 %47 %27
+ OpStore %421 %1728
+ OpBranch %429
+ %426 = OpLabel
+ OpUnreachable
+ %362 = OpLabel
+ %364 = OpAccessChain %9 %47 %1498 %27
+ %365 = OpLoad %6 %364
+ %366 = OpIEqual %40 %365 %28
+ OpSelectionMerge %405 None
+ OpBranchConditional %366 %367 %401
+ %401 = OpLabel
+ %404 = OpLoad %6 %364
+ OpBranch %428
+ %367 = OpLabel
+ %368 = OpAccessChain %67 %65 %24 %66
+ %369 = OpLoad %61 %368
+ %370 = OpAccessChain %67 %65 %24 %70
+ %371 = OpLoad %61 %370
+ %372 = OpFOrdLessThan %40 %369 %371
+ OpSelectionMerge %378 None
+ OpBranchConditional %372 %373 %378
+ %373 = OpLabel
+ OpBranch %374
+ %374 = OpLabel
+ OpLoopMerge %377 %376 None
+ OpBranch %375
+ %375 = OpLabel
+ OpKill
+ %376 = OpLabel
+ OpBranch %374
+ %377 = OpLabel
+ OpUnreachable
+ %378 = OpLabel
+ OpStore %364 %27
+ %388 = OpAccessChain %8 %47 %27
+ OpStore %388 %1728
+ OpBranch %389
+ %389 = OpLabel
+ %394 = OpConvertFToS %6 %369
+ %395 = OpSLessThan %40 %24 %394
+ OpLoopMerge %398 %397 None
+ OpBranchConditional %395 %396 %398
+ %396 = OpLabel
+ OpBranch %398
+ %397 = OpLabel
+ OpBranch %389
+ %398 = OpLabel
+ %1499 = OpPhi %40 %1501 %389 %325 %396
+ OpSelectionMerge %400 None
+ OpBranchConditional %1499 %429 %400
+ %400 = OpLabel
+ OpBranch %405
+ %405 = OpLabel
+ OpBranch %427
+ %427 = OpLabel
+ OpBranch %428
+ %428 = OpLabel
+ %1674 = OpPhi %40 %1501 %401 %1501 %422 %1499 %427
+ %1671 = OpPhi %6 %404 %401 %425 %422 %1498 %427
+ OpBranch %351
+ %429 = OpLabel
+ %1502 = OpPhi %40 %1501 %351 %1499 %398 %325 %411
+ OpSelectionMerge %431 None
+ OpBranchConditional %1502 %432 %431
+ %431 = OpLabel
+ OpBranch %432
+ %432 = OpLabel
+ OpBranch %197
+ %197 = OpLabel
+ %1509 = OpPhi %6 %24 %432 %225 %200
+ OpLoopMerge %199 %200 None
+ OpBranch %201
+ %201 = OpLabel
+ %206 = OpAccessChain %205 %204 %66
+ %207 = OpLoad %61 %206
+ %209 = OpFOrdLessThan %40 %207 %208
+ %210 = OpLogicalNot %40 %209
+ OpSelectionMerge %212 None
+ OpBranchConditional %210 %211 %212
+ %211 = OpLabel
+ %214 = OpAccessChain %67 %65 %24 %66
+ %215 = OpLoad %61 %214
+ %216 = OpConvertFToS %6 %215
+ %217 = OpINotEqual %40 %1509 %216
+ OpBranch %212
+ %212 = OpLabel
+ %218 = OpPhi %40 %209 %201 %217 %211
+ OpBranchConditional %218 %198 %199
+ %198 = OpLabel
+ OpSelectionMerge %534 None
+ OpSwitch %70 %452
+ %452 = OpLabel
+ OpBranch %453
+ %453 = OpLabel
+ %1662 = OpPhi %40 %322 %452 %1726 %530
+ %1659 = OpPhi %6 %24 %452 %1723 %530
+ %457 = OpSLessThanEqual %40 %1659 %30
+ OpLoopMerge %531 %530 None
+ OpBranchConditional %457 %458 %531
+ %458 = OpLabel
+ %461 = OpAccessChain %9 %47 %1659 %24
+ %462 = OpLoad %6 %461
+ %463 = OpSLessThanEqual %40 %219 %462
+ OpSelectionMerge %529 None
+ OpBranchConditional %463 %464 %508
+ %508 = OpLabel
+ %510 = OpAccessChain %9 %47 %1659 %30
+ %511 = OpLoad %6 %510
+ %512 = OpIEqual %40 %511 %28
+ OpSelectionMerge %528 None
+ OpBranchConditional %512 %513 %524
+ %524 = OpLabel
+ %527 = OpLoad %6 %510
+ OpBranch %530
+ %513 = OpLabel
+ OpStore %510 %30
+ %523 = OpAccessChain %8 %47 %30
+ OpStore %523 %1730
+ OpBranch %531
+ %528 = OpLabel
+ OpUnreachable
+ %464 = OpLabel
+ %466 = OpAccessChain %9 %47 %1659 %27
+ %467 = OpLoad %6 %466
+ %468 = OpIEqual %40 %467 %28
+ OpSelectionMerge %507 None
+ OpBranchConditional %468 %469 %503
+ %503 = OpLabel
+ %506 = OpLoad %6 %466
+ OpBranch %530
+ %469 = OpLabel
+ %470 = OpAccessChain %67 %65 %24 %66
+ %471 = OpLoad %61 %470
+ %472 = OpAccessChain %67 %65 %24 %70
+ %473 = OpLoad %61 %472
+ %474 = OpFOrdLessThan %40 %471 %473
+ OpSelectionMerge %480 None
+ OpBranchConditional %474 %475 %480
+ %475 = OpLabel
+ OpBranch %476
+ %476 = OpLabel
+ OpLoopMerge %479 %478 None
+ OpBranch %477
+ %477 = OpLabel
+ OpKill
+ %478 = OpLabel
+ OpBranch %476
+ %479 = OpLabel
+ OpUnreachable
+ %480 = OpLabel
+ OpStore %466 %30
+ %490 = OpAccessChain %8 %47 %30
+ OpStore %490 %1730
+ OpBranch %491
+ %491 = OpLabel
+ %496 = OpConvertFToS %6 %471
+ %497 = OpSLessThan %40 %24 %496
+ OpLoopMerge %500 %499 None
+ OpBranchConditional %497 %498 %500
+ %498 = OpLabel
+ OpBranch %500
+ %499 = OpLabel
+ OpBranch %491
+ %500 = OpLabel
+ %1660 = OpPhi %40 %1662 %491 %325 %498
+ OpSelectionMerge %502 None
+ OpBranchConditional %1660 %531 %502
+ %502 = OpLabel
+ OpBranch %507
+ %507 = OpLabel
+ OpBranch %529
+ %529 = OpLabel
+ OpBranch %530
+ %530 = OpLabel
+ %1726 = OpPhi %40 %1662 %503 %1662 %524 %1660 %529
+ %1723 = OpPhi %6 %506 %503 %527 %524 %1659 %529
+ OpBranch %453
+ %531 = OpLabel
+ %1663 = OpPhi %40 %1662 %453 %1660 %500 %325 %513
+ OpSelectionMerge %533 None
+ OpBranchConditional %1663 %534 %533
+ %533 = OpLabel
+ OpBranch %534
+ %534 = OpLabel
+ OpBranch %200
+ %200 = OpLabel
+ %225 = OpIAdd %6 %1509 %27
+ OpBranch %197
+ %199 = OpLabel
+ OpSelectionMerge %636 None
+ OpSwitch %70 %554
+ %554 = OpLabel
+ OpBranch %555
+ %555 = OpLabel
+ %1515 = OpPhi %40 %322 %554 %1685 %632
+ %1512 = OpPhi %6 %24 %554 %1682 %632
+ %559 = OpSLessThanEqual %40 %1512 %1729
+ OpLoopMerge %633 %632 None
+ OpBranchConditional %559 %560 %633
+ %560 = OpLabel
+ %563 = OpAccessChain %9 %47 %1512 %24
+ %564 = OpLoad %6 %563
+ %565 = OpSLessThanEqual %40 %228 %564
+ OpSelectionMerge %631 None
+ OpBranchConditional %565 %566 %610
+ %610 = OpLabel
+ %612 = OpAccessChain %9 %47 %1512 %30
+ %613 = OpLoad %6 %612
+ %614 = OpIEqual %40 %613 %28
+ OpSelectionMerge %630 None
+ OpBranchConditional %614 %615 %626
+ %626 = OpLabel
+ %629 = OpLoad %6 %612
+ OpBranch %632
+ %615 = OpLabel
+ OpStore %612 %1729
+ %625 = OpAccessChain %8 %47 %1729
+ OpStore %625 %1731
+ OpBranch %633
+ %630 = OpLabel
+ OpUnreachable
+ %566 = OpLabel
+ %568 = OpAccessChain %9 %47 %1512 %27
+ %569 = OpLoad %6 %568
+ %570 = OpIEqual %40 %569 %28
+ OpSelectionMerge %609 None
+ OpBranchConditional %570 %571 %605
+ %605 = OpLabel
+ %608 = OpLoad %6 %568
+ OpBranch %632
+ %571 = OpLabel
+ %572 = OpAccessChain %67 %65 %24 %66
+ %573 = OpLoad %61 %572
+ %574 = OpAccessChain %67 %65 %24 %70
+ %575 = OpLoad %61 %574
+ %576 = OpFOrdLessThan %40 %573 %575
+ OpSelectionMerge %582 None
+ OpBranchConditional %576 %577 %582
+ %577 = OpLabel
+ OpBranch %578
+ %578 = OpLabel
+ OpLoopMerge %581 %580 None
+ OpBranch %579
+ %579 = OpLabel
+ OpKill
+ %580 = OpLabel
+ OpBranch %578
+ %581 = OpLabel
+ OpUnreachable
+ %582 = OpLabel
+ OpStore %568 %1729
+ %592 = OpAccessChain %8 %47 %1729
+ OpStore %592 %1731
+ OpBranch %593
+ %593 = OpLabel
+ %598 = OpConvertFToS %6 %573
+ %599 = OpSLessThan %40 %24 %598
+ OpLoopMerge %602 %601 None
+ OpBranchConditional %599 %600 %602
+ %600 = OpLabel
+ OpBranch %602
+ %601 = OpLabel
+ OpBranch %593
+ %602 = OpLabel
+ %1513 = OpPhi %40 %1515 %593 %325 %600
+ OpSelectionMerge %604 None
+ OpBranchConditional %1513 %633 %604
+ %604 = OpLabel
+ OpBranch %609
+ %609 = OpLabel
+ OpBranch %631
+ %631 = OpLabel
+ OpBranch %632
+ %632 = OpLabel
+ %1685 = OpPhi %40 %1515 %605 %1515 %626 %1513 %631
+ %1682 = OpPhi %6 %608 %605 %629 %626 %1512 %631
+ OpBranch %555
+ %633 = OpLabel
+ %1516 = OpPhi %40 %1515 %555 %1513 %602 %325 %615
+ OpSelectionMerge %635 None
+ OpBranchConditional %1516 %636 %635
+ %635 = OpLabel
+ OpBranch %636
+ %636 = OpLabel
+ OpSelectionMerge %738 None
+ OpSwitch %70 %656
+ %656 = OpLabel
+ OpBranch %657
+ %657 = OpLabel
+ %1526 = OpPhi %40 %322 %656 %1689 %734
+ %1523 = OpPhi %6 %24 %656 %1686 %734
+ %661 = OpSLessThanEqual %40 %1523 %1732
+ OpLoopMerge %735 %734 None
+ OpBranchConditional %661 %662 %735
+ %662 = OpLabel
+ %665 = OpAccessChain %9 %47 %1523 %24
+ %666 = OpLoad %6 %665
+ %667 = OpSLessThanEqual %40 %235 %666
+ OpSelectionMerge %733 None
+ OpBranchConditional %667 %668 %712
+ %712 = OpLabel
+ %714 = OpAccessChain %9 %47 %1523 %30
+ %715 = OpLoad %6 %714
+ %716 = OpIEqual %40 %715 %28
+ OpSelectionMerge %732 None
+ OpBranchConditional %716 %717 %728
+ %728 = OpLabel
+ %731 = OpLoad %6 %714
+ OpBranch %734
+ %717 = OpLabel
+ OpStore %714 %1732
+ %727 = OpAccessChain %8 %47 %1732
+ OpStore %727 %1733
+ OpBranch %735
+ %732 = OpLabel
+ OpUnreachable
+ %668 = OpLabel
+ %670 = OpAccessChain %9 %47 %1523 %27
+ %671 = OpLoad %6 %670
+ %672 = OpIEqual %40 %671 %28
+ OpSelectionMerge %711 None
+ OpBranchConditional %672 %673 %707
+ %707 = OpLabel
+ %710 = OpLoad %6 %670
+ OpBranch %734
+ %673 = OpLabel
+ %674 = OpAccessChain %67 %65 %24 %66
+ %675 = OpLoad %61 %674
+ %676 = OpAccessChain %67 %65 %24 %70
+ %677 = OpLoad %61 %676
+ %678 = OpFOrdLessThan %40 %675 %677
+ OpSelectionMerge %684 None
+ OpBranchConditional %678 %679 %684
+ %679 = OpLabel
+ OpBranch %680
+ %680 = OpLabel
+ OpLoopMerge %683 %682 None
+ OpBranch %681
+ %681 = OpLabel
+ OpKill
+ %682 = OpLabel
+ OpBranch %680
+ %683 = OpLabel
+ OpUnreachable
+ %684 = OpLabel
+ OpStore %670 %1732
+ %694 = OpAccessChain %8 %47 %1732
+ OpStore %694 %1733
+ OpBranch %695
+ %695 = OpLabel
+ %700 = OpConvertFToS %6 %675
+ %701 = OpSLessThan %40 %24 %700
+ OpLoopMerge %704 %703 None
+ OpBranchConditional %701 %702 %704
+ %702 = OpLabel
+ OpBranch %704
+ %703 = OpLabel
+ OpBranch %695
+ %704 = OpLabel
+ %1524 = OpPhi %40 %1526 %695 %325 %702
+ OpSelectionMerge %706 None
+ OpBranchConditional %1524 %735 %706
+ %706 = OpLabel
+ OpBranch %711
+ %711 = OpLabel
+ OpBranch %733
+ %733 = OpLabel
+ OpBranch %734
+ %734 = OpLabel
+ %1689 = OpPhi %40 %1526 %707 %1526 %728 %1524 %733
+ %1686 = OpPhi %6 %710 %707 %731 %728 %1523 %733
+ OpBranch %657
+ %735 = OpLabel
+ %1527 = OpPhi %40 %1526 %657 %1524 %704 %325 %717
+ OpSelectionMerge %737 None
+ OpBranchConditional %1527 %738 %737
+ %737 = OpLabel
+ OpBranch %738
+ %738 = OpLabel
+ OpSelectionMerge %840 None
+ OpSwitch %70 %758
+ %758 = OpLabel
+ OpBranch %759
+ %759 = OpLabel
+ %1537 = OpPhi %40 %322 %758 %1693 %836
+ %1534 = OpPhi %6 %24 %758 %1690 %836
+ %763 = OpSLessThanEqual %40 %1534 %189
+ OpLoopMerge %837 %836 None
+ OpBranchConditional %763 %764 %837
+ %764 = OpLabel
+ %767 = OpAccessChain %9 %47 %1534 %24
+ %768 = OpLoad %6 %767
+ %769 = OpSLessThanEqual %40 %242 %768
+ OpSelectionMerge %835 None
+ OpBranchConditional %769 %770 %814
+ %814 = OpLabel
+ %816 = OpAccessChain %9 %47 %1534 %30
+ %817 = OpLoad %6 %816
+ %818 = OpIEqual %40 %817 %28
+ OpSelectionMerge %834 None
+ OpBranchConditional %818 %819 %830
+ %830 = OpLabel
+ %833 = OpLoad %6 %816
+ OpBranch %836
+ %819 = OpLabel
+ OpStore %816 %189
+ %829 = OpAccessChain %8 %47 %189
+ OpStore %829 %1734
+ OpBranch %837
+ %834 = OpLabel
+ OpUnreachable
+ %770 = OpLabel
+ %772 = OpAccessChain %9 %47 %1534 %27
+ %773 = OpLoad %6 %772
+ %774 = OpIEqual %40 %773 %28
+ OpSelectionMerge %813 None
+ OpBranchConditional %774 %775 %809
+ %809 = OpLabel
+ %812 = OpLoad %6 %772
+ OpBranch %836
+ %775 = OpLabel
+ %776 = OpAccessChain %67 %65 %24 %66
+ %777 = OpLoad %61 %776
+ %778 = OpAccessChain %67 %65 %24 %70
+ %779 = OpLoad %61 %778
+ %780 = OpFOrdLessThan %40 %777 %779
+ OpSelectionMerge %786 None
+ OpBranchConditional %780 %781 %786
+ %781 = OpLabel
+ OpBranch %782
+ %782 = OpLabel
+ OpLoopMerge %785 %784 None
+ OpBranch %783
+ %783 = OpLabel
+ OpKill
+ %784 = OpLabel
+ OpBranch %782
+ %785 = OpLabel
+ OpUnreachable
+ %786 = OpLabel
+ OpStore %772 %189
+ %796 = OpAccessChain %8 %47 %189
+ OpStore %796 %1734
+ OpBranch %797
+ %797 = OpLabel
+ %802 = OpConvertFToS %6 %777
+ %803 = OpSLessThan %40 %24 %802
+ OpLoopMerge %806 %805 None
+ OpBranchConditional %803 %804 %806
+ %804 = OpLabel
+ OpBranch %806
+ %805 = OpLabel
+ OpBranch %797
+ %806 = OpLabel
+ %1535 = OpPhi %40 %1537 %797 %325 %804
+ OpSelectionMerge %808 None
+ OpBranchConditional %1535 %837 %808
+ %808 = OpLabel
+ OpBranch %813
+ %813 = OpLabel
+ OpBranch %835
+ %835 = OpLabel
+ OpBranch %836
+ %836 = OpLabel
+ %1693 = OpPhi %40 %1537 %809 %1537 %830 %1535 %835
+ %1690 = OpPhi %6 %812 %809 %833 %830 %1534 %835
+ OpBranch %759
+ %837 = OpLabel
+ %1538 = OpPhi %40 %1537 %759 %1535 %806 %325 %819
+ OpSelectionMerge %839 None
+ OpBranchConditional %1538 %840 %839
+ %839 = OpLabel
+ OpBranch %840
+ %840 = OpLabel
+ OpSelectionMerge %942 None
+ OpSwitch %70 %860
+ %860 = OpLabel
+ OpBranch %861
+ %861 = OpLabel
+ %1548 = OpPhi %40 %322 %860 %1697 %938
+ %1545 = OpPhi %6 %24 %860 %1694 %938
+ %865 = OpSLessThanEqual %40 %1545 %255
+ OpLoopMerge %939 %938 None
+ OpBranchConditional %865 %866 %939
+ %866 = OpLabel
+ %869 = OpAccessChain %9 %47 %1545 %24
+ %870 = OpLoad %6 %869
+ %871 = OpSLessThanEqual %40 %30 %870
+ OpSelectionMerge %937 None
+ OpBranchConditional %871 %872 %916
+ %916 = OpLabel
+ %918 = OpAccessChain %9 %47 %1545 %30
+ %919 = OpLoad %6 %918
+ %920 = OpIEqual %40 %919 %28
+ OpSelectionMerge %936 None
+ OpBranchConditional %920 %921 %932
+ %932 = OpLabel
+ %935 = OpLoad %6 %918
+ OpBranch %938
+ %921 = OpLabel
+ OpStore %918 %255
+ %931 = OpAccessChain %8 %47 %255
+ OpStore %931 %1735
+ OpBranch %939
+ %936 = OpLabel
+ OpUnreachable
+ %872 = OpLabel
+ %874 = OpAccessChain %9 %47 %1545 %27
+ %875 = OpLoad %6 %874
+ %876 = OpIEqual %40 %875 %28
+ OpSelectionMerge %915 None
+ OpBranchConditional %876 %877 %911
+ %911 = OpLabel
+ %914 = OpLoad %6 %874
+ OpBranch %938
+ %877 = OpLabel
+ %878 = OpAccessChain %67 %65 %24 %66
+ %879 = OpLoad %61 %878
+ %880 = OpAccessChain %67 %65 %24 %70
+ %881 = OpLoad %61 %880
+ %882 = OpFOrdLessThan %40 %879 %881
+ OpSelectionMerge %888 None
+ OpBranchConditional %882 %883 %888
+ %883 = OpLabel
+ OpBranch %884
+ %884 = OpLabel
+ OpLoopMerge %887 %886 None
+ OpBranch %885
+ %885 = OpLabel
+ OpKill
+ %886 = OpLabel
+ OpBranch %884
+ %887 = OpLabel
+ OpUnreachable
+ %888 = OpLabel
+ OpStore %874 %255
+ %898 = OpAccessChain %8 %47 %255
+ OpStore %898 %1735
+ OpBranch %899
+ %899 = OpLabel
+ %904 = OpConvertFToS %6 %879
+ %905 = OpSLessThan %40 %24 %904
+ OpLoopMerge %908 %907 None
+ OpBranchConditional %905 %906 %908
+ %906 = OpLabel
+ OpBranch %908
+ %907 = OpLabel
+ OpBranch %899
+ %908 = OpLabel
+ %1546 = OpPhi %40 %1548 %899 %325 %906
+ OpSelectionMerge %910 None
+ OpBranchConditional %1546 %939 %910
+ %910 = OpLabel
+ OpBranch %915
+ %915 = OpLabel
+ OpBranch %937
+ %937 = OpLabel
+ OpBranch %938
+ %938 = OpLabel
+ %1697 = OpPhi %40 %1548 %911 %1548 %932 %1546 %937
+ %1694 = OpPhi %6 %914 %911 %935 %932 %1545 %937
+ OpBranch %861
+ %939 = OpLabel
+ %1549 = OpPhi %40 %1548 %861 %1546 %908 %325 %921
+ OpSelectionMerge %941 None
+ OpBranchConditional %1549 %942 %941
+ %941 = OpLabel
+ OpBranch %942
+ %942 = OpLabel
+ OpSelectionMerge %1044 None
+ OpSwitch %70 %962
+ %962 = OpLabel
+ OpBranch %963
+ %963 = OpLabel
+ %1559 = OpPhi %40 %322 %962 %1701 %1040
+ %1556 = OpPhi %6 %24 %962 %1698 %1040
+ %967 = OpSLessThanEqual %40 %1556 %235
+ OpLoopMerge %1041 %1040 None
+ OpBranchConditional %967 %968 %1041
+ %968 = OpLabel
+ %971 = OpAccessChain %9 %47 %1556 %24
+ %972 = OpLoad %6 %971
+ %973 = OpSLessThanEqual %40 %255 %972
+ OpSelectionMerge %1039 None
+ OpBranchConditional %973 %974 %1018
+ %1018 = OpLabel
+ %1020 = OpAccessChain %9 %47 %1556 %30
+ %1021 = OpLoad %6 %1020
+ %1022 = OpIEqual %40 %1021 %28
+ OpSelectionMerge %1038 None
+ OpBranchConditional %1022 %1023 %1034
+ %1034 = OpLabel
+ %1037 = OpLoad %6 %1020
+ OpBranch %1040
+ %1023 = OpLabel
+ OpStore %1020 %235
+ %1033 = OpAccessChain %8 %47 %235
+ OpStore %1033 %1736
+ OpBranch %1041
+ %1038 = OpLabel
+ OpUnreachable
+ %974 = OpLabel
+ %976 = OpAccessChain %9 %47 %1556 %27
+ %977 = OpLoad %6 %976
+ %978 = OpIEqual %40 %977 %28
+ OpSelectionMerge %1017 None
+ OpBranchConditional %978 %979 %1013
+ %1013 = OpLabel
+ %1016 = OpLoad %6 %976
+ OpBranch %1040
+ %979 = OpLabel
+ %980 = OpAccessChain %67 %65 %24 %66
+ %981 = OpLoad %61 %980
+ %982 = OpAccessChain %67 %65 %24 %70
+ %983 = OpLoad %61 %982
+ %984 = OpFOrdLessThan %40 %981 %983
+ OpSelectionMerge %990 None
+ OpBranchConditional %984 %985 %990
+ %985 = OpLabel
+ OpBranch %986
+ %986 = OpLabel
+ OpLoopMerge %989 %988 None
+ OpBranch %987
+ %987 = OpLabel
+ OpKill
+ %988 = OpLabel
+ OpBranch %986
+ %989 = OpLabel
+ OpUnreachable
+ %990 = OpLabel
+ OpStore %976 %235
+ %1000 = OpAccessChain %8 %47 %235
+ OpStore %1000 %1736
+ OpBranch %1001
+ %1001 = OpLabel
+ %1006 = OpConvertFToS %6 %981
+ %1007 = OpSLessThan %40 %24 %1006
+ OpLoopMerge %1010 %1009 None
+ OpBranchConditional %1007 %1008 %1010
+ %1008 = OpLabel
+ OpBranch %1010
+ %1009 = OpLabel
+ OpBranch %1001
+ %1010 = OpLabel
+ %1557 = OpPhi %40 %1559 %1001 %325 %1008
+ OpSelectionMerge %1012 None
+ OpBranchConditional %1557 %1041 %1012
+ %1012 = OpLabel
+ OpBranch %1017
+ %1017 = OpLabel
+ OpBranch %1039
+ %1039 = OpLabel
+ OpBranch %1040
+ %1040 = OpLabel
+ %1701 = OpPhi %40 %1559 %1013 %1559 %1034 %1557 %1039
+ %1698 = OpPhi %6 %1016 %1013 %1037 %1034 %1556 %1039
+ OpBranch %963
+ %1041 = OpLabel
+ %1560 = OpPhi %40 %1559 %963 %1557 %1010 %325 %1023
+ OpSelectionMerge %1043 None
+ OpBranchConditional %1560 %1044 %1043
+ %1043 = OpLabel
+ OpBranch %1044
+ %1044 = OpLabel
+ OpSelectionMerge %1146 None
+ OpSwitch %70 %1064
+ %1064 = OpLabel
+ OpBranch %1065
+ %1065 = OpLabel
+ %1570 = OpPhi %40 %322 %1064 %1705 %1142
+ %1567 = OpPhi %6 %24 %1064 %1702 %1142
+ %1069 = OpSLessThanEqual %40 %1567 %242
+ OpLoopMerge %1143 %1142 None
+ OpBranchConditional %1069 %1070 %1143
+ %1070 = OpLabel
+ %1073 = OpAccessChain %9 %47 %1567 %24
+ %1074 = OpLoad %6 %1073
+ %1075 = OpSLessThanEqual %40 %262 %1074
+ OpSelectionMerge %1141 None
+ OpBranchConditional %1075 %1076 %1120
+ %1120 = OpLabel
+ %1122 = OpAccessChain %9 %47 %1567 %30
+ %1123 = OpLoad %6 %1122
+ %1124 = OpIEqual %40 %1123 %28
+ OpSelectionMerge %1140 None
+ OpBranchConditional %1124 %1125 %1136
+ %1136 = OpLabel
+ %1139 = OpLoad %6 %1122
+ OpBranch %1142
+ %1125 = OpLabel
+ OpStore %1122 %242
+ %1135 = OpAccessChain %8 %47 %242
+ OpStore %1135 %1737
+ OpBranch %1143
+ %1140 = OpLabel
+ OpUnreachable
+ %1076 = OpLabel
+ %1078 = OpAccessChain %9 %47 %1567 %27
+ %1079 = OpLoad %6 %1078
+ %1080 = OpIEqual %40 %1079 %28
+ OpSelectionMerge %1119 None
+ OpBranchConditional %1080 %1081 %1115
+ %1115 = OpLabel
+ %1118 = OpLoad %6 %1078
+ OpBranch %1142
+ %1081 = OpLabel
+ %1082 = OpAccessChain %67 %65 %24 %66
+ %1083 = OpLoad %61 %1082
+ %1084 = OpAccessChain %67 %65 %24 %70
+ %1085 = OpLoad %61 %1084
+ %1086 = OpFOrdLessThan %40 %1083 %1085
+ OpSelectionMerge %1092 None
+ OpBranchConditional %1086 %1087 %1092
+ %1087 = OpLabel
+ OpBranch %1088
+ %1088 = OpLabel
+ OpLoopMerge %1091 %1090 None
+ OpBranch %1089
+ %1089 = OpLabel
+ OpKill
+ %1090 = OpLabel
+ OpBranch %1088
+ %1091 = OpLabel
+ OpUnreachable
+ %1092 = OpLabel
+ OpStore %1078 %242
+ %1102 = OpAccessChain %8 %47 %242
+ OpStore %1102 %1737
+ OpBranch %1103
+ %1103 = OpLabel
+ %1108 = OpConvertFToS %6 %1083
+ %1109 = OpSLessThan %40 %24 %1108
+ OpLoopMerge %1112 %1111 None
+ OpBranchConditional %1109 %1110 %1112
+ %1110 = OpLabel
+ OpBranch %1112
+ %1111 = OpLabel
+ OpBranch %1103
+ %1112 = OpLabel
+ %1568 = OpPhi %40 %1570 %1103 %325 %1110
+ OpSelectionMerge %1114 None
+ OpBranchConditional %1568 %1143 %1114
+ %1114 = OpLabel
+ OpBranch %1119
+ %1119 = OpLabel
+ OpBranch %1141
+ %1141 = OpLabel
+ OpBranch %1142
+ %1142 = OpLabel
+ %1705 = OpPhi %40 %1570 %1115 %1570 %1136 %1568 %1141
+ %1702 = OpPhi %6 %1118 %1115 %1139 %1136 %1567 %1141
+ OpBranch %1065
+ %1143 = OpLabel
+ %1571 = OpPhi %40 %1570 %1065 %1568 %1112 %325 %1125
+ OpSelectionMerge %1145 None
+ OpBranchConditional %1571 %1146 %1145
+ %1145 = OpLabel
+ OpBranch %1146
+ %1146 = OpLabel
+ OpSelectionMerge %1248 None
+ OpSwitch %70 %1166
+ %1166 = OpLabel
+ OpBranch %1167
+ %1167 = OpLabel
+ %1581 = OpPhi %40 %322 %1166 %1709 %1244
+ %1578 = OpPhi %6 %24 %1166 %1706 %1244
+ %1171 = OpSLessThanEqual %40 %1578 %179
+ OpLoopMerge %1245 %1244 None
+ OpBranchConditional %1171 %1172 %1245
+ %1172 = OpLabel
+ %1175 = OpAccessChain %9 %47 %1578 %24
+ %1176 = OpLoad %6 %1175
+ %1177 = OpSLessThanEqual %40 %269 %1176
+ OpSelectionMerge %1243 None
+ OpBranchConditional %1177 %1178 %1222
+ %1222 = OpLabel
+ %1224 = OpAccessChain %9 %47 %1578 %30
+ %1225 = OpLoad %6 %1224
+ %1226 = OpIEqual %40 %1225 %28
+ OpSelectionMerge %1242 None
+ OpBranchConditional %1226 %1227 %1238
+ %1238 = OpLabel
+ %1241 = OpLoad %6 %1224
+ OpBranch %1244
+ %1227 = OpLabel
+ OpStore %1224 %179
+ %1237 = OpAccessChain %8 %47 %179
+ OpStore %1237 %1738
+ OpBranch %1245
+ %1242 = OpLabel
+ OpUnreachable
+ %1178 = OpLabel
+ %1180 = OpAccessChain %9 %47 %1578 %27
+ %1181 = OpLoad %6 %1180
+ %1182 = OpIEqual %40 %1181 %28
+ OpSelectionMerge %1221 None
+ OpBranchConditional %1182 %1183 %1217
+ %1217 = OpLabel
+ %1220 = OpLoad %6 %1180
+ OpBranch %1244
+ %1183 = OpLabel
+ %1184 = OpAccessChain %67 %65 %24 %66
+ %1185 = OpLoad %61 %1184
+ %1186 = OpAccessChain %67 %65 %24 %70
+ %1187 = OpLoad %61 %1186
+ %1188 = OpFOrdLessThan %40 %1185 %1187
+ OpSelectionMerge %1194 None
+ OpBranchConditional %1188 %1189 %1194
+ %1189 = OpLabel
+ OpBranch %1190
+ %1190 = OpLabel
+ OpLoopMerge %1193 %1192 None
+ OpBranch %1191
+ %1191 = OpLabel
+ OpKill
+ %1192 = OpLabel
+ OpBranch %1190
+ %1193 = OpLabel
+ OpUnreachable
+ %1194 = OpLabel
+ OpStore %1180 %179
+ %1204 = OpAccessChain %8 %47 %179
+ OpStore %1204 %1738
+ OpBranch %1205
+ %1205 = OpLabel
+ %1210 = OpConvertFToS %6 %1185
+ %1211 = OpSLessThan %40 %24 %1210
+ OpLoopMerge %1214 %1213 None
+ OpBranchConditional %1211 %1212 %1214
+ %1212 = OpLabel
+ OpBranch %1214
+ %1213 = OpLabel
+ OpBranch %1205
+ %1214 = OpLabel
+ %1579 = OpPhi %40 %1581 %1205 %325 %1212
+ OpSelectionMerge %1216 None
+ OpBranchConditional %1579 %1245 %1216
+ %1216 = OpLabel
+ OpBranch %1221
+ %1221 = OpLabel
+ OpBranch %1243
+ %1243 = OpLabel
+ OpBranch %1244
+ %1244 = OpLabel
+ %1709 = OpPhi %40 %1581 %1217 %1581 %1238 %1579 %1243
+ %1706 = OpPhi %6 %1220 %1217 %1241 %1238 %1578 %1243
+ OpBranch %1167
+ %1245 = OpLabel
+ %1582 = OpPhi %40 %1581 %1167 %1579 %1214 %325 %1227
+ OpSelectionMerge %1247 None
+ OpBranchConditional %1582 %1248 %1247
+ %1247 = OpLabel
+ OpBranch %1248
+ %1248 = OpLabel
+ OpBranch %276
+ %276 = OpLabel
+ %1593 = OpPhi %6 %1620 %1248 %1590 %279
+ %1584 = OpPhi %6 %24 %1248 %1710 %279
+ %1583 = OpPhi %6 %24 %1248 %309 %279
+ %283 = OpSLessThan %40 %1583 %282
+ OpLoopMerge %278 %279 None
+ OpBranchConditional %283 %277 %278
+ %277 = OpLabel
+ OpSelectionMerge %1299 None
+ OpSwitch %70 %1267
+ %1267 = OpLabel
+ OpBranch %1268
+ %1268 = OpLabel
+ %1585 = OpPhi %6 %24 %1267 %1739 %1295
+ %1271 = OpINotEqual %40 %1585 %28
+ OpLoopMerge %1296 %1295 None
+ OpBranchConditional %1271 %1272 %1296
+ %1272 = OpLabel
+ %1274 = OpAccessChain %8 %47 %1585
+ %1275 = OpLoad %7 %1274
+ %1305 = OpCompositeExtract %6 %1275 0
+ %1306 = OpCompositeExtract %6 %1275 1
+ %1307 = OpCompositeExtract %6 %1275 2
+ %1279 = OpIEqual %40 %1305 %1583
+ OpSelectionMerge %1282 None
+ OpBranchConditional %1279 %1280 %1282
+ %1280 = OpLabel
+ OpBranch %1296
+ %1282 = OpLabel
+ %1286 = OpSGreaterThan %40 %1583 %1305
+ %1739 = OpSelect %6 %1286 %1307 %1306
+ OpBranch %1295
+ %1295 = OpLabel
+ OpBranch %1268
+ %1296 = OpLabel
+ %1591 = OpPhi %6 %1593 %1268 %1583 %1280
+ %1587 = OpPhi %40 %322 %1268 %325 %1280
+ OpSelectionMerge %1298 None
+ OpBranchConditional %1587 %1299 %1298
+ %1298 = OpLabel
+ OpBranch %1299
+ %1299 = OpLabel
+ %1590 = OpPhi %6 %1591 %1296 %28 %1298
+ OpSelectionMerge %291 None
+ OpSwitch %1583 %290 9 %289 5 %289 12 %289 15 %289 7 %289 8 %289 2 %289 6 %289 17 %289 13 %289
+ %289 = OpLabel
+ %294 = OpIEqual %40 %1590 %1583
+ OpSelectionMerge %296 None
+ OpBranchConditional %294 %295 %296
+ %295 = OpLabel
+ %298 = OpIAdd %6 %1584 %27
+ OpBranch %296
+ %296 = OpLabel
+ %1712 = OpPhi %6 %1584 %289 %298 %295
+ OpBranch %291
+ %290 = OpLabel
+ %301 = OpIEqual %40 %1590 %28
+ OpSelectionMerge %303 None
+ OpBranchConditional %301 %302 %303
+ %302 = OpLabel
+ %305 = OpIAdd %6 %1584 %27
+ OpBranch %303
+ %303 = OpLabel
+ %1711 = OpPhi %6 %1584 %290 %305 %302
+ OpBranch %291
+ %291 = OpLabel
+ %1710 = OpPhi %6 %1711 %303 %1712 %296
+ OpBranch %279
+ %279 = OpLabel
+ %309 = OpIAdd %6 %1583 %27
+ OpBranch %276
+ %278 = OpLabel
+ %311 = OpIEqual %40 %1584 %282
+ OpSelectionMerge %313 None
+ OpBranchConditional %311 %312 %318
+ %318 = OpLabel
+ OpStore %315 %319
+ OpBranch %313
+ %312 = OpLabel
+ OpStore %315 %317
+ OpBranch %313
+ %313 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero.amber
new file mode 100644
index 0000000..7e902cb
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero.amber
@@ -0,0 +1,1195 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with gl_FragCoord.x less than zero
+
+# The test passes because both shaders render the same image.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct BST {
+# int data;
+# int leftIndex;
+# int rightIndex;
+# } ;
+#
+# BST tree[10];
+#
+# void makeTreeNode(inout BST tree, int data)
+# {
+# tree.data = data;
+# tree.leftIndex = - 1;
+# tree.rightIndex = - 1;
+# }
+# void insert(int treeIndex, int data)
+# {
+# int baseIndex = 0;
+# while(baseIndex <= treeIndex)
+# {
+# if(data <= tree[baseIndex].data)
+# {
+# if(tree[baseIndex].leftIndex == - 1)
+# {
+# tree[baseIndex].leftIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].leftIndex;
+# continue;
+# }
+# }
+# else
+# {
+# if(tree[baseIndex].rightIndex == - 1)
+# {
+# tree[baseIndex].rightIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].rightIndex;
+# continue;
+# }
+# }
+# }
+# }
+# int search(int target)
+# {
+# BST currentNode;
+# int index = 0;
+# while(index != - 1)
+# {
+# currentNode = tree[index];
+# if(currentNode.data == target)
+# {
+# return target;
+# }
+# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
+# }
+# return - 1;
+# }
+# void main()
+# {
+# int treeIndex = 0;
+# makeTreeNode(tree[0], 9);
+# treeIndex ++;
+# insert(treeIndex, 5);
+# treeIndex ++;
+# insert(treeIndex, 12);
+# treeIndex ++;
+# insert(treeIndex, 15);
+# treeIndex ++;
+# insert(treeIndex, 7);
+# treeIndex ++;
+# insert(treeIndex, 8);
+# treeIndex ++;
+# insert(treeIndex, 2);
+# treeIndex ++;
+# insert(treeIndex, 6);
+# treeIndex ++;
+# insert(treeIndex, 17);
+# treeIndex ++;
+# insert(treeIndex, 13);
+# int count = 0;
+# for(int i = 0; i < 20; i ++)
+# {
+# int result = search(i);
+# switch(i)
+# {
+# case 9:
+# case 5:
+# case 12:
+# case 15:
+# case 7:
+# case 8:
+# case 2:
+# case 6:
+# case 17:
+# case 13:
+# if(result == i)
+# {
+# count ++;
+# }
+# break;
+# default:
+# if(result == - 1)
+# {
+# count ++;
+# }
+# break;
+# }
+# }
+# if(count == 20)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
+# }
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 260
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %254
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %7 "BST"
+ OpMemberName %7 0 "data"
+ OpMemberName %7 1 "leftIndex"
+ OpMemberName %7 2 "rightIndex"
+ OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+ OpName %11 "tree"
+ OpName %12 "data"
+ OpName %18 "insert(i1;i1;"
+ OpName %16 "treeIndex"
+ OpName %17 "data"
+ OpName %22 "search(i1;"
+ OpName %21 "target"
+ OpName %32 "baseIndex"
+ OpName %47 "tree"
+ OpName %65 "param"
+ OpName %69 "param"
+ OpName %91 "param"
+ OpName %94 "param"
+ OpName %105 "index"
+ OpName %113 "currentNode"
+ OpName %140 "treeIndex"
+ OpName %142 "param"
+ OpName %145 "param"
+ OpName %152 "param"
+ OpName %154 "param"
+ OpName %159 "param"
+ OpName %161 "param"
+ OpName %166 "param"
+ OpName %168 "param"
+ OpName %173 "param"
+ OpName %175 "param"
+ OpName %180 "param"
+ OpName %182 "param"
+ OpName %186 "param"
+ OpName %188 "param"
+ OpName %193 "param"
+ OpName %195 "param"
+ OpName %200 "param"
+ OpName %202 "param"
+ OpName %207 "param"
+ OpName %209 "param"
+ OpName %211 "count"
+ OpName %212 "i"
+ OpName %221 "result"
+ OpName %222 "param"
+ OpName %254 "_GLF_color"
+ OpDecorate %254 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6 %6 %6
+ %8 = OpTypePointer Function %7
+ %9 = OpTypePointer Function %6
+ %10 = OpTypeFunction %2 %8 %9
+ %15 = OpTypeFunction %2 %9 %9
+ %20 = OpTypeFunction %6 %9
+ %24 = OpConstant %6 0
+ %27 = OpConstant %6 1
+ %28 = OpConstant %6 -1
+ %30 = OpConstant %6 2
+ %40 = OpTypeBool
+ %43 = OpTypeInt 32 0
+ %44 = OpConstant %43 10
+ %45 = OpTypeArray %7 %44
+ %46 = OpTypePointer Private %45
+ %47 = OpVariable %46 Private
+ %49 = OpTypePointer Private %6
+ %66 = OpTypePointer Private %7
+ %141 = OpConstant %6 9
+ %151 = OpConstant %6 5
+ %158 = OpConstant %6 12
+ %165 = OpConstant %6 15
+ %172 = OpConstant %6 7
+ %179 = OpConstant %6 8
+ %192 = OpConstant %6 6
+ %199 = OpConstant %6 17
+ %206 = OpConstant %6 13
+ %219 = OpConstant %6 20
+ %251 = OpTypeFloat 32
+ %252 = OpTypeVector %251 4
+ %253 = OpTypePointer Output %252
+ %254 = OpVariable %253 Output
+ %255 = OpConstant %251 1
+ %256 = OpConstant %251 0
+ %257 = OpConstantComposite %252 %255 %256 %256 %255
+ %259 = OpConstantComposite %252 %256 %256 %255 %255
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %140 = OpVariable %9 Function
+ %142 = OpVariable %8 Function
+ %145 = OpVariable %9 Function
+ %152 = OpVariable %9 Function
+ %154 = OpVariable %9 Function
+ %159 = OpVariable %9 Function
+ %161 = OpVariable %9 Function
+ %166 = OpVariable %9 Function
+ %168 = OpVariable %9 Function
+ %173 = OpVariable %9 Function
+ %175 = OpVariable %9 Function
+ %180 = OpVariable %9 Function
+ %182 = OpVariable %9 Function
+ %186 = OpVariable %9 Function
+ %188 = OpVariable %9 Function
+ %193 = OpVariable %9 Function
+ %195 = OpVariable %9 Function
+ %200 = OpVariable %9 Function
+ %202 = OpVariable %9 Function
+ %207 = OpVariable %9 Function
+ %209 = OpVariable %9 Function
+ %211 = OpVariable %9 Function
+ %212 = OpVariable %9 Function
+ %221 = OpVariable %9 Function
+ %222 = OpVariable %9 Function
+ OpStore %140 %24
+ %143 = OpAccessChain %66 %47 %24
+ %144 = OpLoad %7 %143
+ OpStore %142 %144
+ OpStore %145 %141
+ %146 = OpFunctionCall %2 %13 %142 %145
+ %147 = OpLoad %7 %142
+ %148 = OpAccessChain %66 %47 %24
+ OpStore %148 %147
+ %149 = OpLoad %6 %140
+ %150 = OpIAdd %6 %149 %27
+ OpStore %140 %150
+ %153 = OpLoad %6 %140
+ OpStore %152 %153
+ OpStore %154 %151
+ %155 = OpFunctionCall %2 %18 %152 %154
+ %156 = OpLoad %6 %140
+ %157 = OpIAdd %6 %156 %27
+ OpStore %140 %157
+ %160 = OpLoad %6 %140
+ OpStore %159 %160
+ OpStore %161 %158
+ %162 = OpFunctionCall %2 %18 %159 %161
+ %163 = OpLoad %6 %140
+ %164 = OpIAdd %6 %163 %27
+ OpStore %140 %164
+ %167 = OpLoad %6 %140
+ OpStore %166 %167
+ OpStore %168 %165
+ %169 = OpFunctionCall %2 %18 %166 %168
+ %170 = OpLoad %6 %140
+ %171 = OpIAdd %6 %170 %27
+ OpStore %140 %171
+ %174 = OpLoad %6 %140
+ OpStore %173 %174
+ OpStore %175 %172
+ %176 = OpFunctionCall %2 %18 %173 %175
+ %177 = OpLoad %6 %140
+ %178 = OpIAdd %6 %177 %27
+ OpStore %140 %178
+ %181 = OpLoad %6 %140
+ OpStore %180 %181
+ OpStore %182 %179
+ %183 = OpFunctionCall %2 %18 %180 %182
+ %184 = OpLoad %6 %140
+ %185 = OpIAdd %6 %184 %27
+ OpStore %140 %185
+ %187 = OpLoad %6 %140
+ OpStore %186 %187
+ OpStore %188 %30
+ %189 = OpFunctionCall %2 %18 %186 %188
+ %190 = OpLoad %6 %140
+ %191 = OpIAdd %6 %190 %27
+ OpStore %140 %191
+ %194 = OpLoad %6 %140
+ OpStore %193 %194
+ OpStore %195 %192
+ %196 = OpFunctionCall %2 %18 %193 %195
+ %197 = OpLoad %6 %140
+ %198 = OpIAdd %6 %197 %27
+ OpStore %140 %198
+ %201 = OpLoad %6 %140
+ OpStore %200 %201
+ OpStore %202 %199
+ %203 = OpFunctionCall %2 %18 %200 %202
+ %204 = OpLoad %6 %140
+ %205 = OpIAdd %6 %204 %27
+ OpStore %140 %205
+ %208 = OpLoad %6 %140
+ OpStore %207 %208
+ OpStore %209 %206
+ %210 = OpFunctionCall %2 %18 %207 %209
+ OpStore %211 %24
+ OpStore %212 %24
+ OpBranch %213
+ %213 = OpLabel
+ OpLoopMerge %215 %216 None
+ OpBranch %217
+ %217 = OpLabel
+ %218 = OpLoad %6 %212
+ %220 = OpSLessThan %40 %218 %219
+ OpBranchConditional %220 %214 %215
+ %214 = OpLabel
+ %223 = OpLoad %6 %212
+ OpStore %222 %223
+ %224 = OpFunctionCall %6 %22 %222
+ OpStore %221 %224
+ %225 = OpLoad %6 %212
+ OpSelectionMerge %228 None
+ OpSwitch %225 %227 9 %226 5 %226 12 %226 15 %226 7 %226 8 %226 2 %226 6 %226 17 %226 13 %226
+ %227 = OpLabel
+ %237 = OpLoad %6 %221
+ %238 = OpIEqual %40 %237 %28
+ OpSelectionMerge %240 None
+ OpBranchConditional %238 %239 %240
+ %239 = OpLabel
+ %241 = OpLoad %6 %211
+ %242 = OpIAdd %6 %241 %27
+ OpStore %211 %242
+ OpBranch %240
+ %240 = OpLabel
+ OpBranch %228
+ %226 = OpLabel
+ %229 = OpLoad %6 %221
+ %230 = OpLoad %6 %212
+ %231 = OpIEqual %40 %229 %230
+ OpSelectionMerge %233 None
+ OpBranchConditional %231 %232 %233
+ %232 = OpLabel
+ %234 = OpLoad %6 %211
+ %235 = OpIAdd %6 %234 %27
+ OpStore %211 %235
+ OpBranch %233
+ %233 = OpLabel
+ OpBranch %228
+ %228 = OpLabel
+ OpBranch %216
+ %216 = OpLabel
+ %245 = OpLoad %6 %212
+ %246 = OpIAdd %6 %245 %27
+ OpStore %212 %246
+ OpBranch %213
+ %215 = OpLabel
+ %247 = OpLoad %6 %211
+ %248 = OpIEqual %40 %247 %219
+ OpSelectionMerge %250 None
+ OpBranchConditional %248 %249 %258
+ %249 = OpLabel
+ OpStore %254 %257
+ OpBranch %250
+ %258 = OpLabel
+ OpStore %254 %259
+ OpBranch %250
+ %250 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %13 = OpFunction %2 None %10
+ %11 = OpFunctionParameter %8
+ %12 = OpFunctionParameter %9
+ %14 = OpLabel
+ %25 = OpLoad %6 %12
+ %26 = OpAccessChain %9 %11 %24
+ OpStore %26 %25
+ %29 = OpAccessChain %9 %11 %27
+ OpStore %29 %28
+ %31 = OpAccessChain %9 %11 %30
+ OpStore %31 %28
+ OpReturn
+ OpFunctionEnd
+ %18 = OpFunction %2 None %15
+ %16 = OpFunctionParameter %9
+ %17 = OpFunctionParameter %9
+ %19 = OpLabel
+ %32 = OpVariable %9 Function
+ %65 = OpVariable %8 Function
+ %69 = OpVariable %9 Function
+ %91 = OpVariable %8 Function
+ %94 = OpVariable %9 Function
+ OpStore %32 %24
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %6 %32
+ %39 = OpLoad %6 %16
+ %41 = OpSLessThanEqual %40 %38 %39
+ OpBranchConditional %41 %34 %35
+ %34 = OpLabel
+ %42 = OpLoad %6 %17
+ %48 = OpLoad %6 %32
+ %50 = OpAccessChain %49 %47 %48 %24
+ %51 = OpLoad %6 %50
+ %52 = OpSLessThanEqual %40 %42 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %80
+ %53 = OpLabel
+ %55 = OpLoad %6 %32
+ %56 = OpAccessChain %49 %47 %55 %27
+ %57 = OpLoad %6 %56
+ %58 = OpIEqual %40 %57 %28
+ OpSelectionMerge %60 None
+ OpBranchConditional %58 %59 %75
+ %59 = OpLabel
+ %61 = OpLoad %6 %32
+ %62 = OpLoad %6 %16
+ %63 = OpAccessChain %49 %47 %61 %27
+ OpStore %63 %62
+ %64 = OpLoad %6 %16
+ %67 = OpAccessChain %66 %47 %64
+ %68 = OpLoad %7 %67
+ OpStore %65 %68
+ %70 = OpLoad %6 %17
+ OpStore %69 %70
+ %71 = OpFunctionCall %2 %13 %65 %69
+ %72 = OpLoad %7 %65
+ %73 = OpAccessChain %66 %47 %64
+ OpStore %73 %72
+ OpReturn
+ %75 = OpLabel
+ %76 = OpLoad %6 %32
+ %77 = OpAccessChain %49 %47 %76 %27
+ %78 = OpLoad %6 %77
+ OpStore %32 %78
+ OpBranch %36
+ %60 = OpLabel
+ OpUnreachable
+ %80 = OpLabel
+ %81 = OpLoad %6 %32
+ %82 = OpAccessChain %49 %47 %81 %30
+ %83 = OpLoad %6 %82
+ %84 = OpIEqual %40 %83 %28
+ OpSelectionMerge %86 None
+ OpBranchConditional %84 %85 %100
+ %85 = OpLabel
+ %87 = OpLoad %6 %32
+ %88 = OpLoad %6 %16
+ %89 = OpAccessChain %49 %47 %87 %30
+ OpStore %89 %88
+ %90 = OpLoad %6 %16
+ %92 = OpAccessChain %66 %47 %90
+ %93 = OpLoad %7 %92
+ OpStore %91 %93
+ %95 = OpLoad %6 %17
+ OpStore %94 %95
+ %96 = OpFunctionCall %2 %13 %91 %94
+ %97 = OpLoad %7 %91
+ %98 = OpAccessChain %66 %47 %90
+ OpStore %98 %97
+ OpReturn
+ %100 = OpLabel
+ %101 = OpLoad %6 %32
+ %102 = OpAccessChain %49 %47 %101 %30
+ %103 = OpLoad %6 %102
+ OpStore %32 %103
+ OpBranch %36
+ %86 = OpLabel
+ OpUnreachable
+ %54 = OpLabel
+ OpUnreachable
+ %36 = OpLabel
+ OpBranch %33
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %22 = OpFunction %6 None %20
+ %21 = OpFunctionParameter %9
+ %23 = OpLabel
+ %105 = OpVariable %9 Function
+ %113 = OpVariable %8 Function
+ %129 = OpVariable %9 Function
+ OpStore %105 %24
+ OpBranch %106
+ %106 = OpLabel
+ OpLoopMerge %108 %109 None
+ OpBranch %110
+ %110 = OpLabel
+ %111 = OpLoad %6 %105
+ %112 = OpINotEqual %40 %111 %28
+ OpBranchConditional %112 %107 %108
+ %107 = OpLabel
+ %114 = OpLoad %6 %105
+ %115 = OpAccessChain %66 %47 %114
+ %116 = OpLoad %7 %115
+ OpStore %113 %116
+ %117 = OpAccessChain %9 %113 %24
+ %118 = OpLoad %6 %117
+ %119 = OpLoad %6 %21
+ %120 = OpIEqual %40 %118 %119
+ OpSelectionMerge %122 None
+ OpBranchConditional %120 %121 %122
+ %121 = OpLabel
+ %123 = OpLoad %6 %21
+ OpReturnValue %123
+ %122 = OpLabel
+ %125 = OpLoad %6 %21
+ %126 = OpAccessChain %9 %113 %24
+ %127 = OpLoad %6 %126
+ %128 = OpSGreaterThan %40 %125 %127
+ OpSelectionMerge %131 None
+ OpBranchConditional %128 %130 %134
+ %130 = OpLabel
+ %132 = OpAccessChain %9 %113 %30
+ %133 = OpLoad %6 %132
+ OpStore %129 %133
+ OpBranch %131
+ %134 = OpLabel
+ %135 = OpAccessChain %9 %113 %27
+ %136 = OpLoad %6 %135
+ OpStore %129 %136
+ OpBranch %131
+ %131 = OpLabel
+ %137 = OpLoad %6 %129
+ OpStore %105 %137
+ OpBranch %109
+ %109 = OpLabel
+ OpBranch %106
+ %108 = OpLabel
+ OpReturnValue %28
+ OpFunctionEnd
+END
+
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct BST {
+# int data;
+# int leftIndex;
+# int rightIndex;
+# } ;
+#
+# BST tree[10];
+#
+# void makeTreeNode(inout BST tree, int data)
+# {
+# tree.data = data;
+# tree.leftIndex = - 1;
+# tree.rightIndex = - 1;
+# }
+# void insert(int treeIndex, int data)
+# {
+# int baseIndex = 0;
+# while(baseIndex <= treeIndex)
+# {
+# if(data <= tree[baseIndex].data)
+# {
+# if(tree[baseIndex].leftIndex == - 1)
+# {
+# tree[baseIndex].leftIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].leftIndex;
+# continue;
+# }
+# }
+# else
+# {
+# if(tree[baseIndex].rightIndex == - 1)
+# {
+# tree[baseIndex].rightIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].rightIndex;
+# continue;
+# }
+# }
+# }
+# }
+# int search(int target)
+# {
+# BST currentNode;
+# int index = 0;
+# while(index != - 1)
+# {
+# currentNode = tree[index];
+# if(currentNode.data == target)
+# {
+# return target;
+# }
+# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
+# }
+# return - 1;
+# }
+# void main()
+# {
+# int treeIndex = 0;
+# makeTreeNode(tree[0], 9);
+# treeIndex ++;
+# insert(treeIndex, 5);
+# treeIndex ++;
+# insert(treeIndex, 12);
+# treeIndex ++;
+# insert(treeIndex, 15);
+# treeIndex ++;
+# insert(treeIndex, 7);
+# treeIndex ++;
+# insert(treeIndex, 8);
+# treeIndex ++;
+# insert(treeIndex, 2);
+# treeIndex ++;
+# insert(treeIndex, 6);
+# treeIndex ++;
+# insert(treeIndex, 17);
+# treeIndex ++;
+# insert(treeIndex, 13);
+# int count = 0;
+# for(int i = 0; i < 20; i ++)
+# {
+# int result = search(i);
+# switch(i)
+# {
+# case 9:
+# case 5:
+# case 12:
+# case 15:
+# case 7:
+# case 8:
+# case 2:
+# case 6:
+# case 17:
+# case 13:
+# // Always false: gl_Frag_Coord.x < 0.0
+# // Thus, the end result is the same as in the reference shader.
+# if((result == i) || (gl_FragCoord.x < 0.0))
+# {
+# count ++;
+# }
+# break;
+# default:
+# if(result == - 1)
+# {
+# count ++;
+# }
+# break;
+# }
+# }
+# if(count == 20)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 271
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %238 %266
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %7 "BST"
+ OpMemberName %7 0 "data"
+ OpMemberName %7 1 "leftIndex"
+ OpMemberName %7 2 "rightIndex"
+ OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+ OpName %11 "tree"
+ OpName %12 "data"
+ OpName %18 "insert(i1;i1;"
+ OpName %16 "treeIndex"
+ OpName %17 "data"
+ OpName %22 "search(i1;"
+ OpName %21 "target"
+ OpName %32 "baseIndex"
+ OpName %47 "tree"
+ OpName %65 "param"
+ OpName %69 "param"
+ OpName %91 "param"
+ OpName %94 "param"
+ OpName %105 "index"
+ OpName %113 "currentNode"
+ OpName %140 "treeIndex"
+ OpName %142 "param"
+ OpName %145 "param"
+ OpName %152 "param"
+ OpName %154 "param"
+ OpName %159 "param"
+ OpName %161 "param"
+ OpName %166 "param"
+ OpName %168 "param"
+ OpName %173 "param"
+ OpName %175 "param"
+ OpName %180 "param"
+ OpName %182 "param"
+ OpName %186 "param"
+ OpName %188 "param"
+ OpName %193 "param"
+ OpName %195 "param"
+ OpName %200 "param"
+ OpName %202 "param"
+ OpName %207 "param"
+ OpName %209 "param"
+ OpName %211 "count"
+ OpName %212 "i"
+ OpName %221 "result"
+ OpName %222 "param"
+ OpName %238 "gl_FragCoord"
+ OpName %266 "_GLF_color"
+ OpDecorate %238 BuiltIn FragCoord
+ OpDecorate %266 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6 %6 %6
+ %8 = OpTypePointer Function %7
+ %9 = OpTypePointer Function %6
+ %10 = OpTypeFunction %2 %8 %9
+ %15 = OpTypeFunction %2 %9 %9
+ %20 = OpTypeFunction %6 %9
+ %24 = OpConstant %6 0
+ %27 = OpConstant %6 1
+ %28 = OpConstant %6 -1
+ %30 = OpConstant %6 2
+ %40 = OpTypeBool
+ %43 = OpTypeInt 32 0
+ %44 = OpConstant %43 10
+ %45 = OpTypeArray %7 %44
+ %46 = OpTypePointer Private %45
+ %47 = OpVariable %46 Private
+ %49 = OpTypePointer Private %6
+ %66 = OpTypePointer Private %7
+ %141 = OpConstant %6 9
+ %151 = OpConstant %6 5
+ %158 = OpConstant %6 12
+ %165 = OpConstant %6 15
+ %172 = OpConstant %6 7
+ %179 = OpConstant %6 8
+ %192 = OpConstant %6 6
+ %199 = OpConstant %6 17
+ %206 = OpConstant %6 13
+ %219 = OpConstant %6 20
+ %235 = OpTypeFloat 32
+ %236 = OpTypeVector %235 4
+ %237 = OpTypePointer Input %236
+ %238 = OpVariable %237 Input
+ %239 = OpConstant %43 0
+ %240 = OpTypePointer Input %235
+ %243 = OpConstant %235 0
+ %265 = OpTypePointer Output %236
+ %266 = OpVariable %265 Output
+ %267 = OpConstant %235 1
+ %268 = OpConstantComposite %236 %267 %243 %243 %267
+ %270 = OpConstantComposite %236 %243 %243 %267 %267
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %140 = OpVariable %9 Function
+ %142 = OpVariable %8 Function
+ %145 = OpVariable %9 Function
+ %152 = OpVariable %9 Function
+ %154 = OpVariable %9 Function
+ %159 = OpVariable %9 Function
+ %161 = OpVariable %9 Function
+ %166 = OpVariable %9 Function
+ %168 = OpVariable %9 Function
+ %173 = OpVariable %9 Function
+ %175 = OpVariable %9 Function
+ %180 = OpVariable %9 Function
+ %182 = OpVariable %9 Function
+ %186 = OpVariable %9 Function
+ %188 = OpVariable %9 Function
+ %193 = OpVariable %9 Function
+ %195 = OpVariable %9 Function
+ %200 = OpVariable %9 Function
+ %202 = OpVariable %9 Function
+ %207 = OpVariable %9 Function
+ %209 = OpVariable %9 Function
+ %211 = OpVariable %9 Function
+ %212 = OpVariable %9 Function
+ %221 = OpVariable %9 Function
+ %222 = OpVariable %9 Function
+ OpStore %140 %24
+ %143 = OpAccessChain %66 %47 %24
+ %144 = OpLoad %7 %143
+ OpStore %142 %144
+ OpStore %145 %141
+ %146 = OpFunctionCall %2 %13 %142 %145
+ %147 = OpLoad %7 %142
+ %148 = OpAccessChain %66 %47 %24
+ OpStore %148 %147
+ %149 = OpLoad %6 %140
+ %150 = OpIAdd %6 %149 %27
+ OpStore %140 %150
+ %153 = OpLoad %6 %140
+ OpStore %152 %153
+ OpStore %154 %151
+ %155 = OpFunctionCall %2 %18 %152 %154
+ %156 = OpLoad %6 %140
+ %157 = OpIAdd %6 %156 %27
+ OpStore %140 %157
+ %160 = OpLoad %6 %140
+ OpStore %159 %160
+ OpStore %161 %158
+ %162 = OpFunctionCall %2 %18 %159 %161
+ %163 = OpLoad %6 %140
+ %164 = OpIAdd %6 %163 %27
+ OpStore %140 %164
+ %167 = OpLoad %6 %140
+ OpStore %166 %167
+ OpStore %168 %165
+ %169 = OpFunctionCall %2 %18 %166 %168
+ %170 = OpLoad %6 %140
+ %171 = OpIAdd %6 %170 %27
+ OpStore %140 %171
+ %174 = OpLoad %6 %140
+ OpStore %173 %174
+ OpStore %175 %172
+ %176 = OpFunctionCall %2 %18 %173 %175
+ %177 = OpLoad %6 %140
+ %178 = OpIAdd %6 %177 %27
+ OpStore %140 %178
+ %181 = OpLoad %6 %140
+ OpStore %180 %181
+ OpStore %182 %179
+ %183 = OpFunctionCall %2 %18 %180 %182
+ %184 = OpLoad %6 %140
+ %185 = OpIAdd %6 %184 %27
+ OpStore %140 %185
+ %187 = OpLoad %6 %140
+ OpStore %186 %187
+ OpStore %188 %30
+ %189 = OpFunctionCall %2 %18 %186 %188
+ %190 = OpLoad %6 %140
+ %191 = OpIAdd %6 %190 %27
+ OpStore %140 %191
+ %194 = OpLoad %6 %140
+ OpStore %193 %194
+ OpStore %195 %192
+ %196 = OpFunctionCall %2 %18 %193 %195
+ %197 = OpLoad %6 %140
+ %198 = OpIAdd %6 %197 %27
+ OpStore %140 %198
+ %201 = OpLoad %6 %140
+ OpStore %200 %201
+ OpStore %202 %199
+ %203 = OpFunctionCall %2 %18 %200 %202
+ %204 = OpLoad %6 %140
+ %205 = OpIAdd %6 %204 %27
+ OpStore %140 %205
+ %208 = OpLoad %6 %140
+ OpStore %207 %208
+ OpStore %209 %206
+ %210 = OpFunctionCall %2 %18 %207 %209
+ OpStore %211 %24
+ OpStore %212 %24
+ OpBranch %213
+ %213 = OpLabel
+ OpLoopMerge %215 %216 None
+ OpBranch %217
+ %217 = OpLabel
+ %218 = OpLoad %6 %212
+ %220 = OpSLessThan %40 %218 %219
+ OpBranchConditional %220 %214 %215
+ %214 = OpLabel
+ %223 = OpLoad %6 %212
+ OpStore %222 %223
+ %224 = OpFunctionCall %6 %22 %222
+ OpStore %221 %224
+ %225 = OpLoad %6 %212
+ OpSelectionMerge %228 None
+ OpSwitch %225 %227 9 %226 5 %226 12 %226 15 %226 7 %226 8 %226 2 %226 6 %226 17 %226 13 %226
+ %227 = OpLabel
+ %251 = OpLoad %6 %221
+ %252 = OpIEqual %40 %251 %28
+ OpSelectionMerge %254 None
+ OpBranchConditional %252 %253 %254
+ %253 = OpLabel
+ %255 = OpLoad %6 %211
+ %256 = OpIAdd %6 %255 %27
+ OpStore %211 %256
+ OpBranch %254
+ %254 = OpLabel
+ OpBranch %228
+ %226 = OpLabel
+ %229 = OpLoad %6 %221
+ %230 = OpLoad %6 %212
+ %231 = OpIEqual %40 %229 %230
+ %232 = OpLogicalNot %40 %231
+ OpSelectionMerge %234 None
+ OpBranchConditional %232 %233 %234
+ %233 = OpLabel
+ %241 = OpAccessChain %240 %238 %239
+ %242 = OpLoad %235 %241
+ %244 = OpFOrdLessThan %40 %242 %243
+ OpBranch %234
+ %234 = OpLabel
+ %245 = OpPhi %40 %231 %226 %244 %233
+ OpSelectionMerge %247 None
+ OpBranchConditional %245 %246 %247
+ %246 = OpLabel
+ %248 = OpLoad %6 %211
+ %249 = OpIAdd %6 %248 %27
+ OpStore %211 %249
+ OpBranch %247
+ %247 = OpLabel
+ OpBranch %228
+ %228 = OpLabel
+ OpBranch %216
+ %216 = OpLabel
+ %259 = OpLoad %6 %212
+ %260 = OpIAdd %6 %259 %27
+ OpStore %212 %260
+ OpBranch %213
+ %215 = OpLabel
+ %261 = OpLoad %6 %211
+ %262 = OpIEqual %40 %261 %219
+ OpSelectionMerge %264 None
+ OpBranchConditional %262 %263 %269
+ %263 = OpLabel
+ OpStore %266 %268
+ OpBranch %264
+ %269 = OpLabel
+ OpStore %266 %270
+ OpBranch %264
+ %264 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %13 = OpFunction %2 None %10
+ %11 = OpFunctionParameter %8
+ %12 = OpFunctionParameter %9
+ %14 = OpLabel
+ %25 = OpLoad %6 %12
+ %26 = OpAccessChain %9 %11 %24
+ OpStore %26 %25
+ %29 = OpAccessChain %9 %11 %27
+ OpStore %29 %28
+ %31 = OpAccessChain %9 %11 %30
+ OpStore %31 %28
+ OpReturn
+ OpFunctionEnd
+ %18 = OpFunction %2 None %15
+ %16 = OpFunctionParameter %9
+ %17 = OpFunctionParameter %9
+ %19 = OpLabel
+ %32 = OpVariable %9 Function
+ %65 = OpVariable %8 Function
+ %69 = OpVariable %9 Function
+ %91 = OpVariable %8 Function
+ %94 = OpVariable %9 Function
+ OpStore %32 %24
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %6 %32
+ %39 = OpLoad %6 %16
+ %41 = OpSLessThanEqual %40 %38 %39
+ OpBranchConditional %41 %34 %35
+ %34 = OpLabel
+ %42 = OpLoad %6 %17
+ %48 = OpLoad %6 %32
+ %50 = OpAccessChain %49 %47 %48 %24
+ %51 = OpLoad %6 %50
+ %52 = OpSLessThanEqual %40 %42 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %80
+ %53 = OpLabel
+ %55 = OpLoad %6 %32
+ %56 = OpAccessChain %49 %47 %55 %27
+ %57 = OpLoad %6 %56
+ %58 = OpIEqual %40 %57 %28
+ OpSelectionMerge %60 None
+ OpBranchConditional %58 %59 %75
+ %59 = OpLabel
+ %61 = OpLoad %6 %32
+ %62 = OpLoad %6 %16
+ %63 = OpAccessChain %49 %47 %61 %27
+ OpStore %63 %62
+ %64 = OpLoad %6 %16
+ %67 = OpAccessChain %66 %47 %64
+ %68 = OpLoad %7 %67
+ OpStore %65 %68
+ %70 = OpLoad %6 %17
+ OpStore %69 %70
+ %71 = OpFunctionCall %2 %13 %65 %69
+ %72 = OpLoad %7 %65
+ %73 = OpAccessChain %66 %47 %64
+ OpStore %73 %72
+ OpReturn
+ %75 = OpLabel
+ %76 = OpLoad %6 %32
+ %77 = OpAccessChain %49 %47 %76 %27
+ %78 = OpLoad %6 %77
+ OpStore %32 %78
+ OpBranch %36
+ %60 = OpLabel
+ OpUnreachable
+ %80 = OpLabel
+ %81 = OpLoad %6 %32
+ %82 = OpAccessChain %49 %47 %81 %30
+ %83 = OpLoad %6 %82
+ %84 = OpIEqual %40 %83 %28
+ OpSelectionMerge %86 None
+ OpBranchConditional %84 %85 %100
+ %85 = OpLabel
+ %87 = OpLoad %6 %32
+ %88 = OpLoad %6 %16
+ %89 = OpAccessChain %49 %47 %87 %30
+ OpStore %89 %88
+ %90 = OpLoad %6 %16
+ %92 = OpAccessChain %66 %47 %90
+ %93 = OpLoad %7 %92
+ OpStore %91 %93
+ %95 = OpLoad %6 %17
+ OpStore %94 %95
+ %96 = OpFunctionCall %2 %13 %91 %94
+ %97 = OpLoad %7 %91
+ %98 = OpAccessChain %66 %47 %90
+ OpStore %98 %97
+ OpReturn
+ %100 = OpLabel
+ %101 = OpLoad %6 %32
+ %102 = OpAccessChain %49 %47 %101 %30
+ %103 = OpLoad %6 %102
+ OpStore %32 %103
+ OpBranch %36
+ %86 = OpLabel
+ OpUnreachable
+ %54 = OpLabel
+ OpUnreachable
+ %36 = OpLabel
+ OpBranch %33
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %22 = OpFunction %6 None %20
+ %21 = OpFunctionParameter %9
+ %23 = OpLabel
+ %105 = OpVariable %9 Function
+ %113 = OpVariable %8 Function
+ %129 = OpVariable %9 Function
+ OpStore %105 %24
+ OpBranch %106
+ %106 = OpLabel
+ OpLoopMerge %108 %109 None
+ OpBranch %110
+ %110 = OpLabel
+ %111 = OpLoad %6 %105
+ %112 = OpINotEqual %40 %111 %28
+ OpBranchConditional %112 %107 %108
+ %107 = OpLabel
+ %114 = OpLoad %6 %105
+ %115 = OpAccessChain %66 %47 %114
+ %116 = OpLoad %7 %115
+ OpStore %113 %116
+ %117 = OpAccessChain %9 %113 %24
+ %118 = OpLoad %6 %117
+ %119 = OpLoad %6 %21
+ %120 = OpIEqual %40 %118 %119
+ OpSelectionMerge %122 None
+ OpBranchConditional %120 %121 %122
+ %121 = OpLabel
+ %123 = OpLoad %6 %21
+ OpReturnValue %123
+ %122 = OpLabel
+ %125 = OpLoad %6 %21
+ %126 = OpAccessChain %9 %113 %24
+ %127 = OpLoad %6 %126
+ %128 = OpSGreaterThan %40 %125 %127
+ OpSelectionMerge %131 None
+ OpBranchConditional %128 %130 %134
+ %130 = OpLabel
+ %132 = OpAccessChain %9 %113 %30
+ %133 = OpLoad %6 %132
+ OpStore %129 %133
+ OpBranch %131
+ %134 = OpLabel
+ %135 = OpAccessChain %9 %113 %27
+ %136 = OpLoad %6 %135
+ OpStore %129 %136
+ OpBranch %131
+ %131 = OpLabel
+ %137 = OpLoad %6 %129
+ OpStore %105 %137
+ OpBranch %109
+ %109 = OpLabel
+ OpBranch %106
+ %108 = OpLabel
+ OpReturnValue %28
+ OpFunctionEnd
+END
+
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional.amber
new file mode 100644
index 0000000..fe0394a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional.amber
@@ -0,0 +1,1267 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with nested if and conditional statement
+
+# The test passes because both shaders render the same image.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct BST
+# {
+# int data;
+# int leftIndex;
+# int rightIndex;
+# };
+#
+# BST tree[10];
+#
+# void makeTreeNode(inout BST tree, int data)
+# {
+# tree.data = data;
+# tree.leftIndex = -1;
+# tree.rightIndex = -1;
+# }
+# void insert(int treeIndex, int data)
+# {
+# int baseIndex = 0;
+# while (baseIndex <= treeIndex)
+# {
+# if (data <= tree[baseIndex].data)
+# {
+# if (tree[baseIndex].leftIndex == -1)
+# {
+# tree[baseIndex].leftIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].leftIndex;
+# continue;
+# }
+# }
+# else
+# {
+# if (tree[baseIndex].rightIndex == -1)
+# {
+# tree[baseIndex].rightIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].rightIndex;
+# continue;
+# }
+# }
+# }
+# }
+# int search(int target)
+# {
+# BST currentNode;
+# int index = 0;
+# while (index != -1)
+# {
+# currentNode = tree[index];
+# if (currentNode.data == target)
+# {
+# return target;
+# }
+# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
+# }
+# return -1;
+# }
+# void main()
+# {
+# int treeIndex = 0;
+# makeTreeNode(tree[0], 9);
+# treeIndex++;
+# insert(treeIndex, 5);
+# treeIndex++;
+# insert(treeIndex, 12);
+# treeIndex++;
+# insert(treeIndex, 15);
+# treeIndex++;
+# insert(treeIndex, 7);
+# treeIndex++;
+# insert(treeIndex, 8);
+# treeIndex++;
+# insert(treeIndex, 2);
+# treeIndex++;
+# insert(treeIndex, 6);
+# treeIndex++;
+# insert(treeIndex, 17);
+# treeIndex++;
+# insert(treeIndex, 13);
+# int count = 0;
+# for (int i = 0; i < 20; i++)
+# {
+# int result = search(i);
+# switch (i)
+# {
+# case 9:
+# case 5:
+# case 12:
+# case 15:
+# case 7:
+# case 8:
+# case 2:
+# case 6:
+# case 17:
+# case 13:
+# if (result == i)
+# {
+# count++;
+# }
+# break;
+# default:
+# if (result == -1)
+# {
+# count++;
+# }
+# break;
+# }
+# }
+# if (count == 20)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
+# }
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 260
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %254
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %7 "BST"
+ OpMemberName %7 0 "data"
+ OpMemberName %7 1 "leftIndex"
+ OpMemberName %7 2 "rightIndex"
+ OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+ OpName %11 "tree"
+ OpName %12 "data"
+ OpName %18 "insert(i1;i1;"
+ OpName %16 "treeIndex"
+ OpName %17 "data"
+ OpName %22 "search(i1;"
+ OpName %21 "target"
+ OpName %32 "baseIndex"
+ OpName %47 "tree"
+ OpName %65 "param"
+ OpName %69 "param"
+ OpName %91 "param"
+ OpName %94 "param"
+ OpName %105 "index"
+ OpName %113 "currentNode"
+ OpName %140 "treeIndex"
+ OpName %142 "param"
+ OpName %145 "param"
+ OpName %152 "param"
+ OpName %154 "param"
+ OpName %159 "param"
+ OpName %161 "param"
+ OpName %166 "param"
+ OpName %168 "param"
+ OpName %173 "param"
+ OpName %175 "param"
+ OpName %180 "param"
+ OpName %182 "param"
+ OpName %186 "param"
+ OpName %188 "param"
+ OpName %193 "param"
+ OpName %195 "param"
+ OpName %200 "param"
+ OpName %202 "param"
+ OpName %207 "param"
+ OpName %209 "param"
+ OpName %211 "count"
+ OpName %212 "i"
+ OpName %221 "result"
+ OpName %222 "param"
+ OpName %254 "_GLF_color"
+ OpDecorate %254 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6 %6 %6
+ %8 = OpTypePointer Function %7
+ %9 = OpTypePointer Function %6
+ %10 = OpTypeFunction %2 %8 %9
+ %15 = OpTypeFunction %2 %9 %9
+ %20 = OpTypeFunction %6 %9
+ %24 = OpConstant %6 0
+ %27 = OpConstant %6 1
+ %28 = OpConstant %6 -1
+ %30 = OpConstant %6 2
+ %40 = OpTypeBool
+ %43 = OpTypeInt 32 0
+ %44 = OpConstant %43 10
+ %45 = OpTypeArray %7 %44
+ %46 = OpTypePointer Private %45
+ %47 = OpVariable %46 Private
+ %49 = OpTypePointer Private %6
+ %66 = OpTypePointer Private %7
+ %141 = OpConstant %6 9
+ %151 = OpConstant %6 5
+ %158 = OpConstant %6 12
+ %165 = OpConstant %6 15
+ %172 = OpConstant %6 7
+ %179 = OpConstant %6 8
+ %192 = OpConstant %6 6
+ %199 = OpConstant %6 17
+ %206 = OpConstant %6 13
+ %219 = OpConstant %6 20
+ %251 = OpTypeFloat 32
+ %252 = OpTypeVector %251 4
+ %253 = OpTypePointer Output %252
+ %254 = OpVariable %253 Output
+ %255 = OpConstant %251 1
+ %256 = OpConstant %251 0
+ %257 = OpConstantComposite %252 %255 %256 %256 %255
+ %259 = OpConstantComposite %252 %256 %256 %255 %255
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %140 = OpVariable %9 Function
+ %142 = OpVariable %8 Function
+ %145 = OpVariable %9 Function
+ %152 = OpVariable %9 Function
+ %154 = OpVariable %9 Function
+ %159 = OpVariable %9 Function
+ %161 = OpVariable %9 Function
+ %166 = OpVariable %9 Function
+ %168 = OpVariable %9 Function
+ %173 = OpVariable %9 Function
+ %175 = OpVariable %9 Function
+ %180 = OpVariable %9 Function
+ %182 = OpVariable %9 Function
+ %186 = OpVariable %9 Function
+ %188 = OpVariable %9 Function
+ %193 = OpVariable %9 Function
+ %195 = OpVariable %9 Function
+ %200 = OpVariable %9 Function
+ %202 = OpVariable %9 Function
+ %207 = OpVariable %9 Function
+ %209 = OpVariable %9 Function
+ %211 = OpVariable %9 Function
+ %212 = OpVariable %9 Function
+ %221 = OpVariable %9 Function
+ %222 = OpVariable %9 Function
+ OpStore %140 %24
+ %143 = OpAccessChain %66 %47 %24
+ %144 = OpLoad %7 %143
+ OpStore %142 %144
+ OpStore %145 %141
+ %146 = OpFunctionCall %2 %13 %142 %145
+ %147 = OpLoad %7 %142
+ %148 = OpAccessChain %66 %47 %24
+ OpStore %148 %147
+ %149 = OpLoad %6 %140
+ %150 = OpIAdd %6 %149 %27
+ OpStore %140 %150
+ %153 = OpLoad %6 %140
+ OpStore %152 %153
+ OpStore %154 %151
+ %155 = OpFunctionCall %2 %18 %152 %154
+ %156 = OpLoad %6 %140
+ %157 = OpIAdd %6 %156 %27
+ OpStore %140 %157
+ %160 = OpLoad %6 %140
+ OpStore %159 %160
+ OpStore %161 %158
+ %162 = OpFunctionCall %2 %18 %159 %161
+ %163 = OpLoad %6 %140
+ %164 = OpIAdd %6 %163 %27
+ OpStore %140 %164
+ %167 = OpLoad %6 %140
+ OpStore %166 %167
+ OpStore %168 %165
+ %169 = OpFunctionCall %2 %18 %166 %168
+ %170 = OpLoad %6 %140
+ %171 = OpIAdd %6 %170 %27
+ OpStore %140 %171
+ %174 = OpLoad %6 %140
+ OpStore %173 %174
+ OpStore %175 %172
+ %176 = OpFunctionCall %2 %18 %173 %175
+ %177 = OpLoad %6 %140
+ %178 = OpIAdd %6 %177 %27
+ OpStore %140 %178
+ %181 = OpLoad %6 %140
+ OpStore %180 %181
+ OpStore %182 %179
+ %183 = OpFunctionCall %2 %18 %180 %182
+ %184 = OpLoad %6 %140
+ %185 = OpIAdd %6 %184 %27
+ OpStore %140 %185
+ %187 = OpLoad %6 %140
+ OpStore %186 %187
+ OpStore %188 %30
+ %189 = OpFunctionCall %2 %18 %186 %188
+ %190 = OpLoad %6 %140
+ %191 = OpIAdd %6 %190 %27
+ OpStore %140 %191
+ %194 = OpLoad %6 %140
+ OpStore %193 %194
+ OpStore %195 %192
+ %196 = OpFunctionCall %2 %18 %193 %195
+ %197 = OpLoad %6 %140
+ %198 = OpIAdd %6 %197 %27
+ OpStore %140 %198
+ %201 = OpLoad %6 %140
+ OpStore %200 %201
+ OpStore %202 %199
+ %203 = OpFunctionCall %2 %18 %200 %202
+ %204 = OpLoad %6 %140
+ %205 = OpIAdd %6 %204 %27
+ OpStore %140 %205
+ %208 = OpLoad %6 %140
+ OpStore %207 %208
+ OpStore %209 %206
+ %210 = OpFunctionCall %2 %18 %207 %209
+ OpStore %211 %24
+ OpStore %212 %24
+ OpBranch %213
+ %213 = OpLabel
+ OpLoopMerge %215 %216 None
+ OpBranch %217
+ %217 = OpLabel
+ %218 = OpLoad %6 %212
+ %220 = OpSLessThan %40 %218 %219
+ OpBranchConditional %220 %214 %215
+ %214 = OpLabel
+ %223 = OpLoad %6 %212
+ OpStore %222 %223
+ %224 = OpFunctionCall %6 %22 %222
+ OpStore %221 %224
+ %225 = OpLoad %6 %212
+ OpSelectionMerge %228 None
+ OpSwitch %225 %227 9 %226 5 %226 12 %226 15 %226 7 %226 8 %226 2 %226 6 %226 17 %226 13 %226
+ %227 = OpLabel
+ %237 = OpLoad %6 %221
+ %238 = OpIEqual %40 %237 %28
+ OpSelectionMerge %240 None
+ OpBranchConditional %238 %239 %240
+ %239 = OpLabel
+ %241 = OpLoad %6 %211
+ %242 = OpIAdd %6 %241 %27
+ OpStore %211 %242
+ OpBranch %240
+ %240 = OpLabel
+ OpBranch %228
+ %226 = OpLabel
+ %229 = OpLoad %6 %221
+ %230 = OpLoad %6 %212
+ %231 = OpIEqual %40 %229 %230
+ OpSelectionMerge %233 None
+ OpBranchConditional %231 %232 %233
+ %232 = OpLabel
+ %234 = OpLoad %6 %211
+ %235 = OpIAdd %6 %234 %27
+ OpStore %211 %235
+ OpBranch %233
+ %233 = OpLabel
+ OpBranch %228
+ %228 = OpLabel
+ OpBranch %216
+ %216 = OpLabel
+ %245 = OpLoad %6 %212
+ %246 = OpIAdd %6 %245 %27
+ OpStore %212 %246
+ OpBranch %213
+ %215 = OpLabel
+ %247 = OpLoad %6 %211
+ %248 = OpIEqual %40 %247 %219
+ OpSelectionMerge %250 None
+ OpBranchConditional %248 %249 %258
+ %249 = OpLabel
+ OpStore %254 %257
+ OpBranch %250
+ %258 = OpLabel
+ OpStore %254 %259
+ OpBranch %250
+ %250 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %13 = OpFunction %2 None %10
+ %11 = OpFunctionParameter %8
+ %12 = OpFunctionParameter %9
+ %14 = OpLabel
+ %25 = OpLoad %6 %12
+ %26 = OpAccessChain %9 %11 %24
+ OpStore %26 %25
+ %29 = OpAccessChain %9 %11 %27
+ OpStore %29 %28
+ %31 = OpAccessChain %9 %11 %30
+ OpStore %31 %28
+ OpReturn
+ OpFunctionEnd
+ %18 = OpFunction %2 None %15
+ %16 = OpFunctionParameter %9
+ %17 = OpFunctionParameter %9
+ %19 = OpLabel
+ %32 = OpVariable %9 Function
+ %65 = OpVariable %8 Function
+ %69 = OpVariable %9 Function
+ %91 = OpVariable %8 Function
+ %94 = OpVariable %9 Function
+ OpStore %32 %24
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %6 %32
+ %39 = OpLoad %6 %16
+ %41 = OpSLessThanEqual %40 %38 %39
+ OpBranchConditional %41 %34 %35
+ %34 = OpLabel
+ %42 = OpLoad %6 %17
+ %48 = OpLoad %6 %32
+ %50 = OpAccessChain %49 %47 %48 %24
+ %51 = OpLoad %6 %50
+ %52 = OpSLessThanEqual %40 %42 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %80
+ %53 = OpLabel
+ %55 = OpLoad %6 %32
+ %56 = OpAccessChain %49 %47 %55 %27
+ %57 = OpLoad %6 %56
+ %58 = OpIEqual %40 %57 %28
+ OpSelectionMerge %60 None
+ OpBranchConditional %58 %59 %75
+ %59 = OpLabel
+ %61 = OpLoad %6 %32
+ %62 = OpLoad %6 %16
+ %63 = OpAccessChain %49 %47 %61 %27
+ OpStore %63 %62
+ %64 = OpLoad %6 %16
+ %67 = OpAccessChain %66 %47 %64
+ %68 = OpLoad %7 %67
+ OpStore %65 %68
+ %70 = OpLoad %6 %17
+ OpStore %69 %70
+ %71 = OpFunctionCall %2 %13 %65 %69
+ %72 = OpLoad %7 %65
+ %73 = OpAccessChain %66 %47 %64
+ OpStore %73 %72
+ OpReturn
+ %75 = OpLabel
+ %76 = OpLoad %6 %32
+ %77 = OpAccessChain %49 %47 %76 %27
+ %78 = OpLoad %6 %77
+ OpStore %32 %78
+ OpBranch %36
+ %60 = OpLabel
+ OpUnreachable
+ %80 = OpLabel
+ %81 = OpLoad %6 %32
+ %82 = OpAccessChain %49 %47 %81 %30
+ %83 = OpLoad %6 %82
+ %84 = OpIEqual %40 %83 %28
+ OpSelectionMerge %86 None
+ OpBranchConditional %84 %85 %100
+ %85 = OpLabel
+ %87 = OpLoad %6 %32
+ %88 = OpLoad %6 %16
+ %89 = OpAccessChain %49 %47 %87 %30
+ OpStore %89 %88
+ %90 = OpLoad %6 %16
+ %92 = OpAccessChain %66 %47 %90
+ %93 = OpLoad %7 %92
+ OpStore %91 %93
+ %95 = OpLoad %6 %17
+ OpStore %94 %95
+ %96 = OpFunctionCall %2 %13 %91 %94
+ %97 = OpLoad %7 %91
+ %98 = OpAccessChain %66 %47 %90
+ OpStore %98 %97
+ OpReturn
+ %100 = OpLabel
+ %101 = OpLoad %6 %32
+ %102 = OpAccessChain %49 %47 %101 %30
+ %103 = OpLoad %6 %102
+ OpStore %32 %103
+ OpBranch %36
+ %86 = OpLabel
+ OpUnreachable
+ %54 = OpLabel
+ OpUnreachable
+ %36 = OpLabel
+ OpBranch %33
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %22 = OpFunction %6 None %20
+ %21 = OpFunctionParameter %9
+ %23 = OpLabel
+ %105 = OpVariable %9 Function
+ %113 = OpVariable %8 Function
+ %129 = OpVariable %9 Function
+ OpStore %105 %24
+ OpBranch %106
+ %106 = OpLabel
+ OpLoopMerge %108 %109 None
+ OpBranch %110
+ %110 = OpLabel
+ %111 = OpLoad %6 %105
+ %112 = OpINotEqual %40 %111 %28
+ OpBranchConditional %112 %107 %108
+ %107 = OpLabel
+ %114 = OpLoad %6 %105
+ %115 = OpAccessChain %66 %47 %114
+ %116 = OpLoad %7 %115
+ OpStore %113 %116
+ %117 = OpAccessChain %9 %113 %24
+ %118 = OpLoad %6 %117
+ %119 = OpLoad %6 %21
+ %120 = OpIEqual %40 %118 %119
+ OpSelectionMerge %122 None
+ OpBranchConditional %120 %121 %122
+ %121 = OpLabel
+ %123 = OpLoad %6 %21
+ OpReturnValue %123
+ %122 = OpLabel
+ %125 = OpLoad %6 %21
+ %126 = OpAccessChain %9 %113 %24
+ %127 = OpLoad %6 %126
+ %128 = OpSGreaterThan %40 %125 %127
+ OpSelectionMerge %131 None
+ OpBranchConditional %128 %130 %134
+ %130 = OpLabel
+ %132 = OpAccessChain %9 %113 %30
+ %133 = OpLoad %6 %132
+ OpStore %129 %133
+ OpBranch %131
+ %134 = OpLabel
+ %135 = OpAccessChain %9 %113 %27
+ %136 = OpLoad %6 %135
+ OpStore %129 %136
+ OpBranch %131
+ %131 = OpLabel
+ %137 = OpLoad %6 %129
+ OpStore %105 %137
+ OpBranch %109
+ %109 = OpLabel
+ OpBranch %106
+ %108 = OpLabel
+ OpReturnValue %28
+ OpFunctionEnd
+END
+
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch; // x == 0.0, y == 1.0
+# };
+# layout(location = 0) out vec4 _GLF_color;
+#
+# struct BST
+# {
+# int data;
+# int leftIndex;
+# int rightIndex;
+# };
+#
+# BST tree[10];
+#
+# void makeTreeNode(inout BST tree, int data)
+# {
+# tree.data = data;
+# tree.leftIndex = -1;
+# tree.rightIndex = -1;
+# }
+# void insert(int treeIndex, int data)
+# {
+# int baseIndex = 0;
+# while (baseIndex <= treeIndex)
+# {
+# if (data <= tree[baseIndex].data)
+# {
+# if (tree[baseIndex].leftIndex == -1)
+# {
+# tree[baseIndex].leftIndex = treeIndex;
+# // Always true.
+# if (injectionSwitch.x < injectionSwitch.y)
+# {
+# makeTreeNode(tree[treeIndex], data);
+# }
+# // Always true.
+# if (injectionSwitch.x < injectionSwitch.y)
+# {
+# return;
+# }
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].leftIndex;
+# continue;
+# }
+# }
+# else
+# {
+# // Conditional statement's result is irrelevant.
+# if ((injectionSwitch.x < injectionSwitch.y ? tree[baseIndex].rightIndex : tree[baseIndex].rightIndex) == -1)
+# {
+# tree[baseIndex].rightIndex = treeIndex;
+# makeTreeNode(tree[treeIndex], data);
+# return;
+# }
+# else
+# {
+# baseIndex = tree[baseIndex].rightIndex;
+# continue;
+# }
+# }
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# return;
+# }
+# }
+# }
+# int search(int target)
+# {
+# BST currentNode;
+# int index = 0;
+# while (index != -1)
+# {
+# currentNode = tree[index];
+# if (currentNode.data == target)
+# {
+# return target;
+# }
+# index = target > currentNode.data ? currentNode.rightIndex : currentNode.leftIndex;
+# }
+# return -1;
+# }
+# void main()
+# {
+# int treeIndex = 0;
+# makeTreeNode(tree[0], 9);
+# treeIndex++;
+# insert(treeIndex, 5);
+# treeIndex++;
+# insert(treeIndex, 12);
+# treeIndex++;
+# insert(treeIndex, 15);
+# treeIndex++;
+# insert(treeIndex, 7);
+# treeIndex++;
+# insert(treeIndex, 8);
+# treeIndex++;
+# insert(treeIndex, 2);
+# treeIndex++;
+# insert(treeIndex, 6);
+# treeIndex++;
+# insert(treeIndex, 17);
+# treeIndex++;
+# insert(treeIndex, 13);
+# int count = 0;
+# for (int i = 0; i < 20; i++)
+# {
+# int result = search(i);
+# switch (i)
+# {
+# case 9:
+# case 5:
+# case 12:
+# case 15:
+# case 7:
+# case 8:
+# case 2:
+# case 6:
+# case 17:
+# case 13:
+# if (result == i)
+# {
+# count++;
+# }
+# break;
+# default:
+# if (result == -1)
+# {
+# count++;
+# }
+# break;
+# }
+# }
+# if (count == 20)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 1.0, 1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 302
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %296
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %7 "BST"
+ OpMemberName %7 0 "data"
+ OpMemberName %7 1 "leftIndex"
+ OpMemberName %7 2 "rightIndex"
+ OpName %13 "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+ OpName %11 "tree"
+ OpName %12 "data"
+ OpName %18 "insert(i1;i1;"
+ OpName %16 "treeIndex"
+ OpName %17 "data"
+ OpName %22 "search(i1;"
+ OpName %21 "target"
+ OpName %32 "baseIndex"
+ OpName %47 "tree"
+ OpName %66 "buf0"
+ OpMemberName %66 0 "injectionSwitch"
+ OpName %68 ""
+ OpName %80 "param"
+ OpName %84 "param"
+ OpName %126 "param"
+ OpName %129 "param"
+ OpName %148 "index"
+ OpName %156 "currentNode"
+ OpName %183 "treeIndex"
+ OpName %185 "param"
+ OpName %188 "param"
+ OpName %195 "param"
+ OpName %197 "param"
+ OpName %202 "param"
+ OpName %204 "param"
+ OpName %209 "param"
+ OpName %211 "param"
+ OpName %216 "param"
+ OpName %218 "param"
+ OpName %223 "param"
+ OpName %225 "param"
+ OpName %229 "param"
+ OpName %231 "param"
+ OpName %236 "param"
+ OpName %238 "param"
+ OpName %243 "param"
+ OpName %245 "param"
+ OpName %250 "param"
+ OpName %252 "param"
+ OpName %254 "count"
+ OpName %255 "i"
+ OpName %264 "result"
+ OpName %265 "param"
+ OpName %296 "_GLF_color"
+ OpMemberDecorate %66 0 Offset 0
+ OpDecorate %66 Block
+ OpDecorate %68 DescriptorSet 0
+ OpDecorate %68 Binding 0
+ OpDecorate %296 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypeStruct %6 %6 %6
+ %8 = OpTypePointer Function %7
+ %9 = OpTypePointer Function %6
+ %10 = OpTypeFunction %2 %8 %9
+ %15 = OpTypeFunction %2 %9 %9
+ %20 = OpTypeFunction %6 %9
+ %24 = OpConstant %6 0
+ %27 = OpConstant %6 1
+ %28 = OpConstant %6 -1
+ %30 = OpConstant %6 2
+ %40 = OpTypeBool
+ %43 = OpTypeInt 32 0
+ %44 = OpConstant %43 10
+ %45 = OpTypeArray %7 %44
+ %46 = OpTypePointer Private %45
+ %47 = OpVariable %46 Private
+ %49 = OpTypePointer Private %6
+ %64 = OpTypeFloat 32
+ %65 = OpTypeVector %64 2
+ %66 = OpTypeStruct %65
+ %67 = OpTypePointer Uniform %66
+ %68 = OpVariable %67 Uniform
+ %69 = OpConstant %43 0
+ %70 = OpTypePointer Uniform %64
+ %73 = OpConstant %43 1
+ %81 = OpTypePointer Private %7
+ %184 = OpConstant %6 9
+ %194 = OpConstant %6 5
+ %201 = OpConstant %6 12
+ %208 = OpConstant %6 15
+ %215 = OpConstant %6 7
+ %222 = OpConstant %6 8
+ %235 = OpConstant %6 6
+ %242 = OpConstant %6 17
+ %249 = OpConstant %6 13
+ %262 = OpConstant %6 20
+ %294 = OpTypeVector %64 4
+ %295 = OpTypePointer Output %294
+ %296 = OpVariable %295 Output
+ %297 = OpConstant %64 1
+ %298 = OpConstant %64 0
+ %299 = OpConstantComposite %294 %297 %298 %298 %297
+ %301 = OpConstantComposite %294 %298 %298 %297 %297
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %183 = OpVariable %9 Function
+ %185 = OpVariable %8 Function
+ %188 = OpVariable %9 Function
+ %195 = OpVariable %9 Function
+ %197 = OpVariable %9 Function
+ %202 = OpVariable %9 Function
+ %204 = OpVariable %9 Function
+ %209 = OpVariable %9 Function
+ %211 = OpVariable %9 Function
+ %216 = OpVariable %9 Function
+ %218 = OpVariable %9 Function
+ %223 = OpVariable %9 Function
+ %225 = OpVariable %9 Function
+ %229 = OpVariable %9 Function
+ %231 = OpVariable %9 Function
+ %236 = OpVariable %9 Function
+ %238 = OpVariable %9 Function
+ %243 = OpVariable %9 Function
+ %245 = OpVariable %9 Function
+ %250 = OpVariable %9 Function
+ %252 = OpVariable %9 Function
+ %254 = OpVariable %9 Function
+ %255 = OpVariable %9 Function
+ %264 = OpVariable %9 Function
+ %265 = OpVariable %9 Function
+ OpStore %183 %24
+ %186 = OpAccessChain %81 %47 %24
+ %187 = OpLoad %7 %186
+ OpStore %185 %187
+ OpStore %188 %184
+ %189 = OpFunctionCall %2 %13 %185 %188
+ %190 = OpLoad %7 %185
+ %191 = OpAccessChain %81 %47 %24
+ OpStore %191 %190
+ %192 = OpLoad %6 %183
+ %193 = OpIAdd %6 %192 %27
+ OpStore %183 %193
+ %196 = OpLoad %6 %183
+ OpStore %195 %196
+ OpStore %197 %194
+ %198 = OpFunctionCall %2 %18 %195 %197
+ %199 = OpLoad %6 %183
+ %200 = OpIAdd %6 %199 %27
+ OpStore %183 %200
+ %203 = OpLoad %6 %183
+ OpStore %202 %203
+ OpStore %204 %201
+ %205 = OpFunctionCall %2 %18 %202 %204
+ %206 = OpLoad %6 %183
+ %207 = OpIAdd %6 %206 %27
+ OpStore %183 %207
+ %210 = OpLoad %6 %183
+ OpStore %209 %210
+ OpStore %211 %208
+ %212 = OpFunctionCall %2 %18 %209 %211
+ %213 = OpLoad %6 %183
+ %214 = OpIAdd %6 %213 %27
+ OpStore %183 %214
+ %217 = OpLoad %6 %183
+ OpStore %216 %217
+ OpStore %218 %215
+ %219 = OpFunctionCall %2 %18 %216 %218
+ %220 = OpLoad %6 %183
+ %221 = OpIAdd %6 %220 %27
+ OpStore %183 %221
+ %224 = OpLoad %6 %183
+ OpStore %223 %224
+ OpStore %225 %222
+ %226 = OpFunctionCall %2 %18 %223 %225
+ %227 = OpLoad %6 %183
+ %228 = OpIAdd %6 %227 %27
+ OpStore %183 %228
+ %230 = OpLoad %6 %183
+ OpStore %229 %230
+ OpStore %231 %30
+ %232 = OpFunctionCall %2 %18 %229 %231
+ %233 = OpLoad %6 %183
+ %234 = OpIAdd %6 %233 %27
+ OpStore %183 %234
+ %237 = OpLoad %6 %183
+ OpStore %236 %237
+ OpStore %238 %235
+ %239 = OpFunctionCall %2 %18 %236 %238
+ %240 = OpLoad %6 %183
+ %241 = OpIAdd %6 %240 %27
+ OpStore %183 %241
+ %244 = OpLoad %6 %183
+ OpStore %243 %244
+ OpStore %245 %242
+ %246 = OpFunctionCall %2 %18 %243 %245
+ %247 = OpLoad %6 %183
+ %248 = OpIAdd %6 %247 %27
+ OpStore %183 %248
+ %251 = OpLoad %6 %183
+ OpStore %250 %251
+ OpStore %252 %249
+ %253 = OpFunctionCall %2 %18 %250 %252
+ OpStore %254 %24
+ OpStore %255 %24
+ OpBranch %256
+ %256 = OpLabel
+ OpLoopMerge %258 %259 None
+ OpBranch %260
+ %260 = OpLabel
+ %261 = OpLoad %6 %255
+ %263 = OpSLessThan %40 %261 %262
+ OpBranchConditional %263 %257 %258
+ %257 = OpLabel
+ %266 = OpLoad %6 %255
+ OpStore %265 %266
+ %267 = OpFunctionCall %6 %22 %265
+ OpStore %264 %267
+ %268 = OpLoad %6 %255
+ OpSelectionMerge %271 None
+ OpSwitch %268 %270 9 %269 5 %269 12 %269 15 %269 7 %269 8 %269 2 %269 6 %269 17 %269 13 %269
+ %270 = OpLabel
+ %280 = OpLoad %6 %264
+ %281 = OpIEqual %40 %280 %28
+ OpSelectionMerge %283 None
+ OpBranchConditional %281 %282 %283
+ %282 = OpLabel
+ %284 = OpLoad %6 %254
+ %285 = OpIAdd %6 %284 %27
+ OpStore %254 %285
+ OpBranch %283
+ %283 = OpLabel
+ OpBranch %271
+ %269 = OpLabel
+ %272 = OpLoad %6 %264
+ %273 = OpLoad %6 %255
+ %274 = OpIEqual %40 %272 %273
+ OpSelectionMerge %276 None
+ OpBranchConditional %274 %275 %276
+ %275 = OpLabel
+ %277 = OpLoad %6 %254
+ %278 = OpIAdd %6 %277 %27
+ OpStore %254 %278
+ OpBranch %276
+ %276 = OpLabel
+ OpBranch %271
+ %271 = OpLabel
+ OpBranch %259
+ %259 = OpLabel
+ %288 = OpLoad %6 %255
+ %289 = OpIAdd %6 %288 %27
+ OpStore %255 %289
+ OpBranch %256
+ %258 = OpLabel
+ %290 = OpLoad %6 %254
+ %291 = OpIEqual %40 %290 %262
+ OpSelectionMerge %293 None
+ OpBranchConditional %291 %292 %300
+ %292 = OpLabel
+ OpStore %296 %299
+ OpBranch %293
+ %300 = OpLabel
+ OpStore %296 %301
+ OpBranch %293
+ %293 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %13 = OpFunction %2 None %10
+ %11 = OpFunctionParameter %8
+ %12 = OpFunctionParameter %9
+ %14 = OpLabel
+ %25 = OpLoad %6 %12
+ %26 = OpAccessChain %9 %11 %24
+ OpStore %26 %25
+ %29 = OpAccessChain %9 %11 %27
+ OpStore %29 %28
+ %31 = OpAccessChain %9 %11 %30
+ OpStore %31 %28
+ OpReturn
+ OpFunctionEnd
+ %18 = OpFunction %2 None %15
+ %16 = OpFunctionParameter %9
+ %17 = OpFunctionParameter %9
+ %19 = OpLabel
+ %32 = OpVariable %9 Function
+ %80 = OpVariable %8 Function
+ %84 = OpVariable %9 Function
+ %108 = OpVariable %9 Function
+ %126 = OpVariable %8 Function
+ %129 = OpVariable %9 Function
+ OpStore %32 %24
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %6 %32
+ %39 = OpLoad %6 %16
+ %41 = OpSLessThanEqual %40 %38 %39
+ OpBranchConditional %41 %34 %35
+ %34 = OpLabel
+ %42 = OpLoad %6 %17
+ %48 = OpLoad %6 %32
+ %50 = OpAccessChain %49 %47 %48 %24
+ %51 = OpLoad %6 %50
+ %52 = OpSLessThanEqual %40 %42 %51
+ OpSelectionMerge %54 None
+ OpBranchConditional %52 %53 %102
+ %53 = OpLabel
+ %55 = OpLoad %6 %32
+ %56 = OpAccessChain %49 %47 %55 %27
+ %57 = OpLoad %6 %56
+ %58 = OpIEqual %40 %57 %28
+ OpSelectionMerge %60 None
+ OpBranchConditional %58 %59 %97
+ %59 = OpLabel
+ %61 = OpLoad %6 %32
+ %62 = OpLoad %6 %16
+ %63 = OpAccessChain %49 %47 %61 %27
+ OpStore %63 %62
+ %71 = OpAccessChain %70 %68 %24 %69
+ %72 = OpLoad %64 %71
+ %74 = OpAccessChain %70 %68 %24 %73
+ %75 = OpLoad %64 %74
+ %76 = OpFOrdLessThan %40 %72 %75
+ OpSelectionMerge %78 None
+ OpBranchConditional %76 %77 %78
+ %77 = OpLabel
+ %79 = OpLoad %6 %16
+ %82 = OpAccessChain %81 %47 %79
+ %83 = OpLoad %7 %82
+ OpStore %80 %83
+ %85 = OpLoad %6 %17
+ OpStore %84 %85
+ %86 = OpFunctionCall %2 %13 %80 %84
+ %87 = OpLoad %7 %80
+ %88 = OpAccessChain %81 %47 %79
+ OpStore %88 %87
+ OpBranch %78
+ %78 = OpLabel
+ %89 = OpAccessChain %70 %68 %24 %69
+ %90 = OpLoad %64 %89
+ %91 = OpAccessChain %70 %68 %24 %73
+ %92 = OpLoad %64 %91
+ %93 = OpFOrdLessThan %40 %90 %92
+ OpSelectionMerge %95 None
+ OpBranchConditional %93 %94 %95
+ %94 = OpLabel
+ OpReturn
+ %95 = OpLabel
+ OpBranch %60
+ %97 = OpLabel
+ %98 = OpLoad %6 %32
+ %99 = OpAccessChain %49 %47 %98 %27
+ %100 = OpLoad %6 %99
+ OpStore %32 %100
+ OpBranch %36
+ %60 = OpLabel
+ OpBranch %54
+ %102 = OpLabel
+ %103 = OpAccessChain %70 %68 %24 %69
+ %104 = OpLoad %64 %103
+ %105 = OpAccessChain %70 %68 %24 %73
+ %106 = OpLoad %64 %105
+ %107 = OpFOrdLessThan %40 %104 %106
+ OpSelectionMerge %110 None
+ OpBranchConditional %107 %109 %114
+ %109 = OpLabel
+ %111 = OpLoad %6 %32
+ %112 = OpAccessChain %49 %47 %111 %30
+ %113 = OpLoad %6 %112
+ OpStore %108 %113
+ OpBranch %110
+ %114 = OpLabel
+ %115 = OpLoad %6 %32
+ %116 = OpAccessChain %49 %47 %115 %30
+ %117 = OpLoad %6 %116
+ OpStore %108 %117
+ OpBranch %110
+ %110 = OpLabel
+ %118 = OpLoad %6 %108
+ %119 = OpIEqual %40 %118 %28
+ OpSelectionMerge %121 None
+ OpBranchConditional %119 %120 %135
+ %120 = OpLabel
+ %122 = OpLoad %6 %32
+ %123 = OpLoad %6 %16
+ %124 = OpAccessChain %49 %47 %122 %30
+ OpStore %124 %123
+ %125 = OpLoad %6 %16
+ %127 = OpAccessChain %81 %47 %125
+ %128 = OpLoad %7 %127
+ OpStore %126 %128
+ %130 = OpLoad %6 %17
+ OpStore %129 %130
+ %131 = OpFunctionCall %2 %13 %126 %129
+ %132 = OpLoad %7 %126
+ %133 = OpAccessChain %81 %47 %125
+ OpStore %133 %132
+ OpReturn
+ %135 = OpLabel
+ %136 = OpLoad %6 %32
+ %137 = OpAccessChain %49 %47 %136 %30
+ %138 = OpLoad %6 %137
+ OpStore %32 %138
+ OpBranch %36
+ %121 = OpLabel
+ OpUnreachable
+ %54 = OpLabel
+ %140 = OpAccessChain %70 %68 %24 %69
+ %141 = OpLoad %64 %140
+ %142 = OpAccessChain %70 %68 %24 %73
+ %143 = OpLoad %64 %142
+ %144 = OpFOrdGreaterThan %40 %141 %143
+ OpSelectionMerge %146 None
+ OpBranchConditional %144 %145 %146
+ %145 = OpLabel
+ OpReturn
+ %146 = OpLabel
+ OpBranch %36
+ %36 = OpLabel
+ OpBranch %33
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %22 = OpFunction %6 None %20
+ %21 = OpFunctionParameter %9
+ %23 = OpLabel
+ %148 = OpVariable %9 Function
+ %156 = OpVariable %8 Function
+ %172 = OpVariable %9 Function
+ OpStore %148 %24
+ OpBranch %149
+ %149 = OpLabel
+ OpLoopMerge %151 %152 None
+ OpBranch %153
+ %153 = OpLabel
+ %154 = OpLoad %6 %148
+ %155 = OpINotEqual %40 %154 %28
+ OpBranchConditional %155 %150 %151
+ %150 = OpLabel
+ %157 = OpLoad %6 %148
+ %158 = OpAccessChain %81 %47 %157
+ %159 = OpLoad %7 %158
+ OpStore %156 %159
+ %160 = OpAccessChain %9 %156 %24
+ %161 = OpLoad %6 %160
+ %162 = OpLoad %6 %21
+ %163 = OpIEqual %40 %161 %162
+ OpSelectionMerge %165 None
+ OpBranchConditional %163 %164 %165
+ %164 = OpLabel
+ %166 = OpLoad %6 %21
+ OpReturnValue %166
+ %165 = OpLabel
+ %168 = OpLoad %6 %21
+ %169 = OpAccessChain %9 %156 %24
+ %170 = OpLoad %6 %169
+ %171 = OpSGreaterThan %40 %168 %170
+ OpSelectionMerge %174 None
+ OpBranchConditional %171 %173 %177
+ %173 = OpLabel
+ %175 = OpAccessChain %9 %156 %30
+ %176 = OpLoad %6 %175
+ OpStore %172 %176
+ OpBranch %174
+ %177 = OpLabel
+ %178 = OpAccessChain %9 %156 %27
+ %179 = OpLoad %6 %178
+ OpStore %172 %179
+ OpBranch %174
+ %174 = OpLabel
+ %180 = OpLoad %6 %172
+ OpStore %148 %180
+ OpBranch %152
+ %152 = OpLabel
+ OpBranch %149
+ %151 = OpLabel
+ OpReturnValue %28
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max.amber
new file mode 100644
index 0000000..be3de84
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max.amber
@@ -0,0 +1,551 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with push constant and nested min max
+
+# The test passes because both shaders render the same image.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0 {
+# vec2 resolution;
+# };
+# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0));
+#
+# int collatz(int v)
+# {
+# int count = 0;
+# while(v > 1)
+# {
+# if((v & 1) == 1)
+# {
+# v = 3 * v + 1;
+# }
+# else
+# {
+# v /= 2;
+# }
+# count ++;
+# }
+# return count;
+# }
+# void main()
+# {
+# vec2 lin = gl_FragCoord.xy / resolution;
+# lin = floor(lin * 8.0);
+# int v = int(lin.x) * 8 + int(lin.y);
+# _GLF_color = pal[collatz(v) % 16];
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 108
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %47 %76
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %10 "collatz(i1;"
+ OpName %9 "v"
+ OpName %12 "count"
+ OpName %44 "lin"
+ OpName %47 "gl_FragCoord"
+ OpName %50 "buf0"
+ OpMemberName %50 0 "resolution"
+ OpName %52 ""
+ OpName %61 "v"
+ OpName %76 "_GLF_color"
+ OpName %98 "param"
+ OpName %104 "indexable"
+ OpDecorate %47 BuiltIn FragCoord
+ OpMemberDecorate %50 0 Offset 0
+ OpDecorate %50 Block
+ OpDecorate %52 DescriptorSet 0
+ OpDecorate %52 Binding 0
+ OpDecorate %76 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %6 %7
+ %13 = OpConstant %6 0
+ %20 = OpConstant %6 1
+ %21 = OpTypeBool
+ %28 = OpConstant %6 3
+ %33 = OpConstant %6 2
+ %41 = OpTypeFloat 32
+ %42 = OpTypeVector %41 2
+ %43 = OpTypePointer Function %42
+ %45 = OpTypeVector %41 4
+ %46 = OpTypePointer Input %45
+ %47 = OpVariable %46 Input
+ %50 = OpTypeStruct %42
+ %51 = OpTypePointer Uniform %50
+ %52 = OpVariable %51 Uniform
+ %53 = OpTypePointer Uniform %42
+ %58 = OpConstant %41 8
+ %62 = OpTypeInt 32 0
+ %63 = OpConstant %62 0
+ %64 = OpTypePointer Function %41
+ %68 = OpConstant %6 8
+ %70 = OpConstant %62 1
+ %75 = OpTypePointer Output %45
+ %76 = OpVariable %75 Output
+ %77 = OpConstant %62 16
+ %78 = OpTypeArray %45 %77
+ %79 = OpConstant %41 0
+ %80 = OpConstant %41 1
+ %81 = OpConstantComposite %45 %79 %79 %79 %80
+ %82 = OpConstant %41 0.5
+ %83 = OpConstantComposite %45 %82 %79 %79 %80
+ %84 = OpConstantComposite %45 %79 %82 %79 %80
+ %85 = OpConstantComposite %45 %82 %82 %79 %80
+ %86 = OpConstantComposite %45 %79 %79 %82 %80
+ %87 = OpConstantComposite %45 %82 %79 %82 %80
+ %88 = OpConstantComposite %45 %79 %82 %82 %80
+ %89 = OpConstantComposite %45 %82 %82 %82 %80
+ %90 = OpConstantComposite %45 %80 %79 %79 %80
+ %91 = OpConstantComposite %45 %79 %80 %79 %80
+ %92 = OpConstantComposite %45 %80 %80 %79 %80
+ %93 = OpConstantComposite %45 %79 %79 %80 %80
+ %94 = OpConstantComposite %45 %80 %79 %80 %80
+ %95 = OpConstantComposite %45 %79 %80 %80 %80
+ %96 = OpConstantComposite %45 %80 %80 %80 %80
+ %97 = OpConstantComposite %78 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+ %101 = OpConstant %6 16
+ %103 = OpTypePointer Function %78
+ %105 = OpTypePointer Function %45
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %44 = OpVariable %43 Function
+ %61 = OpVariable %7 Function
+ %98 = OpVariable %7 Function
+ %104 = OpVariable %103 Function
+ %48 = OpLoad %45 %47
+ %49 = OpVectorShuffle %42 %48 %48 0 1
+ %54 = OpAccessChain %53 %52 %13
+ %55 = OpLoad %42 %54
+ %56 = OpFDiv %42 %49 %55
+ OpStore %44 %56
+ %57 = OpLoad %42 %44
+ %59 = OpVectorTimesScalar %42 %57 %58
+ %60 = OpExtInst %42 %1 Floor %59
+ OpStore %44 %60
+ %65 = OpAccessChain %64 %44 %63
+ %66 = OpLoad %41 %65
+ %67 = OpConvertFToS %6 %66
+ %69 = OpIMul %6 %67 %68
+ %71 = OpAccessChain %64 %44 %70
+ %72 = OpLoad %41 %71
+ %73 = OpConvertFToS %6 %72
+ %74 = OpIAdd %6 %69 %73
+ OpStore %61 %74
+ %99 = OpLoad %6 %61
+ OpStore %98 %99
+ %100 = OpFunctionCall %6 %10 %98
+ %102 = OpSMod %6 %100 %101
+ OpStore %104 %97
+ %106 = OpAccessChain %105 %104 %102
+ %107 = OpLoad %45 %106
+ OpStore %76 %107
+ OpReturn
+ OpFunctionEnd
+ %10 = OpFunction %6 None %8
+ %9 = OpFunctionParameter %7
+ %11 = OpLabel
+ %12 = OpVariable %7 Function
+ OpStore %12 %13
+ OpBranch %14
+ %14 = OpLabel
+ OpLoopMerge %16 %17 None
+ OpBranch %18
+ %18 = OpLabel
+ %19 = OpLoad %6 %9
+ %22 = OpSGreaterThan %21 %19 %20
+ OpBranchConditional %22 %15 %16
+ %15 = OpLabel
+ %23 = OpLoad %6 %9
+ %24 = OpBitwiseAnd %6 %23 %20
+ %25 = OpIEqual %21 %24 %20
+ OpSelectionMerge %27 None
+ OpBranchConditional %25 %26 %32
+ %26 = OpLabel
+ %29 = OpLoad %6 %9
+ %30 = OpIMul %6 %28 %29
+ %31 = OpIAdd %6 %30 %20
+ OpStore %9 %31
+ OpBranch %27
+ %32 = OpLabel
+ %34 = OpLoad %6 %9
+ %35 = OpSDiv %6 %34 %33
+ OpStore %9 %35
+ OpBranch %27
+ %27 = OpLabel
+ %36 = OpLoad %6 %12
+ %37 = OpIAdd %6 %36 %20
+ OpStore %12 %37
+ OpBranch %17
+ %17 = OpLabel
+ OpBranch %14
+ %16 = OpLabel
+ %38 = OpLoad %6 %12
+ OpReturnValue %38
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(push_constant) uniform buf_push {
+# vec2 resolution;
+# };
+# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0));
+#
+# int collatz(int v)
+# {
+# int count = 0;
+# while(v > 1)
+# {
+# if((v & 1) == 1)
+# {
+# v = 3 * v + 1;
+# }
+# else
+# {
+# v /= 2;
+# }
+# count ++;
+# }
+# return count;
+# }
+# void main()
+# {
+# // vec2 max_c == (gl_FragCoord.xy / resolution).
+# vec2 max_c = max( // This should return the same result.
+# gl_FragCoord.xy / resolution,
+# gl_FragCoord.xy / (vec2(resolution.x, resolution.y))
+# );
+# // vec2 max_a == (gl_FragCoord.xy / resolution)
+# vec2 max_a = max(
+# // gl_FragCoord.y < 0 is always false.
+# // mix operation returns vec2(0.0 , 0.0).
+# // cosine of 0 is 1.
+# // anything divided by 1 stays the same.
+# max_c / cos(mix(vec2(1.0, 0.0), vec2(0.0, 218.851), bvec2(true, (gl_FragCoord.y < 0.0)))),
+# gl_FragCoord.xy / resolution
+# );
+# // vec2 max_d == vec2(1.0, 1.0)
+# vec2 max_d = max(
+# // Same cosine fucntion as in max_a.
+# 1.0 / cos(mix(vec2(1.0, 0.0), vec2(0.0, 218.851), bvec2(true, (gl_FragCoord.y < 0.0)))),
+# vec2(1.0, 1.0)
+# );
+# // vec2 max_b == vec2(1.0, 1.0)
+# vec2 max_b = max(
+# vec2(1.0, 1.0),
+# max_d // max_d == vec2(1.0, 1.0)
+# );
+# // vec2 lin == (gl_FragCoord.xy / resolution)
+# vec2 lin = min(
+# max_a, // max_a == gl_FragCoord.xy / resolution
+# max_b // max_b == vec2(1.0, 1.0)
+# );
+# lin = floor(lin * 8.0);
+# int v = int(lin.x) * 8 + int(lin.y);
+# _GLF_color = pal[collatz(v) % 16];
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 157
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %47 %127
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %10 "collatz(i1;"
+ OpName %9 "v"
+ OpName %12 "count"
+ OpName %44 "max_c"
+ OpName %47 "gl_FragCoord"
+ OpName %50 "buf_push"
+ OpMemberName %50 0 "resolution"
+ OpName %52 ""
+ OpName %70 "max_a"
+ OpName %93 "max_d"
+ OpName %104 "max_b"
+ OpName %107 "lin"
+ OpName %115 "v"
+ OpName %127 "_GLF_color"
+ OpName %147 "param"
+ OpName %153 "indexable"
+ OpDecorate %47 BuiltIn FragCoord
+ OpMemberDecorate %50 0 Offset 0
+ OpDecorate %50 Block
+ OpDecorate %127 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %6 %7
+ %13 = OpConstant %6 0
+ %20 = OpConstant %6 1
+ %21 = OpTypeBool
+ %28 = OpConstant %6 3
+ %33 = OpConstant %6 2
+ %41 = OpTypeFloat 32
+ %42 = OpTypeVector %41 2
+ %43 = OpTypePointer Function %42
+ %45 = OpTypeVector %41 4
+ %46 = OpTypePointer Input %45
+ %47 = OpVariable %46 Input
+ %50 = OpTypeStruct %42
+ %51 = OpTypePointer PushConstant %50
+ %52 = OpVariable %51 PushConstant
+ %53 = OpTypePointer PushConstant %42
+ %59 = OpTypeInt 32 0
+ %60 = OpConstant %59 0
+ %61 = OpTypePointer PushConstant %41
+ %64 = OpConstant %59 1
+ %72 = OpConstant %41 1
+ %73 = OpConstant %41 0
+ %74 = OpConstantComposite %42 %72 %73
+ %75 = OpConstant %41 218.850998
+ %76 = OpConstantComposite %42 %73 %75
+ %77 = OpConstantTrue %21
+ %78 = OpTypePointer Input %41
+ %82 = OpTypeVector %21 2
+ %102 = OpConstantComposite %42 %72 %72
+ %112 = OpConstant %41 8
+ %116 = OpTypePointer Function %41
+ %120 = OpConstant %6 8
+ %126 = OpTypePointer Output %45
+ %127 = OpVariable %126 Output
+ %128 = OpConstant %59 16
+ %129 = OpTypeArray %45 %128
+ %130 = OpConstantComposite %45 %73 %73 %73 %72
+ %131 = OpConstant %41 0.5
+ %132 = OpConstantComposite %45 %131 %73 %73 %72
+ %133 = OpConstantComposite %45 %73 %131 %73 %72
+ %134 = OpConstantComposite %45 %131 %131 %73 %72
+ %135 = OpConstantComposite %45 %73 %73 %131 %72
+ %136 = OpConstantComposite %45 %131 %73 %131 %72
+ %137 = OpConstantComposite %45 %73 %131 %131 %72
+ %138 = OpConstantComposite %45 %131 %131 %131 %72
+ %139 = OpConstantComposite %45 %72 %73 %73 %72
+ %140 = OpConstantComposite %45 %73 %72 %73 %72
+ %141 = OpConstantComposite %45 %72 %72 %73 %72
+ %142 = OpConstantComposite %45 %73 %73 %72 %72
+ %143 = OpConstantComposite %45 %72 %73 %72 %72
+ %144 = OpConstantComposite %45 %73 %72 %72 %72
+ %145 = OpConstantComposite %45 %72 %72 %72 %72
+ %146 = OpConstantComposite %129 %130 %132 %133 %134 %135 %136 %137 %138 %130 %139 %140 %141 %142 %143 %144 %145
+ %150 = OpConstant %6 16
+ %152 = OpTypePointer Function %129
+ %154 = OpTypePointer Function %45
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %44 = OpVariable %43 Function
+ %70 = OpVariable %43 Function
+ %93 = OpVariable %43 Function
+ %104 = OpVariable %43 Function
+ %107 = OpVariable %43 Function
+ %115 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ %153 = OpVariable %152 Function
+ %48 = OpLoad %45 %47
+ %49 = OpVectorShuffle %42 %48 %48 0 1
+ %54 = OpAccessChain %53 %52 %13
+ %55 = OpLoad %42 %54
+ %56 = OpFDiv %42 %49 %55
+ %57 = OpLoad %45 %47
+ %58 = OpVectorShuffle %42 %57 %57 0 1
+ %62 = OpAccessChain %61 %52 %13 %60
+ %63 = OpLoad %41 %62
+ %65 = OpAccessChain %61 %52 %13 %64
+ %66 = OpLoad %41 %65
+ %67 = OpCompositeConstruct %42 %63 %66
+ %68 = OpFDiv %42 %58 %67
+ %69 = OpExtInst %42 %1 FMax %56 %68
+ OpStore %44 %69
+ %71 = OpLoad %42 %44
+ %79 = OpAccessChain %78 %47 %64
+ %80 = OpLoad %41 %79
+ %81 = OpFOrdLessThan %21 %80 %73
+ %83 = OpCompositeConstruct %82 %77 %81
+ %84 = OpSelect %42 %83 %76 %74
+ %85 = OpExtInst %42 %1 Cos %84
+ %86 = OpFDiv %42 %71 %85
+ %87 = OpLoad %45 %47
+ %88 = OpVectorShuffle %42 %87 %87 0 1
+ %89 = OpAccessChain %53 %52 %13
+ %90 = OpLoad %42 %89
+ %91 = OpFDiv %42 %88 %90
+ %92 = OpExtInst %42 %1 FMax %86 %91
+ OpStore %70 %92
+ %94 = OpAccessChain %78 %47 %64
+ %95 = OpLoad %41 %94
+ %96 = OpFOrdLessThan %21 %95 %73
+ %97 = OpCompositeConstruct %82 %77 %96
+ %98 = OpSelect %42 %97 %76 %74
+ %99 = OpExtInst %42 %1 Cos %98
+ %100 = OpCompositeConstruct %42 %72 %72
+ %101 = OpFDiv %42 %100 %99
+ %103 = OpExtInst %42 %1 FMax %101 %102
+ OpStore %93 %103
+ %105 = OpLoad %42 %93
+ %106 = OpExtInst %42 %1 FMax %102 %105
+ OpStore %104 %106
+ %108 = OpLoad %42 %70
+ %109 = OpLoad %42 %104
+ %110 = OpExtInst %42 %1 FMin %108 %109
+ OpStore %107 %110
+ %111 = OpLoad %42 %107
+ %113 = OpVectorTimesScalar %42 %111 %112
+ %114 = OpExtInst %42 %1 Floor %113
+ OpStore %107 %114
+ %117 = OpAccessChain %116 %107 %60
+ %118 = OpLoad %41 %117
+ %119 = OpConvertFToS %6 %118
+ %121 = OpIMul %6 %119 %120
+ %122 = OpAccessChain %116 %107 %64
+ %123 = OpLoad %41 %122
+ %124 = OpConvertFToS %6 %123
+ %125 = OpIAdd %6 %121 %124
+ OpStore %115 %125
+ %148 = OpLoad %6 %115
+ OpStore %147 %148
+ %149 = OpFunctionCall %6 %10 %147
+ %151 = OpSMod %6 %149 %150
+ OpStore %153 %146
+ %155 = OpAccessChain %154 %153 %151
+ %156 = OpLoad %45 %155
+ OpStore %127 %156
+ OpReturn
+ OpFunctionEnd
+ %10 = OpFunction %6 None %8
+ %9 = OpFunctionParameter %7
+ %11 = OpLabel
+ %12 = OpVariable %7 Function
+ OpStore %12 %13
+ OpBranch %14
+ %14 = OpLabel
+ OpLoopMerge %16 %17 None
+ OpBranch %18
+ %18 = OpLabel
+ %19 = OpLoad %6 %9
+ %22 = OpSGreaterThan %21 %19 %20
+ OpBranchConditional %22 %15 %16
+ %15 = OpLabel
+ %23 = OpLoad %6 %9
+ %24 = OpBitwiseAnd %6 %23 %20
+ %25 = OpIEqual %21 %24 %20
+ OpSelectionMerge %27 None
+ OpBranchConditional %25 %26 %32
+ %26 = OpLabel
+ %29 = OpLoad %6 %9
+ %30 = OpIMul %6 %28 %29
+ %31 = OpIAdd %6 %30 %20
+ OpStore %9 %31
+ OpBranch %27
+ %32 = OpLabel
+ %34 = OpLoad %6 %9
+ %35 = OpSDiv %6 %34 %33
+ OpStore %9 %35
+ OpBranch %27
+ %27 = OpLabel
+ %36 = OpLoad %6 %12
+ %37 = OpIAdd %6 %36 %20
+ OpStore %12 %37
+ OpBranch %17
+ %17 = OpLabel
+ OpBranch %14
+ %16 = OpLabel
+ %38 = OpLoad %6 %12
+ OpReturnValue %38
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS push_constant
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard.amber
new file mode 100644
index 0000000..3152da8
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard.amber
@@ -0,0 +1,700 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: A fragment shader with two always false discards
+
+# The test passes because both shaders render the same image.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: 717e7877cac15d393fd3bb1bd872679de8b59add
+
+
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 resolution;
+# };
+# float compute_value(float limit, float thirty_two)
+# {
+# float result = -0.5;
+# for (int i = 1; i < 800; i++)
+# {
+# if ((i % 32) == 0)
+# {
+# result += 0.4;
+# }
+# else
+# {
+# if (mod(float(i), round(thirty_two)) <= 0.01)
+# {
+# result += 100.0;
+# }
+# }
+# if (float(i) >= limit)
+# {
+# return result;
+# }
+# }
+# return result;
+# }
+# void main()
+# {
+# vec3 c = vec3(7.0, 8.0, 9.0);
+# float thirty_two = round(resolution.x / 8.0);
+# c.x = compute_value(gl_FragCoord.x, thirty_two);
+# c.y = compute_value(gl_FragCoord.y, thirty_two);
+# c.z = c.x + c.y;
+# for (int i = 0; i < 3; i++)
+# {
+# if (c[i] >= 1.0)
+# {
+# c[i] = c[i] * c[i];
+# }
+# }
+# _GLF_color = vec4(normalize(abs(c)), 1.0);
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 290
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %85 %137
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %66 "c"
+ OpName %73 "buf0"
+ OpMemberName %73 0 "resolution"
+ OpName %75 ""
+ OpName %85 "gl_FragCoord"
+ OpName %137 "_GLF_color"
+ OpMemberDecorate %73 0 Offset 0
+ OpDecorate %73 Block
+ OpDecorate %75 DescriptorSet 0
+ OpDecorate %75 Binding 0
+ OpDecorate %85 BuiltIn FragCoord
+ OpDecorate %137 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %14 = OpConstant %6 -0.5
+ %15 = OpTypeInt 32 1
+ %18 = OpConstant %15 1
+ %25 = OpConstant %15 800
+ %26 = OpTypeBool
+ %29 = OpConstant %15 32
+ %31 = OpConstant %15 0
+ %35 = OpConstant %6 0.400000006
+ %44 = OpConstant %6 0.00999999978
+ %48 = OpConstant %6 100
+ %64 = OpTypeVector %6 3
+ %65 = OpTypePointer Function %64
+ %67 = OpConstant %6 7
+ %68 = OpConstant %6 8
+ %69 = OpConstant %6 9
+ %70 = OpConstantComposite %64 %67 %68 %69
+ %72 = OpTypeVector %6 2
+ %73 = OpTypeStruct %72
+ %74 = OpTypePointer Uniform %73
+ %75 = OpVariable %74 Uniform
+ %76 = OpTypeInt 32 0
+ %77 = OpConstant %76 0
+ %78 = OpTypePointer Uniform %6
+ %83 = OpTypeVector %6 4
+ %84 = OpTypePointer Input %83
+ %85 = OpVariable %84 Input
+ %87 = OpTypePointer Input %6
+ %95 = OpConstant %76 1
+ %107 = OpConstant %76 2
+ %116 = OpConstant %15 3
+ %121 = OpConstant %6 1
+ %136 = OpTypePointer Output %83
+ %137 = OpVariable %136 Output
+ %149 = OpConstantFalse %26
+ %152 = OpConstantTrue %26
+ %261 = OpUndef %6
+ %289 = OpConstant %6 0.125
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %66 = OpVariable %65 Function
+ OpStore %66 %70
+ %79 = OpAccessChain %78 %75 %31 %77
+ %80 = OpLoad %6 %79
+ %81 = OpFMul %6 %80 %289
+ %82 = OpExtInst %6 %1 Round %81
+ %88 = OpAccessChain %87 %85 %77
+ %89 = OpLoad %6 %88
+ OpSelectionMerge %199 None
+ OpSwitch %77 %161
+ %161 = OpLabel
+ OpBranch %162
+ %162 = OpLabel
+ %248 = OpPhi %6 %14 %161 %251 %192
+ %247 = OpPhi %15 %18 %161 %194 %192
+ %165 = OpSLessThan %26 %247 %25
+ OpLoopMerge %195 %192 None
+ OpBranchConditional %165 %166 %195
+ %166 = OpLabel
+ %168 = OpSMod %15 %247 %29
+ %169 = OpIEqual %26 %168 %31
+ OpSelectionMerge %184 None
+ OpBranchConditional %169 %170 %173
+ %170 = OpLabel
+ %172 = OpFAdd %6 %248 %35
+ OpBranch %184
+ %173 = OpLabel
+ %175 = OpConvertSToF %6 %247
+ %177 = OpExtInst %6 %1 Round %82
+ %178 = OpFMod %6 %175 %177
+ %179 = OpFOrdLessThanEqual %26 %178 %44
+ OpSelectionMerge %183 None
+ OpBranchConditional %179 %180 %183
+ %180 = OpLabel
+ %182 = OpFAdd %6 %248 %48
+ OpBranch %183
+ %183 = OpLabel
+ %252 = OpPhi %6 %248 %173 %182 %180
+ OpBranch %184
+ %184 = OpLabel
+ %251 = OpPhi %6 %172 %170 %252 %183
+ %186 = OpConvertSToF %6 %247
+ %188 = OpFOrdGreaterThanEqual %26 %186 %89
+ OpSelectionMerge %191 None
+ OpBranchConditional %188 %189 %191
+ %189 = OpLabel
+ OpBranch %195
+ %191 = OpLabel
+ OpBranch %192
+ %192 = OpLabel
+ %194 = OpIAdd %15 %247 %18
+ OpBranch %162
+ %195 = OpLabel
+ %259 = OpPhi %6 %261 %162 %251 %189
+ %257 = OpPhi %6 %248 %162 %251 %189
+ %253 = OpPhi %26 %149 %162 %152 %189
+ OpSelectionMerge %197 None
+ OpBranchConditional %253 %199 %197
+ %197 = OpLabel
+ OpBranch %199
+ %199 = OpLabel
+ %258 = OpPhi %6 %259 %195 %257 %197
+ %93 = OpAccessChain %7 %66 %77
+ OpStore %93 %258
+ %96 = OpAccessChain %87 %85 %95
+ %97 = OpLoad %6 %96
+ OpSelectionMerge %245 None
+ OpSwitch %77 %207
+ %207 = OpLabel
+ OpBranch %208
+ %208 = OpLabel
+ %265 = OpPhi %6 %14 %207 %268 %238
+ %264 = OpPhi %15 %18 %207 %240 %238
+ %211 = OpSLessThan %26 %264 %25
+ OpLoopMerge %241 %238 None
+ OpBranchConditional %211 %212 %241
+ %212 = OpLabel
+ %214 = OpSMod %15 %264 %29
+ %215 = OpIEqual %26 %214 %31
+ OpSelectionMerge %230 None
+ OpBranchConditional %215 %216 %219
+ %216 = OpLabel
+ %218 = OpFAdd %6 %265 %35
+ OpBranch %230
+ %219 = OpLabel
+ %221 = OpConvertSToF %6 %264
+ %223 = OpExtInst %6 %1 Round %82
+ %224 = OpFMod %6 %221 %223
+ %225 = OpFOrdLessThanEqual %26 %224 %44
+ OpSelectionMerge %229 None
+ OpBranchConditional %225 %226 %229
+ %226 = OpLabel
+ %228 = OpFAdd %6 %265 %48
+ OpBranch %229
+ %229 = OpLabel
+ %269 = OpPhi %6 %265 %219 %228 %226
+ OpBranch %230
+ %230 = OpLabel
+ %268 = OpPhi %6 %218 %216 %269 %229
+ %232 = OpConvertSToF %6 %264
+ %234 = OpFOrdGreaterThanEqual %26 %232 %97
+ OpSelectionMerge %237 None
+ OpBranchConditional %234 %235 %237
+ %235 = OpLabel
+ OpBranch %241
+ %237 = OpLabel
+ OpBranch %238
+ %238 = OpLabel
+ %240 = OpIAdd %15 %264 %18
+ OpBranch %208
+ %241 = OpLabel
+ %276 = OpPhi %6 %261 %208 %268 %235
+ %274 = OpPhi %6 %265 %208 %268 %235
+ %270 = OpPhi %26 %149 %208 %152 %235
+ OpSelectionMerge %243 None
+ OpBranchConditional %270 %245 %243
+ %243 = OpLabel
+ OpBranch %245
+ %245 = OpLabel
+ %275 = OpPhi %6 %276 %241 %274 %243
+ %101 = OpAccessChain %7 %66 %95
+ OpStore %101 %275
+ %103 = OpLoad %6 %93
+ %105 = OpLoad %6 %101
+ %106 = OpFAdd %6 %103 %105
+ %108 = OpAccessChain %7 %66 %107
+ OpStore %108 %106
+ OpBranch %110
+ %110 = OpLabel
+ %285 = OpPhi %15 %31 %245 %135 %113
+ %117 = OpSLessThan %26 %285 %116
+ OpLoopMerge %112 %113 None
+ OpBranchConditional %117 %111 %112
+ %111 = OpLabel
+ %119 = OpAccessChain %7 %66 %285
+ %120 = OpLoad %6 %119
+ %122 = OpFOrdGreaterThanEqual %26 %120 %121
+ OpSelectionMerge %124 None
+ OpBranchConditional %122 %123 %124
+ %123 = OpLabel
+ %128 = OpLoad %6 %119
+ %131 = OpLoad %6 %119
+ %132 = OpFMul %6 %128 %131
+ OpStore %119 %132
+ OpBranch %124
+ %124 = OpLabel
+ OpBranch %113
+ %113 = OpLabel
+ %135 = OpIAdd %15 %285 %18
+ OpBranch %110
+ %112 = OpLabel
+ %138 = OpLoad %64 %66
+ %139 = OpExtInst %64 %1 FAbs %138
+ %140 = OpExtInst %64 %1 Normalize %139
+ %141 = OpCompositeExtract %6 %140 0
+ %142 = OpCompositeExtract %6 %140 1
+ %143 = OpCompositeExtract %6 %140 2
+ %144 = OpCompositeConstruct %83 %141 %142 %143 %121
+ OpStore %137 %144
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 resolution;
+# };
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# vec2 injectionSwitch; // x == 0.0, y == 1.0
+# };
+# float compute_value(float limit, float thirty_two)
+# {
+# float result = -0.5;
+# for (int i = 1; i < 800; i++)
+# {
+# if ((i % 32) == 0)
+# {
+# result += 0.4;
+# }
+# else
+# {
+# if (mod(float(i), round(thirty_two)) <= 0.01)
+# {
+# result += 100.0;
+# }
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# discard;
+# }
+# }
+# if (float(i) >= limit)
+# {
+# return result;
+# }
+# }
+# return result;
+# }
+# void main()
+# {
+# vec3 c = vec3(7.0, 8.0, 9.0);
+# float thirty_two = round(resolution.x / 8.0);
+# c.x = compute_value(gl_FragCoord.x, thirty_two);
+# c.y = compute_value(gl_FragCoord.y, thirty_two);
+# c.z = c.x + c.y;
+# for (int i = 0; i < 3; i++)
+# {
+# if (c[i] >= 1.0)
+# {
+# c[i] = c[i] * c[i];
+# // Always false.
+# if ((injectionSwitch.x > injectionSwitch.y))
+# {
+# discard;
+# }
+# }
+# }
+# _GLF_color = vec4(normalize(abs(c)), 1.0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 325
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %97 %156
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %52 "buf1"
+ OpMemberName %52 0 "injectionSwitch"
+ OpName %54 ""
+ OpName %82 "c"
+ OpName %88 "buf0"
+ OpMemberName %88 0 "resolution"
+ OpName %90 ""
+ OpName %97 "gl_FragCoord"
+ OpName %156 "_GLF_color"
+ OpMemberDecorate %52 0 Offset 0
+ OpDecorate %52 Block
+ OpDecorate %54 DescriptorSet 0
+ OpDecorate %54 Binding 1
+ OpMemberDecorate %88 0 Offset 0
+ OpDecorate %88 Block
+ OpDecorate %90 DescriptorSet 0
+ OpDecorate %90 Binding 0
+ OpDecorate %97 BuiltIn FragCoord
+ OpDecorate %156 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypePointer Function %6
+ %14 = OpConstant %6 -0.5
+ %15 = OpTypeInt 32 1
+ %18 = OpConstant %15 1
+ %25 = OpConstant %15 800
+ %26 = OpTypeBool
+ %29 = OpConstant %15 32
+ %31 = OpConstant %15 0
+ %35 = OpConstant %6 0.400000006
+ %44 = OpConstant %6 0.00999999978
+ %48 = OpConstant %6 100
+ %51 = OpTypeVector %6 2
+ %52 = OpTypeStruct %51
+ %53 = OpTypePointer Uniform %52
+ %54 = OpVariable %53 Uniform
+ %55 = OpTypeInt 32 0
+ %56 = OpConstant %55 0
+ %57 = OpTypePointer Uniform %6
+ %60 = OpConstant %55 1
+ %80 = OpTypeVector %6 3
+ %81 = OpTypePointer Function %80
+ %83 = OpConstant %6 7
+ %84 = OpConstant %6 8
+ %85 = OpConstant %6 9
+ %86 = OpConstantComposite %80 %83 %84 %85
+ %88 = OpTypeStruct %51
+ %89 = OpTypePointer Uniform %88
+ %90 = OpVariable %89 Uniform
+ %95 = OpTypeVector %6 4
+ %96 = OpTypePointer Input %95
+ %97 = OpVariable %96 Input
+ %99 = OpTypePointer Input %6
+ %118 = OpConstant %55 2
+ %127 = OpConstant %15 3
+ %132 = OpConstant %6 1
+ %155 = OpTypePointer Output %95
+ %156 = OpVariable %155 Output
+ %168 = OpConstantFalse %26
+ %171 = OpConstantTrue %26
+ %296 = OpUndef %6
+ %324 = OpConstant %6 0.125
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %82 = OpVariable %81 Function
+ OpStore %82 %86
+ %91 = OpAccessChain %57 %90 %31 %56
+ %92 = OpLoad %6 %91
+ %93 = OpFMul %6 %92 %324
+ %94 = OpExtInst %6 %1 Round %93
+ %100 = OpAccessChain %99 %97 %56
+ %101 = OpLoad %6 %100
+ OpSelectionMerge %225 None
+ OpSwitch %56 %180
+ %180 = OpLabel
+ OpBranch %181
+ %181 = OpLabel
+ %283 = OpPhi %6 %14 %180 %286 %218
+ %282 = OpPhi %15 %18 %180 %220 %218
+ %184 = OpSLessThan %26 %282 %25
+ OpLoopMerge %221 %218 None
+ OpBranchConditional %184 %185 %221
+ %185 = OpLabel
+ %187 = OpSMod %15 %282 %29
+ %188 = OpIEqual %26 %187 %31
+ OpSelectionMerge %210 None
+ OpBranchConditional %188 %189 %192
+ %189 = OpLabel
+ %191 = OpFAdd %6 %283 %35
+ OpBranch %210
+ %192 = OpLabel
+ %194 = OpConvertSToF %6 %282
+ %196 = OpExtInst %6 %1 Round %94
+ %197 = OpFMod %6 %194 %196
+ %198 = OpFOrdLessThanEqual %26 %197 %44
+ OpSelectionMerge %202 None
+ OpBranchConditional %198 %199 %202
+ %199 = OpLabel
+ %201 = OpFAdd %6 %283 %48
+ OpBranch %202
+ %202 = OpLabel
+ %287 = OpPhi %6 %283 %192 %201 %199
+ %203 = OpAccessChain %57 %54 %31 %56
+ %204 = OpLoad %6 %203
+ %205 = OpAccessChain %57 %54 %31 %60
+ %206 = OpLoad %6 %205
+ %207 = OpFOrdGreaterThan %26 %204 %206
+ OpSelectionMerge %209 None
+ OpBranchConditional %207 %208 %209
+ %208 = OpLabel
+ OpKill
+ %209 = OpLabel
+ OpBranch %210
+ %210 = OpLabel
+ %286 = OpPhi %6 %191 %189 %287 %209
+ %212 = OpConvertSToF %6 %282
+ %214 = OpFOrdGreaterThanEqual %26 %212 %101
+ OpSelectionMerge %217 None
+ OpBranchConditional %214 %215 %217
+ %215 = OpLabel
+ OpBranch %221
+ %217 = OpLabel
+ OpBranch %218
+ %218 = OpLabel
+ %220 = OpIAdd %15 %282 %18
+ OpBranch %181
+ %221 = OpLabel
+ %294 = OpPhi %6 %296 %181 %286 %215
+ %292 = OpPhi %6 %283 %181 %286 %215
+ %288 = OpPhi %26 %168 %181 %171 %215
+ OpSelectionMerge %223 None
+ OpBranchConditional %288 %225 %223
+ %223 = OpLabel
+ OpBranch %225
+ %225 = OpLabel
+ %293 = OpPhi %6 %294 %221 %292 %223
+ %105 = OpAccessChain %7 %82 %56
+ OpStore %105 %293
+ %107 = OpAccessChain %99 %97 %60
+ %108 = OpLoad %6 %107
+ OpSelectionMerge %279 None
+ OpSwitch %56 %234
+ %234 = OpLabel
+ OpBranch %235
+ %235 = OpLabel
+ %300 = OpPhi %6 %14 %234 %303 %272
+ %299 = OpPhi %15 %18 %234 %274 %272
+ %238 = OpSLessThan %26 %299 %25
+ OpLoopMerge %275 %272 None
+ OpBranchConditional %238 %239 %275
+ %239 = OpLabel
+ %241 = OpSMod %15 %299 %29
+ %242 = OpIEqual %26 %241 %31
+ OpSelectionMerge %264 None
+ OpBranchConditional %242 %243 %246
+ %243 = OpLabel
+ %245 = OpFAdd %6 %300 %35
+ OpBranch %264
+ %246 = OpLabel
+ %248 = OpConvertSToF %6 %299
+ %250 = OpExtInst %6 %1 Round %94
+ %251 = OpFMod %6 %248 %250
+ %252 = OpFOrdLessThanEqual %26 %251 %44
+ OpSelectionMerge %256 None
+ OpBranchConditional %252 %253 %256
+ %253 = OpLabel
+ %255 = OpFAdd %6 %300 %48
+ OpBranch %256
+ %256 = OpLabel
+ %304 = OpPhi %6 %300 %246 %255 %253
+ %257 = OpAccessChain %57 %54 %31 %56
+ %258 = OpLoad %6 %257
+ %259 = OpAccessChain %57 %54 %31 %60
+ %260 = OpLoad %6 %259
+ %261 = OpFOrdGreaterThan %26 %258 %260
+ OpSelectionMerge %263 None
+ OpBranchConditional %261 %262 %263
+ %262 = OpLabel
+ OpKill
+ %263 = OpLabel
+ OpBranch %264
+ %264 = OpLabel
+ %303 = OpPhi %6 %245 %243 %304 %263
+ %266 = OpConvertSToF %6 %299
+ %268 = OpFOrdGreaterThanEqual %26 %266 %108
+ OpSelectionMerge %271 None
+ OpBranchConditional %268 %269 %271
+ %269 = OpLabel
+ OpBranch %275
+ %271 = OpLabel
+ OpBranch %272
+ %272 = OpLabel
+ %274 = OpIAdd %15 %299 %18
+ OpBranch %235
+ %275 = OpLabel
+ %311 = OpPhi %6 %296 %235 %303 %269
+ %309 = OpPhi %6 %300 %235 %303 %269
+ %305 = OpPhi %26 %168 %235 %171 %269
+ OpSelectionMerge %277 None
+ OpBranchConditional %305 %279 %277
+ %277 = OpLabel
+ OpBranch %279
+ %279 = OpLabel
+ %310 = OpPhi %6 %311 %275 %309 %277
+ %112 = OpAccessChain %7 %82 %60
+ OpStore %112 %310
+ %114 = OpLoad %6 %105
+ %116 = OpLoad %6 %112
+ %117 = OpFAdd %6 %114 %116
+ %119 = OpAccessChain %7 %82 %118
+ OpStore %119 %117
+ OpBranch %121
+ %121 = OpLabel
+ %320 = OpPhi %15 %31 %279 %154 %124
+ %128 = OpSLessThan %26 %320 %127
+ OpLoopMerge %123 %124 None
+ OpBranchConditional %128 %122 %123
+ %122 = OpLabel
+ %130 = OpAccessChain %7 %82 %320
+ %131 = OpLoad %6 %130
+ %133 = OpFOrdGreaterThanEqual %26 %131 %132
+ OpSelectionMerge %135 None
+ OpBranchConditional %133 %134 %135
+ %134 = OpLabel
+ %139 = OpLoad %6 %130
+ %142 = OpLoad %6 %130
+ %143 = OpFMul %6 %139 %142
+ OpStore %130 %143
+ %145 = OpAccessChain %57 %54 %31 %56
+ %146 = OpLoad %6 %145
+ %147 = OpAccessChain %57 %54 %31 %60
+ %148 = OpLoad %6 %147
+ %149 = OpFOrdGreaterThan %26 %146 %148
+ OpSelectionMerge %151 None
+ OpBranchConditional %149 %150 %151
+ %150 = OpLabel
+ OpKill
+ %151 = OpLabel
+ OpBranch %135
+ %135 = OpLabel
+ OpBranch %124
+ %124 = OpLabel
+ %154 = OpIAdd %15 %320 %18
+ OpBranch %121
+ %123 = OpLabel
+ %157 = OpLoad %80 %82
+ %158 = OpExtInst %80 %1 FAbs %157
+ %159 = OpExtInst %80 %1 Normalize %158
+ %160 = OpCompositeExtract %6 %159 0
+ %161 = OpCompositeExtract %6 %159 1
+ %162 = OpCompositeExtract %6 %159 2
+ %163 = OpCompositeConstruct %95 %160 %161 %162 %132
+ OpStore %156 %163
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> STD140 DATA
+ 256.0 256.0
+END
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-mergesort-for-always-false-if-discard.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-mergesort-for-always-false-if-discard.amber
new file mode 100644
index 0000000..d0c0c70
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-mergesort-for-always-false-if-discard.amber
@@ -0,0 +1,1233 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: A fragment shader with for loop and always false if
+
+# The test passes because both shaders render the same image.
+
+# Optimized using spirv-opt with the following arguments:
+# '-O'
+# spirv-opt commit hash: 717e7877cac15d393fd3bb1bd872679de8b59add
+
+
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch;
+# };
+# const int N = 10;
+#
+# int data[10], temp[10];
+#
+# void merge(int from, int mid, int to)
+# {
+# int k = from, i = from, j = mid + 1;
+# while (i <= mid && j <= to)
+# {
+# if (data[i] < data[j])
+# {
+# temp[k++] = data[i++];
+# }
+# else
+# {
+# temp[k++] = data[j++];
+# }
+# }
+# while (i < N && i <= mid)
+# {
+# temp[k++] = data[i++];
+# }
+# for (int i = from; i <= to; i++)
+# {
+# data[i] = temp[i];
+# }
+# }
+# void mergeSort()
+# {
+# int low = 0;
+# int high = N - 1;
+# for (int m = 1; m <= high; m = 2 * m)
+# {
+# for (int i = low; i < high; i += 2 * m)
+# {
+# int from = i;
+# int mid = i + m - 1;
+# int to = min(i + 2 * m - 1, high);
+# merge(from, mid, to);
+# }
+# }
+# }
+# void main()
+# {
+# int i = int(injectionSwitch.x);
+# do
+# {
+# switch (i)
+# {
+# case 0:
+# data[i] = 4;
+# break;
+# case 1:
+# data[i] = 3;
+# break;
+# case 2:
+# data[i] = 2;
+# break;
+# case 3:
+# data[i] = 1;
+# break;
+# case 4:
+# data[i] = 0;
+# break;
+# case 5:
+# data[i] = -1;
+# break;
+# case 6:
+# data[i] = -2;
+# break;
+# case 7:
+# data[i] = -3;
+# break;
+# case 8:
+# data[i] = -4;
+# break;
+# case 9:
+# data[i] = -5;
+# break;
+# }
+# i++;
+# } while (i < 10);
+# for (int j = 0; j < 10; j++)
+# {
+# temp[j] = data[j];
+# }
+# mergeSort();
+# float grey;
+# if (int(gl_FragCoord[1]) < 30)
+# {
+# grey = 0.5 + float(data[0]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 60)
+# {
+# grey = 0.5 + float(data[1]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 90)
+# {
+# grey = 0.5 + float(data[2]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 120)
+# {
+# grey = 0.5 + float(data[3]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 150)
+# {
+# discard;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 180)
+# {
+# grey = 0.5 + float(data[5]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 210)
+# {
+# grey = 0.5 + float(data[6]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 240)
+# {
+# grey = 0.5 + float(data[7]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 270)
+# {
+# grey = 0.5 + float(data[8]) / 10.0;
+# }
+# else
+# {
+# discard;
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# _GLF_color = vec4(vec3(grey), 1.0);
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 540
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %243 "gl_FragCoord"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %255 = OpConstant %157 0.5
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %373 = OpConstant %157 1
+ %507 = OpTypePointer Function %39
+ %539 = OpConstant %157 0.100000001
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %52 = OpVariable %507 Function
+ %41 = OpVariable %507 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpBranch %167
+ %167 = OpLabel
+ %508 = OpPhi %6 %166 %5 %222 %170
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ OpSelectionMerge %182 None
+ OpSwitch %508 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %185 = OpAccessChain %7 %41 %508
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %189 = OpAccessChain %7 %41 %508
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %192 = OpAccessChain %7 %41 %508
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %195 = OpAccessChain %7 %41 %508
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %198 = OpAccessChain %7 %41 %508
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %202 = OpAccessChain %7 %41 %508
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %206 = OpAccessChain %7 %41 %508
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %210 = OpAccessChain %7 %41 %508
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %214 = OpAccessChain %7 %41 %508
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %218 = OpAccessChain %7 %41 %508
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %222 = OpIAdd %6 %508 %22
+ OpBranch %170
+ %170 = OpLabel
+ %224 = OpSLessThan %31 %222 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpBranch %226
+ %226 = OpLabel
+ %510 = OpPhi %6 %105 %169 %239 %227
+ %232 = OpSLessThan %31 %510 %74
+ OpLoopMerge %228 %227 None
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %235 = OpAccessChain %7 %41 %510
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %7 %52 %510
+ OpStore %237 %236
+ %239 = OpIAdd %6 %510 %22
+ OpBranch %226
+ %228 = OpLabel
+ OpBranch %389
+ %389 = OpLabel
+ %511 = OpPhi %6 %22 %228 %426 %424
+ %393 = OpSLessThanEqual %31 %511 %107
+ OpLoopMerge %427 %424 None
+ OpBranchConditional %393 %394 %427
+ %394 = OpLabel
+ OpBranch %396
+ %396 = OpLabel
+ %519 = OpPhi %6 %105 %394 %410 %418
+ %400 = OpSLessThan %31 %519 %107
+ OpLoopMerge %423 %418 None
+ OpBranchConditional %400 %401 %423
+ %401 = OpLabel
+ %405 = OpIAdd %6 %519 %511
+ %406 = OpISub %6 %405 %22
+ %409 = OpIMul %6 %136 %511
+ %410 = OpIAdd %6 %519 %409
+ %411 = OpISub %6 %410 %22
+ %413 = OpExtInst %6 %1 SMin %411 %107
+ OpBranch %437
+ %437 = OpLabel
+ %532 = OpPhi %6 %519 %401 %456 %471
+ %522 = OpPhi %6 %405 %401 %534 %471
+ %521 = OpPhi %6 %519 %401 %533 %471
+ %441 = OpSLessThanEqual %31 %521 %406
+ %444 = OpSLessThanEqual %31 %522 %413
+ %445 = OpLogicalAnd %31 %441 %444
+ OpLoopMerge %472 %471 None
+ OpBranchConditional %445 %446 %472
+ %446 = OpLabel
+ %448 = OpAccessChain %7 %41 %521
+ %449 = OpLoad %6 %448
+ %451 = OpAccessChain %7 %41 %522
+ %452 = OpLoad %6 %451
+ %453 = OpSLessThan %31 %449 %452
+ %456 = OpIAdd %6 %532 %22
+ OpSelectionMerge %470 None
+ OpBranchConditional %453 %454 %462
+ %454 = OpLabel
+ %458 = OpIAdd %6 %521 %22
+ %460 = OpLoad %6 %448
+ %461 = OpAccessChain %7 %52 %532
+ OpStore %461 %460
+ OpBranch %470
+ %462 = OpLabel
+ %466 = OpIAdd %6 %522 %22
+ %468 = OpLoad %6 %451
+ %469 = OpAccessChain %7 %52 %532
+ OpStore %469 %468
+ OpBranch %470
+ %470 = OpLabel
+ %534 = OpPhi %6 %522 %454 %466 %462
+ %533 = OpPhi %6 %458 %454 %521 %462
+ OpBranch %471
+ %471 = OpLabel
+ OpBranch %437
+ %472 = OpLabel
+ OpBranch %473
+ %473 = OpLabel
+ %531 = OpPhi %6 %532 %472 %483 %481
+ %523 = OpPhi %6 %521 %472 %485 %481
+ %476 = OpSLessThan %31 %523 %74
+ %479 = OpSLessThanEqual %31 %523 %406
+ %480 = OpLogicalAnd %31 %476 %479
+ OpLoopMerge %490 %481 None
+ OpBranchConditional %480 %481 %490
+ %481 = OpLabel
+ %483 = OpIAdd %6 %531 %22
+ %485 = OpIAdd %6 %523 %22
+ %486 = OpAccessChain %7 %41 %523
+ %487 = OpLoad %6 %486
+ %488 = OpAccessChain %7 %52 %531
+ OpStore %488 %487
+ OpBranch %473
+ %490 = OpLabel
+ OpBranch %492
+ %492 = OpLabel
+ %524 = OpPhi %6 %519 %490 %505 %497
+ %496 = OpSLessThanEqual %31 %524 %413
+ OpLoopMerge %506 %497 None
+ OpBranchConditional %496 %497 %506
+ %497 = OpLabel
+ %500 = OpAccessChain %7 %52 %524
+ %501 = OpLoad %6 %500
+ %502 = OpAccessChain %7 %41 %524
+ OpStore %502 %501
+ %505 = OpIAdd %6 %524 %22
+ OpBranch %492
+ %506 = OpLabel
+ OpBranch %418
+ %418 = OpLabel
+ OpBranch %396
+ %423 = OpLabel
+ OpBranch %424
+ %424 = OpLabel
+ %426 = OpIMul %6 %136 %511
+ OpBranch %389
+ %427 = OpLabel
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %7 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFMul %157 %258 %539
+ %261 = OpFAdd %157 %255 %260
+ OpBranch %252
+ %262 = OpLabel
+ %267 = OpSLessThan %31 %248 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %7 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFMul %157 %272 %539
+ %274 = OpFAdd %157 %255 %273
+ OpBranch %269
+ %275 = OpLabel
+ %280 = OpSLessThan %31 %248 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %7 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFMul %157 %285 %539
+ %287 = OpFAdd %157 %255 %286
+ OpBranch %282
+ %288 = OpLabel
+ %293 = OpSLessThan %31 %248 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %7 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFMul %157 %298 %539
+ %300 = OpFAdd %157 %255 %299
+ OpBranch %295
+ %301 = OpLabel
+ %306 = OpSLessThan %31 %248 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %315 = OpSLessThan %31 %248 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %7 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFMul %157 %321 %539
+ %323 = OpFAdd %157 %255 %322
+ OpBranch %317
+ %324 = OpLabel
+ %329 = OpSLessThan %31 %248 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %7 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFMul %157 %335 %539
+ %337 = OpFAdd %157 %255 %336
+ OpBranch %331
+ %338 = OpLabel
+ %343 = OpSLessThan %31 %248 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %7 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFMul %157 %349 %539
+ %351 = OpFAdd %157 %255 %350
+ OpBranch %345
+ %352 = OpLabel
+ %357 = OpSLessThan %31 %248 %356
+ OpSelectionMerge %358 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %7 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFMul %157 %363 %539
+ %365 = OpFAdd %157 %255 %364
+ OpBranch %345
+ %366 = OpLabel
+ OpKill
+ %345 = OpLabel
+ %518 = OpPhi %157 %351 %344 %365 %358
+ OpBranch %331
+ %331 = OpLabel
+ %517 = OpPhi %157 %337 %330 %518 %345
+ OpBranch %317
+ %317 = OpLabel
+ %516 = OpPhi %157 %323 %316 %517 %331
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ %515 = OpPhi %157 %300 %294 %516 %308
+ OpBranch %282
+ %282 = OpLabel
+ %514 = OpPhi %157 %287 %281 %515 %295
+ OpBranch %269
+ %269 = OpLabel
+ %513 = OpPhi %157 %274 %268 %514 %282
+ OpBranch %252
+ %252 = OpLabel
+ %512 = OpPhi %157 %261 %251 %513 %269
+ %377 = OpCompositeConstruct %241 %512 %512 %512 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# injectionSwitch
+BUFFER reference_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch; // x == 0.0, y == 1.0
+# };
+# const int N = 10;
+#
+# int data[10], temp[10];
+#
+# void merge(int from, int mid, int to)
+# {
+# int k = from, i = from, j = mid + 1;
+# while (i <= mid && j <= to)
+# {
+# if (data[i] < data[j])
+# {
+# temp[k++] = data[i++];
+# }
+# else
+# {
+# temp[k++] = data[j++];
+# }
+# }
+# while (i < N && i <= mid)
+# {
+# temp[k++] = data[i++];
+# }
+# for (int i = from; i <= to; i++)
+# {
+# data[i] = temp[i];
+# }
+# }
+# void mergeSort()
+# {
+# int low = 0;
+# int high = N - 1;
+# for (int m = 1; m <= high; m = 2 * m)
+# {
+# for (int i = low; i < high; i += 2 * m)
+# {
+# int from = i;
+# int mid = i + m - 1;
+# int to = min(i + 2 * m - 1, high);
+# merge(from, mid, to);
+# }
+# }
+# }
+# void main()
+# {
+# int i = int(injectionSwitch.x);
+# do
+# {
+# switch (i)
+# {
+# case 0:
+# data[i] = 4;
+# break;
+# case 1:
+# data[i] = 3;
+# break;
+# case 2:
+# data[i] = 2;
+# break;
+# case 3:
+# data[i] = 1;
+# break;
+# case 4:
+# data[i] = 0;
+# break;
+# case 5:
+# data[i] = -1;
+# break;
+# case 6:
+# data[i] = -2;
+# break;
+# case 7:
+# data[i] = -3;
+# break;
+# case 8:
+# data[i] = -4;
+# break;
+# case 9:
+# data[i] = -5;
+# break;
+# }
+# i++;
+# } while (i < 10);
+# for (int j = 0; j < 10; j++)
+# {
+# temp[j] = data[j];
+# }
+# mergeSort();
+# float grey;
+# if (int(gl_FragCoord[1]) < 30)
+# {
+# grey = 0.5 + float(data[0]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 60)
+# {
+# grey = 0.5 + float(data[1]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 90)
+# {
+# grey = 0.5 + float(data[2]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 120)
+# {
+# grey = 0.5 + float(data[3]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 150)
+# {
+# discard;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 180)
+# {
+# grey = 0.5 + float(data[5]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 210)
+# {
+# grey = 0.5 + float(data[6]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 240)
+# {
+# grey = 0.5 + float(data[7]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 270)
+# {
+# grey = 0.5 + float(data[8]) / 10.0;
+# }
+# else
+# {
+# discard;
+# }
+# }
+# }
+# }
+# // Code block bellow should not affect output image.
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# _GLF_color = vec4(1.0);
+# }
+# vec2 a = vec2(1.0, 1.0);
+# for (int i = 0; i <= 32; i++)
+# {
+# // Always false.
+# if (a.x < 0.0)
+# {
+# // Always false.
+# if (injectionSwitch.x > injectionSwitch.y)
+# {
+# discard;
+# }
+# a.y++;
+# }
+# a.x += a.y;
+# }
+# // End of block.
+# }
+# }
+# }
+# }
+# }
+# _GLF_color = vec4(vec3(grey), 1.0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 602
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %376
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %243 "gl_FragCoord"
+ OpName %376 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %376 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %255 = OpConstant %157 0.5
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %375 = OpTypePointer Output %241
+ %376 = OpVariable %375 Output
+ %377 = OpConstant %157 1
+ %378 = OpConstantComposite %241 %377 %377 %377 %377
+ %381 = OpConstantComposite %158 %377 %377
+ %389 = OpConstant %6 32
+ %393 = OpConstant %157 0
+ %552 = OpTypePointer Function %39
+ %601 = OpConstant %157 0.100000001
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %52 = OpVariable %552 Function
+ %41 = OpVariable %552 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpBranch %167
+ %167 = OpLabel
+ %561 = OpPhi %6 %166 %5 %222 %170
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ OpSelectionMerge %182 None
+ OpSwitch %561 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %185 = OpAccessChain %7 %41 %561
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %189 = OpAccessChain %7 %41 %561
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %192 = OpAccessChain %7 %41 %561
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %195 = OpAccessChain %7 %41 %561
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %198 = OpAccessChain %7 %41 %561
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %202 = OpAccessChain %7 %41 %561
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %206 = OpAccessChain %7 %41 %561
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %210 = OpAccessChain %7 %41 %561
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %214 = OpAccessChain %7 %41 %561
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %218 = OpAccessChain %7 %41 %561
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %222 = OpIAdd %6 %561 %22
+ OpBranch %170
+ %170 = OpLabel
+ %224 = OpSLessThan %31 %222 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpBranch %226
+ %226 = OpLabel
+ %563 = OpPhi %6 %105 %169 %239 %227
+ %232 = OpSLessThan %31 %563 %74
+ OpLoopMerge %228 %227 None
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %235 = OpAccessChain %7 %41 %563
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %7 %52 %563
+ OpStore %237 %236
+ %239 = OpIAdd %6 %563 %22
+ OpBranch %226
+ %228 = OpLabel
+ OpBranch %434
+ %434 = OpLabel
+ %564 = OpPhi %6 %22 %228 %471 %469
+ %438 = OpSLessThanEqual %31 %564 %107
+ OpLoopMerge %472 %469 None
+ OpBranchConditional %438 %439 %472
+ %439 = OpLabel
+ OpBranch %441
+ %441 = OpLabel
+ %579 = OpPhi %6 %105 %439 %455 %463
+ %445 = OpSLessThan %31 %579 %107
+ OpLoopMerge %468 %463 None
+ OpBranchConditional %445 %446 %468
+ %446 = OpLabel
+ %450 = OpIAdd %6 %579 %564
+ %451 = OpISub %6 %450 %22
+ %454 = OpIMul %6 %136 %564
+ %455 = OpIAdd %6 %579 %454
+ %456 = OpISub %6 %455 %22
+ %458 = OpExtInst %6 %1 SMin %456 %107
+ OpBranch %482
+ %482 = OpLabel
+ %592 = OpPhi %6 %579 %446 %501 %516
+ %582 = OpPhi %6 %450 %446 %594 %516
+ %581 = OpPhi %6 %579 %446 %593 %516
+ %486 = OpSLessThanEqual %31 %581 %451
+ %489 = OpSLessThanEqual %31 %582 %458
+ %490 = OpLogicalAnd %31 %486 %489
+ OpLoopMerge %517 %516 None
+ OpBranchConditional %490 %491 %517
+ %491 = OpLabel
+ %493 = OpAccessChain %7 %41 %581
+ %494 = OpLoad %6 %493
+ %496 = OpAccessChain %7 %41 %582
+ %497 = OpLoad %6 %496
+ %498 = OpSLessThan %31 %494 %497
+ %501 = OpIAdd %6 %592 %22
+ OpSelectionMerge %515 None
+ OpBranchConditional %498 %499 %507
+ %499 = OpLabel
+ %503 = OpIAdd %6 %581 %22
+ %505 = OpLoad %6 %493
+ %506 = OpAccessChain %7 %52 %592
+ OpStore %506 %505
+ OpBranch %515
+ %507 = OpLabel
+ %511 = OpIAdd %6 %582 %22
+ %513 = OpLoad %6 %496
+ %514 = OpAccessChain %7 %52 %592
+ OpStore %514 %513
+ OpBranch %515
+ %515 = OpLabel
+ %594 = OpPhi %6 %582 %499 %511 %507
+ %593 = OpPhi %6 %503 %499 %581 %507
+ OpBranch %516
+ %516 = OpLabel
+ OpBranch %482
+ %517 = OpLabel
+ OpBranch %518
+ %518 = OpLabel
+ %591 = OpPhi %6 %592 %517 %528 %526
+ %583 = OpPhi %6 %581 %517 %530 %526
+ %521 = OpSLessThan %31 %583 %74
+ %524 = OpSLessThanEqual %31 %583 %451
+ %525 = OpLogicalAnd %31 %521 %524
+ OpLoopMerge %535 %526 None
+ OpBranchConditional %525 %526 %535
+ %526 = OpLabel
+ %528 = OpIAdd %6 %591 %22
+ %530 = OpIAdd %6 %583 %22
+ %531 = OpAccessChain %7 %41 %583
+ %532 = OpLoad %6 %531
+ %533 = OpAccessChain %7 %52 %591
+ OpStore %533 %532
+ OpBranch %518
+ %535 = OpLabel
+ OpBranch %537
+ %537 = OpLabel
+ %584 = OpPhi %6 %579 %535 %550 %542
+ %541 = OpSLessThanEqual %31 %584 %458
+ OpLoopMerge %551 %542 None
+ OpBranchConditional %541 %542 %551
+ %542 = OpLabel
+ %545 = OpAccessChain %7 %52 %584
+ %546 = OpLoad %6 %545
+ %547 = OpAccessChain %7 %41 %584
+ OpStore %547 %546
+ %550 = OpIAdd %6 %584 %22
+ OpBranch %537
+ %551 = OpLabel
+ OpBranch %463
+ %463 = OpLabel
+ OpBranch %441
+ %468 = OpLabel
+ OpBranch %469
+ %469 = OpLabel
+ %471 = OpIMul %6 %136 %564
+ OpBranch %434
+ %472 = OpLabel
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %7 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFMul %157 %258 %601
+ %261 = OpFAdd %157 %255 %260
+ OpBranch %252
+ %262 = OpLabel
+ %267 = OpSLessThan %31 %248 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %7 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFMul %157 %272 %601
+ %274 = OpFAdd %157 %255 %273
+ OpBranch %269
+ %275 = OpLabel
+ %280 = OpSLessThan %31 %248 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %7 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFMul %157 %285 %601
+ %287 = OpFAdd %157 %255 %286
+ OpBranch %282
+ %288 = OpLabel
+ %293 = OpSLessThan %31 %248 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %7 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFMul %157 %298 %601
+ %300 = OpFAdd %157 %255 %299
+ OpBranch %295
+ %301 = OpLabel
+ %306 = OpSLessThan %31 %248 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %315 = OpSLessThan %31 %248 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %7 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFMul %157 %321 %601
+ %323 = OpFAdd %157 %255 %322
+ OpBranch %317
+ %324 = OpLabel
+ %329 = OpSLessThan %31 %248 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %7 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFMul %157 %335 %601
+ %337 = OpFAdd %157 %255 %336
+ OpBranch %331
+ %338 = OpLabel
+ %343 = OpSLessThan %31 %248 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %7 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFMul %157 %349 %601
+ %351 = OpFAdd %157 %255 %350
+ OpBranch %345
+ %352 = OpLabel
+ %357 = OpSLessThan %31 %248 %356
+ OpSelectionMerge %358 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %7 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFMul %157 %363 %601
+ %365 = OpFAdd %157 %255 %364
+ OpBranch %345
+ %366 = OpLabel
+ OpKill
+ %345 = OpLabel
+ %577 = OpPhi %157 %351 %344 %365 %358
+ OpBranch %331
+ %331 = OpLabel
+ %576 = OpPhi %157 %337 %330 %577 %345
+ OpBranch %317
+ %317 = OpLabel
+ %575 = OpPhi %157 %323 %316 %576 %331
+ %370 = OpAccessChain %163 %161 %105 %244
+ %371 = OpLoad %157 %370
+ %372 = OpFOrdGreaterThan %31 %165 %371
+ OpSelectionMerge %374 None
+ OpBranchConditional %372 %373 %374
+ %373 = OpLabel
+ OpStore %376 %378
+ OpBranch %374
+ %374 = OpLabel
+ OpBranch %383
+ %383 = OpLabel
+ %566 = OpPhi %158 %381 %374 %560 %386
+ %565 = OpPhi %6 %105 %374 %415 %386
+ %390 = OpSLessThanEqual %31 %565 %389
+ OpLoopMerge %385 %386 None
+ OpBranchConditional %390 %384 %385
+ %384 = OpLabel
+ %392 = OpCompositeExtract %157 %566 0
+ %394 = OpFOrdLessThan %31 %392 %393
+ OpSelectionMerge %396 None
+ OpBranchConditional %394 %395 %396
+ %395 = OpLabel
+ OpSelectionMerge %403 None
+ OpBranchConditional %372 %402 %403
+ %402 = OpLabel
+ OpKill
+ %403 = OpLabel
+ %406 = OpCompositeExtract %157 %566 1
+ %407 = OpFAdd %157 %406 %377
+ %556 = OpCompositeInsert %158 %407 %566 1
+ OpBranch %396
+ %396 = OpLabel
+ %567 = OpPhi %158 %566 %384 %556 %403
+ %409 = OpCompositeExtract %157 %567 1
+ %411 = OpCompositeExtract %157 %567 0
+ %412 = OpFAdd %157 %411 %409
+ %560 = OpCompositeInsert %158 %412 %567 0
+ OpBranch %386
+ %386 = OpLabel
+ %415 = OpIAdd %6 %565 %22
+ OpBranch %383
+ %385 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ %572 = OpPhi %157 %300 %294 %575 %308
+ OpBranch %282
+ %282 = OpLabel
+ %571 = OpPhi %157 %287 %281 %572 %295
+ OpBranch %269
+ %269 = OpLabel
+ %570 = OpPhi %157 %274 %268 %571 %282
+ OpBranch %252
+ %252 = OpLabel
+ %569 = OpPhi %157 %261 %251 %570 %269
+ %422 = OpCompositeConstruct %241 %569 %569 %569 %377
+ OpStore %376 %422
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> STD140 DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-mergesort-reversed-for-loop.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-mergesort-reversed-for-loop.amber
new file mode 100644
index 0000000..03dcbca
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-mergesort-reversed-for-loop.amber
@@ -0,0 +1,1552 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with once iterated reversed for loop
+
+# The test passes because both shaders render the same image.
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch;
+# };
+# const int N = 10;
+#
+# int data[10], temp[10];
+#
+# void merge(int from, int mid, int to)
+# {
+# int k = from, i = from, j = mid + 1;
+# while (i <= mid && j <= to)
+# {
+# if (data[i] < data[j])
+# {
+# temp[k++] = data[i++];
+# }
+# else
+# {
+# temp[k++] = data[j++];
+# }
+# }
+# while (i < N && i <= mid)
+# {
+# temp[k++] = data[i++];
+# }
+# for (int i = from; i <= to; i++)
+# {
+# data[i] = temp[i];
+# }
+# }
+# void mergeSort()
+# {
+# int low = 0;
+# int high = N - 1;
+# for (int m = 1; m <= high; m = 2 * m)
+# {
+# for (int i = low; i < high; i += 2 * m)
+# {
+# int from = i;
+# int mid = i + m - 1;
+# int to = min(i + 2 * m - 1, high);
+# merge(from, mid, to);
+# }
+# }
+# }
+# void main()
+# {
+# int i = int(injectionSwitch.x);
+# do
+# {
+# switch (i)
+# {
+# case 0:
+# data[i] = 4;
+# break;
+# case 1:
+# data[i] = 3;
+# break;
+# case 2:
+# data[i] = 2;
+# break;
+# case 3:
+# data[i] = 1;
+# break;
+# case 4:
+# data[i] = 0;
+# break;
+# case 5:
+# data[i] = -1;
+# break;
+# case 6:
+# data[i] = -2;
+# break;
+# case 7:
+# data[i] = -3;
+# break;
+# case 8:
+# data[i] = -4;
+# break;
+# case 9:
+# data[i] = -5;
+# break;
+# }
+# i++;
+# } while (i < 10);
+# for (int j = 0; j < 10; j++)
+# {
+# temp[j] = data[j];
+# }
+# mergeSort();
+# float grey;
+# if (int(gl_FragCoord[1]) < 30)
+# {
+# grey = 0.5 + float(data[0]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 60)
+# {
+# grey = 0.5 + float(data[1]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 90)
+# {
+# grey = 0.5 + float(data[2]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 120)
+# {
+# grey = 0.5 + float(data[3]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 150)
+# {
+# discard;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 180)
+# {
+# grey = 0.5 + float(data[5]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 210)
+# {
+# grey = 0.5 + float(data[6]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 240)
+# {
+# grey = 0.5 + float(data[7]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 270)
+# {
+# grey = 0.5 + float(data[8]) / 10.0;
+# }
+# else
+# {
+# discard;
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# _GLF_color = vec4(vec3(grey), 1.0);
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 378
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %369
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %369 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %369 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %314 = OpConstant %6 180
+ %318 = OpConstant %6 5
+ %328 = OpConstant %6 210
+ %332 = OpConstant %6 6
+ %342 = OpConstant %6 240
+ %346 = OpConstant %6 7
+ %356 = OpConstant %6 270
+ %360 = OpConstant %6 8
+ %368 = OpTypePointer Output %241
+ %369 = OpVariable %368 Output
+ %371 = OpTypeVector %157 3
+ %373 = OpConstant %157 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ %240 = OpFunctionCall %2 %14
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %310
+ %307 = OpLabel
+ OpKill
+ %310 = OpLabel
+ %311 = OpAccessChain %245 %243 %244
+ %312 = OpLoad %157 %311
+ %313 = OpConvertFToS %6 %312
+ %315 = OpSLessThan %31 %313 %314
+ OpSelectionMerge %317 None
+ OpBranchConditional %315 %316 %324
+ %316 = OpLabel
+ %319 = OpAccessChain %43 %41 %318
+ %320 = OpLoad %6 %319
+ %321 = OpConvertSToF %157 %320
+ %322 = OpFDiv %157 %321 %259
+ %323 = OpFAdd %157 %255 %322
+ OpStore %254 %323
+ OpBranch %317
+ %324 = OpLabel
+ %325 = OpAccessChain %245 %243 %244
+ %326 = OpLoad %157 %325
+ %327 = OpConvertFToS %6 %326
+ %329 = OpSLessThan %31 %327 %328
+ OpSelectionMerge %331 None
+ OpBranchConditional %329 %330 %338
+ %330 = OpLabel
+ %333 = OpAccessChain %43 %41 %332
+ %334 = OpLoad %6 %333
+ %335 = OpConvertSToF %157 %334
+ %336 = OpFDiv %157 %335 %259
+ %337 = OpFAdd %157 %255 %336
+ OpStore %254 %337
+ OpBranch %331
+ %338 = OpLabel
+ %339 = OpAccessChain %245 %243 %244
+ %340 = OpLoad %157 %339
+ %341 = OpConvertFToS %6 %340
+ %343 = OpSLessThan %31 %341 %342
+ OpSelectionMerge %345 None
+ OpBranchConditional %343 %344 %352
+ %344 = OpLabel
+ %347 = OpAccessChain %43 %41 %346
+ %348 = OpLoad %6 %347
+ %349 = OpConvertSToF %157 %348
+ %350 = OpFDiv %157 %349 %259
+ %351 = OpFAdd %157 %255 %350
+ OpStore %254 %351
+ OpBranch %345
+ %352 = OpLabel
+ %353 = OpAccessChain %245 %243 %244
+ %354 = OpLoad %157 %353
+ %355 = OpConvertFToS %6 %354
+ %357 = OpSLessThan %31 %355 %356
+ OpSelectionMerge %359 None
+ OpBranchConditional %357 %358 %366
+ %358 = OpLabel
+ %361 = OpAccessChain %43 %41 %360
+ %362 = OpLoad %6 %361
+ %363 = OpConvertSToF %157 %362
+ %364 = OpFDiv %157 %363 %259
+ %365 = OpFAdd %157 %255 %364
+ OpStore %254 %365
+ OpBranch %359
+ %366 = OpLabel
+ OpKill
+ %359 = OpLabel
+ OpBranch %345
+ %345 = OpLabel
+ OpBranch %331
+ %331 = OpLabel
+ OpBranch %317
+ %317 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %370 = OpLoad %157 %254
+ %372 = OpCompositeConstruct %371 %370 %370 %370
+ %374 = OpCompositeExtract %157 %372 0
+ %375 = OpCompositeExtract %157 %372 1
+ %376 = OpCompositeExtract %157 %372 2
+ %377 = OpCompositeConstruct %241 %374 %375 %376 %373
+ OpStore %369 %377
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %60
+ %50 = OpLabel
+ %53 = OpLoad %6 %16
+ %54 = OpIAdd %6 %53 %22
+ OpStore %16 %54
+ %55 = OpLoad %6 %18
+ %56 = OpIAdd %6 %55 %22
+ OpStore %18 %56
+ %57 = OpAccessChain %43 %41 %55
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %43 %52 %53
+ OpStore %59 %58
+ OpBranch %51
+ %60 = OpLabel
+ %61 = OpLoad %6 %16
+ %62 = OpIAdd %6 %61 %22
+ OpStore %16 %62
+ %63 = OpLoad %6 %20
+ %64 = OpIAdd %6 %63 %22
+ OpStore %20 %64
+ %65 = OpAccessChain %43 %41 %63
+ %66 = OpLoad %6 %65
+ %67 = OpAccessChain %43 %52 %61
+ OpStore %67 %66
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# injectionSwitch
+BUFFER reference_injectionSwitch DATA_TYPE vec2<float> DATA
+ 0.0 1.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 injectionSwitch;
+# };
+# const int N = 10;
+#
+# int data[10], temp[10];
+#
+# void merge(int from, int mid, int to)
+# {
+# int k = from, i = from, j = mid + 1;
+# while (i <= mid && j <= to)
+# {
+# if (data[i] < data[j])
+# {
+# temp[k++] = data[i++];
+# }
+# else
+# {
+# temp[k++] = data[j++];
+# }
+# }
+# while (i < N && i <= mid)
+# {
+# temp[k++] = data[i++];
+# }
+# for (int i = from; i <= to; i++)
+# {
+# data[i] = temp[i];
+# }
+# }
+# void mergeSort()
+# {
+# int low = 0;
+# int high = N - 1;
+# for (int m = 1; m <= high; m = 2 * m)
+# {
+# for (int i = low; i < high; i += 2 * m)
+# {
+# int from = i;
+# int mid = i + m - 1;
+# int to = min(i + 2 * m - 1, high);
+# merge(from, mid, to);
+# }
+# }
+# }
+# void main()
+# {
+# int i = int(injectionSwitch.x);
+# do
+# {
+# switch (i)
+# {
+# case 0:
+# data[i] = 4;
+# break;
+# case 1:
+# data[i] = 3;
+# break;
+# case 2:
+# data[i] = 2;
+# break;
+# case 3:
+# data[i] = 1;
+# break;
+# case 4:
+# data[i] = 0;
+# break;
+# case 5:
+# data[i] = -1;
+# break;
+# case 6:
+# data[i] = -2;
+# break;
+# case 7:
+# data[i] = -3;
+# break;
+# case 8:
+# data[i] = -4;
+# break;
+# case 9:
+# data[i] = -5;
+# break;
+# }
+# i++;
+# } while (i < 10);
+# for (int j = 0; j < 10; j++)
+# {
+# temp[j] = data[j];
+# }
+# mergeSort();
+# float grey;
+# if (int(gl_FragCoord[1]) < 30)
+# {
+# grey = 0.5 + float(data[0]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 60)
+# {
+# grey = 0.5 + float(data[1]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 90)
+# {
+# grey = 0.5 + float(data[2]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 120)
+# {
+# grey = 0.5 + float(data[3]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 150)
+# {
+# // Iterates once.
+# for (int int_i = 1; int_i > int((injectionSwitch.x)); int_i--)
+# {
+# discard;
+# }
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 180)
+# {
+# grey = 0.5 + float(data[5]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 210)
+# {
+# grey = 0.5 + float(data[6]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 240)
+# {
+# grey = 0.5 + float(data[7]) / 10.0;
+# }
+# else
+# {
+# if (int(gl_FragCoord[1]) < 270)
+# {
+# grey = 0.5 + float(data[8]) / 10.0;
+# }
+# else
+# {
+# discard;
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# }
+# _GLF_color = vec4(vec3(grey), 1.0);
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 391
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %243 %382
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "merge(i1;i1;i1;"
+ OpName %9 "from"
+ OpName %10 "mid"
+ OpName %11 "to"
+ OpName %14 "mergeSort("
+ OpName %16 "k"
+ OpName %18 "i"
+ OpName %20 "j"
+ OpName %41 "data"
+ OpName %52 "temp"
+ OpName %87 "i"
+ OpName %104 "low"
+ OpName %106 "high"
+ OpName %108 "m"
+ OpName %117 "i"
+ OpName %127 "from"
+ OpName %129 "mid"
+ OpName %134 "to"
+ OpName %143 "param"
+ OpName %145 "param"
+ OpName %147 "param"
+ OpName %156 "i"
+ OpName %159 "buf0"
+ OpMemberName %159 0 "injectionSwitch"
+ OpName %161 ""
+ OpName %225 "j"
+ OpName %243 "gl_FragCoord"
+ OpName %254 "grey"
+ OpName %309 "int_i"
+ OpName %382 "_GLF_color"
+ OpMemberDecorate %159 0 Offset 0
+ OpDecorate %159 Block
+ OpDecorate %161 DescriptorSet 0
+ OpDecorate %161 Binding 0
+ OpDecorate %243 BuiltIn FragCoord
+ OpDecorate %382 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeInt 32 1
+ %7 = OpTypePointer Function %6
+ %8 = OpTypeFunction %2 %7 %7 %7
+ %22 = OpConstant %6 1
+ %31 = OpTypeBool
+ %37 = OpTypeInt 32 0
+ %38 = OpConstant %37 10
+ %39 = OpTypeArray %6 %38
+ %40 = OpTypePointer Private %39
+ %41 = OpVariable %40 Private
+ %43 = OpTypePointer Private %6
+ %52 = OpVariable %40 Private
+ %74 = OpConstant %6 10
+ %105 = OpConstant %6 0
+ %107 = OpConstant %6 9
+ %136 = OpConstant %6 2
+ %157 = OpTypeFloat 32
+ %158 = OpTypeVector %157 2
+ %159 = OpTypeStruct %158
+ %160 = OpTypePointer Uniform %159
+ %161 = OpVariable %160 Uniform
+ %162 = OpConstant %37 0
+ %163 = OpTypePointer Uniform %157
+ %184 = OpConstant %6 4
+ %188 = OpConstant %6 3
+ %201 = OpConstant %6 -1
+ %205 = OpConstant %6 -2
+ %209 = OpConstant %6 -3
+ %213 = OpConstant %6 -4
+ %217 = OpConstant %6 -5
+ %241 = OpTypeVector %157 4
+ %242 = OpTypePointer Input %241
+ %243 = OpVariable %242 Input
+ %244 = OpConstant %37 1
+ %245 = OpTypePointer Input %157
+ %249 = OpConstant %6 30
+ %253 = OpTypePointer Function %157
+ %255 = OpConstant %157 0.5
+ %259 = OpConstant %157 10
+ %266 = OpConstant %6 60
+ %279 = OpConstant %6 90
+ %292 = OpConstant %6 120
+ %305 = OpConstant %6 150
+ %327 = OpConstant %6 180
+ %331 = OpConstant %6 5
+ %341 = OpConstant %6 210
+ %345 = OpConstant %6 6
+ %355 = OpConstant %6 240
+ %359 = OpConstant %6 7
+ %369 = OpConstant %6 270
+ %373 = OpConstant %6 8
+ %381 = OpTypePointer Output %241
+ %382 = OpVariable %381 Output
+ %384 = OpTypeVector %157 3
+ %386 = OpConstant %157 1
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %156 = OpVariable %7 Function
+ %225 = OpVariable %7 Function
+ %254 = OpVariable %253 Function
+ %309 = OpVariable %7 Function
+ %164 = OpAccessChain %163 %161 %105 %162
+ %165 = OpLoad %157 %164
+ %166 = OpConvertFToS %6 %165
+ OpStore %156 %166
+ OpBranch %167
+ %167 = OpLabel
+ OpLoopMerge %169 %170 None
+ OpBranch %168
+ %168 = OpLabel
+ %171 = OpLoad %6 %156
+ OpSelectionMerge %182 None
+ OpSwitch %171 %182 0 %172 1 %173 2 %174 3 %175 4 %176 5 %177 6 %178 7 %179 8 %180 9 %181
+ %172 = OpLabel
+ %183 = OpLoad %6 %156
+ %185 = OpAccessChain %43 %41 %183
+ OpStore %185 %184
+ OpBranch %182
+ %173 = OpLabel
+ %187 = OpLoad %6 %156
+ %189 = OpAccessChain %43 %41 %187
+ OpStore %189 %188
+ OpBranch %182
+ %174 = OpLabel
+ %191 = OpLoad %6 %156
+ %192 = OpAccessChain %43 %41 %191
+ OpStore %192 %136
+ OpBranch %182
+ %175 = OpLabel
+ %194 = OpLoad %6 %156
+ %195 = OpAccessChain %43 %41 %194
+ OpStore %195 %22
+ OpBranch %182
+ %176 = OpLabel
+ %197 = OpLoad %6 %156
+ %198 = OpAccessChain %43 %41 %197
+ OpStore %198 %105
+ OpBranch %182
+ %177 = OpLabel
+ %200 = OpLoad %6 %156
+ %202 = OpAccessChain %43 %41 %200
+ OpStore %202 %201
+ OpBranch %182
+ %178 = OpLabel
+ %204 = OpLoad %6 %156
+ %206 = OpAccessChain %43 %41 %204
+ OpStore %206 %205
+ OpBranch %182
+ %179 = OpLabel
+ %208 = OpLoad %6 %156
+ %210 = OpAccessChain %43 %41 %208
+ OpStore %210 %209
+ OpBranch %182
+ %180 = OpLabel
+ %212 = OpLoad %6 %156
+ %214 = OpAccessChain %43 %41 %212
+ OpStore %214 %213
+ OpBranch %182
+ %181 = OpLabel
+ %216 = OpLoad %6 %156
+ %218 = OpAccessChain %43 %41 %216
+ OpStore %218 %217
+ OpBranch %182
+ %182 = OpLabel
+ %221 = OpLoad %6 %156
+ %222 = OpIAdd %6 %221 %22
+ OpStore %156 %222
+ OpBranch %170
+ %170 = OpLabel
+ %223 = OpLoad %6 %156
+ %224 = OpSLessThan %31 %223 %74
+ OpBranchConditional %224 %167 %169
+ %169 = OpLabel
+ OpStore %225 %105
+ OpBranch %226
+ %226 = OpLabel
+ OpLoopMerge %228 %229 None
+ OpBranch %230
+ %230 = OpLabel
+ %231 = OpLoad %6 %225
+ %232 = OpSLessThan %31 %231 %74
+ OpBranchConditional %232 %227 %228
+ %227 = OpLabel
+ %233 = OpLoad %6 %225
+ %234 = OpLoad %6 %225
+ %235 = OpAccessChain %43 %41 %234
+ %236 = OpLoad %6 %235
+ %237 = OpAccessChain %43 %52 %233
+ OpStore %237 %236
+ OpBranch %229
+ %229 = OpLabel
+ %238 = OpLoad %6 %225
+ %239 = OpIAdd %6 %238 %22
+ OpStore %225 %239
+ OpBranch %226
+ %228 = OpLabel
+ %240 = OpFunctionCall %2 %14
+ %246 = OpAccessChain %245 %243 %244
+ %247 = OpLoad %157 %246
+ %248 = OpConvertFToS %6 %247
+ %250 = OpSLessThan %31 %248 %249
+ OpSelectionMerge %252 None
+ OpBranchConditional %250 %251 %262
+ %251 = OpLabel
+ %256 = OpAccessChain %43 %41 %105
+ %257 = OpLoad %6 %256
+ %258 = OpConvertSToF %157 %257
+ %260 = OpFDiv %157 %258 %259
+ %261 = OpFAdd %157 %255 %260
+ OpStore %254 %261
+ OpBranch %252
+ %262 = OpLabel
+ %263 = OpAccessChain %245 %243 %244
+ %264 = OpLoad %157 %263
+ %265 = OpConvertFToS %6 %264
+ %267 = OpSLessThan %31 %265 %266
+ OpSelectionMerge %269 None
+ OpBranchConditional %267 %268 %275
+ %268 = OpLabel
+ %270 = OpAccessChain %43 %41 %22
+ %271 = OpLoad %6 %270
+ %272 = OpConvertSToF %157 %271
+ %273 = OpFDiv %157 %272 %259
+ %274 = OpFAdd %157 %255 %273
+ OpStore %254 %274
+ OpBranch %269
+ %275 = OpLabel
+ %276 = OpAccessChain %245 %243 %244
+ %277 = OpLoad %157 %276
+ %278 = OpConvertFToS %6 %277
+ %280 = OpSLessThan %31 %278 %279
+ OpSelectionMerge %282 None
+ OpBranchConditional %280 %281 %288
+ %281 = OpLabel
+ %283 = OpAccessChain %43 %41 %136
+ %284 = OpLoad %6 %283
+ %285 = OpConvertSToF %157 %284
+ %286 = OpFDiv %157 %285 %259
+ %287 = OpFAdd %157 %255 %286
+ OpStore %254 %287
+ OpBranch %282
+ %288 = OpLabel
+ %289 = OpAccessChain %245 %243 %244
+ %290 = OpLoad %157 %289
+ %291 = OpConvertFToS %6 %290
+ %293 = OpSLessThan %31 %291 %292
+ OpSelectionMerge %295 None
+ OpBranchConditional %293 %294 %301
+ %294 = OpLabel
+ %296 = OpAccessChain %43 %41 %188
+ %297 = OpLoad %6 %296
+ %298 = OpConvertSToF %157 %297
+ %299 = OpFDiv %157 %298 %259
+ %300 = OpFAdd %157 %255 %299
+ OpStore %254 %300
+ OpBranch %295
+ %301 = OpLabel
+ %302 = OpAccessChain %245 %243 %244
+ %303 = OpLoad %157 %302
+ %304 = OpConvertFToS %6 %303
+ %306 = OpSLessThan %31 %304 %305
+ OpSelectionMerge %308 None
+ OpBranchConditional %306 %307 %323
+ %307 = OpLabel
+ OpStore %309 %22
+ OpBranch %310
+ %310 = OpLabel
+ OpLoopMerge %312 %313 None
+ OpBranch %314
+ %314 = OpLabel
+ %315 = OpLoad %6 %309
+ %316 = OpAccessChain %163 %161 %105 %162
+ %317 = OpLoad %157 %316
+ %318 = OpConvertFToS %6 %317
+ %319 = OpSGreaterThan %31 %315 %318
+ OpBranchConditional %319 %311 %312
+ %311 = OpLabel
+ OpKill
+ %313 = OpLabel
+ OpBranch %310
+ %312 = OpLabel
+ OpBranch %308
+ %323 = OpLabel
+ %324 = OpAccessChain %245 %243 %244
+ %325 = OpLoad %157 %324
+ %326 = OpConvertFToS %6 %325
+ %328 = OpSLessThan %31 %326 %327
+ OpSelectionMerge %330 None
+ OpBranchConditional %328 %329 %337
+ %329 = OpLabel
+ %332 = OpAccessChain %43 %41 %331
+ %333 = OpLoad %6 %332
+ %334 = OpConvertSToF %157 %333
+ %335 = OpFDiv %157 %334 %259
+ %336 = OpFAdd %157 %255 %335
+ OpStore %254 %336
+ OpBranch %330
+ %337 = OpLabel
+ %338 = OpAccessChain %245 %243 %244
+ %339 = OpLoad %157 %338
+ %340 = OpConvertFToS %6 %339
+ %342 = OpSLessThan %31 %340 %341
+ OpSelectionMerge %344 None
+ OpBranchConditional %342 %343 %351
+ %343 = OpLabel
+ %346 = OpAccessChain %43 %41 %345
+ %347 = OpLoad %6 %346
+ %348 = OpConvertSToF %157 %347
+ %349 = OpFDiv %157 %348 %259
+ %350 = OpFAdd %157 %255 %349
+ OpStore %254 %350
+ OpBranch %344
+ %351 = OpLabel
+ %352 = OpAccessChain %245 %243 %244
+ %353 = OpLoad %157 %352
+ %354 = OpConvertFToS %6 %353
+ %356 = OpSLessThan %31 %354 %355
+ OpSelectionMerge %358 None
+ OpBranchConditional %356 %357 %365
+ %357 = OpLabel
+ %360 = OpAccessChain %43 %41 %359
+ %361 = OpLoad %6 %360
+ %362 = OpConvertSToF %157 %361
+ %363 = OpFDiv %157 %362 %259
+ %364 = OpFAdd %157 %255 %363
+ OpStore %254 %364
+ OpBranch %358
+ %365 = OpLabel
+ %366 = OpAccessChain %245 %243 %244
+ %367 = OpLoad %157 %366
+ %368 = OpConvertFToS %6 %367
+ %370 = OpSLessThan %31 %368 %369
+ OpSelectionMerge %372 None
+ OpBranchConditional %370 %371 %379
+ %371 = OpLabel
+ %374 = OpAccessChain %43 %41 %373
+ %375 = OpLoad %6 %374
+ %376 = OpConvertSToF %157 %375
+ %377 = OpFDiv %157 %376 %259
+ %378 = OpFAdd %157 %255 %377
+ OpStore %254 %378
+ OpBranch %372
+ %379 = OpLabel
+ OpKill
+ %372 = OpLabel
+ OpBranch %358
+ %358 = OpLabel
+ OpBranch %344
+ %344 = OpLabel
+ OpBranch %330
+ %330 = OpLabel
+ OpBranch %308
+ %308 = OpLabel
+ OpBranch %295
+ %295 = OpLabel
+ OpBranch %282
+ %282 = OpLabel
+ OpBranch %269
+ %269 = OpLabel
+ OpBranch %252
+ %252 = OpLabel
+ %383 = OpLoad %157 %254
+ %385 = OpCompositeConstruct %384 %383 %383 %383
+ %387 = OpCompositeExtract %157 %385 0
+ %388 = OpCompositeExtract %157 %385 1
+ %389 = OpCompositeExtract %157 %385 2
+ %390 = OpCompositeConstruct %241 %387 %388 %389 %386
+ OpStore %382 %390
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %2 None %8
+ %9 = OpFunctionParameter %7
+ %10 = OpFunctionParameter %7
+ %11 = OpFunctionParameter %7
+ %13 = OpLabel
+ %16 = OpVariable %7 Function
+ %18 = OpVariable %7 Function
+ %20 = OpVariable %7 Function
+ %87 = OpVariable %7 Function
+ %17 = OpLoad %6 %9
+ OpStore %16 %17
+ %19 = OpLoad %6 %9
+ OpStore %18 %19
+ %21 = OpLoad %6 %10
+ %23 = OpIAdd %6 %21 %22
+ OpStore %20 %23
+ OpBranch %24
+ %24 = OpLabel
+ OpLoopMerge %26 %27 None
+ OpBranch %28
+ %28 = OpLabel
+ %29 = OpLoad %6 %18
+ %30 = OpLoad %6 %10
+ %32 = OpSLessThanEqual %31 %29 %30
+ %33 = OpLoad %6 %20
+ %34 = OpLoad %6 %11
+ %35 = OpSLessThanEqual %31 %33 %34
+ %36 = OpLogicalAnd %31 %32 %35
+ OpBranchConditional %36 %25 %26
+ %25 = OpLabel
+ %42 = OpLoad %6 %18
+ %44 = OpAccessChain %43 %41 %42
+ %45 = OpLoad %6 %44
+ %46 = OpLoad %6 %20
+ %47 = OpAccessChain %43 %41 %46
+ %48 = OpLoad %6 %47
+ %49 = OpSLessThan %31 %45 %48
+ OpSelectionMerge %51 None
+ OpBranchConditional %49 %50 %60
+ %50 = OpLabel
+ %53 = OpLoad %6 %16
+ %54 = OpIAdd %6 %53 %22
+ OpStore %16 %54
+ %55 = OpLoad %6 %18
+ %56 = OpIAdd %6 %55 %22
+ OpStore %18 %56
+ %57 = OpAccessChain %43 %41 %55
+ %58 = OpLoad %6 %57
+ %59 = OpAccessChain %43 %52 %53
+ OpStore %59 %58
+ OpBranch %51
+ %60 = OpLabel
+ %61 = OpLoad %6 %16
+ %62 = OpIAdd %6 %61 %22
+ OpStore %16 %62
+ %63 = OpLoad %6 %20
+ %64 = OpIAdd %6 %63 %22
+ OpStore %20 %64
+ %65 = OpAccessChain %43 %41 %63
+ %66 = OpLoad %6 %65
+ %67 = OpAccessChain %43 %52 %61
+ OpStore %67 %66
+ OpBranch %51
+ %51 = OpLabel
+ OpBranch %27
+ %27 = OpLabel
+ OpBranch %24
+ %26 = OpLabel
+ OpBranch %68
+ %68 = OpLabel
+ OpLoopMerge %70 %71 None
+ OpBranch %72
+ %72 = OpLabel
+ %73 = OpLoad %6 %18
+ %75 = OpSLessThan %31 %73 %74
+ %76 = OpLoad %6 %18
+ %77 = OpLoad %6 %10
+ %78 = OpSLessThanEqual %31 %76 %77
+ %79 = OpLogicalAnd %31 %75 %78
+ OpBranchConditional %79 %69 %70
+ %69 = OpLabel
+ %80 = OpLoad %6 %16
+ %81 = OpIAdd %6 %80 %22
+ OpStore %16 %81
+ %82 = OpLoad %6 %18
+ %83 = OpIAdd %6 %82 %22
+ OpStore %18 %83
+ %84 = OpAccessChain %43 %41 %82
+ %85 = OpLoad %6 %84
+ %86 = OpAccessChain %43 %52 %80
+ OpStore %86 %85
+ OpBranch %71
+ %71 = OpLabel
+ OpBranch %68
+ %70 = OpLabel
+ %88 = OpLoad %6 %9
+ OpStore %87 %88
+ OpBranch %89
+ %89 = OpLabel
+ OpLoopMerge %91 %92 None
+ OpBranch %93
+ %93 = OpLabel
+ %94 = OpLoad %6 %87
+ %95 = OpLoad %6 %11
+ %96 = OpSLessThanEqual %31 %94 %95
+ OpBranchConditional %96 %90 %91
+ %90 = OpLabel
+ %97 = OpLoad %6 %87
+ %98 = OpLoad %6 %87
+ %99 = OpAccessChain %43 %52 %98
+ %100 = OpLoad %6 %99
+ %101 = OpAccessChain %43 %41 %97
+ OpStore %101 %100
+ OpBranch %92
+ %92 = OpLabel
+ %102 = OpLoad %6 %87
+ %103 = OpIAdd %6 %102 %22
+ OpStore %87 %103
+ OpBranch %89
+ %91 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %14 = OpFunction %2 None %3
+ %15 = OpLabel
+ %104 = OpVariable %7 Function
+ %106 = OpVariable %7 Function
+ %108 = OpVariable %7 Function
+ %117 = OpVariable %7 Function
+ %127 = OpVariable %7 Function
+ %129 = OpVariable %7 Function
+ %134 = OpVariable %7 Function
+ %143 = OpVariable %7 Function
+ %145 = OpVariable %7 Function
+ %147 = OpVariable %7 Function
+ OpStore %104 %105
+ OpStore %106 %107
+ OpStore %108 %22
+ OpBranch %109
+ %109 = OpLabel
+ OpLoopMerge %111 %112 None
+ OpBranch %113
+ %113 = OpLabel
+ %114 = OpLoad %6 %108
+ %115 = OpLoad %6 %106
+ %116 = OpSLessThanEqual %31 %114 %115
+ OpBranchConditional %116 %110 %111
+ %110 = OpLabel
+ %118 = OpLoad %6 %104
+ OpStore %117 %118
+ OpBranch %119
+ %119 = OpLabel
+ OpLoopMerge %121 %122 None
+ OpBranch %123
+ %123 = OpLabel
+ %124 = OpLoad %6 %117
+ %125 = OpLoad %6 %106
+ %126 = OpSLessThan %31 %124 %125
+ OpBranchConditional %126 %120 %121
+ %120 = OpLabel
+ %128 = OpLoad %6 %117
+ OpStore %127 %128
+ %130 = OpLoad %6 %117
+ %131 = OpLoad %6 %108
+ %132 = OpIAdd %6 %130 %131
+ %133 = OpISub %6 %132 %22
+ OpStore %129 %133
+ %135 = OpLoad %6 %117
+ %137 = OpLoad %6 %108
+ %138 = OpIMul %6 %136 %137
+ %139 = OpIAdd %6 %135 %138
+ %140 = OpISub %6 %139 %22
+ %141 = OpLoad %6 %106
+ %142 = OpExtInst %6 %1 SMin %140 %141
+ OpStore %134 %142
+ %144 = OpLoad %6 %127
+ OpStore %143 %144
+ %146 = OpLoad %6 %129
+ OpStore %145 %146
+ %148 = OpLoad %6 %134
+ OpStore %147 %148
+ %149 = OpFunctionCall %2 %12 %143 %145 %147
+ OpBranch %122
+ %122 = OpLabel
+ %150 = OpLoad %6 %108
+ %151 = OpIMul %6 %136 %150
+ %152 = OpLoad %6 %117
+ %153 = OpIAdd %6 %152 %151
+ OpStore %117 %153
+ OpBranch %119
+ %121 = OpLabel
+ OpBranch %112
+ %112 = OpLabel
+ %154 = OpLoad %6 %108
+ %155 = OpIMul %6 %136 %154
+ OpStore %108 %155
+ OpBranch %109
+ %111 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-triangle-array-nested-loop.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-triangle-array-nested-loop.amber
new file mode 100644
index 0000000..729d6b3
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-triangle-array-nested-loop.amber
@@ -0,0 +1,896 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with array and nested loops
+
+# The test passes because both shaders render the same image.
+
+# Optimized using spirv-opt with the following arguments:
+# '--private-to-local'
+# '--copy-propagate-arrays'
+# '--if-conversion'
+# '--private-to-local'
+# '--eliminate-dead-inserts'
+# '--if-conversion'
+# '--if-conversion'
+# '--scalar-replacement=100'
+# '--private-to-local'
+# '--reduce-load-size'
+# '--ccp'
+# '--scalar-replacement=100'
+# '--eliminate-dead-branches'
+# '--eliminate-dead-branches'
+# '--merge-return'
+# '--private-to-local'
+# '--redundancy-elimination'
+# '--combine-access-chains'
+# '--eliminate-local-multi-store'
+# '--ccp'
+# '--convert-local-access-chains'
+# '--reduce-load-size'
+# '--private-to-local'
+# '--vector-dce'
+# spirv-opt commit hash: 230f363e6da32791f640b02205e0645cc67c3f1d
+
+
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 resolution;
+# };
+# float cross2d(vec2 a, vec2 b)
+# {
+# return ((a.x) * (b.y) - (b.x) * (a.y));
+# }
+# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c)
+# {
+# float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y));
+# float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y));
+# if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0)))
+# {
+# return 0;
+# }
+# float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y));
+# if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0)))
+# {
+# return 0;
+# }
+# return 1;
+# }
+# void main()
+# {
+# vec2 pos = gl_FragCoord.xy / resolution;
+# if (pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, 0.4)) == 1)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 0.0, 1.0);
+# }
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 207
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %162 %191
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "cross2d(vf2;vf2;"
+ OpName %10 "a"
+ OpName %11 "b"
+ OpName %20 "pointInTriangle(vf2;vf2;vf2;vf2;"
+ OpName %16 "p"
+ OpName %17 "a"
+ OpName %18 "b"
+ OpName %19 "c"
+ OpName %39 "pab"
+ OpName %62 "param"
+ OpName %63 "param"
+ OpName %65 "pbc"
+ OpName %88 "param"
+ OpName %89 "param"
+ OpName %112 "pca"
+ OpName %135 "param"
+ OpName %136 "param"
+ OpName %159 "pos"
+ OpName %162 "gl_FragCoord"
+ OpName %165 "buf0"
+ OpMemberName %165 0 "resolution"
+ OpName %167 ""
+ OpName %181 "param"
+ OpName %183 "param"
+ OpName %184 "param"
+ OpName %185 "param"
+ OpName %191 "_GLF_color"
+ OpDecorate %162 BuiltIn FragCoord
+ OpMemberDecorate %165 0 Offset 0
+ OpDecorate %165 Block
+ OpDecorate %167 DescriptorSet 0
+ OpDecorate %167 Binding 0
+ OpDecorate %191 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %9 = OpTypeFunction %6 %8 %8
+ %14 = OpTypeInt 32 1
+ %15 = OpTypeFunction %14 %8 %8 %8 %8
+ %22 = OpTypeInt 32 0
+ %23 = OpConstant %22 0
+ %24 = OpTypePointer Function %6
+ %27 = OpConstant %22 1
+ %91 = OpTypeBool
+ %93 = OpConstant %6 0
+ %110 = OpConstant %14 0
+ %156 = OpConstant %14 1
+ %160 = OpTypeVector %6 4
+ %161 = OpTypePointer Input %160
+ %162 = OpVariable %161 Input
+ %165 = OpTypeStruct %7
+ %166 = OpTypePointer Uniform %165
+ %167 = OpVariable %166 Uniform
+ %168 = OpTypePointer Uniform %7
+ %172 = OpConstant %6 0.699999988
+ %173 = OpConstant %6 0.300000012
+ %174 = OpConstantComposite %7 %172 %173
+ %175 = OpConstant %6 0.5
+ %176 = OpConstant %6 0.899999976
+ %177 = OpConstantComposite %7 %175 %176
+ %178 = OpConstant %6 0.100000001
+ %179 = OpConstant %6 0.400000006
+ %180 = OpConstantComposite %7 %178 %179
+ %190 = OpTypePointer Output %160
+ %191 = OpVariable %190 Output
+ %192 = OpConstant %6 1
+ %193 = OpConstantComposite %160 %192 %93 %93 %192
+ %195 = OpConstantComposite %160 %93 %93 %93 %192
+ %197 = OpTypePointer Function %14
+ %201 = OpConstantFalse %91
+ %202 = OpTypePointer Function %91
+ %204 = OpConstantTrue %91
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %159 = OpVariable %8 Function
+ %181 = OpVariable %8 Function
+ %183 = OpVariable %8 Function
+ %184 = OpVariable %8 Function
+ %185 = OpVariable %8 Function
+ %163 = OpLoad %160 %162
+ %164 = OpVectorShuffle %7 %163 %163 0 1
+ %169 = OpAccessChain %168 %167 %110
+ %170 = OpLoad %7 %169
+ %171 = OpFDiv %7 %164 %170
+ OpStore %159 %171
+ OpStore %181 %171
+ OpStore %183 %174
+ OpStore %184 %177
+ OpStore %185 %180
+ %186 = OpFunctionCall %14 %20 %181 %183 %184 %185
+ %187 = OpIEqual %91 %186 %156
+ OpSelectionMerge %189 None
+ OpBranchConditional %187 %188 %194
+ %188 = OpLabel
+ OpStore %191 %193
+ OpBranch %189
+ %194 = OpLabel
+ OpStore %191 %195
+ OpBranch %189
+ %189 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %6 None %9
+ %10 = OpFunctionParameter %8
+ %11 = OpFunctionParameter %8
+ %13 = OpLabel
+ %25 = OpAccessChain %24 %10 %23
+ %26 = OpLoad %6 %25
+ %28 = OpAccessChain %24 %11 %27
+ %29 = OpLoad %6 %28
+ %30 = OpFMul %6 %26 %29
+ %31 = OpAccessChain %24 %11 %23
+ %32 = OpLoad %6 %31
+ %33 = OpAccessChain %24 %10 %27
+ %34 = OpLoad %6 %33
+ %35 = OpFMul %6 %32 %34
+ %36 = OpFSub %6 %30 %35
+ OpReturnValue %36
+ OpFunctionEnd
+ %20 = OpFunction %14 None %15
+ %16 = OpFunctionParameter %8
+ %17 = OpFunctionParameter %8
+ %18 = OpFunctionParameter %8
+ %19 = OpFunctionParameter %8
+ %21 = OpLabel
+ %203 = OpVariable %202 Function %201
+ %198 = OpVariable %197 Function
+ %39 = OpVariable %24 Function
+ %62 = OpVariable %8 Function
+ %63 = OpVariable %8 Function
+ %65 = OpVariable %24 Function
+ %88 = OpVariable %8 Function
+ %89 = OpVariable %8 Function
+ %112 = OpVariable %24 Function
+ %135 = OpVariable %8 Function
+ %136 = OpVariable %8 Function
+ OpSelectionMerge %196 None
+ OpSwitch %23 %200
+ %200 = OpLabel
+ %40 = OpAccessChain %24 %16 %23
+ %41 = OpLoad %6 %40
+ %42 = OpAccessChain %24 %17 %23
+ %43 = OpLoad %6 %42
+ %44 = OpFSub %6 %41 %43
+ %45 = OpAccessChain %24 %16 %27
+ %46 = OpLoad %6 %45
+ %47 = OpAccessChain %24 %17 %27
+ %48 = OpLoad %6 %47
+ %49 = OpFSub %6 %46 %48
+ %50 = OpCompositeConstruct %7 %44 %49
+ %51 = OpAccessChain %24 %18 %23
+ %52 = OpLoad %6 %51
+ %54 = OpLoad %6 %42
+ %55 = OpFSub %6 %52 %54
+ %56 = OpAccessChain %24 %18 %27
+ %57 = OpLoad %6 %56
+ %59 = OpLoad %6 %47
+ %60 = OpFSub %6 %57 %59
+ %61 = OpCompositeConstruct %7 %55 %60
+ OpStore %62 %50
+ OpStore %63 %61
+ %64 = OpFunctionCall %6 %12 %62 %63
+ OpStore %39 %64
+ %67 = OpLoad %6 %40
+ %69 = OpLoad %6 %51
+ %70 = OpFSub %6 %67 %69
+ %72 = OpLoad %6 %45
+ %74 = OpLoad %6 %56
+ %75 = OpFSub %6 %72 %74
+ %76 = OpCompositeConstruct %7 %70 %75
+ %77 = OpAccessChain %24 %19 %23
+ %78 = OpLoad %6 %77
+ %80 = OpLoad %6 %51
+ %81 = OpFSub %6 %78 %80
+ %82 = OpAccessChain %24 %19 %27
+ %83 = OpLoad %6 %82
+ %85 = OpLoad %6 %56
+ %86 = OpFSub %6 %83 %85
+ %87 = OpCompositeConstruct %7 %81 %86
+ OpStore %88 %76
+ OpStore %89 %87
+ %90 = OpFunctionCall %6 %12 %88 %89
+ OpStore %65 %90
+ %94 = OpFOrdLessThan %91 %64 %93
+ %96 = OpFOrdLessThan %91 %90 %93
+ %97 = OpLogicalAnd %91 %94 %96
+ %98 = OpLogicalNot %91 %97
+ OpSelectionMerge %100 None
+ OpBranchConditional %98 %99 %100
+ %99 = OpLabel
+ %102 = OpFOrdGreaterThanEqual %91 %64 %93
+ %104 = OpFOrdGreaterThanEqual %91 %90 %93
+ %105 = OpLogicalAnd %91 %102 %104
+ OpBranch %100
+ %100 = OpLabel
+ %106 = OpPhi %91 %97 %200 %105 %99
+ %107 = OpLogicalNot %91 %106
+ OpSelectionMerge %109 None
+ OpBranchConditional %107 %108 %109
+ %108 = OpLabel
+ OpStore %203 %204
+ OpStore %198 %110
+ OpBranch %196
+ %109 = OpLabel
+ %114 = OpLoad %6 %40
+ %116 = OpLoad %6 %77
+ %117 = OpFSub %6 %114 %116
+ %119 = OpLoad %6 %45
+ %121 = OpLoad %6 %82
+ %122 = OpFSub %6 %119 %121
+ %123 = OpCompositeConstruct %7 %117 %122
+ %125 = OpLoad %6 %42
+ %127 = OpLoad %6 %77
+ %128 = OpFSub %6 %125 %127
+ %130 = OpLoad %6 %47
+ %132 = OpLoad %6 %82
+ %133 = OpFSub %6 %130 %132
+ %134 = OpCompositeConstruct %7 %128 %133
+ OpStore %135 %123
+ OpStore %136 %134
+ %137 = OpFunctionCall %6 %12 %135 %136
+ OpStore %112 %137
+ %139 = OpFOrdLessThan %91 %64 %93
+ %141 = OpFOrdLessThan %91 %137 %93
+ %142 = OpLogicalAnd %91 %139 %141
+ %143 = OpLogicalNot %91 %142
+ OpSelectionMerge %145 None
+ OpBranchConditional %143 %144 %145
+ %144 = OpLabel
+ %147 = OpFOrdGreaterThanEqual %91 %64 %93
+ %149 = OpFOrdGreaterThanEqual %91 %137 %93
+ %150 = OpLogicalAnd %91 %147 %149
+ OpBranch %145
+ %145 = OpLabel
+ %151 = OpPhi %91 %142 %109 %150 %144
+ %152 = OpLogicalNot %91 %151
+ OpSelectionMerge %154 None
+ OpBranchConditional %152 %153 %154
+ %153 = OpLabel
+ OpStore %203 %204
+ OpStore %198 %110
+ OpBranch %196
+ %154 = OpLabel
+ OpStore %203 %204
+ OpStore %198 %156
+ OpBranch %196
+ %196 = OpLabel
+ %206 = OpPhi %14 %110 %108 %110 %153 %156 %154
+ OpReturnValue %206
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 resolution;
+# };
+# float cross2d(vec2 a, vec2 b)
+# {
+# return ((a.x) * (b.y) - (b.x) * (a.y));
+# }
+# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c)
+# {
+# const int array_size = 256;
+# int array_a[array_size];
+# float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y));
+# float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y));
+# if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0)))
+# {
+# // Injected live code block has no impact on rest of the code in the shader.
+# // Initialize array to known values.
+# for (int i = 0; i < array_size; i++)
+# {
+# array_a[i] = 0;
+# }
+# // Total loop iteration count: 6x4x4x4 = 384.
+# for (int int_a = 0; int_a < 6; )
+# {
+# int_a++;
+# int int_c = 1;
+# int int_h = 1;
+# int int_d = 0;
+# do
+# {
+# int_d++;
+# int int_e = 0;
+# for (int int_f = 0; int_f < 4; int_c++)
+# {
+# int_f++;
+# for (int int_g = 0; int_g < 4; int_e++)
+# {
+# int_g++;
+# if (array_a[clamp(int_e * 2 + 32, 0, array_size - 1)] == 0)
+# {
+# int_h = int_c;
+# }
+# }
+# }
+# array_a[clamp(1 + int_h * 16, 0, array_size - 1)] = 1;
+# } while (int_d < 4);
+# }
+# return 0;
+# }
+# float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y));
+# if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0)))
+# {
+# return 0;
+# }
+# return 1;
+# }
+# void main()
+# {
+# vec2 pos = gl_FragCoord.xy / resolution;
+# if (pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, 0.4)) == 1)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 0.0, 1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 318
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %247 %276
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %12 "cross2d(vf2;vf2;"
+ OpName %10 "a"
+ OpName %11 "b"
+ OpName %20 "pointInTriangle(vf2;vf2;vf2;vf2;"
+ OpName %16 "p"
+ OpName %17 "a"
+ OpName %18 "b"
+ OpName %19 "c"
+ OpName %39 "pab"
+ OpName %62 "param"
+ OpName %63 "param"
+ OpName %65 "pbc"
+ OpName %88 "param"
+ OpName %89 "param"
+ OpName %111 "i"
+ OpName %124 "array_a"
+ OpName %130 "int_a"
+ OpName %141 "int_c"
+ OpName %142 "int_h"
+ OpName %143 "int_d"
+ OpName %150 "int_e"
+ OpName %151 "int_f"
+ OpName %162 "int_g"
+ OpName %198 "pca"
+ OpName %221 "param"
+ OpName %222 "param"
+ OpName %244 "pos"
+ OpName %247 "gl_FragCoord"
+ OpName %250 "buf0"
+ OpMemberName %250 0 "resolution"
+ OpName %252 ""
+ OpName %266 "param"
+ OpName %268 "param"
+ OpName %269 "param"
+ OpName %270 "param"
+ OpName %276 "_GLF_color"
+ OpDecorate %247 BuiltIn FragCoord
+ OpMemberDecorate %250 0 Offset 0
+ OpDecorate %250 Block
+ OpDecorate %252 DescriptorSet 0
+ OpDecorate %252 Binding 0
+ OpDecorate %276 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %9 = OpTypeFunction %6 %8 %8
+ %14 = OpTypeInt 32 1
+ %15 = OpTypeFunction %14 %8 %8 %8 %8
+ %22 = OpTypeInt 32 0
+ %23 = OpConstant %22 0
+ %24 = OpTypePointer Function %6
+ %27 = OpConstant %22 1
+ %91 = OpTypeBool
+ %93 = OpConstant %6 0
+ %110 = OpTypePointer Function %14
+ %112 = OpConstant %14 0
+ %119 = OpConstant %14 256
+ %121 = OpConstant %22 256
+ %122 = OpTypeArray %14 %121
+ %123 = OpTypePointer Function %122
+ %128 = OpConstant %14 1
+ %137 = OpConstant %14 6
+ %158 = OpConstant %14 4
+ %173 = OpConstant %14 2
+ %175 = OpConstant %14 32
+ %177 = OpConstant %14 255
+ %190 = OpConstant %14 16
+ %245 = OpTypeVector %6 4
+ %246 = OpTypePointer Input %245
+ %247 = OpVariable %246 Input
+ %250 = OpTypeStruct %7
+ %251 = OpTypePointer Uniform %250
+ %252 = OpVariable %251 Uniform
+ %253 = OpTypePointer Uniform %7
+ %257 = OpConstant %6 0.699999988
+ %258 = OpConstant %6 0.300000012
+ %259 = OpConstantComposite %7 %257 %258
+ %260 = OpConstant %6 0.5
+ %261 = OpConstant %6 0.899999976
+ %262 = OpConstantComposite %7 %260 %261
+ %263 = OpConstant %6 0.100000001
+ %264 = OpConstant %6 0.400000006
+ %265 = OpConstantComposite %7 %263 %264
+ %275 = OpTypePointer Output %245
+ %276 = OpVariable %275 Output
+ %277 = OpConstant %6 1
+ %278 = OpConstantComposite %245 %277 %93 %93 %277
+ %280 = OpConstantComposite %245 %93 %93 %93 %277
+ %285 = OpConstantFalse %91
+ %286 = OpTypePointer Function %91
+ %288 = OpConstantTrue %91
+ %317 = OpConstant %14 17
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %244 = OpVariable %8 Function
+ %266 = OpVariable %8 Function
+ %268 = OpVariable %8 Function
+ %269 = OpVariable %8 Function
+ %270 = OpVariable %8 Function
+ %248 = OpLoad %245 %247
+ %249 = OpVectorShuffle %7 %248 %248 0 1
+ %254 = OpAccessChain %253 %252 %112
+ %255 = OpLoad %7 %254
+ %256 = OpFDiv %7 %249 %255
+ OpStore %244 %256
+ OpStore %266 %256
+ OpStore %268 %259
+ OpStore %269 %262
+ OpStore %270 %265
+ %271 = OpFunctionCall %14 %20 %266 %268 %269 %270
+ %272 = OpIEqual %91 %271 %128
+ OpSelectionMerge %274 None
+ OpBranchConditional %272 %273 %279
+ %273 = OpLabel
+ OpStore %276 %278
+ OpBranch %274
+ %279 = OpLabel
+ OpStore %276 %280
+ OpBranch %274
+ %274 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %12 = OpFunction %6 None %9
+ %10 = OpFunctionParameter %8
+ %11 = OpFunctionParameter %8
+ %13 = OpLabel
+ %25 = OpAccessChain %24 %10 %23
+ %26 = OpLoad %6 %25
+ %28 = OpAccessChain %24 %11 %27
+ %29 = OpLoad %6 %28
+ %30 = OpFMul %6 %26 %29
+ %31 = OpAccessChain %24 %11 %23
+ %32 = OpLoad %6 %31
+ %33 = OpAccessChain %24 %10 %27
+ %34 = OpLoad %6 %33
+ %35 = OpFMul %6 %32 %34
+ %36 = OpFSub %6 %30 %35
+ OpReturnValue %36
+ OpFunctionEnd
+ %20 = OpFunction %14 None %15
+ %16 = OpFunctionParameter %8
+ %17 = OpFunctionParameter %8
+ %18 = OpFunctionParameter %8
+ %19 = OpFunctionParameter %8
+ %21 = OpLabel
+ %287 = OpVariable %286 Function %285
+ %282 = OpVariable %110 Function
+ %39 = OpVariable %24 Function
+ %62 = OpVariable %8 Function
+ %63 = OpVariable %8 Function
+ %65 = OpVariable %24 Function
+ %88 = OpVariable %8 Function
+ %89 = OpVariable %8 Function
+ %111 = OpVariable %110 Function
+ %124 = OpVariable %123 Function
+ %130 = OpVariable %110 Function
+ %141 = OpVariable %110 Function
+ %142 = OpVariable %110 Function
+ %143 = OpVariable %110 Function
+ %150 = OpVariable %110 Function
+ %151 = OpVariable %110 Function
+ %162 = OpVariable %110 Function
+ %198 = OpVariable %24 Function
+ %221 = OpVariable %8 Function
+ %222 = OpVariable %8 Function
+ OpSelectionMerge %281 None
+ OpSwitch %23 %284
+ %284 = OpLabel
+ %40 = OpAccessChain %24 %16 %23
+ %41 = OpLoad %6 %40
+ %42 = OpAccessChain %24 %17 %23
+ %43 = OpLoad %6 %42
+ %44 = OpFSub %6 %41 %43
+ %45 = OpAccessChain %24 %16 %27
+ %46 = OpLoad %6 %45
+ %47 = OpAccessChain %24 %17 %27
+ %48 = OpLoad %6 %47
+ %49 = OpFSub %6 %46 %48
+ %50 = OpCompositeConstruct %7 %44 %49
+ %51 = OpAccessChain %24 %18 %23
+ %52 = OpLoad %6 %51
+ %54 = OpLoad %6 %42
+ %55 = OpFSub %6 %52 %54
+ %56 = OpAccessChain %24 %18 %27
+ %57 = OpLoad %6 %56
+ %59 = OpLoad %6 %47
+ %60 = OpFSub %6 %57 %59
+ %61 = OpCompositeConstruct %7 %55 %60
+ OpStore %62 %50
+ OpStore %63 %61
+ %64 = OpFunctionCall %6 %12 %62 %63
+ OpStore %39 %64
+ %67 = OpLoad %6 %40
+ %69 = OpLoad %6 %51
+ %70 = OpFSub %6 %67 %69
+ %72 = OpLoad %6 %45
+ %74 = OpLoad %6 %56
+ %75 = OpFSub %6 %72 %74
+ %76 = OpCompositeConstruct %7 %70 %75
+ %77 = OpAccessChain %24 %19 %23
+ %78 = OpLoad %6 %77
+ %80 = OpLoad %6 %51
+ %81 = OpFSub %6 %78 %80
+ %82 = OpAccessChain %24 %19 %27
+ %83 = OpLoad %6 %82
+ %85 = OpLoad %6 %56
+ %86 = OpFSub %6 %83 %85
+ %87 = OpCompositeConstruct %7 %81 %86
+ OpStore %88 %76
+ OpStore %89 %87
+ %90 = OpFunctionCall %6 %12 %88 %89
+ OpStore %65 %90
+ %94 = OpFOrdLessThan %91 %64 %93
+ %96 = OpFOrdLessThan %91 %90 %93
+ %97 = OpLogicalAnd %91 %94 %96
+ %98 = OpLogicalNot %91 %97
+ OpSelectionMerge %100 None
+ OpBranchConditional %98 %99 %100
+ %99 = OpLabel
+ %102 = OpFOrdGreaterThanEqual %91 %64 %93
+ %104 = OpFOrdGreaterThanEqual %91 %90 %93
+ %105 = OpLogicalAnd %91 %102 %104
+ OpBranch %100
+ %100 = OpLabel
+ %106 = OpPhi %91 %97 %284 %105 %99
+ %107 = OpLogicalNot %91 %106
+ OpSelectionMerge %109 None
+ OpBranchConditional %107 %108 %109
+ %108 = OpLabel
+ OpStore %111 %112
+ OpBranch %113
+ %113 = OpLabel
+ %290 = OpPhi %14 %112 %108 %129 %116
+ OpLoopMerge %115 %116 None
+ OpBranch %117
+ %117 = OpLabel
+ %120 = OpSLessThan %91 %290 %119
+ OpBranchConditional %120 %114 %115
+ %114 = OpLabel
+ %126 = OpAccessChain %110 %124 %290
+ OpStore %126 %112
+ OpBranch %116
+ %116 = OpLabel
+ %129 = OpIAdd %14 %290 %128
+ OpStore %111 %129
+ OpBranch %113
+ %115 = OpLabel
+ OpStore %130 %112
+ OpBranch %131
+ %131 = OpLabel
+ %291 = OpPhi %14 %112 %115 %306 %134
+ OpLoopMerge %133 %134 None
+ OpBranch %135
+ %135 = OpLabel
+ %138 = OpSLessThan %91 %291 %137
+ OpBranchConditional %138 %132 %133
+ %132 = OpLabel
+ %140 = OpIAdd %14 %291 %128
+ OpStore %130 %140
+ OpStore %141 %128
+ OpStore %142 %128
+ OpStore %143 %112
+ OpBranch %144
+ %144 = OpLabel
+ %296 = OpPhi %14 %128 %132 %295 %147
+ %293 = OpPhi %14 %112 %132 %149 %147
+ %306 = OpPhi %14 %140 %132 %306 %147
+ %301 = OpPhi %14 %128 %132 %300 %147
+ OpLoopMerge %146 %147 None
+ OpBranch %145
+ %145 = OpLabel
+ %149 = OpIAdd %14 %293 %128
+ OpStore %143 %149
+ OpStore %150 %112
+ OpStore %151 %112
+ OpBranch %152
+ %152 = OpLabel
+ %300 = OpPhi %14 %301 %145 %188 %155
+ %295 = OpPhi %14 %296 %145 %311 %155
+ %294 = OpPhi %14 %112 %145 %161 %155
+ %303 = OpPhi %14 %112 %145 %302 %155
+ OpLoopMerge %154 %155 None
+ OpBranch %156
+ %156 = OpLabel
+ %159 = OpSLessThan %91 %294 %158
+ OpBranchConditional %159 %153 %154
+ %153 = OpLabel
+ %161 = OpIAdd %14 %294 %128
+ OpStore %151 %161
+ OpStore %162 %112
+ OpBranch %163
+ %163 = OpLabel
+ %302 = OpPhi %14 %303 %153 %186 %166
+ %298 = OpPhi %14 %112 %153 %171 %166
+ %311 = OpPhi %14 %295 %153 %312 %166
+ OpLoopMerge %165 %166 None
+ OpBranch %167
+ %167 = OpLabel
+ %169 = OpSLessThan %91 %298 %158
+ OpBranchConditional %169 %164 %165
+ %164 = OpLabel
+ %171 = OpIAdd %14 %298 %128
+ OpStore %162 %171
+ %174 = OpIMul %14 %302 %173
+ %176 = OpIAdd %14 %174 %175
+ %178 = OpExtInst %14 %1 SClamp %176 %112 %177
+ %179 = OpAccessChain %110 %124 %178
+ %180 = OpLoad %14 %179
+ %181 = OpIEqual %91 %180 %112
+ OpSelectionMerge %183 None
+ OpBranchConditional %181 %182 %183
+ %182 = OpLabel
+ OpStore %142 %300
+ OpBranch %183
+ %183 = OpLabel
+ %312 = OpPhi %14 %311 %164 %300 %182
+ OpBranch %166
+ %166 = OpLabel
+ %186 = OpIAdd %14 %302 %128
+ OpStore %150 %186
+ OpBranch %163
+ %165 = OpLabel
+ OpBranch %155
+ %155 = OpLabel
+ %188 = OpIAdd %14 %300 %128
+ OpStore %141 %188
+ OpBranch %152
+ %154 = OpLabel
+ %191 = OpIMul %14 %295 %190
+ %192 = OpIAdd %14 %128 %191
+ %193 = OpExtInst %14 %1 SClamp %192 %112 %177
+ %194 = OpAccessChain %110 %124 %193
+ OpStore %194 %128
+ OpBranch %147
+ %147 = OpLabel
+ %196 = OpSLessThan %91 %149 %158
+ OpBranchConditional %196 %144 %146
+ %146 = OpLabel
+ OpBranch %134
+ %134 = OpLabel
+ OpBranch %131
+ %133 = OpLabel
+ OpStore %287 %288
+ OpStore %282 %112
+ OpBranch %281
+ %109 = OpLabel
+ %200 = OpLoad %6 %40
+ %202 = OpLoad %6 %77
+ %203 = OpFSub %6 %200 %202
+ %205 = OpLoad %6 %45
+ %207 = OpLoad %6 %82
+ %208 = OpFSub %6 %205 %207
+ %209 = OpCompositeConstruct %7 %203 %208
+ %211 = OpLoad %6 %42
+ %213 = OpLoad %6 %77
+ %214 = OpFSub %6 %211 %213
+ %216 = OpLoad %6 %47
+ %218 = OpLoad %6 %82
+ %219 = OpFSub %6 %216 %218
+ %220 = OpCompositeConstruct %7 %214 %219
+ OpStore %221 %209
+ OpStore %222 %220
+ %223 = OpFunctionCall %6 %12 %221 %222
+ OpStore %198 %223
+ %225 = OpFOrdLessThan %91 %64 %93
+ %227 = OpFOrdLessThan %91 %223 %93
+ %228 = OpLogicalAnd %91 %225 %227
+ %229 = OpLogicalNot %91 %228
+ OpSelectionMerge %231 None
+ OpBranchConditional %229 %230 %231
+ %230 = OpLabel
+ %233 = OpFOrdGreaterThanEqual %91 %64 %93
+ %235 = OpFOrdGreaterThanEqual %91 %223 %93
+ %236 = OpLogicalAnd %91 %233 %235
+ OpBranch %231
+ %231 = OpLabel
+ %237 = OpPhi %91 %228 %109 %236 %230
+ %238 = OpLogicalNot %91 %237
+ OpSelectionMerge %240 None
+ OpBranchConditional %238 %239 %240
+ %239 = OpLabel
+ OpStore %287 %288
+ OpStore %282 %112
+ OpBranch %281
+ %240 = OpLabel
+ OpStore %287 %288
+ OpStore %282 %128
+ OpBranch %281
+ %281 = OpLabel
+ %292 = OpPhi %14 %112 %133 %112 %239 %128 %240
+ OpReturnValue %292
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if.amber
new file mode 100644
index 0000000..345efbd
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if.amber
@@ -0,0 +1,771 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by GraphicsFuzz.
+
+# Short description: A fragment shader with nested for loop and always true if
+
+# The test passes because both shaders render the same image.
+
+# Optimized using spirv-opt with the following arguments:
+# '--if-conversion'
+# '--eliminate-local-multi-store'
+# '--eliminate-dead-inserts'
+# '--scalar-replacement=100'
+# '--simplify-instructions'
+# '--reduce-load-size'
+# '--copy-propagate-arrays'
+# '--private-to-local'
+# '--ccp'
+# '--redundancy-elimination'
+# '--vector-dce'
+# '--eliminate-local-multi-store'
+# '--eliminate-dead-code-aggressive'
+# '--private-to-local'
+# '--convert-local-access-chains'
+# '--if-conversion'
+# '--inline-entry-points-exhaustive'
+# '--eliminate-dead-code-aggressive'
+# '--eliminate-local-single-block'
+# '--if-conversion'
+# spirv-opt commit hash: 230f363e6da32791f640b02205e0645cc67c3f1d
+
+
+
+SHADER vertex reference_vertex_shader PASSTHROUGH
+
+# reference_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 resolution;
+# };
+# float cross2d(vec2 a, vec2 b)
+# {
+# return ((a.x) * (b.y) - (b.x) * (a.y));
+# }
+# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c)
+# {
+# float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y));
+# float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y));
+# if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0)))
+# {
+# return 0;
+# }
+# float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y));
+# if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0)))
+# {
+# return 0;
+# }
+# return 1;
+# }
+# void main()
+# {
+# vec2 pos = gl_FragCoord.xy / resolution;
+# if (pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, 0.4)) == 1)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 0.0, 1.0);
+# }
+# }
+SHADER fragment reference_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 236
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %162 %191
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %20 "pointInTriangle(vf2;vf2;vf2;vf2;"
+ OpName %16 "p"
+ OpName %17 "a"
+ OpName %18 "b"
+ OpName %19 "c"
+ OpName %62 "param"
+ OpName %63 "param"
+ OpName %88 "param"
+ OpName %89 "param"
+ OpName %135 "param"
+ OpName %136 "param"
+ OpName %162 "gl_FragCoord"
+ OpName %165 "buf0"
+ OpMemberName %165 0 "resolution"
+ OpName %167 ""
+ OpName %181 "param"
+ OpName %183 "param"
+ OpName %184 "param"
+ OpName %185 "param"
+ OpName %191 "_GLF_color"
+ OpDecorate %162 BuiltIn FragCoord
+ OpMemberDecorate %165 0 Offset 0
+ OpDecorate %165 Block
+ OpDecorate %167 DescriptorSet 0
+ OpDecorate %167 Binding 0
+ OpDecorate %191 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %14 = OpTypeInt 32 1
+ %15 = OpTypeFunction %14 %8 %8 %8 %8
+ %22 = OpTypeInt 32 0
+ %23 = OpConstant %22 0
+ %24 = OpTypePointer Function %6
+ %27 = OpConstant %22 1
+ %91 = OpTypeBool
+ %93 = OpConstant %6 0
+ %110 = OpConstant %14 0
+ %156 = OpConstant %14 1
+ %160 = OpTypeVector %6 4
+ %161 = OpTypePointer Input %160
+ %162 = OpVariable %161 Input
+ %165 = OpTypeStruct %7
+ %166 = OpTypePointer Uniform %165
+ %167 = OpVariable %166 Uniform
+ %168 = OpTypePointer Uniform %7
+ %172 = OpConstant %6 0.699999988
+ %173 = OpConstant %6 0.300000012
+ %174 = OpConstantComposite %7 %172 %173
+ %175 = OpConstant %6 0.5
+ %176 = OpConstant %6 0.899999976
+ %177 = OpConstantComposite %7 %175 %176
+ %178 = OpConstant %6 0.100000001
+ %179 = OpConstant %6 0.400000006
+ %180 = OpConstantComposite %7 %178 %179
+ %190 = OpTypePointer Output %160
+ %191 = OpVariable %190 Output
+ %192 = OpConstant %6 1
+ %193 = OpConstantComposite %160 %192 %93 %93 %192
+ %195 = OpConstantComposite %160 %93 %93 %93 %192
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %181 = OpVariable %8 Function
+ %183 = OpVariable %8 Function
+ %184 = OpVariable %8 Function
+ %185 = OpVariable %8 Function
+ %163 = OpLoad %160 %162
+ %164 = OpVectorShuffle %7 %163 %163 0 1
+ %169 = OpAccessChain %168 %167 %110
+ %170 = OpLoad %7 %169
+ %171 = OpFDiv %7 %164 %170
+ OpStore %181 %171
+ OpStore %183 %174
+ OpStore %184 %177
+ OpStore %185 %180
+ %186 = OpFunctionCall %14 %20 %181 %183 %184 %185
+ %187 = OpIEqual %91 %186 %156
+ OpSelectionMerge %189 None
+ OpBranchConditional %187 %188 %194
+ %188 = OpLabel
+ OpStore %191 %193
+ OpBranch %189
+ %194 = OpLabel
+ OpStore %191 %195
+ OpBranch %189
+ %189 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %20 = OpFunction %14 None %15
+ %16 = OpFunctionParameter %8
+ %17 = OpFunctionParameter %8
+ %18 = OpFunctionParameter %8
+ %19 = OpFunctionParameter %8
+ %21 = OpLabel
+ %223 = OpVariable %24 Function
+ %210 = OpVariable %24 Function
+ %197 = OpVariable %24 Function
+ %62 = OpVariable %8 Function
+ %63 = OpVariable %8 Function
+ %88 = OpVariable %8 Function
+ %89 = OpVariable %8 Function
+ %135 = OpVariable %8 Function
+ %136 = OpVariable %8 Function
+ %40 = OpAccessChain %24 %16 %23
+ %41 = OpLoad %6 %40
+ %42 = OpAccessChain %24 %17 %23
+ %43 = OpLoad %6 %42
+ %44 = OpFSub %6 %41 %43
+ %45 = OpAccessChain %24 %16 %27
+ %46 = OpLoad %6 %45
+ %47 = OpAccessChain %24 %17 %27
+ %48 = OpLoad %6 %47
+ %49 = OpFSub %6 %46 %48
+ %50 = OpCompositeConstruct %7 %44 %49
+ %51 = OpAccessChain %24 %18 %23
+ %52 = OpLoad %6 %51
+ %54 = OpLoad %6 %42
+ %55 = OpFSub %6 %52 %54
+ %56 = OpAccessChain %24 %18 %27
+ %57 = OpLoad %6 %56
+ %59 = OpLoad %6 %47
+ %60 = OpFSub %6 %57 %59
+ %61 = OpCompositeConstruct %7 %55 %60
+ OpStore %62 %50
+ OpStore %63 %61
+ %199 = OpAccessChain %24 %62 %23
+ %200 = OpLoad %6 %199
+ %201 = OpAccessChain %24 %63 %27
+ %202 = OpLoad %6 %201
+ %203 = OpFMul %6 %200 %202
+ %204 = OpAccessChain %24 %63 %23
+ %205 = OpLoad %6 %204
+ %206 = OpAccessChain %24 %62 %27
+ %207 = OpLoad %6 %206
+ %208 = OpFMul %6 %205 %207
+ %209 = OpFSub %6 %203 %208
+ OpStore %197 %209
+ %67 = OpLoad %6 %40
+ %69 = OpLoad %6 %51
+ %70 = OpFSub %6 %67 %69
+ %72 = OpLoad %6 %45
+ %74 = OpLoad %6 %56
+ %75 = OpFSub %6 %72 %74
+ %76 = OpCompositeConstruct %7 %70 %75
+ %77 = OpAccessChain %24 %19 %23
+ %78 = OpLoad %6 %77
+ %80 = OpLoad %6 %51
+ %81 = OpFSub %6 %78 %80
+ %82 = OpAccessChain %24 %19 %27
+ %83 = OpLoad %6 %82
+ %85 = OpLoad %6 %56
+ %86 = OpFSub %6 %83 %85
+ %87 = OpCompositeConstruct %7 %81 %86
+ OpStore %88 %76
+ OpStore %89 %87
+ %212 = OpAccessChain %24 %88 %23
+ %213 = OpLoad %6 %212
+ %214 = OpAccessChain %24 %89 %27
+ %215 = OpLoad %6 %214
+ %216 = OpFMul %6 %213 %215
+ %217 = OpAccessChain %24 %89 %23
+ %218 = OpLoad %6 %217
+ %219 = OpAccessChain %24 %88 %27
+ %220 = OpLoad %6 %219
+ %221 = OpFMul %6 %218 %220
+ %222 = OpFSub %6 %216 %221
+ OpStore %210 %222
+ %94 = OpFOrdLessThan %91 %209 %93
+ %96 = OpFOrdLessThan %91 %222 %93
+ %97 = OpLogicalAnd %91 %94 %96
+ %98 = OpLogicalNot %91 %97
+ OpSelectionMerge %100 None
+ OpBranchConditional %98 %99 %100
+ %99 = OpLabel
+ %102 = OpFOrdGreaterThanEqual %91 %209 %93
+ %104 = OpFOrdGreaterThanEqual %91 %222 %93
+ %105 = OpLogicalAnd %91 %102 %104
+ OpBranch %100
+ %100 = OpLabel
+ %106 = OpPhi %91 %97 %21 %105 %99
+ %107 = OpLogicalNot %91 %106
+ OpSelectionMerge %109 None
+ OpBranchConditional %107 %108 %109
+ %108 = OpLabel
+ OpReturnValue %110
+ %109 = OpLabel
+ %114 = OpLoad %6 %40
+ %116 = OpLoad %6 %77
+ %117 = OpFSub %6 %114 %116
+ %119 = OpLoad %6 %45
+ %121 = OpLoad %6 %82
+ %122 = OpFSub %6 %119 %121
+ %123 = OpCompositeConstruct %7 %117 %122
+ %125 = OpLoad %6 %42
+ %127 = OpLoad %6 %77
+ %128 = OpFSub %6 %125 %127
+ %130 = OpLoad %6 %47
+ %132 = OpLoad %6 %82
+ %133 = OpFSub %6 %130 %132
+ %134 = OpCompositeConstruct %7 %128 %133
+ OpStore %135 %123
+ OpStore %136 %134
+ %225 = OpAccessChain %24 %135 %23
+ %226 = OpLoad %6 %225
+ %227 = OpAccessChain %24 %136 %27
+ %228 = OpLoad %6 %227
+ %229 = OpFMul %6 %226 %228
+ %230 = OpAccessChain %24 %136 %23
+ %231 = OpLoad %6 %230
+ %232 = OpAccessChain %24 %135 %27
+ %233 = OpLoad %6 %232
+ %234 = OpFMul %6 %231 %233
+ %235 = OpFSub %6 %229 %234
+ OpStore %223 %235
+ %141 = OpFOrdLessThan %91 %235 %93
+ %142 = OpLogicalAnd %91 %94 %141
+ %143 = OpLogicalNot %91 %142
+ OpSelectionMerge %145 None
+ OpBranchConditional %143 %144 %145
+ %144 = OpLabel
+ %147 = OpFOrdGreaterThanEqual %91 %209 %93
+ %149 = OpFOrdGreaterThanEqual %91 %235 %93
+ %150 = OpLogicalAnd %91 %147 %149
+ OpBranch %145
+ %145 = OpLabel
+ %151 = OpPhi %91 %142 %109 %150 %144
+ %152 = OpLogicalNot %91 %151
+ OpSelectionMerge %154 None
+ OpBranchConditional %152 %153 %154
+ %153 = OpLabel
+ OpReturnValue %110
+ %154 = OpLabel
+ OpReturnValue %156
+ OpFunctionEnd
+END
+
+# uniforms for reference
+
+# resolution
+BUFFER reference_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.0
+END
+
+BUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics reference_pipeline
+ ATTACH reference_vertex_shader
+ ATTACH reference_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER reference_framebuffer AS color LOCATION 0
+ BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+END
+CLEAR_COLOR reference_pipeline 0 0 0 255
+
+CLEAR reference_pipeline
+RUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# layout(set = 0, binding = 0) uniform buf0
+# {
+# vec2 resolution;
+# };
+# layout(set = 0, binding = 1) uniform buf1
+# {
+# vec2 injectionSwitch; // x == 0.0, y == 1.0
+# };
+#
+# void func()
+# {
+# vec4 vec4_a = vec4(1.0, 1.0, 1.0, 1.0);
+# // Iterates once.
+# for (int int_i = 0; int_i < int(injectionSwitch.y); int_i++)
+# {
+# // _GLF_color == 1.0, 1.0, 1.0, 1.0
+# _GLF_color = vec4_a;
+# // Iterates once.
+# for (int int_j = 0; int_j < int(injectionSwitch.y); int_j++)
+# {
+# // _GLF_color == 1.0, 1.0, 1.0, 1.0
+# _GLF_color = vec4_a;
+# }
+# }
+# }
+#
+# float cross2d(vec2 a, vec2 b)
+# {
+# return ((a.x) * (b.y) - (b.x) * (a.y));
+# }
+# int pointInTriangle(vec2 p, vec2 a, vec2 b, vec2 c)
+# {
+# float pab = cross2d(vec2(p.x - a.x, p.y - a.y), vec2(b.x - a.x, b.y - a.y));
+# float pbc = cross2d(vec2(p.x - b.x, p.y - b.y), vec2(c.x - b.x, c.y - b.y));
+# if (!((pab < 0.0 && pbc < 0.0) || (pab >= 0.0 && pbc >= 0.0)))
+# {
+# func();
+# return 0;
+# }
+# float pca = cross2d(vec2(p.x - c.x, p.y - c.y), vec2(a.x - c.x, a.y - c.y));
+# if (!((pab < 0.0 && pca < 0.0) || (pab >= 0.0 && pca >= 0.0)))
+# {
+# return 0;
+# }
+# return 1;
+# }
+# void main()
+# {
+# vec2 pos = gl_FragCoord.xy / resolution;
+# if (pointInTriangle(pos, vec2(0.7, 0.3), vec2(0.5, 0.9), vec2(0.1, 0.4)) == 1)
+# {
+# // Always true.
+# if ((injectionSwitch.y >= injectionSwitch.x))
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# }
+# else
+# {
+# _GLF_color = vec4(0.0, 0.0, 0.0, 1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 307
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %50 %204
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %22 "pointInTriangle(vf2;vf2;vf2;vf2;"
+ OpName %18 "p"
+ OpName %19 "a"
+ OpName %20 "b"
+ OpName %21 "c"
+ OpName %38 "buf1"
+ OpMemberName %38 0 "injectionSwitch"
+ OpName %40 ""
+ OpName %50 "_GLF_color"
+ OpName %107 "param"
+ OpName %108 "param"
+ OpName %133 "param"
+ OpName %134 "param"
+ OpName %179 "param"
+ OpName %180 "param"
+ OpName %204 "gl_FragCoord"
+ OpName %207 "buf0"
+ OpMemberName %207 0 "resolution"
+ OpName %209 ""
+ OpName %223 "param"
+ OpName %225 "param"
+ OpName %226 "param"
+ OpName %227 "param"
+ OpMemberDecorate %38 0 Offset 0
+ OpDecorate %38 Block
+ OpDecorate %40 DescriptorSet 0
+ OpDecorate %40 Binding 1
+ OpDecorate %50 Location 0
+ OpDecorate %204 BuiltIn FragCoord
+ OpMemberDecorate %207 0 Offset 0
+ OpDecorate %207 Block
+ OpDecorate %209 DescriptorSet 0
+ OpDecorate %209 Binding 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %8 = OpTypeFloat 32
+ %9 = OpTypeVector %8 2
+ %10 = OpTypePointer Function %9
+ %16 = OpTypeInt 32 1
+ %17 = OpTypeFunction %16 %10 %10 %10 %10
+ %24 = OpTypeVector %8 4
+ %27 = OpConstant %8 1
+ %28 = OpConstantComposite %24 %27 %27 %27 %27
+ %31 = OpConstant %16 0
+ %38 = OpTypeStruct %9
+ %39 = OpTypePointer Uniform %38
+ %40 = OpVariable %39 Uniform
+ %41 = OpTypeInt 32 0
+ %42 = OpConstant %41 1
+ %43 = OpTypePointer Uniform %8
+ %47 = OpTypeBool
+ %49 = OpTypePointer Output %24
+ %50 = OpVariable %49 Output
+ %65 = OpConstant %16 1
+ %69 = OpConstant %41 0
+ %70 = OpTypePointer Function %8
+ %137 = OpConstant %8 0
+ %203 = OpTypePointer Input %24
+ %204 = OpVariable %203 Input
+ %207 = OpTypeStruct %9
+ %208 = OpTypePointer Uniform %207
+ %209 = OpVariable %208 Uniform
+ %210 = OpTypePointer Uniform %9
+ %214 = OpConstant %8 0.699999988
+ %215 = OpConstant %8 0.300000012
+ %216 = OpConstantComposite %9 %214 %215
+ %217 = OpConstant %8 0.5
+ %218 = OpConstant %8 0.899999976
+ %219 = OpConstantComposite %9 %217 %218
+ %220 = OpConstant %8 0.100000001
+ %221 = OpConstant %8 0.400000006
+ %222 = OpConstantComposite %9 %220 %221
+ %239 = OpConstantComposite %24 %27 %137 %137 %27
+ %241 = OpConstantComposite %24 %137 %137 %137 %27
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %223 = OpVariable %10 Function
+ %225 = OpVariable %10 Function
+ %226 = OpVariable %10 Function
+ %227 = OpVariable %10 Function
+ %205 = OpLoad %24 %204
+ %206 = OpVectorShuffle %9 %205 %205 0 1
+ %211 = OpAccessChain %210 %209 %31
+ %212 = OpLoad %9 %211
+ %213 = OpFDiv %9 %206 %212
+ OpStore %223 %213
+ OpStore %225 %216
+ OpStore %226 %219
+ OpStore %227 %222
+ %228 = OpFunctionCall %16 %22 %223 %225 %226 %227
+ %229 = OpIEqual %47 %228 %65
+ OpSelectionMerge %231 None
+ OpBranchConditional %229 %230 %240
+ %230 = OpLabel
+ %232 = OpAccessChain %43 %40 %31 %42
+ %233 = OpLoad %8 %232
+ %234 = OpAccessChain %43 %40 %31 %69
+ %235 = OpLoad %8 %234
+ %236 = OpFOrdGreaterThanEqual %47 %233 %235
+ OpSelectionMerge %238 None
+ OpBranchConditional %236 %237 %238
+ %237 = OpLabel
+ OpStore %50 %239
+ OpBranch %238
+ %238 = OpLabel
+ OpBranch %231
+ %240 = OpLabel
+ OpStore %50 %241
+ OpBranch %231
+ %231 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %22 = OpFunction %16 None %17
+ %18 = OpFunctionParameter %10
+ %19 = OpFunctionParameter %10
+ %20 = OpFunctionParameter %10
+ %21 = OpFunctionParameter %10
+ %23 = OpLabel
+ %294 = OpVariable %70 Function
+ %261 = OpVariable %70 Function
+ %248 = OpVariable %70 Function
+ %107 = OpVariable %10 Function
+ %108 = OpVariable %10 Function
+ %133 = OpVariable %10 Function
+ %134 = OpVariable %10 Function
+ %179 = OpVariable %10 Function
+ %180 = OpVariable %10 Function
+ %85 = OpAccessChain %70 %18 %69
+ %86 = OpLoad %8 %85
+ %87 = OpAccessChain %70 %19 %69
+ %88 = OpLoad %8 %87
+ %89 = OpFSub %8 %86 %88
+ %90 = OpAccessChain %70 %18 %42
+ %91 = OpLoad %8 %90
+ %92 = OpAccessChain %70 %19 %42
+ %93 = OpLoad %8 %92
+ %94 = OpFSub %8 %91 %93
+ %95 = OpCompositeConstruct %9 %89 %94
+ %96 = OpAccessChain %70 %20 %69
+ %97 = OpLoad %8 %96
+ %99 = OpLoad %8 %87
+ %100 = OpFSub %8 %97 %99
+ %101 = OpAccessChain %70 %20 %42
+ %102 = OpLoad %8 %101
+ %104 = OpLoad %8 %92
+ %105 = OpFSub %8 %102 %104
+ %106 = OpCompositeConstruct %9 %100 %105
+ OpStore %107 %95
+ OpStore %108 %106
+ %250 = OpAccessChain %70 %107 %69
+ %251 = OpLoad %8 %250
+ %252 = OpAccessChain %70 %108 %42
+ %253 = OpLoad %8 %252
+ %254 = OpFMul %8 %251 %253
+ %255 = OpAccessChain %70 %108 %69
+ %256 = OpLoad %8 %255
+ %257 = OpAccessChain %70 %107 %42
+ %258 = OpLoad %8 %257
+ %259 = OpFMul %8 %256 %258
+ %260 = OpFSub %8 %254 %259
+ OpStore %248 %260
+ %112 = OpLoad %8 %85
+ %114 = OpLoad %8 %96
+ %115 = OpFSub %8 %112 %114
+ %117 = OpLoad %8 %90
+ %119 = OpLoad %8 %101
+ %120 = OpFSub %8 %117 %119
+ %121 = OpCompositeConstruct %9 %115 %120
+ %122 = OpAccessChain %70 %21 %69
+ %123 = OpLoad %8 %122
+ %125 = OpLoad %8 %96
+ %126 = OpFSub %8 %123 %125
+ %127 = OpAccessChain %70 %21 %42
+ %128 = OpLoad %8 %127
+ %130 = OpLoad %8 %101
+ %131 = OpFSub %8 %128 %130
+ %132 = OpCompositeConstruct %9 %126 %131
+ OpStore %133 %121
+ OpStore %134 %132
+ %263 = OpAccessChain %70 %133 %69
+ %264 = OpLoad %8 %263
+ %265 = OpAccessChain %70 %134 %42
+ %266 = OpLoad %8 %265
+ %267 = OpFMul %8 %264 %266
+ %268 = OpAccessChain %70 %134 %69
+ %269 = OpLoad %8 %268
+ %270 = OpAccessChain %70 %133 %42
+ %271 = OpLoad %8 %270
+ %272 = OpFMul %8 %269 %271
+ %273 = OpFSub %8 %267 %272
+ OpStore %261 %273
+ %138 = OpFOrdLessThan %47 %260 %137
+ %140 = OpFOrdLessThan %47 %273 %137
+ %141 = OpLogicalAnd %47 %138 %140
+ %142 = OpLogicalNot %47 %141
+ OpSelectionMerge %144 None
+ OpBranchConditional %142 %143 %144
+ %143 = OpLabel
+ %146 = OpFOrdGreaterThanEqual %47 %260 %137
+ %148 = OpFOrdGreaterThanEqual %47 %273 %137
+ %149 = OpLogicalAnd %47 %146 %148
+ OpBranch %144
+ %144 = OpLabel
+ %150 = OpPhi %47 %141 %23 %149 %143
+ %151 = OpLogicalNot %47 %150
+ OpSelectionMerge %153 None
+ OpBranchConditional %151 %152 %153
+ %152 = OpLabel
+ OpBranch %275
+ %275 = OpLabel
+ %276 = OpPhi %16 %31 %152 %292 %291
+ OpLoopMerge %293 %291 None
+ OpBranch %277
+ %277 = OpLabel
+ %278 = OpAccessChain %43 %40 %31 %42
+ %279 = OpLoad %8 %278
+ %280 = OpConvertFToS %16 %279
+ %281 = OpSLessThan %47 %276 %280
+ OpBranchConditional %281 %282 %293
+ %282 = OpLabel
+ OpStore %50 %28
+ OpBranch %283
+ %283 = OpLabel
+ %284 = OpPhi %16 %31 %282 %289 %288
+ OpLoopMerge %290 %288 None
+ OpBranch %285
+ %285 = OpLabel
+ %286 = OpSLessThan %47 %284 %280
+ OpBranchConditional %286 %287 %290
+ %287 = OpLabel
+ OpStore %50 %28
+ OpBranch %288
+ %288 = OpLabel
+ %289 = OpIAdd %16 %284 %65
+ OpBranch %283
+ %290 = OpLabel
+ OpBranch %291
+ %291 = OpLabel
+ %292 = OpIAdd %16 %276 %65
+ OpBranch %275
+ %293 = OpLabel
+ OpReturnValue %31
+ %153 = OpLabel
+ %158 = OpLoad %8 %85
+ %160 = OpLoad %8 %122
+ %161 = OpFSub %8 %158 %160
+ %163 = OpLoad %8 %90
+ %165 = OpLoad %8 %127
+ %166 = OpFSub %8 %163 %165
+ %167 = OpCompositeConstruct %9 %161 %166
+ %169 = OpLoad %8 %87
+ %171 = OpLoad %8 %122
+ %172 = OpFSub %8 %169 %171
+ %174 = OpLoad %8 %92
+ %176 = OpLoad %8 %127
+ %177 = OpFSub %8 %174 %176
+ %178 = OpCompositeConstruct %9 %172 %177
+ OpStore %179 %167
+ OpStore %180 %178
+ %296 = OpAccessChain %70 %179 %69
+ %297 = OpLoad %8 %296
+ %298 = OpAccessChain %70 %180 %42
+ %299 = OpLoad %8 %298
+ %300 = OpFMul %8 %297 %299
+ %301 = OpAccessChain %70 %180 %69
+ %302 = OpLoad %8 %301
+ %303 = OpAccessChain %70 %179 %42
+ %304 = OpLoad %8 %303
+ %305 = OpFMul %8 %302 %304
+ %306 = OpFSub %8 %300 %305
+ OpStore %294 %306
+ %185 = OpFOrdLessThan %47 %306 %137
+ %186 = OpLogicalAnd %47 %138 %185
+ %187 = OpLogicalNot %47 %186
+ OpSelectionMerge %189 None
+ OpBranchConditional %187 %188 %189
+ %188 = OpLabel
+ %191 = OpFOrdGreaterThanEqual %47 %260 %137
+ %193 = OpFOrdGreaterThanEqual %47 %306 %137
+ %194 = OpLogicalAnd %47 %191 %193
+ OpBranch %189
+ %189 = OpLabel
+ %195 = OpPhi %47 %186 %153 %194 %188
+ %196 = OpLogicalNot %47 %195
+ OpSelectionMerge %198 None
+ OpBranchConditional %196 %197 %198
+ %197 = OpLabel
+ OpReturnValue %31
+ %198 = OpLabel
+ OpReturnValue %65
+ OpFunctionEnd
+END
+
+# uniforms for variant
+
+# resolution
+BUFFER variant_resolution DATA_TYPE vec2<float> DATA
+ 256.0 256.0
+END
+# injectionSwitch
+BUFFER variant_injectionSwitch DATA_TYPE vec2<float> DATA
+ 0.0 1.0
+END
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+ BIND BUFFER variant_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER variant_injectionSwitch AS uniform DESCRIPTOR_SET 0 BINDING 1
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005
diff --git a/external/vulkancts/data/vulkan/amber/graphicsfuzz/vec2-modf.amber b/external/vulkancts/data/vulkan/amber/graphicsfuzz/vec2-modf.amber
new file mode 100644
index 0000000..095dc26
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/graphicsfuzz/vec2-modf.amber
@@ -0,0 +1,129 @@
+#!amber
+
+# Copyright 2020 Google LLC
+#
+# 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.
+
+
+# A test for a bug found by the GraphicsFuzz project.
+
+# Short description: A fragment shader with vec2 in modulus fraction function
+
+# The test passes because the shader always writes the color red.
+
+SHADER vertex variant_vertex_shader PASSTHROUGH
+
+# variant_fragment_shader is derived from the following GLSL:
+# #version 320 es
+# precision highp float;
+#
+# precision highp int;
+#
+# layout(location = 0) out vec4 _GLF_color;
+#
+# void main()
+# {
+# vec2 uv = vec2(1.0, 1.0);
+# uv.x = (modf(1.0, uv.y));
+# // uv.y == 1.0, uv.x == 0.0
+# if (uv.y > 0.0 && uv.x < 1.0)
+# {
+# _GLF_color = vec4(1.0, 0.0, 0.0, 1.0);
+# }
+# else
+# {
+# _GLF_color = vec4(1.0);
+# }
+# }
+SHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 10
+; Bound: 38
+; Schema: 0
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %4 "main" %34
+ OpExecutionMode %4 OriginUpperLeft
+ OpSource ESSL 320
+ OpName %4 "main"
+ OpName %9 "uv"
+ OpName %34 "_GLF_color"
+ OpDecorate %34 Location 0
+ %2 = OpTypeVoid
+ %3 = OpTypeFunction %2
+ %6 = OpTypeFloat 32
+ %7 = OpTypeVector %6 2
+ %8 = OpTypePointer Function %7
+ %10 = OpConstant %6 1
+ %11 = OpConstantComposite %7 %10 %10
+ %12 = OpTypeInt 32 0
+ %13 = OpConstant %12 1
+ %14 = OpTypePointer Function %6
+ %17 = OpConstant %12 0
+ %19 = OpTypeBool
+ %22 = OpConstant %6 0
+ %32 = OpTypeVector %6 4
+ %33 = OpTypePointer Output %32
+ %34 = OpVariable %33 Output
+ %35 = OpConstantComposite %32 %10 %22 %22 %10
+ %37 = OpConstantComposite %32 %10 %10 %10 %10
+ %4 = OpFunction %2 None %3
+ %5 = OpLabel
+ %9 = OpVariable %8 Function
+ OpStore %9 %11
+ %15 = OpAccessChain %14 %9 %13
+ %16 = OpExtInst %6 %1 Modf %10 %15
+ %18 = OpAccessChain %14 %9 %17
+ OpStore %18 %16
+ %20 = OpAccessChain %14 %9 %13
+ %21 = OpLoad %6 %20
+ %23 = OpFOrdGreaterThan %19 %21 %22
+ OpSelectionMerge %25 None
+ OpBranchConditional %23 %24 %25
+ %24 = OpLabel
+ %26 = OpAccessChain %14 %9 %17
+ %27 = OpLoad %6 %26
+ %28 = OpFOrdLessThan %19 %27 %10
+ OpBranch %25
+ %25 = OpLabel
+ %29 = OpPhi %19 %23 %5 %28 %24
+ OpSelectionMerge %31 None
+ OpBranchConditional %29 %30 %36
+ %30 = OpLabel
+ OpStore %34 %35
+ OpBranch %31
+ %36 = OpLabel
+ OpStore %34 %37
+ OpBranch %31
+ %31 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+
+BUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics variant_pipeline
+ ATTACH variant_vertex_shader
+ ATTACH variant_fragment_shader
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER variant_framebuffer AS color LOCATION 0
+END
+CLEAR_COLOR variant_pipeline 0 0 0 255
+
+CLEAR variant_pipeline
+RUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256
+
+EXPECT variant_framebuffer IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255
diff --git a/external/vulkancts/data/vulkan/amber/pipeline/vertex_only/position_to_ssbo.amber b/external/vulkancts/data/vulkan/amber/pipeline/position_to_ssbo.amber
similarity index 100%
rename from external/vulkancts/data/vulkan/amber/pipeline/vertex_only/position_to_ssbo.amber
rename to external/vulkancts/data/vulkan/amber/pipeline/position_to_ssbo.amber
diff --git a/external/vulkancts/data/vulkan/amber/pipeline/primitive_id_from_tess.amber b/external/vulkancts/data/vulkan/amber/pipeline/primitive_id_from_tess.amber
new file mode 100644
index 0000000..db52be5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/pipeline/primitive_id_from_tess.amber
@@ -0,0 +1,114 @@
+#!amber
+#
+# Copyright 2020 The Khronos Group Inc.
+# Copyright 2020 Valve Corporation.
+#
+# 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
+#
+# https://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.
+
+DEVICE_FEATURE geometryShader
+DEVICE_FEATURE tessellationShader
+
+SHADER vertex vert GLSL
+#version 450
+layout (location=0) in vec4 in_pos;
+void main(void)
+{
+ gl_Position = in_pos;
+}
+END
+
+SHADER tessellation_control tesc GLSL
+#version 450
+layout (vertices = 3) out;
+void main(void)
+{
+ gl_TessLevelInner[0] = 1.0;
+ gl_TessLevelInner[1] = 1.0;
+ gl_TessLevelOuter[0] = 1.0;
+ gl_TessLevelOuter[1] = 1.0;
+ gl_TessLevelOuter[2] = 1.0;
+ gl_TessLevelOuter[3] = 1.0;
+
+ gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+}
+END
+
+SHADER tessellation_evaluation tese GLSL
+#version 450
+layout (triangles, fractional_odd_spacing, cw) in;
+void main(void)
+{
+ gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +
+ (gl_TessCoord.y * gl_in[1].gl_Position) +
+ (gl_TessCoord.z * gl_in[2].gl_Position);
+}
+END
+
+SHADER fragment frag GLSL
+#version 450
+layout (location=0) out vec4 out_color;
+void main(void)
+{
+ vec4 primitive_color;
+ switch (gl_PrimitiveID) {
+ case 0:
+ case 1:
+ primitive_color = vec4(0, 0, 1, 1);
+ break;
+ case 2:
+ case 3:
+ primitive_color = vec4(1, 0, 1, 1);
+ break;
+ default:
+ primitive_color = vec4(0, 0, 0, 1);
+ break;
+ }
+ out_color = primitive_color;
+}
+END
+
+BUFFER position DATA_TYPE vec4<float> DATA
+-1 -1 0 1
+ 1 -1 0 1
+-1 0 0 1
+
+-1 0 0 1
+ 1 -1 0 1
+ 1 0 0 1
+
+-1 0 0 1
+ 1 0 0 1
+-1 1 0 1
+
+-1 1 0 1
+ 1 0 0 1
+ 1 1 0 1
+
+END
+
+BUFFER framebuffer FORMAT B8G8R8A8_UNORM
+
+PIPELINE graphics graphics_pipeline
+ ATTACH vert
+ ATTACH tesc
+ ATTACH tese
+ ATTACH frag
+ VERTEX_DATA position LOCATION 0
+ BIND BUFFER framebuffer AS color LOCATION 0
+END
+
+CLEAR_COLOR graphics_pipeline 255 255 255 255
+CLEAR graphics_pipeline
+RUN graphics_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 12
+EXPECT framebuffer IDX 0 0 SIZE 250 125 EQ_RGBA 0 0 255 255
+EXPECT framebuffer IDX 0 125 SIZE 250 125 EQ_RGBA 255 0 255 255
diff --git a/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d16_unorm.amber b/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d16_unorm.amber
new file mode 100644
index 0000000..36ac2d5
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d16_unorm.amber
@@ -0,0 +1,186 @@
+#!amber
+# Copyright 2020 Google LLC.
+# Copyright 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
+#
+# https://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.
+
+# This test draws two quads with depth values 0.3 and 0.5. Based on the equation in
+# Vulkan spec 26.12.3 the effective constant bias o is calculated as follows:
+
+# Both quads have a constant depth value, thus the maximum depth slope m is zero.
+# For minimun resolveble difference r there are two values accepted: r0 = 2^-16
+# and r1 = 2^-15. It is constant throughout the range of the entire depth buffer.
+
+# Using r0 the constant bias o value is:
+# 16384 * r0 = 16384 * 2^-16 = 0.25.
+
+# Adding this to the existing quad depth values should result as:
+# 0.3 + 0.25 = 0.55 and 0.5 + 0.25 = 0.75.
+
+# For r1 the same calculation for o is:
+# 16384 * r1 = 16384 * 2^-15 = 0.5.
+
+# Adding this to the existing quad depth values should result as:
+# 0.3 + 0.5 = 0.8 and 0.5 + 0.5 = 1.0
+
+SHADER vertex vert_shader GLSL
+#version 430
+
+layout(location = 0) in vec4 position;
+layout(location = 0) out vec4 frag_color;
+
+layout(set = 0, binding = 0) readonly buffer block1 {
+ vec4 in_color;
+ float depth;
+};
+
+void main() {
+ gl_Position = vec4(position.xy, depth, 1.0);
+ frag_color = in_color;
+}
+END
+
+SHADER fragment frag_shader GLSL
+#version 430
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+END
+
+SHADER vertex vert_shader_tex GLSL
+#version 430
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec2 texcoords_in;
+layout(location = 0) out vec2 texcoords_out;
+void main() {
+ gl_Position = position;
+ texcoords_out = texcoords_in;
+}
+END
+
+SHADER fragment frag_shader_tex GLSL
+#version 430
+layout(location = 0) in vec2 texcoords_in;
+layout(location = 0) out vec4 color_out;
+uniform layout(set=0, binding=0) sampler2D tex_sampler;
+void main() {
+ float f = texture(tex_sampler, texcoords_in).r;
+ color_out = vec4(f, f, f, 1);
+}
+END
+
+BUFFER data_buf1 DATA_TYPE float DATA 1.0 0.0 0.0 1.0 0.3 END
+BUFFER data_buf2 DATA_TYPE float DATA 0.0 1.0 0.0 1.0 0.5 END
+
+BUFFER position DATA_TYPE vec2<float> DATA
+-1.0 -1.0
+ 1.0 -1.0
+ 1.0 1.0
+-1.0 1.0
+END
+BUFFER texcoords DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
+BUFFER depthstencil FORMAT D16_UNORM
+BUFFER ddump FORMAT R32_SFLOAT
+BUFFER results DATA_TYPE float SIZE 2 FILL 0
+BUFFER framebuffer FORMAT B8G8R8A8_UNORM
+
+SAMPLER sampler
+
+PIPELINE graphics pipeline1
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER framebuffer AS color LOCATION 0
+ BIND BUFFER depthstencil AS depth_stencil
+ BIND BUFFER data_buf1 AS storage DESCRIPTOR_SET 0 BINDING 0
+
+ DEPTH
+ TEST on
+ WRITE on
+ COMPARE_OP less
+ CLAMP off
+ BOUNDS min 0.0 max 1.0
+ BIAS constant 16384.0 clamp 0.0 slope 2.0
+ END
+END
+
+DERIVE_PIPELINE pipeline2 FROM pipeline1
+ BIND BUFFER data_buf2 AS storage DESCRIPTOR_SET 0 BINDING 0
+END
+
+PIPELINE graphics depthdump
+ ATTACH vert_shader_tex
+ ATTACH frag_shader_tex
+ BIND BUFFER depthstencil AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+ VERTEX_DATA position LOCATION 0
+ VERTEX_DATA texcoords LOCATION 1
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER ddump AS color LOCATION 0
+END
+
+SHADER compute verification_shader GLSL
+#version 430
+layout(local_size_x=1,local_size_y=1) in;
+uniform layout (set=0, binding=0, r32f) image2D texture;
+layout(set = 0, binding = 1) buffer Result {
+ float result0;
+ float result1;
+};
+
+void main () {
+ float ref0_0 = 0.55;
+ float ref0_1 = 0.8;
+ float depth0 = imageLoad(texture, ivec2(0, 0)).r;
+ if (distance(ref0_0, depth0) < 0.003 || distance(ref0_1, depth0) < 0.003)
+ result0 = 1.0;
+ else
+ result0 = 0.0;
+
+ float ref1_0 = 0.75;
+ float ref1_1 = 1.0;
+ float depth1 = imageLoad(texture, ivec2(255, 255)).r;
+ if (distance(ref1_0, depth1) < 0.003 || distance(ref1_1, depth1) < 0.003)
+ result1 = 1.0;
+ else
+ result1 = 0.0;
+}
+END
+
+PIPELINE compute verification_pipeline
+ ATTACH verification_shader
+ BIND BUFFER ddump AS storage_image DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER results AS storage DESCRIPTOR_SET 0 BINDING 1
+ FRAMEBUFFER_SIZE 256 256
+END
+
+CLEAR_DEPTH pipeline1 1.0
+CLEAR_COLOR pipeline1 255 255 255 255
+CLEAR pipeline1
+RUN pipeline1 DRAW_RECT POS 0 0 SIZE 200 200
+RUN pipeline2 DRAW_RECT POS 56 56 SIZE 200 200
+RUN depthdump DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+RUN verification_pipeline 1 1 1
+
+EXPECT results IDX 0 EQ 1.0
+EXPECT results IDX 4 EQ 1.0
diff --git a/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d24_unorm.amber b/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d24_unorm.amber
new file mode 100644
index 0000000..b3230da
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d24_unorm.amber
@@ -0,0 +1,186 @@
+#!amber
+# Copyright 2020 Google LLC.
+# Copyright 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
+#
+# https://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.
+
+# This test draws two quads with depth values 0.3 and 0.5. Based on the equation in
+# Vulkan spec 26.12.3 the effective constant bias o is calculated as follows:
+
+# Both quads have a constant depth value, thus the maximum depth slope m is zero.
+# For minimun resolveble difference r there are two values accepted: r0 = 2^-24
+# and r1 = 2^-23. It is constant throughout the range of the entire depth buffer.
+
+# Using r0 the constant bias o value is:
+# 4194304 * r0 = 4194304 * 2^-24 = 0.25.
+
+# Adding this to the existing quad depth values should result as:
+# 0.3 + 0.25 = 0.55 and 0.5 + 0.25 = 0.75.
+
+# For r1 the same calculation for o is:
+# 4194304 * r1 = 4194304 * 2^-23 = 0.5.
+
+# Adding this to the existing quad depth values should result as:
+# 0.3 + 0.5 = 0.8 and 0.5 + 0.5 = 1.0
+
+SHADER vertex vert_shader GLSL
+#version 430
+
+layout(location = 0) in vec4 position;
+layout(location = 0) out vec4 frag_color;
+
+layout(set = 0, binding = 0) readonly buffer block1 {
+ vec4 in_color;
+ float depth;
+};
+
+void main() {
+ gl_Position = vec4(position.xy, depth, 1.0);
+ frag_color = in_color;
+}
+END
+
+SHADER fragment frag_shader GLSL
+#version 430
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+END
+
+SHADER vertex vert_shader_tex GLSL
+#version 430
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec2 texcoords_in;
+layout(location = 0) out vec2 texcoords_out;
+void main() {
+ gl_Position = position;
+ texcoords_out = texcoords_in;
+}
+END
+
+SHADER fragment frag_shader_tex GLSL
+#version 430
+layout(location = 0) in vec2 texcoords_in;
+layout(location = 0) out vec4 color_out;
+uniform layout(set=0, binding=0) sampler2D tex_sampler;
+void main() {
+ float f = texture(tex_sampler, texcoords_in).r;
+ color_out = vec4(f, f, f, 1);
+}
+END
+
+BUFFER data_buf1 DATA_TYPE float DATA 1.0 0.0 0.0 1.0 0.3 END
+BUFFER data_buf2 DATA_TYPE float DATA 0.0 1.0 0.0 1.0 0.5 END
+
+BUFFER position DATA_TYPE vec2<float> DATA
+-1.0 -1.0
+ 1.0 -1.0
+ 1.0 1.0
+-1.0 1.0
+END
+BUFFER texcoords DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
+BUFFER depthstencil FORMAT D24_UNORM_S8_UINT
+BUFFER ddump FORMAT R32_SFLOAT
+BUFFER results DATA_TYPE float SIZE 2 FILL 0
+BUFFER framebuffer FORMAT B8G8R8A8_UNORM
+
+SAMPLER sampler
+
+PIPELINE graphics pipeline1
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER framebuffer AS color LOCATION 0
+ BIND BUFFER depthstencil AS depth_stencil
+ BIND BUFFER data_buf1 AS storage DESCRIPTOR_SET 0 BINDING 0
+
+ DEPTH
+ TEST on
+ WRITE on
+ COMPARE_OP less
+ CLAMP off
+ BOUNDS min 0.0 max 1.0
+ BIAS constant 4194304.0 clamp 0.0 slope 2.0
+ END
+END
+
+DERIVE_PIPELINE pipeline2 FROM pipeline1
+ BIND BUFFER data_buf2 AS storage DESCRIPTOR_SET 0 BINDING 0
+END
+
+PIPELINE graphics depthdump
+ ATTACH vert_shader_tex
+ ATTACH frag_shader_tex
+ BIND BUFFER depthstencil AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+ VERTEX_DATA position LOCATION 0
+ VERTEX_DATA texcoords LOCATION 1
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER ddump AS color LOCATION 0
+END
+
+SHADER compute verification_shader GLSL
+#version 430
+layout(local_size_x=1,local_size_y=1) in;
+uniform layout (set=0, binding=0, r32f) image2D texture;
+layout(set = 0, binding = 1) buffer Result {
+ float result0;
+ float result1;
+};
+
+void main () {
+ float ref0_0 = 0.55;
+ float ref0_1 = 0.8;
+ float depth0 = imageLoad(texture, ivec2(0, 0)).r;
+ if (distance(ref0_0, depth0) < 0.003 || distance(ref0_1, depth0) < 0.003)
+ result0 = 1.0;
+ else
+ result0 = 0.0;
+
+ float ref1_0 = 0.75;
+ float ref1_1 = 1.0;
+ float depth1 = imageLoad(texture, ivec2(255, 255)).r;
+ if (distance(ref1_0, depth1) < 0.003 || distance(ref1_1, depth1) < 0.003)
+ result1 = 1.0;
+ else
+ result1 = 0.0;
+}
+END
+
+PIPELINE compute verification_pipeline
+ ATTACH verification_shader
+ BIND BUFFER ddump AS storage_image DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER results AS storage DESCRIPTOR_SET 0 BINDING 1
+ FRAMEBUFFER_SIZE 256 256
+END
+
+CLEAR_DEPTH pipeline1 1.0
+CLEAR_COLOR pipeline1 255 255 255 255
+CLEAR pipeline1
+RUN pipeline1 DRAW_RECT POS 0 0 SIZE 200 200
+RUN pipeline2 DRAW_RECT POS 56 56 SIZE 200 200
+RUN depthdump DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+RUN verification_pipeline 1 1 1
+
+EXPECT results IDX 0 EQ 1.0
+EXPECT results IDX 4 EQ 1.0
diff --git a/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d32_sfloat.amber b/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d32_sfloat.amber
new file mode 100644
index 0000000..3649889
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/rasterization/depth_bias/d32_sfloat.amber
@@ -0,0 +1,153 @@
+#!amber
+# Copyright 2020 Google LLC.
+# Copyright 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
+#
+# https://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.
+
+# This test draws two quads with depth values 0.3 and 0.5. Based on the equation in
+# Vulkan spec 26.12.3 the effective constant bias o is calculated as follows:
+
+# Both quads have a constant depth value, thus the maximum depth slope m is zero.
+# The maximum exponent e is taken from the constant depth value.
+# For depth value 0.3 e is -2, and for value 0.5 it's -1.
+
+# 32bit float format has a mantissa size of 23 making n = 23.
+# The minimum resolvable difference r is calculated as r = 2^(e-n).
+
+# Thus the constant bias o values are:
+# 4194304 * r = 4194304 * 2^(-2-23) = 4194304 * 2^-25 = 0.125
+# and
+# 4194304 * r = 4194304 * 2^(-1-23) = 4194304 * 2^-24 = 0.25
+
+# Adding this to the existing quad depth values should result as
+# 0.3 + 0.125 = 0.425 and 0.5 + 0.25 = 0.75.
+
+# The depth buffer is dumped as a RGBA8 image making the expected results
+# roughly 0.425 * 255 = 108 and 0.75 * 255 = 191.
+
+SHADER vertex vert_shader GLSL
+#version 430
+
+layout(location = 0) in vec4 position;
+layout(location = 0) out vec4 frag_color;
+
+layout(set = 0, binding = 0) readonly buffer block1 {
+ vec4 in_color;
+ float depth;
+};
+
+void main() {
+ gl_Position = vec4(position.xy, depth, 1.0);
+ frag_color = in_color;
+}
+END
+
+SHADER fragment frag_shader GLSL
+#version 430
+
+layout(location = 0) in vec4 frag_color;
+layout(location = 0) out vec4 final_color;
+
+void main() {
+ final_color = frag_color;
+}
+END
+
+SHADER vertex vert_shader_tex GLSL
+#version 430
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec2 texcoords_in;
+layout(location = 0) out vec2 texcoords_out;
+void main() {
+ gl_Position = position;
+ texcoords_out = texcoords_in;
+}
+END
+
+SHADER fragment frag_shader_tex GLSL
+#version 430
+layout(location = 0) in vec2 texcoords_in;
+layout(location = 0) out vec4 color_out;
+uniform layout(set=0, binding=0) sampler2D tex_sampler;
+void main() {
+ float f = texture(tex_sampler, texcoords_in).r;
+ color_out = vec4(f, f, f, 1);
+}
+END
+
+BUFFER data_buf1 DATA_TYPE float DATA 1.0 0.0 0.0 1.0 0.3 END
+BUFFER data_buf2 DATA_TYPE float DATA 0.0 1.0 0.0 1.0 0.5 END
+
+BUFFER position DATA_TYPE vec2<float> DATA
+-1.0 -1.0
+ 1.0 -1.0
+ 1.0 1.0
+-1.0 1.0
+END
+BUFFER texcoords DATA_TYPE vec2<float> DATA
+0.0 0.0
+1.0 0.0
+1.0 1.0
+0.0 1.0
+END
+
+BUFFER framebuffer FORMAT B8G8R8A8_UNORM
+BUFFER ddump FORMAT B8G8R8A8_UNORM
+BUFFER depthstencil FORMAT D32_SFLOAT
+
+SAMPLER sampler
+
+PIPELINE graphics pipeline1
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER framebuffer AS color LOCATION 0
+ BIND BUFFER depthstencil AS depth_stencil
+ BIND BUFFER data_buf1 AS storage DESCRIPTOR_SET 0 BINDING 0
+
+ DEPTH
+ TEST on
+ WRITE on
+ COMPARE_OP less
+ CLAMP off
+ BOUNDS min 0.0 max 1.0
+ BIAS constant 4194304.0 clamp 0.0 slope 2.0
+ END
+END
+
+DERIVE_PIPELINE pipeline2 FROM pipeline1
+ BIND BUFFER data_buf2 AS storage DESCRIPTOR_SET 0 BINDING 0
+END
+
+PIPELINE graphics depthdump
+ ATTACH vert_shader_tex
+ ATTACH frag_shader_tex
+ BIND BUFFER depthstencil AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0
+ VERTEX_DATA position LOCATION 0
+ VERTEX_DATA texcoords LOCATION 1
+ FRAMEBUFFER_SIZE 256 256
+ BIND BUFFER ddump AS color LOCATION 0
+END
+
+CLEAR_DEPTH pipeline1 1.0
+CLEAR_COLOR pipeline1 255 255 255 255
+CLEAR pipeline1
+RUN pipeline1 DRAW_RECT POS 0 0 SIZE 200 200
+RUN pipeline2 DRAW_RECT POS 56 56 SIZE 200 200
+RUN depthdump DRAW_ARRAY AS TRIANGLE_FAN START_IDX 0 COUNT 4
+
+EXPECT ddump IDX 0 0 SIZE 1 1 EQ_RGBA 108 108 108 255 TOLERANCE 5% 5% 5% 0
+EXPECT ddump IDX 255 0 SIZE 1 1 EQ_RGBA 255 255 255 255 TOLERANCE 5% 5% 5% 0
+EXPECT ddump IDX 0 255 SIZE 1 1 EQ_RGBA 255 255 255 255 TOLERANCE 5% 5% 5% 0
+EXPECT ddump IDX 255 255 SIZE 1 1 EQ_RGBA 191 191 191 255 TOLERANCE 5% 5% 5% 0
\ No newline at end of file
diff --git a/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/line-strip.amber b/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/line-strip.amber
index dc88e12..4544a4b 100644
--- a/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/line-strip.amber
+++ b/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/line-strip.amber
@@ -1,5 +1,6 @@
#!amber
-# Copyright 2020 The Amber Authors.
+# Copyright 2020 Google LLC.
+# Copyright 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.
diff --git a/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/polygon-mode-lines.amber b/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/polygon-mode-lines.amber
index 4bae586..5ab2b66 100644
--- a/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/polygon-mode-lines.amber
+++ b/external/vulkancts/data/vulkan/amber/rasterization/line_continuity/polygon-mode-lines.amber
@@ -1,5 +1,6 @@
#!amber
-# Copyright 2020 The Amber Authors.
+# Copyright 2020 Google LLC.
+# Copyright 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.
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/compute/variable_pointer/dynamic_offset/select_descriptor_array.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/compute/variable_pointer/dynamic_offset/select_descriptor_array.amber
new file mode 100644
index 0000000..66a2393
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/compute/variable_pointer/dynamic_offset/select_descriptor_array.amber
@@ -0,0 +1,166 @@
+#!amber
+# Copyright 2020 The Amber Authors.
+#
+# 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
+#
+# https://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.
+
+DEVICE_EXTENSION VK_KHR_variable_pointers
+DEVICE_EXTENSION VK_KHR_storage_buffer_storage_class
+DEVICE_FEATURE VariablePointerFeatures.variablePointers
+DEVICE_FEATURE VariablePointerFeatures.variablePointersStorageBuffer
+
+# Based on the following GLSL shader pseudocode:
+#
+#SHADER compute compute_shader GLSL
+##version 430
+#
+#layout(set = 0, binding = 0) buffer InputData
+#{
+# int data[10];
+#} input0[2];
+#
+#layout(set = 0, binding = 1) buffer InputData
+#{
+# int data[10];
+#} input1[2];
+#
+#layout(set = 0, binding = 2) buffer Result
+#{
+# int result;
+#};
+#
+#layout(push_constant) uniform Indices
+#{
+# int idx0;
+# int idx1;
+# int idx2;
+#};
+#
+#
+#void main()
+#{
+# InputData input[]* = (idx0 == 0) ? &input0 : &input1;
+# result = input[idx1].data[idx2];
+#}
+#END
+
+SHADER compute compute_shader SPIRV-ASM
+ OpCapability Shader
+ OpCapability VariablePointers
+ OpExtension "SPV_KHR_variable_pointers"
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpSource GLSL 430
+ OpMemberDecorate %Indices 0 Offset 0
+ OpMemberDecorate %Indices 1 Offset 4
+ OpMemberDecorate %Indices 2 Offset 8
+ OpDecorate %Indices Block
+ OpMemberDecorate %Result 0 Offset 0
+ OpDecorate %Result Block
+ OpDecorate %result DescriptorSet 0
+ OpDecorate %result Binding 2
+ OpDecorate %_arr_int_int_10 ArrayStride 16
+ OpMemberDecorate %InputData 0 Offset 0
+ OpDecorate %InputData Block
+ OpDecorate %input0 DescriptorSet 0
+ OpDecorate %input0 Binding 0
+ OpDecorate %input1 DescriptorSet 0
+ OpDecorate %input1 Binding 1
+ %void = OpTypeVoid
+ %bool = OpTypeBool
+ %int = OpTypeInt 32 1
+ %void_func = OpTypeFunction %void
+ %Indices = OpTypeStruct %int %int %int
+%_ptr_PushConstant_Indices = OpTypePointer PushConstant %Indices
+ %indices = OpVariable %_ptr_PushConstant_Indices PushConstant
+ %int_0 = OpConstant %int 0
+ %int_1 = OpConstant %int 1
+ %int_2 = OpConstant %int 2
+ %int_10 = OpConstant %int 10
+%_ptr_PushConstant_int = OpTypePointer PushConstant %int
+ %Result = OpTypeStruct %int
+%_ptr_StorageBuffer_Result = OpTypePointer StorageBuffer %Result
+ %result = OpVariable %_ptr_StorageBuffer_Result StorageBuffer
+%_arr_int_int_10 = OpTypeArray %int %int_10
+ %InputData = OpTypeStruct %_arr_int_int_10
+%_arr_InputData_int_2 = OpTypeArray %InputData %int_2
+%_ptr_StorageBuffer__arr_InputData_int_2 = OpTypePointer StorageBuffer %_arr_InputData_int_2
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+ %input0 = OpVariable %_ptr_StorageBuffer__arr_InputData_int_2 StorageBuffer
+ %input1 = OpVariable %_ptr_StorageBuffer__arr_InputData_int_2 StorageBuffer
+ %main = OpFunction %void None %void_func
+ %label = OpLabel
+ %idx0_ptr = OpAccessChain %_ptr_PushConstant_int %indices %int_0
+ %idx0 = OpLoad %int %idx0_ptr
+ %idx1_ptr = OpAccessChain %_ptr_PushConstant_int %indices %int_1
+ %idx1 = OpLoad %int %idx1_ptr
+ %idx2_ptr = OpAccessChain %_ptr_PushConstant_int %indices %int_2
+ %idx2 = OpLoad %int %idx2_ptr
+ %idx0_zero = OpIEqual %bool %idx0 %int_0
+%variable_ptr = OpSelect %_ptr_StorageBuffer__arr_InputData_int_2 %idx0_zero %input0 %input1
+%input_data_ptr = OpAccessChain %_ptr_StorageBuffer_int %variable_ptr %idx1 %int_0 %idx2
+ %input_data = OpLoad %int %input_data_ptr
+%result_data_ptr = OpAccessChain %_ptr_StorageBuffer_int %result %int_0
+ OpStore %result_data_ptr %input_data
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf0 DATA_TYPE int32 SIZE 1024 SERIES_FROM 0 INC_BY 1
+BUFFER buf1 DATA_TYPE int32 SIZE 1024 SERIES_FROM 1 INC_BY 1
+BUFFER buf2 DATA_TYPE int32 SIZE 1024 SERIES_FROM 2 INC_BY 1
+BUFFER buf3 DATA_TYPE int32 SIZE 1024 SERIES_FROM 3 INC_BY 1
+BUFFER indices0 DATA_TYPE int32 DATA
+0 1 2
+END
+BUFFER indices1 DATA_TYPE int32 DATA
+1 1 2
+END
+BUFFER result DATA_TYPE int32 DATA
+0
+END
+
+# This pipeline will select input from buf1 which has a dynamic offset of 256 bytes.
+# The sequence in that buffer starts from 1, and the array stride in the shader is
+# 16 bytes. The shader reads an array element number 2. Thus the expected value is:
+# 256/4 + 1 + 2 * 4 = 73.
+PIPELINE compute pipeline0
+ ATTACH compute_shader
+
+ BIND BUFFER_ARRAY buf0 buf1 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 0 OFFSET 0 256
+ BIND BUFFER_ARRAY buf2 buf3 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 1 OFFSET 512 768
+ BIND BUFFER indices0 AS push_constant
+ BIND BUFFER result AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN pipeline0 1 1 1
+
+EXPECT result IDX 0 EQ 73
+
+# This pipeline will select input from buf3 which has a dynamic offset of 768 bytes.
+# The sequence in that buffer starts from 3, and the array stride in the shader is
+# 16 bytes. The shader reads an array element number 2. Thus the expected value is:
+# 768/4 + 3 + 2 * 4 = 203.
+PIPELINE compute pipeline1
+ ATTACH compute_shader
+
+ BIND BUFFER_ARRAY buf0 buf1 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 0 OFFSET 0 256
+ BIND BUFFER_ARRAY buf2 buf3 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 1 OFFSET 512 768
+ BIND BUFFER indices1 AS push_constant
+ BIND BUFFER result AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN pipeline1 1 1 1
+
+EXPECT result IDX 0 EQ 203
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_comp.amber
new file mode 100644
index 0000000..c5455eb
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_comp.amber
@@ -0,0 +1,211 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A compute shader test for FrexpStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 1;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uint in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+# float frexp_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+# float frexpStruct_out[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# float x;
+# int exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (float orig)
+# {
+# float x;
+# int exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (uint ndx = 0; ndx < ndp; ndx += 2)
+# {
+# uint in_uint = in_values[ndx/2];
+# float in_float = uintBitsToFloat(in_uint);
+# float x;
+# int exp;
+#
+# x = frexp(in_float, exp);
+# frexpStructType res = frexpStruct(in_float);
+#
+# frexp_out[ndx] = intBitsToFloat(exp);
+# frexp_out[ndx+1] = x;
+# frexpStruct_out[ndx] = intBitsToFloat(res.exp);
+# frexpStruct_out[ndx+1] = res.x;
+# }
+#
+# return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpDecorate %_arr_uint_uint_648 ArrayStride 4
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_arr_float_uint_1296 ArrayStride 4
+ OpMemberDecorate %block1 0 Offset 0
+ OpDecorate %block1 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ OpDecorate %_arr_float_uint_1296_0 ArrayStride 4
+ OpMemberDecorate %block2 0 Offset 0
+ OpDecorate %block2 BufferBlock
+ OpDecorate %__1 DescriptorSet 0
+ OpDecorate %__1 Binding 2
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %int = OpTypeInt 32 1
+%frexpStructType = OpTypeStruct %float %int
+ %10 = OpTypeFunction %frexpStructType %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_1296 = OpConstant %uint 1296
+ %bool = OpTypeBool
+ %uint_648 = OpConstant %uint 648
+%_arr_uint_uint_648 = OpTypeArray %uint %uint_648
+ %block0 = OpTypeStruct %_arr_uint_uint_648
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_arr_float_uint_1296 = OpTypeArray %float %uint_1296
+ %block1 = OpTypeStruct %_arr_float_uint_1296
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+ %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1296_0 = OpTypeArray %float %uint_1296
+ %block2 = OpTypeStruct %_arr_float_uint_1296_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+ %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_uint Function
+ %in_float = OpVariable %_ptr_Function_float Function
+ %x_0 = OpVariable %_ptr_Function_float Function
+ %exp_0 = OpVariable %_ptr_Function_int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %ndx %uint_0
+ OpBranch %31
+ %31 = OpLabel
+ OpLoopMerge %33 %34 None
+ OpBranch %35
+ %35 = OpLabel
+ %36 = OpLoad %uint %ndx
+ %39 = OpULessThan %bool %36 %uint_1296
+ OpBranchConditional %39 %32 %33
+ %32 = OpLabel
+ %47 = OpLoad %uint %ndx
+ %49 = OpUDiv %uint %47 %uint_2
+ %51 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %49
+ %52 = OpLoad %uint %51
+ OpStore %in_uint %52
+ %54 = OpLoad %uint %in_uint
+ %55 = OpBitcast %float %54
+ OpStore %in_float %55
+ %57 = OpLoad %float %in_float
+ %59 = OpExtInst %float %1 Frexp %57 %exp_0
+ OpStore %x_0 %59
+ %62 = OpLoad %float %in_float
+ %63 = OpExtInst %frexpStructType %1 FrexpStruct %62
+ OpStore %res_0 %63
+ %68 = OpLoad %uint %ndx
+ %69 = OpLoad %int %exp_0
+ %70 = OpBitcast %float %69
+ %72 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %68
+ OpStore %72 %70
+ %73 = OpLoad %uint %ndx
+ %75 = OpIAdd %uint %73 %uint_1
+ %76 = OpLoad %float %x_0
+ %77 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %75
+ OpStore %77 %76
+ %82 = OpLoad %uint %ndx
+ %84 = OpAccessChain %_ptr_Function_int %res_0 %int_1
+ %85 = OpLoad %int %84
+ %86 = OpBitcast %float %85
+ %87 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %82
+ OpStore %87 %86
+ %88 = OpLoad %uint %ndx
+ %89 = OpIAdd %uint %88 %uint_1
+ %90 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+ %91 = OpLoad %float %90
+ %92 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %89
+ OpStore %92 %91
+ OpBranch %34
+ %34 = OpLabel
+ %93 = OpLoad %uint %ndx
+ %94 = OpIAdd %uint %93 %uint_2
+ OpStore %ndx %94
+ OpBranch %31
+ %33 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_frexp DATA_TYPE float SIZE 1296 FILL 0.0
+BUFFER buf_frexpStruct DATA_TYPE float SIZE 1296 FILL 1.0
+
+PIPELINE compute test_pipeline
+ ATTACH comp_shader
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER buf_frexp AS storage DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER buf_frexpStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_frexp EQ_BUFFER buf_frexpStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag.amber
new file mode 100644
index 0000000..f5b61e3
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag.amber
@@ -0,0 +1,283 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A fragment shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uint in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# float x;
+# int exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (float orig)
+# {
+# float x;
+# int exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uint in_uint = in_values[ndx_in];
+# float in_float = uintBitsToFloat(in_uint);
+# float x;
+# int exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.r = x;
+# frexp_exp_out.r = intBitsToFloat(exp);
+# frexpStruct_x_out.r = res.x;
+# frexpStruct_exp_out.r = intBitsToFloat(res.exp);
+#
+# return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %int = OpTypeInt 32 1
+%frexpStructType = OpTypeStruct %float %int
+ %10 = OpTypeFunction %frexpStructType %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+ %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+ %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_uint Function
+ %in_float = OpVariable %_ptr_Function_float Function
+ %x_0 = OpVariable %_ptr_Function_float Function
+ %exp_0 = OpVariable %_ptr_Function_int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %38 = OpLoad %uint %ndx_in
+ %40 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %38
+ %41 = OpLoad %uint %40
+ OpStore %in_uint %41
+ %43 = OpLoad %uint %in_uint
+ %44 = OpBitcast %float %43
+ OpStore %in_float %44
+ %46 = OpLoad %float %in_float
+ %48 = OpExtInst %float %1 Frexp %46 %exp_0
+ OpStore %x_0 %48
+ %51 = OpLoad %float %in_float
+ %52 = OpExtInst %frexpStructType %1 FrexpStruct %51
+ OpStore %res_0 %52
+ OpStore %frexp_x_out %58
+ OpStore %frexp_exp_out %58
+ OpStore %frexpStruct_x_out %58
+ OpStore %frexpStruct_exp_out %58
+ %62 = OpLoad %float %x_0
+ %65 = OpAccessChain %_ptr_Output_float %frexp_x_out %uint_0
+ OpStore %65 %62
+ %66 = OpLoad %int %exp_0
+ %67 = OpBitcast %float %66
+ %68 = OpAccessChain %_ptr_Output_float %frexp_exp_out %uint_0
+ OpStore %68 %67
+ %69 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+ %70 = OpLoad %float %69
+ %71 = OpAccessChain %_ptr_Output_float %frexpStruct_x_out %uint_0
+ OpStore %71 %70
+ %73 = OpAccessChain %_ptr_Function_int %res_0 %int_1
+ %74 = OpLoad %int %73
+ %75 = OpBitcast %float %74
+ %76 = OpAccessChain %_ptr_Output_float %frexpStruct_exp_out %uint_0
+ OpStore %76 %75
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_geom.amber
new file mode 100644
index 0000000..dd39469
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_geom.amber
@@ -0,0 +1,424 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A geometry shader test for FrexpStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uint in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out float frexp_x_out;
+# layout (location = 1) flat out float frexp_exp_out;
+# layout (location = 2) flat out float frexpStruct_x_out;
+# layout (location = 3) flat out float frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# float x;
+# int exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (float orig)
+# {
+# float x;
+# int exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (int vertex = 0; vertex < 3; vertex++)
+# {
+# uint in_uint = in_values[ndx_in[vertex]];
+# float in_float = uintBitsToFloat(in_uint);
+# float x;
+# int exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = gl_in[vertex].gl_Position;
+# EmitVertex();
+# }
+#
+# EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+ OpCapability Geometry
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Geometry %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0 %gl_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main Invocations 1
+ OpExecutionMode %main OutputTriangleStrip
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %int = OpTypeInt 32 1
+%frexpStructType = OpTypeStruct %float %int
+ %10 = OpTypeFunction %frexpStructType %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %bool = OpTypeBool
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+ %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_x_out = OpVariable %_ptr_Output_float Output
+%frexp_exp_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_float Output
+ %int_1 = OpConstant %int 1
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %vertex = OpVariable %_ptr_Function_int Function
+ %in_uint = OpVariable %_ptr_Function_uint Function
+ %in_float = OpVariable %_ptr_Function_float Function
+ %x_0 = OpVariable %_ptr_Function_float Function
+ %exp_0 = OpVariable %_ptr_Function_int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %vertex %int_0
+ OpBranch %29
+ %29 = OpLabel
+ OpLoopMerge %31 %32 None
+ OpBranch %33
+ %33 = OpLabel
+ %34 = OpLoad %int %vertex
+ %37 = OpSLessThan %bool %34 %int_3
+ OpBranchConditional %37 %30 %31
+ %30 = OpLabel
+ %50 = OpLoad %int %vertex
+ %52 = OpAccessChain %_ptr_Input_uint %ndx_in %50
+ %53 = OpLoad %uint %52
+ %55 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %53
+ %56 = OpLoad %uint %55
+ OpStore %in_uint %56
+ %58 = OpLoad %uint %in_uint
+ %59 = OpBitcast %float %58
+ OpStore %in_float %59
+ %61 = OpLoad %float %in_float
+ %63 = OpExtInst %float %1 Frexp %61 %exp_0
+ OpStore %x_0 %63
+ %66 = OpLoad %float %in_float
+ %67 = OpExtInst %frexpStructType %1 FrexpStruct %66
+ OpStore %res_0 %67
+ %70 = OpLoad %float %x_0
+ OpStore %frexp_x_out %70
+ %72 = OpLoad %int %exp_0
+ %73 = OpBitcast %float %72
+ OpStore %frexp_exp_out %73
+ %75 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+ %76 = OpLoad %float %75
+ OpStore %frexpStruct_x_out %76
+ %79 = OpAccessChain %_ptr_Function_int %res_0 %int_1
+ %80 = OpLoad %int %79
+ %81 = OpBitcast %float %80
+ OpStore %frexpStruct_exp_out %81
+ %92 = OpLoad %int %vertex
+ %94 = OpAccessChain %_ptr_Input_v4float %gl_in %92 %int_0
+ %95 = OpLoad %v4float %94
+ %97 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %97 %95
+ OpEmitVertex
+ OpBranch %32
+ %32 = OpLabel
+ %98 = OpLoad %int %vertex
+ %99 = OpIAdd %int %98 %int_1
+ OpStore %vertex %99
+ OpBranch %29
+ %31 = OpLabel
+ OpEndPrimitive
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float frexp_x_in;
+# layout (location = 1) flat in float frexp_exp_in;
+# layout (location = 2) flat in float frexpStruct_x_in;
+# layout (location = 3) flat in float frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.r = frexp_x_in;
+# frexp_exp_out.r = frexp_exp_in;
+# frexpStruct_x_out.r = frexpStruct_x_in;
+# frexpStruct_exp_out.r = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+ %frexp_x_in = OpVariable %_ptr_Input_float Input
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_exp_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %18 = OpLoad %float %frexp_x_in
+ %22 = OpAccessChain %_ptr_Output_float %frexp_x_out %uint_0
+ OpStore %22 %18
+ %24 = OpLoad %float %frexp_exp_in
+ %25 = OpAccessChain %_ptr_Output_float %frexp_exp_out %uint_0
+ OpStore %25 %24
+ %27 = OpLoad %float %frexpStruct_x_in
+ %28 = OpAccessChain %_ptr_Output_float %frexpStruct_x_out %uint_0
+ OpStore %28 %27
+ %30 = OpLoad %float %frexpStruct_exp_in
+ %31 = OpAccessChain %_ptr_Output_float %frexpStruct_exp_out %uint_0
+ OpStore %31 %30
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH geom_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_tesc.amber
new file mode 100644
index 0000000..3f2eb76
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_tesc.amber
@@ -0,0 +1,580 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out float frexp_x_out[];
+# layout (location = 1) flat out float frexp_exp_out[];
+# layout (location = 2) flat out float frexpStruct_x_out[];
+# layout (location = 3) flat out float frexpStruct_exp_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uint in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# float x;
+# int exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (float orig)
+# {
+# float x;
+# int exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uint in_uint = in_values[ndx_in[gl_InvocationID]];
+# float in_float = uintBitsToFloat(in_uint);
+# float x;
+# int exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out[gl_InvocationID] = x;
+# frexp_exp_out[gl_InvocationID] = intBitsToFloat(exp);
+# frexpStruct_x_out[gl_InvocationID] = res.x;
+# frexpStruct_exp_out[gl_InvocationID] = intBitsToFloat(res.exp);
+#
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %int = OpTypeInt 32 1
+%frexpStructType = OpTypeStruct %float %int
+ %10 = OpTypeFunction %frexpStructType %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+ %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+ %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Output__arr_float_uint_3 = OpTypePointer Output %_arr_float_uint_3
+%frexp_x_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_exp_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+%frexpStruct_x_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output__arr_float_uint_3 Output
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %float_1 = OpConstant %float 1
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_uint Function
+ %in_float = OpVariable %_ptr_Function_float Function
+ %x_0 = OpVariable %_ptr_Function_float Function
+ %exp_0 = OpVariable %_ptr_Function_int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %42 = OpLoad %int %gl_InvocationID
+ %44 = OpAccessChain %_ptr_Input_uint %ndx_in %42
+ %45 = OpLoad %uint %44
+ %47 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %45
+ %48 = OpLoad %uint %47
+ OpStore %in_uint %48
+ %50 = OpLoad %uint %in_uint
+ %51 = OpBitcast %float %50
+ OpStore %in_float %51
+ %53 = OpLoad %float %in_float
+ %55 = OpExtInst %float %1 Frexp %53 %exp_0
+ OpStore %x_0 %55
+ %58 = OpLoad %float %in_float
+ %59 = OpExtInst %frexpStructType %1 FrexpStruct %58
+ OpStore %res_0 %59
+ %64 = OpLoad %int %gl_InvocationID
+ %65 = OpLoad %float %x_0
+ %67 = OpAccessChain %_ptr_Output_float %frexp_x_out %64
+ OpStore %67 %65
+ %69 = OpLoad %int %gl_InvocationID
+ %70 = OpLoad %int %exp_0
+ %71 = OpBitcast %float %70
+ %72 = OpAccessChain %_ptr_Output_float %frexp_exp_out %69
+ OpStore %72 %71
+ %74 = OpLoad %int %gl_InvocationID
+ %75 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+ %76 = OpLoad %float %75
+ %77 = OpAccessChain %_ptr_Output_float %frexpStruct_x_out %74
+ OpStore %77 %76
+ %79 = OpLoad %int %gl_InvocationID
+ %81 = OpAccessChain %_ptr_Function_int %res_0 %int_1
+ %82 = OpLoad %int %81
+ %83 = OpBitcast %float %82
+ %84 = OpAccessChain %_ptr_Output_float %frexpStruct_exp_out %79
+ OpStore %84 %83
+ %90 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %90 %float_1
+ %91 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %91 %float_1
+ %96 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %96 %float_1
+ %97 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %97 %float_1
+ %99 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %99 %float_1
+ %101 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %101 %float_1
+ %109 = OpLoad %int %gl_InvocationID
+ %114 = OpLoad %int %gl_InvocationID
+ %116 = OpAccessChain %_ptr_Input_v4float %gl_in %114 %int_0
+ %117 = OpLoad %v4float %116
+ %119 = OpAccessChain %_ptr_Output_v4float %gl_out %109 %int_0
+ OpStore %119 %117
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in float frexp_x_in[];
+# layout (location = 1) flat in float frexp_exp_in[];
+# layout (location = 2) flat in float frexpStruct_x_in[];
+# layout (location = 3) flat in float frexpStruct_exp_in[];
+#
+# layout (location = 0) flat out float frexp_x_out;
+# layout (location = 1) flat out float frexp_exp_out;
+# layout (location = 2) flat out float frexpStruct_x_out;
+# layout (location = 3) flat out float frexpStruct_exp_out;
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# frexp_x_out = frexp_x_in[0];
+# frexp_exp_out = frexp_exp_in[0];
+# frexpStruct_x_out = frexpStruct_x_in[0];
+# frexpStruct_exp_out = frexpStruct_exp_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_x_out = OpVariable %_ptr_Output_float Output
+%_arr_float_uint_32 = OpTypeArray %float %uint_32
+%_ptr_Input__arr_float_uint_32 = OpTypePointer Input %_arr_float_uint_32
+ %frexp_x_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+%frexp_exp_out = OpVariable %_ptr_Output_float Output
+%frexp_exp_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input__arr_float_uint_32 Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %22 = OpLoad %float %21
+ %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %30 = OpLoad %v4float %29
+ %31 = OpVectorTimesScalar %v4float %30 %22
+ %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %33 = OpLoad %float %32
+ %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %36 = OpLoad %v4float %35
+ %37 = OpVectorTimesScalar %v4float %36 %33
+ %38 = OpFAdd %v4float %31 %37
+ %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %41 = OpLoad %float %40
+ %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %44 = OpLoad %v4float %43
+ %45 = OpVectorTimesScalar %v4float %44 %41
+ %46 = OpFAdd %v4float %38 %45
+ %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %48 %46
+ %54 = OpAccessChain %_ptr_Input_float %frexp_x_in %int_0
+ %55 = OpLoad %float %54
+ OpStore %frexp_x_out %55
+ %58 = OpAccessChain %_ptr_Input_float %frexp_exp_in %int_0
+ %59 = OpLoad %float %58
+ OpStore %frexp_exp_out %59
+ %62 = OpAccessChain %_ptr_Input_float %frexpStruct_x_in %int_0
+ %63 = OpLoad %float %62
+ OpStore %frexpStruct_x_out %63
+ %66 = OpAccessChain %_ptr_Input_float %frexpStruct_exp_in %int_0
+ %67 = OpLoad %float %66
+ OpStore %frexpStruct_exp_out %67
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float frexp_x_in;
+# layout (location = 1) flat in float frexp_exp_in;
+# layout (location = 2) flat in float frexpStruct_x_in;
+# layout (location = 3) flat in float frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.r = frexp_x_in;
+# frexp_exp_out.r = frexp_exp_in;
+# frexpStruct_x_out.r = frexpStruct_x_in;
+# frexpStruct_exp_out.r = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+ %frexp_x_in = OpVariable %_ptr_Input_float Input
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_exp_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %18 = OpLoad %float %frexp_x_in
+ %22 = OpAccessChain %_ptr_Output_float %frexp_x_out %uint_0
+ OpStore %22 %18
+ %24 = OpLoad %float %frexp_exp_in
+ %25 = OpAccessChain %_ptr_Output_float %frexp_exp_out %uint_0
+ OpStore %25 %24
+ %27 = OpLoad %float %frexpStruct_x_in
+ %28 = OpAccessChain %_ptr_Output_float %frexpStruct_x_out %uint_0
+ OpStore %28 %27
+ %30 = OpLoad %float %frexpStruct_exp_in
+ %31 = OpAccessChain %_ptr_Output_float %frexpStruct_exp_out %uint_0
+ OpStore %31 %30
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_tese.amber
new file mode 100644
index 0000000..166a0dc
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_tese.amber
@@ -0,0 +1,536 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+#
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %uint = OpTypeInt 32 0
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+ %int_1 = OpConstant %int 1
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+ %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %16 %float_1
+ %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %18 %float_1
+ %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %23 %float_1
+ %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %24 %float_1
+ %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %26 %float_1
+ %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %28 %float_1
+ %39 = OpLoad %int %gl_InvocationID
+ %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+ %48 = OpLoad %v4float %47
+ %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+ OpStore %50 %48
+ %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+ %61 = OpLoad %uint %60
+ %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+ OpStore %63 %61
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out float frexp_x_out;
+# layout (location = 1) flat out float frexp_exp_out;
+# layout (location = 2) flat out float frexpStruct_x_out;
+# layout (location = 3) flat out float frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uint in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# float x;
+# int exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (float orig)
+# {
+# float x;
+# int exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# uint in_uint = in_values[ndx_in[0]];
+# float in_float = uintBitsToFloat(in_uint);
+# float x;
+# int exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %int = OpTypeInt 32 1
+%frexpStructType = OpTypeStruct %float %int
+ %10 = OpTypeFunction %frexpStructType %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int_0 = OpConstant %int 0
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+ %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_x_out = OpVariable %_ptr_Output_float Output
+%frexp_exp_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_float Output
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_uint Function
+ %in_float = OpVariable %_ptr_Function_float Function
+ %x_0 = OpVariable %_ptr_Function_float Function
+ %exp_0 = OpVariable %_ptr_Function_int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %41 = OpLoad %float %40
+ %48 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %49 = OpLoad %v4float %48
+ %50 = OpVectorTimesScalar %v4float %49 %41
+ %51 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %52 = OpLoad %float %51
+ %54 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %55 = OpLoad %v4float %54
+ %56 = OpVectorTimesScalar %v4float %55 %52
+ %57 = OpFAdd %v4float %50 %56
+ %59 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %60 = OpLoad %float %59
+ %62 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %63 = OpLoad %v4float %62
+ %64 = OpVectorTimesScalar %v4float %63 %60
+ %65 = OpFAdd %v4float %57 %64
+ %67 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %67 %65
+ %79 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+ %80 = OpLoad %uint %79
+ %82 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %80
+ %83 = OpLoad %uint %82
+ OpStore %in_uint %83
+ %85 = OpLoad %uint %in_uint
+ %86 = OpBitcast %float %85
+ OpStore %in_float %86
+ %88 = OpLoad %float %in_float
+ %90 = OpExtInst %float %1 Frexp %88 %exp_0
+ OpStore %x_0 %90
+ %93 = OpLoad %float %in_float
+ %94 = OpExtInst %frexpStructType %1 FrexpStruct %93
+ OpStore %res_0 %94
+ %97 = OpLoad %float %x_0
+ OpStore %frexp_x_out %97
+ %99 = OpLoad %int %exp_0
+ %100 = OpBitcast %float %99
+ OpStore %frexp_exp_out %100
+ %102 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+ %103 = OpLoad %float %102
+ OpStore %frexpStruct_x_out %103
+ %105 = OpAccessChain %_ptr_Function_int %res_0 %int_1
+ %106 = OpLoad %int %105
+ %107 = OpBitcast %float %106
+ OpStore %frexpStruct_exp_out %107
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float frexp_x_in;
+# layout (location = 1) flat in float frexp_exp_in;
+# layout (location = 2) flat in float frexpStruct_x_in;
+# layout (location = 3) flat in float frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.r = frexp_x_in;
+# frexp_exp_out.r = frexp_exp_in;
+# frexpStruct_x_out.r = frexpStruct_x_in;
+# frexpStruct_exp_out.r = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+ %frexp_x_in = OpVariable %_ptr_Input_float Input
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_exp_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %18 = OpLoad %float %frexp_x_in
+ %22 = OpAccessChain %_ptr_Output_float %frexp_x_out %uint_0
+ OpStore %22 %18
+ %24 = OpLoad %float %frexp_exp_in
+ %25 = OpAccessChain %_ptr_Output_float %frexp_exp_out %uint_0
+ OpStore %25 %24
+ %27 = OpLoad %float %frexpStruct_x_in
+ %28 = OpAccessChain %_ptr_Output_float %frexpStruct_x_out %uint_0
+ OpStore %28 %27
+ %30 = OpLoad %float %frexpStruct_exp_in
+ %31 = OpAccessChain %_ptr_Output_float %frexpStruct_exp_out %uint_0
+ OpStore %31 %30
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_vert.amber
new file mode 100644
index 0000000..4063fcc
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_1_vert.amber
@@ -0,0 +1,328 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A vertex shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out float frexp_x_out;
+# layout (location = 1) flat out float frexp_exp_out;
+# layout (location = 2) flat out float frexpStruct_x_out;
+# layout (location = 3) flat out float frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uint in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# float x;
+# int exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (float orig)
+# {
+# float x;
+# int exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# uint ndx = xcoord + ycoord * ndpSqrt;
+#
+# uint in_uint = in_values[ndx];
+# float in_float = uintBitsToFloat(in_uint);
+# float x;
+# int exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0
+ OpDecorate %position Location 0
+ OpDecorate %_arr_uint_uint_1296 ArrayStride 4
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %int = OpTypeInt 32 1
+%frexpStructType = OpTypeStruct %float %int
+ %10 = OpTypeFunction %frexpStructType %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %float_36 = OpConstant %float 36
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %uint_1 = OpConstant %uint 1
+ %uint_36 = OpConstant %uint 36
+ %uint_1296 = OpConstant %uint 1296
+%_arr_uint_uint_1296 = OpTypeArray %uint %uint_1296
+ %block0 = OpTypeStruct %_arr_uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_x_out = OpVariable %_ptr_Output_float Output
+%frexp_exp_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_float Output
+ %int_1 = OpConstant %int 1
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %xcoord = OpVariable %_ptr_Function_uint Function
+ %ycoord = OpVariable %_ptr_Function_uint Function
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_uint Function
+ %in_float = OpVariable %_ptr_Function_float Function
+ %x_0 = OpVariable %_ptr_Function_float Function
+ %exp_0 = OpVariable %_ptr_Function_int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %36 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %37 = OpLoad %float %36
+ %39 = OpFAdd %float %37 %float_0_027777778
+ %41 = OpFAdd %float %39 %float_1
+ %43 = OpFDiv %float %41 %float_2
+ %44 = OpFMul %float %float_36 %43
+ %45 = OpFSub %float %44 %float_1
+ %46 = OpConvertFToU %uint %45
+ OpStore %xcoord %46
+ %49 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %50 = OpLoad %float %49
+ %51 = OpFAdd %float %50 %float_0_027777778
+ %52 = OpFAdd %float %51 %float_1
+ %53 = OpFDiv %float %52 %float_2
+ %54 = OpFMul %float %float_36 %53
+ %55 = OpFSub %float %54 %float_1
+ %56 = OpConvertFToU %uint %55
+ OpStore %ycoord %56
+ %58 = OpLoad %uint %xcoord
+ %59 = OpLoad %uint %ycoord
+ %61 = OpIMul %uint %59 %uint_36
+ %62 = OpIAdd %uint %58 %61
+ OpStore %ndx %62
+ %70 = OpLoad %uint %ndx
+ %72 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %70
+ %73 = OpLoad %uint %72
+ OpStore %in_uint %73
+ %75 = OpLoad %uint %in_uint
+ %76 = OpBitcast %float %75
+ OpStore %in_float %76
+ %78 = OpLoad %float %in_float
+ %80 = OpExtInst %float %1 Frexp %78 %exp_0
+ OpStore %x_0 %80
+ %83 = OpLoad %float %in_float
+ %84 = OpExtInst %frexpStructType %1 FrexpStruct %83
+ OpStore %res_0 %84
+ %87 = OpLoad %float %x_0
+ OpStore %frexp_x_out %87
+ %89 = OpLoad %int %exp_0
+ %90 = OpBitcast %float %89
+ OpStore %frexp_exp_out %90
+ %92 = OpAccessChain %_ptr_Function_float %res_0 %int_0
+ %93 = OpLoad %float %92
+ OpStore %frexpStruct_x_out %93
+ %96 = OpAccessChain %_ptr_Function_int %res_0 %int_1
+ %97 = OpLoad %int %96
+ %98 = OpBitcast %float %97
+ OpStore %frexpStruct_exp_out %98
+ %104 = OpLoad %v2float %position
+ %106 = OpCompositeExtract %float %104 0
+ %107 = OpCompositeExtract %float %104 1
+ %108 = OpCompositeConstruct %v4float %106 %107 %float_0 %float_1
+ %110 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %110 %108
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in float frexp_x_in;
+# layout (location = 1) flat in float frexp_exp_in;
+# layout (location = 2) flat in float frexpStruct_x_in;
+# layout (location = 3) flat in float frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.r = frexp_x_in;
+# frexp_exp_out.r = frexp_exp_in;
+# frexpStruct_x_out.r = frexpStruct_x_in;
+# frexpStruct_exp_out.r = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_float = OpTypePointer Input %float
+ %frexp_x_in = OpVariable %_ptr_Input_float Input
+ %uint = OpTypeInt 32 0
+ %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+%frexp_exp_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %18 = OpLoad %float %frexp_x_in
+ %22 = OpAccessChain %_ptr_Output_float %frexp_x_out %uint_0
+ OpStore %22 %18
+ %24 = OpLoad %float %frexp_exp_in
+ %25 = OpAccessChain %_ptr_Output_float %frexp_exp_out %uint_0
+ OpStore %25 %24
+ %27 = OpLoad %float %frexpStruct_x_in
+ %28 = OpAccessChain %_ptr_Output_float %frexpStruct_x_out %uint_0
+ OpStore %28 %27
+ %30 = OpLoad %float %frexpStruct_exp_in
+ %31 = OpAccessChain %_ptr_Output_float %frexpStruct_exp_out %uint_0
+ OpStore %31 %30
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_comp.amber
new file mode 100644
index 0000000..a5af11a
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_comp.amber
@@ -0,0 +1,215 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A compute shader test for FrexpStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 2;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec2 in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+# vec2 frexp_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+# vec2 frexpStruct_out[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec2 x;
+# ivec2 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec2 orig)
+# {
+# vec2 x;
+# ivec2 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (uint ndx = 0; ndx < ndp; ndx += 2)
+# {
+# uvec2 in_uint = in_values[ndx/2];
+# vec2 in_float = uintBitsToFloat(in_uint);
+# vec2 x;
+# ivec2 exp;
+#
+# x = frexp(in_float, exp);
+# frexpStructType res = frexpStruct(in_float);
+#
+# frexp_out[ndx] = intBitsToFloat(exp);
+# frexp_out[ndx+1] = x;
+# frexpStruct_out[ndx] = intBitsToFloat(res.exp);
+# frexpStruct_out[ndx+1] = res.x;
+# }
+#
+# return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpDecorate %_arr_v2uint_uint_324 ArrayStride 8
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_arr_v2float_uint_648 ArrayStride 8
+ OpMemberDecorate %block1 0 Offset 0
+ OpDecorate %block1 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ OpDecorate %_arr_v2float_uint_648_0 ArrayStride 8
+ OpMemberDecorate %block2 0 Offset 0
+ OpDecorate %block2 BufferBlock
+ OpDecorate %__1 DescriptorSet 0
+ OpDecorate %__1 Binding 2
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %int = OpTypeInt 32 1
+ %v2int = OpTypeVector %int 2
+%frexpStructType = OpTypeStruct %v2float %v2int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v2float
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_648 = OpConstant %uint 648
+ %bool = OpTypeBool
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %uint_324 = OpConstant %uint 324
+%_arr_v2uint_uint_324 = OpTypeArray %v2uint %uint_324
+ %block0 = OpTypeStruct %_arr_v2uint_uint_324
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_arr_v2float_uint_648 = OpTypeArray %v2float %uint_648
+ %block1 = OpTypeStruct %_arr_v2float_uint_648
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+ %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+ %uint_1 = OpConstant %uint 1
+%_arr_v2float_uint_648_0 = OpTypeArray %v2float %uint_648
+ %block2 = OpTypeStruct %_arr_v2float_uint_648_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+ %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_v2uint Function
+ %in_float = OpVariable %_ptr_Function_v2float Function
+ %x_0 = OpVariable %_ptr_Function_v2float Function
+ %exp_0 = OpVariable %_ptr_Function_v2int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %ndx %uint_0
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %uint %ndx
+ %41 = OpULessThan %bool %38 %uint_648
+ OpBranchConditional %41 %34 %35
+ %34 = OpLabel
+ %51 = OpLoad %uint %ndx
+ %53 = OpUDiv %uint %51 %uint_2
+ %55 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %53
+ %56 = OpLoad %v2uint %55
+ OpStore %in_uint %56
+ %58 = OpLoad %v2uint %in_uint
+ %59 = OpBitcast %v2float %58
+ OpStore %in_float %59
+ %61 = OpLoad %v2float %in_float
+ %63 = OpExtInst %v2float %1 Frexp %61 %exp_0
+ OpStore %x_0 %63
+ %66 = OpLoad %v2float %in_float
+ %67 = OpExtInst %frexpStructType %1 FrexpStruct %66
+ OpStore %res_0 %67
+ %72 = OpLoad %uint %ndx
+ %73 = OpLoad %v2int %exp_0
+ %74 = OpBitcast %v2float %73
+ %76 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %72
+ OpStore %76 %74
+ %77 = OpLoad %uint %ndx
+ %79 = OpIAdd %uint %77 %uint_1
+ %80 = OpLoad %v2float %x_0
+ %81 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0 %79
+ OpStore %81 %80
+ %86 = OpLoad %uint %ndx
+ %88 = OpAccessChain %_ptr_Function_v2int %res_0 %int_1
+ %89 = OpLoad %v2int %88
+ %90 = OpBitcast %v2float %89
+ %91 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0 %86
+ OpStore %91 %90
+ %92 = OpLoad %uint %ndx
+ %93 = OpIAdd %uint %92 %uint_1
+ %94 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+ %95 = OpLoad %v2float %94
+ %96 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0 %93
+ OpStore %96 %95
+ OpBranch %36
+ %36 = OpLabel
+ %97 = OpLoad %uint %ndx
+ %98 = OpIAdd %uint %97 %uint_2
+ OpStore %ndx %98
+ OpBranch %33
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_frexp DATA_TYPE vec2<float> SIZE 648 FILL 0.0
+BUFFER buf_frexpStruct DATA_TYPE vec2<float> SIZE 648 FILL 1.0
+
+PIPELINE compute test_pipeline
+ ATTACH comp_shader
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER buf_frexp AS storage DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER buf_frexpStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_frexp EQ_BUFFER buf_frexpStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_frag.amber
new file mode 100644
index 0000000..d127317
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_frag.amber
@@ -0,0 +1,288 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A fragment shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec2 in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# vec2 x;
+# ivec2 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec2 orig)
+# {
+# vec2 x;
+# ivec2 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uvec2 in_uint = in_values[ndx_in];
+# vec2 in_float = uintBitsToFloat(in_uint);
+# vec2 x;
+# ivec2 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rg = x;
+# frexp_exp_out.rg = intBitsToFloat(exp);
+# frexpStruct_x_out.rg = res.x;
+# frexpStruct_exp_out.rg = intBitsToFloat(res.exp);
+#
+# return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %int = OpTypeInt 32 1
+ %v2int = OpTypeVector %int 2
+%frexpStructType = OpTypeStruct %v2float %v2int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v2float
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+ %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v2uint Function
+ %in_float = OpVariable %_ptr_Function_v2float Function
+ %x_0 = OpVariable %_ptr_Function_v2float Function
+ %exp_0 = OpVariable %_ptr_Function_v2int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %41 = OpLoad %uint %ndx_in
+ %43 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %41
+ %44 = OpLoad %v2uint %43
+ OpStore %in_uint %44
+ %46 = OpLoad %v2uint %in_uint
+ %47 = OpBitcast %v2float %46
+ OpStore %in_float %47
+ %49 = OpLoad %v2float %in_float
+ %51 = OpExtInst %v2float %1 Frexp %49 %exp_0
+ OpStore %x_0 %51
+ %54 = OpLoad %v2float %in_float
+ %55 = OpExtInst %frexpStructType %1 FrexpStruct %54
+ OpStore %res_0 %55
+ OpStore %frexp_x_out %61
+ OpStore %frexp_exp_out %61
+ OpStore %frexpStruct_x_out %61
+ OpStore %frexpStruct_exp_out %61
+ %65 = OpLoad %v2float %x_0
+ %66 = OpLoad %v4float %frexp_x_out
+ %67 = OpVectorShuffle %v4float %66 %65 4 5 2 3
+ OpStore %frexp_x_out %67
+ %68 = OpLoad %v2int %exp_0
+ %69 = OpBitcast %v2float %68
+ %70 = OpLoad %v4float %frexp_exp_out
+ %71 = OpVectorShuffle %v4float %70 %69 4 5 2 3
+ OpStore %frexp_exp_out %71
+ %72 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+ %73 = OpLoad %v2float %72
+ %74 = OpLoad %v4float %frexpStruct_x_out
+ %75 = OpVectorShuffle %v4float %74 %73 4 5 2 3
+ OpStore %frexpStruct_x_out %75
+ %77 = OpAccessChain %_ptr_Function_v2int %res_0 %int_1
+ %78 = OpLoad %v2int %77
+ %79 = OpBitcast %v2float %78
+ %80 = OpLoad %v4float %frexpStruct_exp_out
+ %81 = OpVectorShuffle %v4float %80 %79 4 5 2 3
+ OpStore %frexpStruct_exp_out %81
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_geom.amber
new file mode 100644
index 0000000..f421130
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_geom.amber
@@ -0,0 +1,430 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A geometry shader test for FrexpStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec2 in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec2 frexp_x_out;
+# layout (location = 1) flat out vec2 frexp_exp_out;
+# layout (location = 2) flat out vec2 frexpStruct_x_out;
+# layout (location = 3) flat out vec2 frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# vec2 x;
+# ivec2 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec2 orig)
+# {
+# vec2 x;
+# ivec2 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (int vertex = 0; vertex < 3; vertex++)
+# {
+# uvec2 in_uint = in_values[ndx_in[vertex]];
+# vec2 in_float = uintBitsToFloat(in_uint);
+# vec2 x;
+# ivec2 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = gl_in[vertex].gl_Position;
+# EmitVertex();
+# }
+#
+# EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+ OpCapability Geometry
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Geometry %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0 %gl_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main Invocations 1
+ OpExecutionMode %main OutputTriangleStrip
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %int = OpTypeInt 32 1
+ %v2int = OpTypeVector %int 2
+%frexpStructType = OpTypeStruct %v2float %v2int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v2float
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %bool = OpTypeBool
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+%frexp_x_out = OpVariable %_ptr_Output_v2float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v2float Output
+ %int_1 = OpConstant %int 1
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %vertex = OpVariable %_ptr_Function_int Function
+ %in_uint = OpVariable %_ptr_Function_v2uint Function
+ %in_float = OpVariable %_ptr_Function_v2float Function
+ %x_0 = OpVariable %_ptr_Function_v2float Function
+ %exp_0 = OpVariable %_ptr_Function_v2int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %vertex %int_0
+ OpBranch %32
+ %32 = OpLabel
+ OpLoopMerge %34 %35 None
+ OpBranch %36
+ %36 = OpLabel
+ %37 = OpLoad %int %vertex
+ %40 = OpSLessThan %bool %37 %int_3
+ OpBranchConditional %40 %33 %34
+ %33 = OpLabel
+ %54 = OpLoad %int %vertex
+ %56 = OpAccessChain %_ptr_Input_uint %ndx_in %54
+ %57 = OpLoad %uint %56
+ %59 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %57
+ %60 = OpLoad %v2uint %59
+ OpStore %in_uint %60
+ %62 = OpLoad %v2uint %in_uint
+ %63 = OpBitcast %v2float %62
+ OpStore %in_float %63
+ %65 = OpLoad %v2float %in_float
+ %67 = OpExtInst %v2float %1 Frexp %65 %exp_0
+ OpStore %x_0 %67
+ %70 = OpLoad %v2float %in_float
+ %71 = OpExtInst %frexpStructType %1 FrexpStruct %70
+ OpStore %res_0 %71
+ %74 = OpLoad %v2float %x_0
+ OpStore %frexp_x_out %74
+ %76 = OpLoad %v2int %exp_0
+ %77 = OpBitcast %v2float %76
+ OpStore %frexp_exp_out %77
+ %79 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+ %80 = OpLoad %v2float %79
+ OpStore %frexpStruct_x_out %80
+ %83 = OpAccessChain %_ptr_Function_v2int %res_0 %int_1
+ %84 = OpLoad %v2int %83
+ %85 = OpBitcast %v2float %84
+ OpStore %frexpStruct_exp_out %85
+ %96 = OpLoad %int %vertex
+ %98 = OpAccessChain %_ptr_Input_v4float %gl_in %96 %int_0
+ %99 = OpLoad %v4float %98
+ %101 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %101 %99
+ OpEmitVertex
+ OpBranch %35
+ %35 = OpLabel
+ %102 = OpLoad %int %vertex
+ %103 = OpIAdd %int %102 %int_1
+ OpStore %vertex %103
+ OpBranch %32
+ %34 = OpLabel
+ OpEndPrimitive
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 frexp_x_in;
+# layout (location = 1) flat in vec2 frexp_exp_in;
+# layout (location = 2) flat in vec2 frexpStruct_x_in;
+# layout (location = 3) flat in vec2 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rg = frexp_x_in;
+# frexp_exp_out.rg = frexp_exp_in;
+# frexpStruct_x_out.rg = frexpStruct_x_in;
+# frexpStruct_exp_out.rg = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %frexp_x_in = OpVariable %_ptr_Input_v2float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v2float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v2float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v2float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v2float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v2float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH geom_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_tesc.amber
new file mode 100644
index 0000000..3abf115
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_tesc.amber
@@ -0,0 +1,588 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec2 frexp_x_out[];
+# layout (location = 1) flat out vec2 frexp_exp_out[];
+# layout (location = 2) flat out vec2 frexpStruct_x_out[];
+# layout (location = 3) flat out vec2 frexpStruct_exp_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec2 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec2 x;
+# ivec2 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec2 orig)
+# {
+# vec2 x;
+# ivec2 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uvec2 in_uint = in_values[ndx_in[gl_InvocationID]];
+# vec2 in_float = uintBitsToFloat(in_uint);
+# vec2 x;
+# ivec2 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out[gl_InvocationID] = x;
+# frexp_exp_out[gl_InvocationID] = intBitsToFloat(exp);
+# frexpStruct_x_out[gl_InvocationID] = res.x;
+# frexpStruct_exp_out[gl_InvocationID] = intBitsToFloat(res.exp);
+#
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %int = OpTypeInt 32 1
+ %v2int = OpTypeVector %int 2
+%frexpStructType = OpTypeStruct %v2float %v2int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v2float
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+ %uint_3 = OpConstant %uint 3
+%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
+%_ptr_Output__arr_v2float_uint_3 = OpTypePointer Output %_arr_v2float_uint_3
+%frexp_x_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+%frexp_exp_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+%frexpStruct_x_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output__arr_v2float_uint_3 Output
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v2uint Function
+ %in_float = OpVariable %_ptr_Function_v2float Function
+ %x_0 = OpVariable %_ptr_Function_v2float Function
+ %exp_0 = OpVariable %_ptr_Function_v2int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %45 = OpLoad %int %gl_InvocationID
+ %47 = OpAccessChain %_ptr_Input_uint %ndx_in %45
+ %48 = OpLoad %uint %47
+ %50 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %48
+ %51 = OpLoad %v2uint %50
+ OpStore %in_uint %51
+ %53 = OpLoad %v2uint %in_uint
+ %54 = OpBitcast %v2float %53
+ OpStore %in_float %54
+ %56 = OpLoad %v2float %in_float
+ %58 = OpExtInst %v2float %1 Frexp %56 %exp_0
+ OpStore %x_0 %58
+ %61 = OpLoad %v2float %in_float
+ %62 = OpExtInst %frexpStructType %1 FrexpStruct %61
+ OpStore %res_0 %62
+ %67 = OpLoad %int %gl_InvocationID
+ %68 = OpLoad %v2float %x_0
+ %70 = OpAccessChain %_ptr_Output_v2float %frexp_x_out %67
+ OpStore %70 %68
+ %72 = OpLoad %int %gl_InvocationID
+ %73 = OpLoad %v2int %exp_0
+ %74 = OpBitcast %v2float %73
+ %75 = OpAccessChain %_ptr_Output_v2float %frexp_exp_out %72
+ OpStore %75 %74
+ %77 = OpLoad %int %gl_InvocationID
+ %78 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+ %79 = OpLoad %v2float %78
+ %80 = OpAccessChain %_ptr_Output_v2float %frexpStruct_x_out %77
+ OpStore %80 %79
+ %82 = OpLoad %int %gl_InvocationID
+ %84 = OpAccessChain %_ptr_Function_v2int %res_0 %int_1
+ %85 = OpLoad %v2int %84
+ %86 = OpBitcast %v2float %85
+ %87 = OpAccessChain %_ptr_Output_v2float %frexpStruct_exp_out %82
+ OpStore %87 %86
+ %94 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %94 %float_1
+ %95 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %95 %float_1
+ %100 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %100 %float_1
+ %101 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %101 %float_1
+ %103 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %103 %float_1
+ %105 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %105 %float_1
+ %113 = OpLoad %int %gl_InvocationID
+ %118 = OpLoad %int %gl_InvocationID
+ %120 = OpAccessChain %_ptr_Input_v4float %gl_in %118 %int_0
+ %121 = OpLoad %v4float %120
+ %123 = OpAccessChain %_ptr_Output_v4float %gl_out %113 %int_0
+ OpStore %123 %121
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in vec2 frexp_x_in[];
+# layout (location = 1) flat in vec2 frexp_exp_in[];
+# layout (location = 2) flat in vec2 frexpStruct_x_in[];
+# layout (location = 3) flat in vec2 frexpStruct_exp_in[];
+#
+# layout (location = 0) flat out vec2 frexp_x_out;
+# layout (location = 1) flat out vec2 frexp_exp_out;
+# layout (location = 2) flat out vec2 frexpStruct_x_out;
+# layout (location = 3) flat out vec2 frexpStruct_exp_out;
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# frexp_x_out = frexp_x_in[0];
+# frexp_exp_out = frexp_exp_in[0];
+# frexpStruct_x_out = frexpStruct_x_in[0];
+# frexpStruct_exp_out = frexpStruct_exp_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %v2float = OpTypeVector %float 2
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+%frexp_x_out = OpVariable %_ptr_Output_v2float Output
+%_arr_v2float_uint_32 = OpTypeArray %v2float %uint_32
+%_ptr_Input__arr_v2float_uint_32 = OpTypePointer Input %_arr_v2float_uint_32
+ %frexp_x_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+%frexp_exp_out = OpVariable %_ptr_Output_v2float Output
+%frexp_exp_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input__arr_v2float_uint_32 Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %22 = OpLoad %float %21
+ %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %30 = OpLoad %v4float %29
+ %31 = OpVectorTimesScalar %v4float %30 %22
+ %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %33 = OpLoad %float %32
+ %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %36 = OpLoad %v4float %35
+ %37 = OpVectorTimesScalar %v4float %36 %33
+ %38 = OpFAdd %v4float %31 %37
+ %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %41 = OpLoad %float %40
+ %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %44 = OpLoad %v4float %43
+ %45 = OpVectorTimesScalar %v4float %44 %41
+ %46 = OpFAdd %v4float %38 %45
+ %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %48 %46
+ %56 = OpAccessChain %_ptr_Input_v2float %frexp_x_in %int_0
+ %57 = OpLoad %v2float %56
+ OpStore %frexp_x_out %57
+ %60 = OpAccessChain %_ptr_Input_v2float %frexp_exp_in %int_0
+ %61 = OpLoad %v2float %60
+ OpStore %frexp_exp_out %61
+ %64 = OpAccessChain %_ptr_Input_v2float %frexpStruct_x_in %int_0
+ %65 = OpLoad %v2float %64
+ OpStore %frexpStruct_x_out %65
+ %68 = OpAccessChain %_ptr_Input_v2float %frexpStruct_exp_in %int_0
+ %69 = OpLoad %v2float %68
+ OpStore %frexpStruct_exp_out %69
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 frexp_x_in;
+# layout (location = 1) flat in vec2 frexp_exp_in;
+# layout (location = 2) flat in vec2 frexpStruct_x_in;
+# layout (location = 3) flat in vec2 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rg = frexp_x_in;
+# frexp_exp_out.rg = frexp_exp_in;
+# frexpStruct_x_out.rg = frexpStruct_x_in;
+# frexpStruct_exp_out.rg = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %frexp_x_in = OpVariable %_ptr_Input_v2float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v2float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v2float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v2float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v2float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v2float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_tese.amber
new file mode 100644
index 0000000..dadfad9
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_tese.amber
@@ -0,0 +1,541 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+#
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %uint = OpTypeInt 32 0
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+ %int_1 = OpConstant %int 1
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+ %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %16 %float_1
+ %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %18 %float_1
+ %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %23 %float_1
+ %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %24 %float_1
+ %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %26 %float_1
+ %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %28 %float_1
+ %39 = OpLoad %int %gl_InvocationID
+ %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+ %48 = OpLoad %v4float %47
+ %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+ OpStore %50 %48
+ %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+ %61 = OpLoad %uint %60
+ %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+ OpStore %63 %61
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec2 frexp_x_out;
+# layout (location = 1) flat out vec2 frexp_exp_out;
+# layout (location = 2) flat out vec2 frexpStruct_x_out;
+# layout (location = 3) flat out vec2 frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec2 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec2 x;
+# ivec2 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec2 orig)
+# {
+# vec2 x;
+# ivec2 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# uvec2 in_uint = in_values[ndx_in[0]];
+# vec2 in_float = uintBitsToFloat(in_uint);
+# vec2 x;
+# ivec2 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %int = OpTypeInt 32 1
+ %v2int = OpTypeVector %int 2
+%frexpStructType = OpTypeStruct %v2float %v2int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v2float
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int_0 = OpConstant %int 0
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+%frexp_x_out = OpVariable %_ptr_Output_v2float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v2float Output
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v2uint Function
+ %in_float = OpVariable %_ptr_Function_v2float Function
+ %x_0 = OpVariable %_ptr_Function_v2float Function
+ %exp_0 = OpVariable %_ptr_Function_v2int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %42 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %43 = OpLoad %float %42
+ %50 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %51 = OpLoad %v4float %50
+ %52 = OpVectorTimesScalar %v4float %51 %43
+ %53 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %54 = OpLoad %float %53
+ %56 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %57 = OpLoad %v4float %56
+ %58 = OpVectorTimesScalar %v4float %57 %54
+ %59 = OpFAdd %v4float %52 %58
+ %61 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %62 = OpLoad %float %61
+ %64 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %65 = OpLoad %v4float %64
+ %66 = OpVectorTimesScalar %v4float %65 %62
+ %67 = OpFAdd %v4float %59 %66
+ %69 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %69 %67
+ %82 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+ %83 = OpLoad %uint %82
+ %85 = OpAccessChain %_ptr_Uniform_v2uint %__0 %int_0 %83
+ %86 = OpLoad %v2uint %85
+ OpStore %in_uint %86
+ %88 = OpLoad %v2uint %in_uint
+ %89 = OpBitcast %v2float %88
+ OpStore %in_float %89
+ %91 = OpLoad %v2float %in_float
+ %93 = OpExtInst %v2float %1 Frexp %91 %exp_0
+ OpStore %x_0 %93
+ %96 = OpLoad %v2float %in_float
+ %97 = OpExtInst %frexpStructType %1 FrexpStruct %96
+ OpStore %res_0 %97
+ %100 = OpLoad %v2float %x_0
+ OpStore %frexp_x_out %100
+ %102 = OpLoad %v2int %exp_0
+ %103 = OpBitcast %v2float %102
+ OpStore %frexp_exp_out %103
+ %105 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+ %106 = OpLoad %v2float %105
+ OpStore %frexpStruct_x_out %106
+ %108 = OpAccessChain %_ptr_Function_v2int %res_0 %int_1
+ %109 = OpLoad %v2int %108
+ %110 = OpBitcast %v2float %109
+ OpStore %frexpStruct_exp_out %110
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 frexp_x_in;
+# layout (location = 1) flat in vec2 frexp_exp_in;
+# layout (location = 2) flat in vec2 frexpStruct_x_in;
+# layout (location = 3) flat in vec2 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rg = frexp_x_in;
+# frexp_exp_out.rg = frexp_exp_in;
+# frexpStruct_x_out.rg = frexpStruct_x_in;
+# frexpStruct_exp_out.rg = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %frexp_x_in = OpVariable %_ptr_Input_v2float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v2float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v2float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v2float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v2float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v2float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_vert.amber
new file mode 100644
index 0000000..31d38bd
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_2_vert.amber
@@ -0,0 +1,333 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A vertex shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out vec2 frexp_x_out;
+# layout (location = 1) flat out vec2 frexp_exp_out;
+# layout (location = 2) flat out vec2 frexpStruct_x_out;
+# layout (location = 3) flat out vec2 frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec2 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec2 x;
+# ivec2 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec2 orig)
+# {
+# vec2 x;
+# ivec2 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# uint ndx = xcoord + ycoord * ndpSqrt;
+#
+# uvec2 in_uint = in_values[ndx];
+# vec2 in_float = uintBitsToFloat(in_uint);
+# vec2 x;
+# ivec2 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0
+ OpDecorate %position Location 0
+ OpDecorate %_arr_v2uint_uint_1296 ArrayStride 8
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+ %int = OpTypeInt 32 1
+ %v2int = OpTypeVector %int 2
+%frexpStructType = OpTypeStruct %v2float %v2int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v2float
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %float_36 = OpConstant %float 36
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %uint_1 = OpConstant %uint 1
+ %uint_36 = OpConstant %uint 36
+ %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v2uint_uint_1296 = OpTypeArray %v2uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v2uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+%frexp_x_out = OpVariable %_ptr_Output_v2float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v2float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v2float Output
+ %int_1 = OpConstant %int 1
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %xcoord = OpVariable %_ptr_Function_uint Function
+ %ycoord = OpVariable %_ptr_Function_uint Function
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_v2uint Function
+ %in_float = OpVariable %_ptr_Function_v2float Function
+ %x_0 = OpVariable %_ptr_Function_v2float Function
+ %exp_0 = OpVariable %_ptr_Function_v2int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %37 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %38 = OpLoad %float %37
+ %40 = OpFAdd %float %38 %float_0_027777778
+ %42 = OpFAdd %float %40 %float_1
+ %44 = OpFDiv %float %42 %float_2
+ %45 = OpFMul %float %float_36 %44
+ %46 = OpFSub %float %45 %float_1
+ %47 = OpConvertFToU %uint %46
+ OpStore %xcoord %47
+ %50 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %51 = OpLoad %float %50
+ %52 = OpFAdd %float %51 %float_0_027777778
+ %53 = OpFAdd %float %52 %float_1
+ %54 = OpFDiv %float %53 %float_2
+ %55 = OpFMul %float %float_36 %54
+ %56 = OpFSub %float %55 %float_1
+ %57 = OpConvertFToU %uint %56
+ OpStore %ycoord %57
+ %59 = OpLoad %uint %xcoord
+ %60 = OpLoad %uint %ycoord
+ %62 = OpIMul %uint %60 %uint_36
+ %63 = OpIAdd %uint %59 %62
+ OpStore %ndx %63
+ %73 = OpLoad %uint %ndx
+ %75 = OpAccessChain %_ptr_Uniform_v2uint %_ %int_0 %73
+ %76 = OpLoad %v2uint %75
+ OpStore %in_uint %76
+ %78 = OpLoad %v2uint %in_uint
+ %79 = OpBitcast %v2float %78
+ OpStore %in_float %79
+ %81 = OpLoad %v2float %in_float
+ %83 = OpExtInst %v2float %1 Frexp %81 %exp_0
+ OpStore %x_0 %83
+ %86 = OpLoad %v2float %in_float
+ %87 = OpExtInst %frexpStructType %1 FrexpStruct %86
+ OpStore %res_0 %87
+ %90 = OpLoad %v2float %x_0
+ OpStore %frexp_x_out %90
+ %92 = OpLoad %v2int %exp_0
+ %93 = OpBitcast %v2float %92
+ OpStore %frexp_exp_out %93
+ %95 = OpAccessChain %_ptr_Function_v2float %res_0 %int_0
+ %96 = OpLoad %v2float %95
+ OpStore %frexpStruct_x_out %96
+ %99 = OpAccessChain %_ptr_Function_v2int %res_0 %int_1
+ %100 = OpLoad %v2int %99
+ %101 = OpBitcast %v2float %100
+ OpStore %frexpStruct_exp_out %101
+ %107 = OpLoad %v2float %position
+ %109 = OpCompositeExtract %float %107 0
+ %110 = OpCompositeExtract %float %107 1
+ %111 = OpCompositeConstruct %v4float %109 %110 %float_0 %float_1
+ %113 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %113 %111
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec2 frexp_x_in;
+# layout (location = 1) flat in vec2 frexp_exp_in;
+# layout (location = 2) flat in vec2 frexpStruct_x_in;
+# layout (location = 3) flat in vec2 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rg = frexp_x_in;
+# frexp_exp_out.rg = frexp_exp_in;
+# frexpStruct_x_out.rg = frexpStruct_x_in;
+# frexpStruct_exp_out.rg = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %frexp_x_in = OpVariable %_ptr_Input_v2float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v2float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v2float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v2float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 2 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v2float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 2 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v2float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 2 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v2float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 2 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_comp.amber
new file mode 100644
index 0000000..a637659
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_comp.amber
@@ -0,0 +1,215 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A compute shader test for FrexpStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 3;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec3 in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+# vec3 frexp_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+# vec3 frexpStruct_out[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec3 x;
+# ivec3 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec3 orig)
+# {
+# vec3 x;
+# ivec3 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (uint ndx = 0; ndx < ndp; ndx += 2)
+# {
+# uvec3 in_uint = in_values[ndx/2];
+# vec3 in_float = uintBitsToFloat(in_uint);
+# vec3 x;
+# ivec3 exp;
+#
+# x = frexp(in_float, exp);
+# frexpStructType res = frexpStruct(in_float);
+#
+# frexp_out[ndx] = intBitsToFloat(exp);
+# frexp_out[ndx+1] = x;
+# frexpStruct_out[ndx] = intBitsToFloat(res.exp);
+# frexpStruct_out[ndx+1] = res.x;
+# }
+#
+# return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpDecorate %_arr_v3uint_uint_216 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_arr_v3float_uint_432 ArrayStride 16
+ OpMemberDecorate %block1 0 Offset 0
+ OpDecorate %block1 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ OpDecorate %_arr_v3float_uint_432_0 ArrayStride 16
+ OpMemberDecorate %block2 0 Offset 0
+ OpDecorate %block2 BufferBlock
+ OpDecorate %__1 DescriptorSet 0
+ OpDecorate %__1 Binding 2
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+%frexpStructType = OpTypeStruct %v3float %v3int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v3float
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_432 = OpConstant %uint 432
+ %bool = OpTypeBool
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %uint_216 = OpConstant %uint 216
+%_arr_v3uint_uint_216 = OpTypeArray %v3uint %uint_216
+ %block0 = OpTypeStruct %_arr_v3uint_uint_216
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_arr_v3float_uint_432 = OpTypeArray %v3float %uint_432
+ %block1 = OpTypeStruct %_arr_v3float_uint_432
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+ %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+%_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
+ %uint_1 = OpConstant %uint 1
+%_arr_v3float_uint_432_0 = OpTypeArray %v3float %uint_432
+ %block2 = OpTypeStruct %_arr_v3float_uint_432_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+ %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_v3uint Function
+ %in_float = OpVariable %_ptr_Function_v3float Function
+ %x_0 = OpVariable %_ptr_Function_v3float Function
+ %exp_0 = OpVariable %_ptr_Function_v3int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %ndx %uint_0
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %uint %ndx
+ %41 = OpULessThan %bool %38 %uint_432
+ OpBranchConditional %41 %34 %35
+ %34 = OpLabel
+ %51 = OpLoad %uint %ndx
+ %53 = OpUDiv %uint %51 %uint_2
+ %55 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %53
+ %56 = OpLoad %v3uint %55
+ OpStore %in_uint %56
+ %58 = OpLoad %v3uint %in_uint
+ %59 = OpBitcast %v3float %58
+ OpStore %in_float %59
+ %61 = OpLoad %v3float %in_float
+ %63 = OpExtInst %v3float %1 Frexp %61 %exp_0
+ OpStore %x_0 %63
+ %66 = OpLoad %v3float %in_float
+ %67 = OpExtInst %frexpStructType %1 FrexpStruct %66
+ OpStore %res_0 %67
+ %72 = OpLoad %uint %ndx
+ %73 = OpLoad %v3int %exp_0
+ %74 = OpBitcast %v3float %73
+ %76 = OpAccessChain %_ptr_Uniform_v3float %__0 %int_0 %72
+ OpStore %76 %74
+ %77 = OpLoad %uint %ndx
+ %79 = OpIAdd %uint %77 %uint_1
+ %80 = OpLoad %v3float %x_0
+ %81 = OpAccessChain %_ptr_Uniform_v3float %__0 %int_0 %79
+ OpStore %81 %80
+ %86 = OpLoad %uint %ndx
+ %88 = OpAccessChain %_ptr_Function_v3int %res_0 %int_1
+ %89 = OpLoad %v3int %88
+ %90 = OpBitcast %v3float %89
+ %91 = OpAccessChain %_ptr_Uniform_v3float %__1 %int_0 %86
+ OpStore %91 %90
+ %92 = OpLoad %uint %ndx
+ %93 = OpIAdd %uint %92 %uint_1
+ %94 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+ %95 = OpLoad %v3float %94
+ %96 = OpAccessChain %_ptr_Uniform_v3float %__1 %int_0 %93
+ OpStore %96 %95
+ OpBranch %36
+ %36 = OpLabel
+ %97 = OpLoad %uint %ndx
+ %98 = OpIAdd %uint %97 %uint_2
+ OpStore %ndx %98
+ OpBranch %33
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_frexp DATA_TYPE vec3<float> SIZE 432 FILL 0.0
+BUFFER buf_frexpStruct DATA_TYPE vec3<float> SIZE 432 FILL 1.0
+
+PIPELINE compute test_pipeline
+ ATTACH comp_shader
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER buf_frexp AS storage DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER buf_frexpStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_frexp EQ_BUFFER buf_frexpStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_frag.amber
new file mode 100644
index 0000000..d11db06
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_frag.amber
@@ -0,0 +1,288 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A fragment shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec3 in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# vec3 x;
+# ivec3 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec3 orig)
+# {
+# vec3 x;
+# ivec3 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uvec3 in_uint = in_values[ndx_in];
+# vec3 in_float = uintBitsToFloat(in_uint);
+# vec3 x;
+# ivec3 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rgb = x;
+# frexp_exp_out.rgb = intBitsToFloat(exp);
+# frexpStruct_x_out.rgb = res.x;
+# frexpStruct_exp_out.rgb = intBitsToFloat(res.exp);
+#
+# return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+%frexpStructType = OpTypeStruct %v3float %v3int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v3float
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+ %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v3uint Function
+ %in_float = OpVariable %_ptr_Function_v3float Function
+ %x_0 = OpVariable %_ptr_Function_v3float Function
+ %exp_0 = OpVariable %_ptr_Function_v3int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %41 = OpLoad %uint %ndx_in
+ %43 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %41
+ %44 = OpLoad %v3uint %43
+ OpStore %in_uint %44
+ %46 = OpLoad %v3uint %in_uint
+ %47 = OpBitcast %v3float %46
+ OpStore %in_float %47
+ %49 = OpLoad %v3float %in_float
+ %51 = OpExtInst %v3float %1 Frexp %49 %exp_0
+ OpStore %x_0 %51
+ %54 = OpLoad %v3float %in_float
+ %55 = OpExtInst %frexpStructType %1 FrexpStruct %54
+ OpStore %res_0 %55
+ OpStore %frexp_x_out %61
+ OpStore %frexp_exp_out %61
+ OpStore %frexpStruct_x_out %61
+ OpStore %frexpStruct_exp_out %61
+ %65 = OpLoad %v3float %x_0
+ %66 = OpLoad %v4float %frexp_x_out
+ %67 = OpVectorShuffle %v4float %66 %65 4 5 6 3
+ OpStore %frexp_x_out %67
+ %68 = OpLoad %v3int %exp_0
+ %69 = OpBitcast %v3float %68
+ %70 = OpLoad %v4float %frexp_exp_out
+ %71 = OpVectorShuffle %v4float %70 %69 4 5 6 3
+ OpStore %frexp_exp_out %71
+ %72 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+ %73 = OpLoad %v3float %72
+ %74 = OpLoad %v4float %frexpStruct_x_out
+ %75 = OpVectorShuffle %v4float %74 %73 4 5 6 3
+ OpStore %frexpStruct_x_out %75
+ %77 = OpAccessChain %_ptr_Function_v3int %res_0 %int_1
+ %78 = OpLoad %v3int %77
+ %79 = OpBitcast %v3float %78
+ %80 = OpLoad %v4float %frexpStruct_exp_out
+ %81 = OpVectorShuffle %v4float %80 %79 4 5 6 3
+ OpStore %frexpStruct_exp_out %81
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_geom.amber
new file mode 100644
index 0000000..1cbb73d
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_geom.amber
@@ -0,0 +1,430 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A geometry shader test for FrexpStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec3 in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec3 frexp_x_out;
+# layout (location = 1) flat out vec3 frexp_exp_out;
+# layout (location = 2) flat out vec3 frexpStruct_x_out;
+# layout (location = 3) flat out vec3 frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# vec3 x;
+# ivec3 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec3 orig)
+# {
+# vec3 x;
+# ivec3 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (int vertex = 0; vertex < 3; vertex++)
+# {
+# uvec3 in_uint = in_values[ndx_in[vertex]];
+# vec3 in_float = uintBitsToFloat(in_uint);
+# vec3 x;
+# ivec3 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = gl_in[vertex].gl_Position;
+# EmitVertex();
+# }
+#
+# EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+ OpCapability Geometry
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Geometry %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0 %gl_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main Invocations 1
+ OpExecutionMode %main OutputTriangleStrip
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+%frexpStructType = OpTypeStruct %v3float %v3int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v3float
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %bool = OpTypeBool
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+%frexp_x_out = OpVariable %_ptr_Output_v3float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v3float Output
+ %int_1 = OpConstant %int 1
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %vertex = OpVariable %_ptr_Function_int Function
+ %in_uint = OpVariable %_ptr_Function_v3uint Function
+ %in_float = OpVariable %_ptr_Function_v3float Function
+ %x_0 = OpVariable %_ptr_Function_v3float Function
+ %exp_0 = OpVariable %_ptr_Function_v3int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %vertex %int_0
+ OpBranch %32
+ %32 = OpLabel
+ OpLoopMerge %34 %35 None
+ OpBranch %36
+ %36 = OpLabel
+ %37 = OpLoad %int %vertex
+ %40 = OpSLessThan %bool %37 %int_3
+ OpBranchConditional %40 %33 %34
+ %33 = OpLabel
+ %54 = OpLoad %int %vertex
+ %56 = OpAccessChain %_ptr_Input_uint %ndx_in %54
+ %57 = OpLoad %uint %56
+ %59 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %57
+ %60 = OpLoad %v3uint %59
+ OpStore %in_uint %60
+ %62 = OpLoad %v3uint %in_uint
+ %63 = OpBitcast %v3float %62
+ OpStore %in_float %63
+ %65 = OpLoad %v3float %in_float
+ %67 = OpExtInst %v3float %1 Frexp %65 %exp_0
+ OpStore %x_0 %67
+ %70 = OpLoad %v3float %in_float
+ %71 = OpExtInst %frexpStructType %1 FrexpStruct %70
+ OpStore %res_0 %71
+ %74 = OpLoad %v3float %x_0
+ OpStore %frexp_x_out %74
+ %76 = OpLoad %v3int %exp_0
+ %77 = OpBitcast %v3float %76
+ OpStore %frexp_exp_out %77
+ %79 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+ %80 = OpLoad %v3float %79
+ OpStore %frexpStruct_x_out %80
+ %83 = OpAccessChain %_ptr_Function_v3int %res_0 %int_1
+ %84 = OpLoad %v3int %83
+ %85 = OpBitcast %v3float %84
+ OpStore %frexpStruct_exp_out %85
+ %96 = OpLoad %int %vertex
+ %98 = OpAccessChain %_ptr_Input_v4float %gl_in %96 %int_0
+ %99 = OpLoad %v4float %98
+ %101 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %101 %99
+ OpEmitVertex
+ OpBranch %35
+ %35 = OpLabel
+ %102 = OpLoad %int %vertex
+ %103 = OpIAdd %int %102 %int_1
+ OpStore %vertex %103
+ OpBranch %32
+ %34 = OpLabel
+ OpEndPrimitive
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 frexp_x_in;
+# layout (location = 1) flat in vec3 frexp_exp_in;
+# layout (location = 2) flat in vec3 frexpStruct_x_in;
+# layout (location = 3) flat in vec3 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rgb = frexp_x_in;
+# frexp_exp_out.rgb = frexp_exp_in;
+# frexpStruct_x_out.rgb = frexpStruct_x_in;
+# frexpStruct_exp_out.rgb = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+ %frexp_x_in = OpVariable %_ptr_Input_v3float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v3float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v3float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v3float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v3float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v3float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH geom_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_tesc.amber
new file mode 100644
index 0000000..2d2a02f
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_tesc.amber
@@ -0,0 +1,586 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec3 frexp_x_out[];
+# layout (location = 1) flat out vec3 frexp_exp_out[];
+# layout (location = 2) flat out vec3 frexpStruct_x_out[];
+# layout (location = 3) flat out vec3 frexpStruct_exp_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec3 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec3 x;
+# ivec3 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec3 orig)
+# {
+# vec3 x;
+# ivec3 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uvec3 in_uint = in_values[ndx_in[gl_InvocationID]];
+# vec3 in_float = uintBitsToFloat(in_uint);
+# vec3 x;
+# ivec3 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out[gl_InvocationID] = x;
+# frexp_exp_out[gl_InvocationID] = intBitsToFloat(exp);
+# frexpStruct_x_out[gl_InvocationID] = res.x;
+# frexpStruct_exp_out[gl_InvocationID] = intBitsToFloat(res.exp);
+#
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+%frexpStructType = OpTypeStruct %v3float %v3int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v3float
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+ %uint_3 = OpConstant %uint 3
+%_arr_v3float_uint_3 = OpTypeArray %v3float %uint_3
+%_ptr_Output__arr_v3float_uint_3 = OpTypePointer Output %_arr_v3float_uint_3
+%frexp_x_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+%frexp_exp_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+%frexpStruct_x_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output__arr_v3float_uint_3 Output
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v3uint Function
+ %in_float = OpVariable %_ptr_Function_v3float Function
+ %x_0 = OpVariable %_ptr_Function_v3float Function
+ %exp_0 = OpVariable %_ptr_Function_v3int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %45 = OpLoad %int %gl_InvocationID
+ %47 = OpAccessChain %_ptr_Input_uint %ndx_in %45
+ %48 = OpLoad %uint %47
+ %50 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %48
+ %51 = OpLoad %v3uint %50
+ OpStore %in_uint %51
+ %53 = OpLoad %v3uint %in_uint
+ %54 = OpBitcast %v3float %53
+ OpStore %in_float %54
+ %56 = OpLoad %v3float %in_float
+ %58 = OpExtInst %v3float %1 Frexp %56 %exp_0
+ OpStore %x_0 %58
+ %61 = OpLoad %v3float %in_float
+ %62 = OpExtInst %frexpStructType %1 FrexpStruct %61
+ OpStore %res_0 %62
+ %67 = OpLoad %int %gl_InvocationID
+ %68 = OpLoad %v3float %x_0
+ %70 = OpAccessChain %_ptr_Output_v3float %frexp_x_out %67
+ OpStore %70 %68
+ %72 = OpLoad %int %gl_InvocationID
+ %73 = OpLoad %v3int %exp_0
+ %74 = OpBitcast %v3float %73
+ %75 = OpAccessChain %_ptr_Output_v3float %frexp_exp_out %72
+ OpStore %75 %74
+ %77 = OpLoad %int %gl_InvocationID
+ %78 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+ %79 = OpLoad %v3float %78
+ %80 = OpAccessChain %_ptr_Output_v3float %frexpStruct_x_out %77
+ OpStore %80 %79
+ %82 = OpLoad %int %gl_InvocationID
+ %84 = OpAccessChain %_ptr_Function_v3int %res_0 %int_1
+ %85 = OpLoad %v3int %84
+ %86 = OpBitcast %v3float %85
+ %87 = OpAccessChain %_ptr_Output_v3float %frexpStruct_exp_out %82
+ OpStore %87 %86
+ %94 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %94 %float_1
+ %95 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %95 %float_1
+ %100 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %100 %float_1
+ %101 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %101 %float_1
+ %103 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %103 %float_1
+ %105 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %105 %float_1
+ %113 = OpLoad %int %gl_InvocationID
+ %118 = OpLoad %int %gl_InvocationID
+ %120 = OpAccessChain %_ptr_Input_v4float %gl_in %118 %int_0
+ %121 = OpLoad %v4float %120
+ %123 = OpAccessChain %_ptr_Output_v4float %gl_out %113 %int_0
+ OpStore %123 %121
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in vec3 frexp_x_in[];
+# layout (location = 1) flat in vec3 frexp_exp_in[];
+# layout (location = 2) flat in vec3 frexpStruct_x_in[];
+# layout (location = 3) flat in vec3 frexpStruct_exp_in[];
+#
+# layout (location = 0) flat out vec3 frexp_x_out;
+# layout (location = 1) flat out vec3 frexp_exp_out;
+# layout (location = 2) flat out vec3 frexpStruct_x_out;
+# layout (location = 3) flat out vec3 frexpStruct_exp_out;
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# frexp_x_out = frexp_x_in[0];
+# frexp_exp_out = frexp_exp_in[0];
+# frexpStruct_x_out = frexpStruct_x_in[0];
+# frexpStruct_exp_out = frexpStruct_exp_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+%frexp_x_out = OpVariable %_ptr_Output_v3float Output
+%_arr_v3float_uint_32 = OpTypeArray %v3float %uint_32
+%_ptr_Input__arr_v3float_uint_32 = OpTypePointer Input %_arr_v3float_uint_32
+ %frexp_x_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+%frexp_exp_out = OpVariable %_ptr_Output_v3float Output
+%frexp_exp_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input__arr_v3float_uint_32 Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %22 = OpLoad %float %21
+ %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %30 = OpLoad %v4float %29
+ %31 = OpVectorTimesScalar %v4float %30 %22
+ %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %33 = OpLoad %float %32
+ %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %36 = OpLoad %v4float %35
+ %37 = OpVectorTimesScalar %v4float %36 %33
+ %38 = OpFAdd %v4float %31 %37
+ %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %41 = OpLoad %float %40
+ %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %44 = OpLoad %v4float %43
+ %45 = OpVectorTimesScalar %v4float %44 %41
+ %46 = OpFAdd %v4float %38 %45
+ %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %48 %46
+ %54 = OpAccessChain %_ptr_Input_v3float %frexp_x_in %int_0
+ %55 = OpLoad %v3float %54
+ OpStore %frexp_x_out %55
+ %58 = OpAccessChain %_ptr_Input_v3float %frexp_exp_in %int_0
+ %59 = OpLoad %v3float %58
+ OpStore %frexp_exp_out %59
+ %62 = OpAccessChain %_ptr_Input_v3float %frexpStruct_x_in %int_0
+ %63 = OpLoad %v3float %62
+ OpStore %frexpStruct_x_out %63
+ %66 = OpAccessChain %_ptr_Input_v3float %frexpStruct_exp_in %int_0
+ %67 = OpLoad %v3float %66
+ OpStore %frexpStruct_exp_out %67
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 frexp_x_in;
+# layout (location = 1) flat in vec3 frexp_exp_in;
+# layout (location = 2) flat in vec3 frexpStruct_x_in;
+# layout (location = 3) flat in vec3 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rgb = frexp_x_in;
+# frexp_exp_out.rgb = frexp_exp_in;
+# frexpStruct_x_out.rgb = frexpStruct_x_in;
+# frexpStruct_exp_out.rgb = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+ %frexp_x_in = OpVariable %_ptr_Input_v3float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v3float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v3float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v3float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v3float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v3float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_tese.amber
new file mode 100644
index 0000000..90d71f0
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_tese.amber
@@ -0,0 +1,540 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+#
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %uint = OpTypeInt 32 0
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+ %int_1 = OpConstant %int 1
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+ %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %16 %float_1
+ %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %18 %float_1
+ %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %23 %float_1
+ %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %24 %float_1
+ %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %26 %float_1
+ %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %28 %float_1
+ %39 = OpLoad %int %gl_InvocationID
+ %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+ %48 = OpLoad %v4float %47
+ %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+ OpStore %50 %48
+ %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+ %61 = OpLoad %uint %60
+ %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+ OpStore %63 %61
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec3 frexp_x_out;
+# layout (location = 1) flat out vec3 frexp_exp_out;
+# layout (location = 2) flat out vec3 frexpStruct_x_out;
+# layout (location = 3) flat out vec3 frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec3 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec3 x;
+# ivec3 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec3 orig)
+# {
+# vec3 x;
+# ivec3 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# uvec3 in_uint = in_values[ndx_in[0]];
+# vec3 in_float = uintBitsToFloat(in_uint);
+# vec3 x;
+# ivec3 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+%frexpStructType = OpTypeStruct %v3float %v3int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v3float
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int_0 = OpConstant %int 0
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+%frexp_x_out = OpVariable %_ptr_Output_v3float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v3float Output
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v3uint Function
+ %in_float = OpVariable %_ptr_Function_v3float Function
+ %x_0 = OpVariable %_ptr_Function_v3float Function
+ %exp_0 = OpVariable %_ptr_Function_v3int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %41 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %42 = OpLoad %float %41
+ %49 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %50 = OpLoad %v4float %49
+ %51 = OpVectorTimesScalar %v4float %50 %42
+ %52 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %53 = OpLoad %float %52
+ %55 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %56 = OpLoad %v4float %55
+ %57 = OpVectorTimesScalar %v4float %56 %53
+ %58 = OpFAdd %v4float %51 %57
+ %60 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %61 = OpLoad %float %60
+ %63 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %64 = OpLoad %v4float %63
+ %65 = OpVectorTimesScalar %v4float %64 %61
+ %66 = OpFAdd %v4float %58 %65
+ %68 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %68 %66
+ %81 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+ %82 = OpLoad %uint %81
+ %84 = OpAccessChain %_ptr_Uniform_v3uint %__0 %int_0 %82
+ %85 = OpLoad %v3uint %84
+ OpStore %in_uint %85
+ %87 = OpLoad %v3uint %in_uint
+ %88 = OpBitcast %v3float %87
+ OpStore %in_float %88
+ %90 = OpLoad %v3float %in_float
+ %92 = OpExtInst %v3float %1 Frexp %90 %exp_0
+ OpStore %x_0 %92
+ %95 = OpLoad %v3float %in_float
+ %96 = OpExtInst %frexpStructType %1 FrexpStruct %95
+ OpStore %res_0 %96
+ %99 = OpLoad %v3float %x_0
+ OpStore %frexp_x_out %99
+ %101 = OpLoad %v3int %exp_0
+ %102 = OpBitcast %v3float %101
+ OpStore %frexp_exp_out %102
+ %104 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+ %105 = OpLoad %v3float %104
+ OpStore %frexpStruct_x_out %105
+ %107 = OpAccessChain %_ptr_Function_v3int %res_0 %int_1
+ %108 = OpLoad %v3int %107
+ %109 = OpBitcast %v3float %108
+ OpStore %frexpStruct_exp_out %109
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 frexp_x_in;
+# layout (location = 1) flat in vec3 frexp_exp_in;
+# layout (location = 2) flat in vec3 frexpStruct_x_in;
+# layout (location = 3) flat in vec3 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rgb = frexp_x_in;
+# frexp_exp_out.rgb = frexp_exp_in;
+# frexpStruct_x_out.rgb = frexpStruct_x_in;
+# frexpStruct_exp_out.rgb = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+ %frexp_x_in = OpVariable %_ptr_Input_v3float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v3float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v3float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v3float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v3float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v3float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_vert.amber
new file mode 100644
index 0000000..ac15518
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_3_vert.amber
@@ -0,0 +1,334 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A vertex shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out vec3 frexp_x_out;
+# layout (location = 1) flat out vec3 frexp_exp_out;
+# layout (location = 2) flat out vec3 frexpStruct_x_out;
+# layout (location = 3) flat out vec3 frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec3 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec3 x;
+# ivec3 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec3 orig)
+# {
+# vec3 x;
+# ivec3 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# uint ndx = xcoord + ycoord * ndpSqrt;
+#
+# uvec3 in_uint = in_values[ndx];
+# vec3 in_float = uintBitsToFloat(in_uint);
+# vec3 x;
+# ivec3 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0
+ OpDecorate %position Location 0
+ OpDecorate %_arr_v3uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+ %int = OpTypeInt 32 1
+ %v3int = OpTypeVector %int 3
+%frexpStructType = OpTypeStruct %v3float %v3int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v3float
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %float_36 = OpConstant %float 36
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %uint_1 = OpConstant %uint 1
+ %uint_36 = OpConstant %uint 36
+ %v3uint = OpTypeVector %uint 3
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v3uint_uint_1296 = OpTypeArray %v3uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v3uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_ptr_Output_v3float = OpTypePointer Output %v3float
+%frexp_x_out = OpVariable %_ptr_Output_v3float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v3float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v3float Output
+ %int_1 = OpConstant %int 1
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %xcoord = OpVariable %_ptr_Function_uint Function
+ %ycoord = OpVariable %_ptr_Function_uint Function
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_v3uint Function
+ %in_float = OpVariable %_ptr_Function_v3float Function
+ %x_0 = OpVariable %_ptr_Function_v3float Function
+ %exp_0 = OpVariable %_ptr_Function_v3int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %38 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %39 = OpLoad %float %38
+ %41 = OpFAdd %float %39 %float_0_027777778
+ %43 = OpFAdd %float %41 %float_1
+ %45 = OpFDiv %float %43 %float_2
+ %46 = OpFMul %float %float_36 %45
+ %47 = OpFSub %float %46 %float_1
+ %48 = OpConvertFToU %uint %47
+ OpStore %xcoord %48
+ %51 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %52 = OpLoad %float %51
+ %53 = OpFAdd %float %52 %float_0_027777778
+ %54 = OpFAdd %float %53 %float_1
+ %55 = OpFDiv %float %54 %float_2
+ %56 = OpFMul %float %float_36 %55
+ %57 = OpFSub %float %56 %float_1
+ %58 = OpConvertFToU %uint %57
+ OpStore %ycoord %58
+ %60 = OpLoad %uint %xcoord
+ %61 = OpLoad %uint %ycoord
+ %63 = OpIMul %uint %61 %uint_36
+ %64 = OpIAdd %uint %60 %63
+ OpStore %ndx %64
+ %74 = OpLoad %uint %ndx
+ %76 = OpAccessChain %_ptr_Uniform_v3uint %_ %int_0 %74
+ %77 = OpLoad %v3uint %76
+ OpStore %in_uint %77
+ %79 = OpLoad %v3uint %in_uint
+ %80 = OpBitcast %v3float %79
+ OpStore %in_float %80
+ %82 = OpLoad %v3float %in_float
+ %84 = OpExtInst %v3float %1 Frexp %82 %exp_0
+ OpStore %x_0 %84
+ %87 = OpLoad %v3float %in_float
+ %88 = OpExtInst %frexpStructType %1 FrexpStruct %87
+ OpStore %res_0 %88
+ %91 = OpLoad %v3float %x_0
+ OpStore %frexp_x_out %91
+ %93 = OpLoad %v3int %exp_0
+ %94 = OpBitcast %v3float %93
+ OpStore %frexp_exp_out %94
+ %96 = OpAccessChain %_ptr_Function_v3float %res_0 %int_0
+ %97 = OpLoad %v3float %96
+ OpStore %frexpStruct_x_out %97
+ %100 = OpAccessChain %_ptr_Function_v3int %res_0 %int_1
+ %101 = OpLoad %v3int %100
+ %102 = OpBitcast %v3float %101
+ OpStore %frexpStruct_exp_out %102
+ %108 = OpLoad %v2float %position
+ %110 = OpCompositeExtract %float %108 0
+ %111 = OpCompositeExtract %float %108 1
+ %112 = OpCompositeConstruct %v4float %110 %111 %float_0 %float_1
+ %114 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %114 %112
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec3 frexp_x_in;
+# layout (location = 1) flat in vec3 frexp_exp_in;
+# layout (location = 2) flat in vec3 frexpStruct_x_in;
+# layout (location = 3) flat in vec3 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# const vec4 clear_value = vec4(0.0, 0.0, 0.0, 1.0);
+#
+# void main ()
+# {
+# frexp_x_out = clear_value;
+# frexp_exp_out = clear_value;
+# frexpStruct_x_out = clear_value;
+# frexpStruct_exp_out = clear_value;
+# frexp_x_out.rgb = frexp_x_in;
+# frexp_exp_out.rgb = frexp_exp_in;
+# frexpStruct_x_out.rgb = frexpStruct_x_in;
+# frexpStruct_exp_out.rgb = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %frexp_x_in %frexp_exp_in %frexpStruct_x_in %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+ %float_0 = OpConstant %float 0
+ %float_1 = OpConstant %float 1
+ %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+ %frexp_x_in = OpVariable %_ptr_Input_v3float Input
+%frexp_exp_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_x_in = OpVariable %_ptr_Input_v3float Input
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v3float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ OpStore %frexp_x_out %12
+ OpStore %frexp_exp_out %12
+ OpStore %frexpStruct_x_out %12
+ OpStore %frexpStruct_exp_out %12
+ %19 = OpLoad %v3float %frexp_x_in
+ %20 = OpLoad %v4float %frexp_x_out
+ %21 = OpVectorShuffle %v4float %20 %19 4 5 6 3
+ OpStore %frexp_x_out %21
+ %23 = OpLoad %v3float %frexp_exp_in
+ %24 = OpLoad %v4float %frexp_exp_out
+ %25 = OpVectorShuffle %v4float %24 %23 4 5 6 3
+ OpStore %frexp_exp_out %25
+ %27 = OpLoad %v3float %frexpStruct_x_in
+ %28 = OpLoad %v4float %frexpStruct_x_out
+ %29 = OpVectorShuffle %v4float %28 %27 4 5 6 3
+ OpStore %frexpStruct_x_out %29
+ %31 = OpLoad %v3float %frexpStruct_exp_in
+ %32 = OpLoad %v4float %frexpStruct_exp_out
+ %33 = OpVectorShuffle %v4float %32 %31 4 5 6 3
+ OpStore %frexpStruct_exp_out %33
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_comp.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_comp.amber
new file mode 100644
index 0000000..a41dee0
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_comp.amber
@@ -0,0 +1,215 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A compute shader test for FrexpStruct.
+
+# SHADER compute comp_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296 / 4;
+# const uint half_ndp = ndp / 2;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec4 in_values[half_ndp];
+# };
+#
+# layout(set = 0, binding = 1) buffer block1 {
+# vec4 frexp_out[ndp];
+# };
+#
+# layout(set = 0, binding = 2) buffer block2 {
+# vec4 frexpStruct_out[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec4 x;
+# ivec4 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec4 orig)
+# {
+# vec4 x;
+# ivec4 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (uint ndx = 0; ndx < ndp; ndx += 2)
+# {
+# uvec4 in_uint = in_values[ndx/2];
+# vec4 in_float = uintBitsToFloat(in_uint);
+# vec4 x;
+# ivec4 exp;
+#
+# x = frexp(in_float, exp);
+# frexpStructType res = frexpStruct(in_float);
+#
+# frexp_out[ndx] = intBitsToFloat(exp);
+# frexp_out[ndx+1] = x;
+# frexpStruct_out[ndx] = intBitsToFloat(res.exp);
+# frexpStruct_out[ndx+1] = res.x;
+# }
+#
+# return;
+# }
+# END
+
+SHADER compute comp_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpDecorate %_arr_v4uint_uint_162 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %_arr_v4float_uint_324 ArrayStride 16
+ OpMemberDecorate %block1 0 Offset 0
+ OpDecorate %block1 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 1
+ OpDecorate %_arr_v4float_uint_324_0 ArrayStride 16
+ OpMemberDecorate %block2 0 Offset 0
+ OpDecorate %block2 BufferBlock
+ OpDecorate %__1 DescriptorSet 0
+ OpDecorate %__1 Binding 2
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %int = OpTypeInt 32 1
+ %v4int = OpTypeVector %int 4
+%frexpStructType = OpTypeStruct %v4float %v4int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v4float
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %uint_0 = OpConstant %uint 0
+ %uint_324 = OpConstant %uint 324
+ %bool = OpTypeBool
+ %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+ %uint_162 = OpConstant %uint 162
+%_arr_v4uint_uint_162 = OpTypeArray %v4uint %uint_162
+ %block0 = OpTypeStruct %_arr_v4uint_uint_162
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_2 = OpConstant %uint 2
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_arr_v4float_uint_324 = OpTypeArray %v4float %uint_324
+ %block1 = OpTypeStruct %_arr_v4float_uint_324
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+ %__0 = OpVariable %_ptr_Uniform_block1 Uniform
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+ %uint_1 = OpConstant %uint 1
+%_arr_v4float_uint_324_0 = OpTypeArray %v4float %uint_324
+ %block2 = OpTypeStruct %_arr_v4float_uint_324_0
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+ %__1 = OpVariable %_ptr_Uniform_block2 Uniform
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_v4uint Function
+ %in_float = OpVariable %_ptr_Function_v4float Function
+ %x_0 = OpVariable %_ptr_Function_v4float Function
+ %exp_0 = OpVariable %_ptr_Function_v4int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %ndx %uint_0
+ OpBranch %33
+ %33 = OpLabel
+ OpLoopMerge %35 %36 None
+ OpBranch %37
+ %37 = OpLabel
+ %38 = OpLoad %uint %ndx
+ %41 = OpULessThan %bool %38 %uint_324
+ OpBranchConditional %41 %34 %35
+ %34 = OpLabel
+ %51 = OpLoad %uint %ndx
+ %53 = OpUDiv %uint %51 %uint_2
+ %55 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %53
+ %56 = OpLoad %v4uint %55
+ OpStore %in_uint %56
+ %58 = OpLoad %v4uint %in_uint
+ %59 = OpBitcast %v4float %58
+ OpStore %in_float %59
+ %61 = OpLoad %v4float %in_float
+ %63 = OpExtInst %v4float %1 Frexp %61 %exp_0
+ OpStore %x_0 %63
+ %66 = OpLoad %v4float %in_float
+ %67 = OpExtInst %frexpStructType %1 FrexpStruct %66
+ OpStore %res_0 %67
+ %72 = OpLoad %uint %ndx
+ %73 = OpLoad %v4int %exp_0
+ %74 = OpBitcast %v4float %73
+ %76 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %72
+ OpStore %76 %74
+ %77 = OpLoad %uint %ndx
+ %79 = OpIAdd %uint %77 %uint_1
+ %80 = OpLoad %v4float %x_0
+ %81 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0 %79
+ OpStore %81 %80
+ %86 = OpLoad %uint %ndx
+ %88 = OpAccessChain %_ptr_Function_v4int %res_0 %int_1
+ %89 = OpLoad %v4int %88
+ %90 = OpBitcast %v4float %89
+ %91 = OpAccessChain %_ptr_Uniform_v4float %__1 %int_0 %86
+ OpStore %91 %90
+ %92 = OpLoad %uint %ndx
+ %93 = OpIAdd %uint %92 %uint_1
+ %94 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+ %95 = OpLoad %v4float %94
+ %96 = OpAccessChain %_ptr_Uniform_v4float %__1 %int_0 %93
+ OpStore %96 %95
+ OpBranch %36
+ %36 = OpLabel
+ %97 = OpLoad %uint %ndx
+ %98 = OpIAdd %uint %97 %uint_2
+ OpStore %ndx %98
+ OpBranch %33
+ %35 = OpLabel
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+
+BUFFER buf_frexp DATA_TYPE vec4<float> SIZE 324 FILL 0.0
+BUFFER buf_frexpStruct DATA_TYPE vec4<float> SIZE 324 FILL 1.0
+
+PIPELINE compute test_pipeline
+ ATTACH comp_shader
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER buf_frexp AS storage DESCRIPTOR_SET 0 BINDING 1
+ BIND BUFFER buf_frexpStruct AS storage DESCRIPTOR_SET 0 BINDING 2
+END
+
+RUN test_pipeline 1 1 1
+
+EXPECT buf_frexp EQ_BUFFER buf_frexpStruct
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_frag.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_frag.amber
new file mode 100644
index 0000000..d75a75f
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_frag.amber
@@ -0,0 +1,267 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A fragment shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec4 in_values[ndp];
+# };
+#
+# layout (location = 0) flat in uint ndx_in;
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# vec4 x;
+# ivec4 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec4 orig)
+# {
+# vec4 x;
+# ivec4 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uvec4 in_uint = in_values[ndx_in];
+# vec4 in_float = uintBitsToFloat(in_uint);
+# vec4 x;
+# ivec4 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out.rgba = x;
+# frexp_exp_out.rgba = intBitsToFloat(exp);
+# frexpStruct_x_out.rgba = res.x;
+# frexpStruct_exp_out.rgba = intBitsToFloat(res.exp);
+#
+# return;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %int = OpTypeInt 32 1
+ %v4int = OpTypeVector %int 4
+%frexpStructType = OpTypeStruct %v4float %v4int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v4float
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+ %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+ %ndx_in = OpVariable %_ptr_Input_uint Input
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %int_1 = OpConstant %int 1
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v4uint Function
+ %in_float = OpVariable %_ptr_Function_v4float Function
+ %x_0 = OpVariable %_ptr_Function_v4float Function
+ %exp_0 = OpVariable %_ptr_Function_v4int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %41 = OpLoad %uint %ndx_in
+ %43 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %41
+ %44 = OpLoad %v4uint %43
+ OpStore %in_uint %44
+ %46 = OpLoad %v4uint %in_uint
+ %47 = OpBitcast %v4float %46
+ OpStore %in_float %47
+ %49 = OpLoad %v4float %in_float
+ %51 = OpExtInst %v4float %1 Frexp %49 %exp_0
+ OpStore %x_0 %51
+ %54 = OpLoad %v4float %in_float
+ %55 = OpExtInst %frexpStructType %1 FrexpStruct %54
+ OpStore %res_0 %55
+ %58 = OpLoad %v4float %x_0
+ OpStore %frexp_x_out %58
+ %60 = OpLoad %v4int %exp_0
+ %61 = OpBitcast %v4float %60
+ OpStore %frexp_exp_out %61
+ %63 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+ %64 = OpLoad %v4float %63
+ OpStore %frexpStruct_x_out %64
+ %67 = OpAccessChain %_ptr_Function_v4int %res_0 %int_1
+ %68 = OpLoad %v4int %67
+ %69 = OpBitcast %v4float %68
+ OpStore %frexpStruct_exp_out %69
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_geom.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_geom.amber
new file mode 100644
index 0000000..b25735c
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_geom.amber
@@ -0,0 +1,407 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A geometry shader test for FrexpStruct.
+
+DEVICE_FEATURE geometryShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER geometry geom_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec4 in_values[ndp];
+# };
+#
+# layout (triangles) in;
+# layout (triangle_strip, max_vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec4 frexp_x_out;
+# layout (location = 1) flat out vec4 frexp_exp_out;
+# layout (location = 2) flat out vec4 frexpStruct_x_out;
+# layout (location = 3) flat out vec4 frexpStruct_exp_out;
+#
+# struct frexpStructType
+# {
+# vec4 x;
+# ivec4 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec4 orig)
+# {
+# vec4 x;
+# ivec4 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# for (int vertex = 0; vertex < 3; vertex++)
+# {
+# uvec4 in_uint = in_values[ndx_in[vertex]];
+# vec4 in_float = uintBitsToFloat(in_uint);
+# vec4 x;
+# ivec4 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = gl_in[vertex].gl_Position;
+# EmitVertex();
+# }
+#
+# EndPrimitive();
+# }
+# END
+
+SHADER geometry geom_shader SPIRV-ASM
+ OpCapability Geometry
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Geometry %main "main" %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0 %gl_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main Invocations 1
+ OpExecutionMode %main OutputTriangleStrip
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %int = OpTypeInt 32 1
+ %v4int = OpTypeVector %int 4
+%frexpStructType = OpTypeStruct %v4float %v4int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v4float
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+%_ptr_Function_int = OpTypePointer Function %int
+ %int_0 = OpConstant %int 0
+ %int_3 = OpConstant %int 3
+ %bool = OpTypeBool
+ %uint = OpTypeInt 32 0
+ %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %uint_3 = OpConstant %uint 3
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Input__arr_uint_uint_3 = OpTypePointer Input %_arr_uint_uint_3
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_3 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %int_1 = OpConstant %int 1
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_3 = OpTypeArray %gl_PerVertex_0 %uint_3
+%_ptr_Input__arr_gl_PerVertex_0_uint_3 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_3
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_3 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %vertex = OpVariable %_ptr_Function_int Function
+ %in_uint = OpVariable %_ptr_Function_v4uint Function
+ %in_float = OpVariable %_ptr_Function_v4float Function
+ %x_0 = OpVariable %_ptr_Function_v4float Function
+ %exp_0 = OpVariable %_ptr_Function_v4int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ OpStore %vertex %int_0
+ OpBranch %32
+ %32 = OpLabel
+ OpLoopMerge %34 %35 None
+ OpBranch %36
+ %36 = OpLabel
+ %37 = OpLoad %int %vertex
+ %40 = OpSLessThan %bool %37 %int_3
+ OpBranchConditional %40 %33 %34
+ %33 = OpLabel
+ %54 = OpLoad %int %vertex
+ %56 = OpAccessChain %_ptr_Input_uint %ndx_in %54
+ %57 = OpLoad %uint %56
+ %59 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %57
+ %60 = OpLoad %v4uint %59
+ OpStore %in_uint %60
+ %62 = OpLoad %v4uint %in_uint
+ %63 = OpBitcast %v4float %62
+ OpStore %in_float %63
+ %65 = OpLoad %v4float %in_float
+ %67 = OpExtInst %v4float %1 Frexp %65 %exp_0
+ OpStore %x_0 %67
+ %70 = OpLoad %v4float %in_float
+ %71 = OpExtInst %frexpStructType %1 FrexpStruct %70
+ OpStore %res_0 %71
+ %74 = OpLoad %v4float %x_0
+ OpStore %frexp_x_out %74
+ %76 = OpLoad %v4int %exp_0
+ %77 = OpBitcast %v4float %76
+ OpStore %frexp_exp_out %77
+ %79 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+ %80 = OpLoad %v4float %79
+ OpStore %frexpStruct_x_out %80
+ %83 = OpAccessChain %_ptr_Function_v4int %res_0 %int_1
+ %84 = OpLoad %v4int %83
+ %85 = OpBitcast %v4float %84
+ OpStore %frexpStruct_exp_out %85
+ %95 = OpLoad %int %vertex
+ %97 = OpAccessChain %_ptr_Input_v4float %gl_in %95 %int_0
+ %98 = OpLoad %v4float %97
+ %99 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %99 %98
+ OpEmitVertex
+ OpBranch %35
+ %35 = OpLabel
+ %100 = OpLoad %int %vertex
+ %101 = OpIAdd %int %100 %int_1
+ OpStore %vertex %101
+ OpBranch %32
+ %34 = OpLabel
+ OpEndPrimitive
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 frexp_x_in;
+# layout (location = 1) flat in vec4 frexp_exp_in;
+# layout (location = 2) flat in vec4 frexpStruct_x_in;
+# layout (location = 3) flat in vec4 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+#
+# void main ()
+# {
+# frexp_x_out.rgba = frexp_x_in;
+# frexp_exp_out.rgba = frexp_exp_in;
+# frexpStruct_x_out.rgba = frexpStruct_x_in;
+# frexpStruct_exp_out.rgba = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %frexp_x_in = OpVariable %_ptr_Input_v4float Input
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v4float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %12 = OpLoad %v4float %frexp_x_in
+ OpStore %frexp_x_out %12
+ %15 = OpLoad %v4float %frexp_exp_in
+ OpStore %frexp_exp_out %15
+ %18 = OpLoad %v4float %frexpStruct_x_in
+ OpStore %frexpStruct_x_out %18
+ %21 = OpLoad %v4float %frexpStruct_exp_in
+ OpStore %frexpStruct_exp_out %21
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH geom_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_tesc.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_tesc.amber
new file mode 100644
index 0000000..8d1f772
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_tesc.amber
@@ -0,0 +1,562 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation control shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec4 frexp_x_out[];
+# layout (location = 1) flat out vec4 frexp_exp_out[];
+# layout (location = 2) flat out vec4 frexpStruct_x_out[];
+# layout (location = 3) flat out vec4 frexpStruct_exp_out[];
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec4 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec4 x;
+# ivec4 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec4 orig)
+# {
+# vec4 x;
+# ivec4 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uvec4 in_uint = in_values[ndx_in[gl_InvocationID]];
+# vec4 in_float = uintBitsToFloat(in_uint);
+# vec4 x;
+# ivec4 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out[gl_InvocationID] = x;
+# frexp_exp_out[gl_InvocationID] = intBitsToFloat(exp);
+# frexpStruct_x_out[gl_InvocationID] = res.x;
+# frexpStruct_exp_out[gl_InvocationID] = intBitsToFloat(res.exp);
+#
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %ndx_in %gl_InvocationID %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %int = OpTypeInt 32 1
+ %v4int = OpTypeVector %int 4
+%frexpStructType = OpTypeStruct %v4float %v4int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v4float
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+ %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+ %uint_32 = OpConstant %uint 32
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+ %uint_3 = OpConstant %uint 3
+%_arr_v4float_uint_3 = OpTypeArray %v4float %uint_3
+%_ptr_Output__arr_v4float_uint_3 = OpTypePointer Output %_arr_v4float_uint_3
+%frexp_x_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_exp_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%frexpStruct_x_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output__arr_v4float_uint_3 Output
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v4uint Function
+ %in_float = OpVariable %_ptr_Function_v4float Function
+ %x_0 = OpVariable %_ptr_Function_v4float Function
+ %exp_0 = OpVariable %_ptr_Function_v4int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %45 = OpLoad %int %gl_InvocationID
+ %47 = OpAccessChain %_ptr_Input_uint %ndx_in %45
+ %48 = OpLoad %uint %47
+ %50 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %48
+ %51 = OpLoad %v4uint %50
+ OpStore %in_uint %51
+ %53 = OpLoad %v4uint %in_uint
+ %54 = OpBitcast %v4float %53
+ OpStore %in_float %54
+ %56 = OpLoad %v4float %in_float
+ %58 = OpExtInst %v4float %1 Frexp %56 %exp_0
+ OpStore %x_0 %58
+ %61 = OpLoad %v4float %in_float
+ %62 = OpExtInst %frexpStructType %1 FrexpStruct %61
+ OpStore %res_0 %62
+ %67 = OpLoad %int %gl_InvocationID
+ %68 = OpLoad %v4float %x_0
+ %70 = OpAccessChain %_ptr_Output_v4float %frexp_x_out %67
+ OpStore %70 %68
+ %72 = OpLoad %int %gl_InvocationID
+ %73 = OpLoad %v4int %exp_0
+ %74 = OpBitcast %v4float %73
+ %75 = OpAccessChain %_ptr_Output_v4float %frexp_exp_out %72
+ OpStore %75 %74
+ %77 = OpLoad %int %gl_InvocationID
+ %78 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+ %79 = OpLoad %v4float %78
+ %80 = OpAccessChain %_ptr_Output_v4float %frexpStruct_x_out %77
+ OpStore %80 %79
+ %82 = OpLoad %int %gl_InvocationID
+ %84 = OpAccessChain %_ptr_Function_v4int %res_0 %int_1
+ %85 = OpLoad %v4int %84
+ %86 = OpBitcast %v4float %85
+ %87 = OpAccessChain %_ptr_Output_v4float %frexpStruct_exp_out %82
+ OpStore %87 %86
+ %94 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %94 %float_1
+ %95 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %95 %float_1
+ %100 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %100 %float_1
+ %101 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %101 %float_1
+ %103 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %103 %float_1
+ %105 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %105 %float_1
+ %112 = OpLoad %int %gl_InvocationID
+ %117 = OpLoad %int %gl_InvocationID
+ %119 = OpAccessChain %_ptr_Input_v4float %gl_in %117 %int_0
+ %120 = OpLoad %v4float %119
+ %121 = OpAccessChain %_ptr_Output_v4float %gl_out %112 %int_0
+ OpStore %121 %120
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in vec4 frexp_x_in[];
+# layout (location = 1) flat in vec4 frexp_exp_in[];
+# layout (location = 2) flat in vec4 frexpStruct_x_in[];
+# layout (location = 3) flat in vec4 frexpStruct_exp_in[];
+#
+# layout (location = 0) flat out vec4 frexp_x_out;
+# layout (location = 1) flat out vec4 frexp_exp_out;
+# layout (location = 2) flat out vec4 frexpStruct_x_out;
+# layout (location = 3) flat out vec4 frexpStruct_exp_out;
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# frexp_x_out = frexp_x_in[0];
+# frexp_exp_out = frexp_exp_in[0];
+# frexpStruct_x_out = frexpStruct_x_in[0];
+# frexpStruct_exp_out = frexpStruct_exp_in[0];
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32
+%_ptr_Input__arr_v4float_uint_32 = OpTypePointer Input %_arr_v4float_uint_32
+ %frexp_x_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input__arr_v4float_uint_32 Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %21 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %22 = OpLoad %float %21
+ %29 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %30 = OpLoad %v4float %29
+ %31 = OpVectorTimesScalar %v4float %30 %22
+ %32 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %33 = OpLoad %float %32
+ %35 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %36 = OpLoad %v4float %35
+ %37 = OpVectorTimesScalar %v4float %36 %33
+ %38 = OpFAdd %v4float %31 %37
+ %40 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %41 = OpLoad %float %40
+ %43 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %44 = OpLoad %v4float %43
+ %45 = OpVectorTimesScalar %v4float %44 %41
+ %46 = OpFAdd %v4float %38 %45
+ %48 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %48 %46
+ %53 = OpAccessChain %_ptr_Input_v4float %frexp_x_in %int_0
+ %54 = OpLoad %v4float %53
+ OpStore %frexp_x_out %54
+ %57 = OpAccessChain %_ptr_Input_v4float %frexp_exp_in %int_0
+ %58 = OpLoad %v4float %57
+ OpStore %frexp_exp_out %58
+ %61 = OpAccessChain %_ptr_Input_v4float %frexpStruct_x_in %int_0
+ %62 = OpLoad %v4float %61
+ OpStore %frexpStruct_x_out %62
+ %65 = OpAccessChain %_ptr_Input_v4float %frexpStruct_exp_in %int_0
+ %66 = OpLoad %v4float %65
+ OpStore %frexpStruct_exp_out %66
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 frexp_x_in;
+# layout (location = 1) flat in vec4 frexp_exp_in;
+# layout (location = 2) flat in vec4 frexpStruct_x_in;
+# layout (location = 3) flat in vec4 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+#
+# void main ()
+# {
+# frexp_x_out.rgba = frexp_x_in;
+# frexp_exp_out.rgba = frexp_exp_in;
+# frexpStruct_x_out.rgba = frexpStruct_x_in;
+# frexpStruct_exp_out.rgba = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %frexp_x_in = OpVariable %_ptr_Input_v4float Input
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v4float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %12 = OpLoad %v4float %frexp_x_in
+ OpStore %frexp_x_out %12
+ %15 = OpLoad %v4float %frexp_exp_in
+ OpStore %frexp_exp_out %15
+ %18 = OpLoad %v4float %frexpStruct_x_in
+ OpStore %frexpStruct_x_out %18
+ %21 = OpLoad %v4float %frexpStruct_exp_in
+ OpStore %frexpStruct_exp_out %21
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_tese.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_tese.amber
new file mode 100644
index 0000000..7104926
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_tese.amber
@@ -0,0 +1,518 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A tessellation evaluation shader test for FrexpStruct.
+
+DEVICE_FEATURE tessellationShader
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out uint ndx_out;
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# ndx_out = xcoord + ycoord * ndpSqrt;
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %ndx_out %_
+ OpDecorate %position Location 0
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+ %float_1 = OpConstant %float 1
+ %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %ndx_out = OpVariable %_ptr_Output_uint Output
+ %uint_36 = OpConstant %uint 36
+ %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+ %float_18 = OpConstant %float 18
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %17 = OpLoad %float %16
+ %21 = OpFAdd %float %17 %float_1_02777779
+ %24 = OpFMul %float %21 %float_18
+ %25 = OpFSub %float %24 %float_1
+ %26 = OpConvertFToU %uint %25
+ %29 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %30 = OpLoad %float %29
+ %32 = OpFAdd %float %30 %float_1_02777779
+ %34 = OpFMul %float %32 %float_18
+ %35 = OpFSub %float %34 %float_1
+ %36 = OpConvertFToU %uint %35
+ %42 = OpIMul %uint %36 %uint_36
+ %43 = OpIAdd %uint %26 %42
+ OpStore %ndx_out %43
+ %51 = OpLoad %v2float %position
+ %53 = OpCompositeExtract %float %51 0
+ %54 = OpCompositeExtract %float %51 1
+ %55 = OpCompositeConstruct %v4float %53 %54 %float_0 %float_1
+ %57 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %57 %55
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_control tesc_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (vertices = 3) out;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out uint ndx_out[];
+#
+# void main ()
+# {
+# gl_TessLevelInner[0] = 1.0;
+# gl_TessLevelInner[1] = 1.0;
+# gl_TessLevelOuter[0] = 1.0;
+# gl_TessLevelOuter[1] = 1.0;
+# gl_TessLevelOuter[2] = 1.0;
+# gl_TessLevelOuter[3] = 1.0;
+#
+# gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+# ndx_out[gl_InvocationID] = ndx_in[gl_InvocationID];
+# }
+# END
+
+SHADER tessellation_control tesc_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationControl %main "main" %gl_TessLevelInner %gl_TessLevelOuter %gl_out %gl_InvocationID %gl_in %ndx_out %ndx_in
+ OpExecutionMode %main OutputVertices 3
+ OpDecorate %gl_TessLevelInner Patch
+ OpDecorate %gl_TessLevelInner BuiltIn TessLevelInner
+ OpDecorate %gl_TessLevelOuter Patch
+ OpDecorate %gl_TessLevelOuter BuiltIn TessLevelOuter
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_InvocationID BuiltIn InvocationId
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %ndx_out Flat
+ OpDecorate %ndx_out Location 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %uint = OpTypeInt 32 0
+ %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Output__arr_float_uint_2 = OpTypePointer Output %_arr_float_uint_2
+%gl_TessLevelInner = OpVariable %_ptr_Output__arr_float_uint_2 Output
+ %int = OpTypeInt 32 1
+ %int_0 = OpConstant %int 0
+ %float_1 = OpConstant %float 1
+%_ptr_Output_float = OpTypePointer Output %float
+ %int_1 = OpConstant %int 1
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+%_ptr_Output__arr_float_uint_4 = OpTypePointer Output %_arr_float_uint_4
+%gl_TessLevelOuter = OpVariable %_ptr_Output__arr_float_uint_4 Output
+ %int_2 = OpConstant %int 2
+ %int_3 = OpConstant %int 3
+ %v4float = OpTypeVector %float 4
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_3 = OpConstant %uint 3
+%_arr_gl_PerVertex_uint_3 = OpTypeArray %gl_PerVertex %uint_3
+%_ptr_Output__arr_gl_PerVertex_uint_3 = OpTypePointer Output %_arr_gl_PerVertex_uint_3
+ %gl_out = OpVariable %_ptr_Output__arr_gl_PerVertex_uint_3 Output
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_InvocationID = OpVariable %_ptr_Input_int Input
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_arr_uint_uint_3 = OpTypeArray %uint %uint_3
+%_ptr_Output__arr_uint_uint_3 = OpTypePointer Output %_arr_uint_uint_3
+ %ndx_out = OpVariable %_ptr_Output__arr_uint_uint_3 Output
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Output_uint = OpTypePointer Output %uint
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %16 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_0
+ OpStore %16 %float_1
+ %18 = OpAccessChain %_ptr_Output_float %gl_TessLevelInner %int_1
+ OpStore %18 %float_1
+ %23 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_0
+ OpStore %23 %float_1
+ %24 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_1
+ OpStore %24 %float_1
+ %26 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_2
+ OpStore %26 %float_1
+ %28 = OpAccessChain %_ptr_Output_float %gl_TessLevelOuter %int_3
+ OpStore %28 %float_1
+ %39 = OpLoad %int %gl_InvocationID
+ %47 = OpAccessChain %_ptr_Input_v4float %gl_in %39 %int_0
+ %48 = OpLoad %v4float %47
+ %50 = OpAccessChain %_ptr_Output_v4float %gl_out %39 %int_0
+ OpStore %50 %48
+ %60 = OpAccessChain %_ptr_Input_uint %ndx_in %39
+ %61 = OpLoad %uint %60
+ %63 = OpAccessChain %_ptr_Output_uint %ndx_out %39
+ OpStore %63 %61
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER tessellation_evaluation tese_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+#
+# layout (triangles) in;
+#
+# layout (location = 0) flat in uint ndx_in[];
+# layout (location = 0) flat out vec4 frexp_x_out;
+# layout (location = 1) flat out vec4 frexp_exp_out;
+# layout (location = 2) flat out vec4 frexpStruct_x_out;
+# layout (location = 3) flat out vec4 frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec4 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec4 x;
+# ivec4 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec4 orig)
+# {
+# vec4 x;
+# ivec4 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# gl_Position = gl_TessCoord.x * gl_in[0].gl_Position +
+# gl_TessCoord.y * gl_in[1].gl_Position +
+# gl_TessCoord.z * gl_in[2].gl_Position;
+#
+# uvec4 in_uint = in_values[ndx_in[0]];
+# vec4 in_float = uintBitsToFloat(in_uint);
+# vec4 x;
+# ivec4 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+# }
+# END
+
+SHADER tessellation_evaluation tese_shader SPIRV-ASM
+ OpCapability Tessellation
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint TessellationEvaluation %main "main" %_ %gl_TessCoord %gl_in %ndx_in %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out
+ OpExecutionMode %main Triangles
+ OpExecutionMode %main SpacingEqual
+ OpExecutionMode %main VertexOrderCcw
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ OpDecorate %gl_TessCoord BuiltIn TessCoord
+ OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex_0 Block
+ OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %__0 DescriptorSet 0
+ OpDecorate %__0 Binding 0
+ OpDecorate %ndx_in Flat
+ OpDecorate %ndx_in Location 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %int = OpTypeInt 32 1
+ %v4int = OpTypeVector %int 4
+%frexpStructType = OpTypeStruct %v4float %v4int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v4float
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+ %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+ %int_0 = OpConstant %int 0
+ %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%gl_TessCoord = OpVariable %_ptr_Input_v3float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
+ %uint_32 = OpConstant %uint 32
+%_arr_gl_PerVertex_0_uint_32 = OpTypeArray %gl_PerVertex_0 %uint_32
+%_ptr_Input__arr_gl_PerVertex_0_uint_32 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_32
+ %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_32 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %int_1 = OpConstant %int 1
+ %uint_2 = OpConstant %uint 2
+ %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_arr_uint_uint_32 = OpTypeArray %uint %uint_32
+%_ptr_Input__arr_uint_uint_32 = OpTypePointer Input %_arr_uint_uint_32
+ %ndx_in = OpVariable %_ptr_Input__arr_uint_uint_32 Input
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %in_uint = OpVariable %_ptr_Function_v4uint Function
+ %in_float = OpVariable %_ptr_Function_v4float Function
+ %x_0 = OpVariable %_ptr_Function_v4float Function
+ %exp_0 = OpVariable %_ptr_Function_v4int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %41 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_0
+ %42 = OpLoad %float %41
+ %49 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+ %50 = OpLoad %v4float %49
+ %51 = OpVectorTimesScalar %v4float %50 %42
+ %52 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_1
+ %53 = OpLoad %float %52
+ %55 = OpAccessChain %_ptr_Input_v4float %gl_in %int_1 %int_0
+ %56 = OpLoad %v4float %55
+ %57 = OpVectorTimesScalar %v4float %56 %53
+ %58 = OpFAdd %v4float %51 %57
+ %60 = OpAccessChain %_ptr_Input_float %gl_TessCoord %uint_2
+ %61 = OpLoad %float %60
+ %63 = OpAccessChain %_ptr_Input_v4float %gl_in %int_2 %int_0
+ %64 = OpLoad %v4float %63
+ %65 = OpVectorTimesScalar %v4float %64 %61
+ %66 = OpFAdd %v4float %58 %65
+ %68 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+ OpStore %68 %66
+ %81 = OpAccessChain %_ptr_Input_uint %ndx_in %int_0
+ %82 = OpLoad %uint %81
+ %84 = OpAccessChain %_ptr_Uniform_v4uint %__0 %int_0 %82
+ %85 = OpLoad %v4uint %84
+ OpStore %in_uint %85
+ %87 = OpLoad %v4uint %in_uint
+ %88 = OpBitcast %v4float %87
+ OpStore %in_float %88
+ %90 = OpLoad %v4float %in_float
+ %92 = OpExtInst %v4float %1 Frexp %90 %exp_0
+ OpStore %x_0 %92
+ %95 = OpLoad %v4float %in_float
+ %96 = OpExtInst %frexpStructType %1 FrexpStruct %95
+ OpStore %res_0 %96
+ %98 = OpLoad %v4float %x_0
+ OpStore %frexp_x_out %98
+ %100 = OpLoad %v4int %exp_0
+ %101 = OpBitcast %v4float %100
+ OpStore %frexp_exp_out %101
+ %103 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+ %104 = OpLoad %v4float %103
+ OpStore %frexpStruct_x_out %104
+ %106 = OpAccessChain %_ptr_Function_v4int %res_0 %int_1
+ %107 = OpLoad %v4int %106
+ %108 = OpBitcast %v4float %107
+ OpStore %frexpStruct_exp_out %108
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 frexp_x_in;
+# layout (location = 1) flat in vec4 frexp_exp_in;
+# layout (location = 2) flat in vec4 frexpStruct_x_in;
+# layout (location = 3) flat in vec4 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+#
+# void main ()
+# {
+# frexp_x_out.rgba = frexp_x_in;
+# frexp_exp_out.rgba = frexp_exp_in;
+# frexpStruct_x_out.rgba = frexpStruct_x_in;
+# frexpStruct_exp_out.rgba = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %frexp_x_in = OpVariable %_ptr_Input_v4float Input
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v4float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %12 = OpLoad %v4float %frexp_x_in
+ OpStore %frexp_x_out %12
+ %15 = OpLoad %v4float %frexp_exp_in
+ OpStore %frexp_exp_out %15
+ %18 = OpLoad %v4float %frexpStruct_x_in
+ OpStore %frexpStruct_x_out %18
+ %21 = OpLoad %v4float %frexpStruct_exp_in
+ OpStore %frexpStruct_exp_out %21
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH tesc_shader
+ ATTACH tese_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+#RUN test_pipeline DRAW_GRID POS 0 0 SIZE 144 144 CELLS 144 144
+RUN test_pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_vert.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_vert.amber
new file mode 100644
index 0000000..41d8aed
--- /dev/null
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/float32/comparison/frexpstruct_4_vert.amber
@@ -0,0 +1,311 @@
+#!amber
+
+# Copyright 2021 Google LLC
+#
+# 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.
+
+# A vertex shader test for FrexpStruct.
+
+# SHADER vertex vert_shader GLSL
+# #version 430
+# precision highp float;
+#
+# const uint ndp = 1296;
+# const uint ndpSqrt = uint(sqrt(ndp));
+# const float halfGridElementSize = 1.0 / float(ndpSqrt);
+#
+# layout (location = 0) in vec2 position;
+# layout (location = 0) flat out vec4 frexp_x_out;
+# layout (location = 1) flat out vec4 frexp_exp_out;
+# layout (location = 2) flat out vec4 frexpStruct_x_out;
+# layout (location = 3) flat out vec4 frexpStruct_exp_out;
+#
+# layout(set = 0, binding = 0) readonly buffer block0 {
+# uvec4 in_values[ndp];
+# };
+#
+# struct frexpStructType
+# {
+# vec4 x;
+# ivec4 exp;
+# };
+#
+# // Replaced with native function in SPIR-V.
+# frexpStructType frexpStruct (vec4 orig)
+# {
+# vec4 x;
+# ivec4 exp;
+# x = frexp(orig, exp);
+# frexpStructType res = { x, exp };
+# return res;
+# }
+#
+# void main ()
+# {
+# uint xcoord = uint(ndpSqrt * ((position.x + halfGridElementSize + 1) / 2) - 1);
+# uint ycoord = uint(ndpSqrt * ((position.y + halfGridElementSize + 1) / 2) - 1);
+# uint ndx = xcoord + ycoord * ndpSqrt;
+#
+# uvec4 in_uint = in_values[ndx];
+# vec4 in_float = uintBitsToFloat(in_uint);
+# vec4 x;
+# ivec4 exp;
+# frexpStructType res;
+#
+# x = frexp(in_float, exp);
+# res = frexpStruct(in_float);
+#
+# frexp_x_out = x;
+# frexp_exp_out = intBitsToFloat(exp);
+# frexpStruct_x_out = res.x;
+# frexpStruct_exp_out = intBitsToFloat(res.exp);
+#
+# gl_Position = vec4(position, 0, 1);
+#
+# return;
+# }
+# END
+
+SHADER vertex vert_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Vertex %main "main" %position %frexp_x_out %frexp_exp_out %frexpStruct_x_out %frexpStruct_exp_out %__0
+ OpDecorate %position Location 0
+ OpDecorate %_arr_v4uint_uint_1296 ArrayStride 16
+ OpMemberDecorate %block0 0 NonWritable
+ OpMemberDecorate %block0 0 Offset 0
+ OpDecorate %block0 BufferBlock
+ OpDecorate %_ DescriptorSet 0
+ OpDecorate %_ Binding 0
+ OpDecorate %frexp_x_out Flat
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_exp_out Flat
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexpStruct_x_out Flat
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_exp_out Flat
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+ OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+ OpDecorate %gl_PerVertex Block
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+ %int = OpTypeInt 32 1
+ %v4int = OpTypeVector %int 4
+%frexpStructType = OpTypeStruct %v4float %v4int
+ %12 = OpTypeFunction %frexpStructType %_ptr_Function_v4float
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+%_ptr_Function_frexpStructType = OpTypePointer Function %frexpStructType
+ %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+ %float_36 = OpConstant %float 36
+ %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+ %position = OpVariable %_ptr_Input_v2float Input
+ %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_027777778 = OpConstant %float 0.027777778
+ %float_1 = OpConstant %float 1
+ %float_2 = OpConstant %float 2
+ %uint_1 = OpConstant %uint 1
+ %uint_36 = OpConstant %uint 36
+ %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+ %uint_1296 = OpConstant %uint 1296
+%_arr_v4uint_uint_1296 = OpTypeArray %v4uint %uint_1296
+ %block0 = OpTypeStruct %_arr_v4uint_uint_1296
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+ %_ = OpVariable %_ptr_Uniform_block0 Uniform
+ %int_0 = OpConstant %int 0
+%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+ %int_1 = OpConstant %int 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+ %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+ %float_0 = OpConstant %float 0
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %xcoord = OpVariable %_ptr_Function_uint Function
+ %ycoord = OpVariable %_ptr_Function_uint Function
+ %ndx = OpVariable %_ptr_Function_uint Function
+ %in_uint = OpVariable %_ptr_Function_v4uint Function
+ %in_float = OpVariable %_ptr_Function_v4float Function
+ %x_0 = OpVariable %_ptr_Function_v4float Function
+ %exp_0 = OpVariable %_ptr_Function_v4int Function
+ %res_0 = OpVariable %_ptr_Function_frexpStructType Function
+ %38 = OpAccessChain %_ptr_Input_float %position %uint_0
+ %39 = OpLoad %float %38
+ %41 = OpFAdd %float %39 %float_0_027777778
+ %43 = OpFAdd %float %41 %float_1
+ %45 = OpFDiv %float %43 %float_2
+ %46 = OpFMul %float %float_36 %45
+ %47 = OpFSub %float %46 %float_1
+ %48 = OpConvertFToU %uint %47
+ OpStore %xcoord %48
+ %51 = OpAccessChain %_ptr_Input_float %position %uint_1
+ %52 = OpLoad %float %51
+ %53 = OpFAdd %float %52 %float_0_027777778
+ %54 = OpFAdd %float %53 %float_1
+ %55 = OpFDiv %float %54 %float_2
+ %56 = OpFMul %float %float_36 %55
+ %57 = OpFSub %float %56 %float_1
+ %58 = OpConvertFToU %uint %57
+ OpStore %ycoord %58
+ %60 = OpLoad %uint %xcoord
+ %61 = OpLoad %uint %ycoord
+ %63 = OpIMul %uint %61 %uint_36
+ %64 = OpIAdd %uint %60 %63
+ OpStore %ndx %64
+ %74 = OpLoad %uint %ndx
+ %76 = OpAccessChain %_ptr_Uniform_v4uint %_ %int_0 %74
+ %77 = OpLoad %v4uint %76
+ OpStore %in_uint %77
+ %79 = OpLoad %v4uint %in_uint
+ %80 = OpBitcast %v4float %79
+ OpStore %in_float %80
+ %82 = OpLoad %v4float %in_float
+ %84 = OpExtInst %v4float %1 Frexp %82 %exp_0
+ OpStore %x_0 %84
+ %87 = OpLoad %v4float %in_float
+ %88 = OpExtInst %frexpStructType %1 FrexpStruct %87
+ OpStore %res_0 %88
+ %91 = OpLoad %v4float %x_0
+ OpStore %frexp_x_out %91
+ %93 = OpLoad %v4int %exp_0
+ %94 = OpBitcast %v4float %93
+ OpStore %frexp_exp_out %94
+ %96 = OpAccessChain %_ptr_Function_v4float %res_0 %int_0
+ %97 = OpLoad %v4float %96
+ OpStore %frexpStruct_x_out %97
+ %100 = OpAccessChain %_ptr_Function_v4int %res_0 %int_1
+ %101 = OpLoad %v4int %100
+ %102 = OpBitcast %v4float %101
+ OpStore %frexpStruct_exp_out %102
+ %107 = OpLoad %v2float %position
+ %109 = OpCompositeExtract %float %107 0
+ %110 = OpCompositeExtract %float %107 1
+ %111 = OpCompositeConstruct %v4float %109 %110 %float_0 %float_1
+ %112 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+ OpStore %112 %111
+ OpReturn
+ OpFunctionEnd
+END
+
+# SHADER fragment frag_shader GLSL
+# #version 430
+# precision highp float;
+#
+# layout (location = 0) flat in vec4 frexp_x_in;
+# layout (location = 1) flat in vec4 frexp_exp_in;
+# layout (location = 2) flat in vec4 frexpStruct_x_in;
+# layout (location = 3) flat in vec4 frexpStruct_exp_in;
+#
+# layout (location = 0) out vec4 frexp_x_out;
+# layout (location = 1) out vec4 frexp_exp_out;
+# layout (location = 2) out vec4 frexpStruct_x_out;
+# layout (location = 3) out vec4 frexpStruct_exp_out;
+#
+#
+# void main ()
+# {
+# frexp_x_out.rgba = frexp_x_in;
+# frexp_exp_out.rgba = frexp_exp_in;
+# frexpStruct_x_out.rgba = frexpStruct_x_in;
+# frexpStruct_exp_out.rgba = frexpStruct_exp_in;
+# }
+# END
+
+SHADER fragment frag_shader SPIRV-ASM
+ OpCapability Shader
+ %1 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint Fragment %main "main" %frexp_x_out %frexp_x_in %frexp_exp_out %frexp_exp_in %frexpStruct_x_out %frexpStruct_x_in %frexpStruct_exp_out %frexpStruct_exp_in
+ OpExecutionMode %main OriginUpperLeft
+ OpDecorate %frexp_x_out Location 0
+ OpDecorate %frexp_x_in Flat
+ OpDecorate %frexp_x_in Location 0
+ OpDecorate %frexp_exp_out Location 1
+ OpDecorate %frexp_exp_in Flat
+ OpDecorate %frexp_exp_in Location 1
+ OpDecorate %frexpStruct_x_out Location 2
+ OpDecorate %frexpStruct_x_in Flat
+ OpDecorate %frexpStruct_x_in Location 2
+ OpDecorate %frexpStruct_exp_out Location 3
+ OpDecorate %frexpStruct_exp_in Flat
+ OpDecorate %frexpStruct_exp_in Location 3
+ %void = OpTypeVoid
+ %3 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%frexp_x_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %frexp_x_in = OpVariable %_ptr_Input_v4float Input
+%frexp_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexp_exp_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_x_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_x_in = OpVariable %_ptr_Input_v4float Input
+%frexpStruct_exp_out = OpVariable %_ptr_Output_v4float Output
+%frexpStruct_exp_in = OpVariable %_ptr_Input_v4float Input
+ %main = OpFunction %void None %3
+ %5 = OpLabel
+ %12 = OpLoad %v4float %frexp_x_in
+ OpStore %frexp_x_out %12
+ %15 = OpLoad %v4float %frexp_exp_in
+ OpStore %frexp_exp_out %15
+ %18 = OpLoad %v4float %frexpStruct_x_in
+ OpStore %frexpStruct_x_out %18
+ %21 = OpLoad %v4float %frexpStruct_exp_in
+ OpStore %frexpStruct_exp_out %21
+ OpReturn
+ OpFunctionEnd
+END
+
+BUFFER buf_in DATA_TYPE uint32 SIZE 1296 FILE TEXT input.txt
+BUFFER vertices DATA_TYPE vec2<float> SIZE 7776 FILE TEXT grid_vertices.txt
+
+BUFFER frexp_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexp_exp FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_x FORMAT R32G32B32A32_SFLOAT
+BUFFER frexpStruct_exp FORMAT R32G32B32A32_SFLOAT
+
+PIPELINE graphics test_pipeline
+ FRAMEBUFFER_SIZE 144 144
+
+ ATTACH vert_shader
+ ATTACH frag_shader
+
+ VERTEX_DATA vertices LOCATION 0
+
+ BIND BUFFER buf_in AS storage DESCRIPTOR_SET 0 BINDING 0
+ BIND BUFFER frexp_x AS color LOCATION 0
+ BIND BUFFER frexp_exp AS color LOCATION 1
+ BIND BUFFER frexpStruct_x AS color LOCATION 2
+ BIND BUFFER frexpStruct_exp AS color LOCATION 3
+END
+
+RUN test_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 7776
+
+EXPECT frexp_x EQ_BUFFER frexpStruct_x
+EXPECT frexp_exp EQ_BUFFER frexpStruct_exp
diff --git a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_workgroup_entry_point.amber b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_workgroup_entry_point.amber
index fdc2f0a..0746244 100644
--- a/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_workgroup_entry_point.amber
+++ b/external/vulkancts/data/vulkan/amber/spirv_assembly/instruction/spirv1p4/entrypoint/comp_workgroup_entry_point.amber
@@ -6,25 +6,25 @@
;
; layout(local_size_x = 2) in;
; layout(local_size_y = 2) in;
-; layout(local_size_z = 2) in;
+; layout(local_size_z = 1) in;
;
; layout(std430, binding = 1) buffer output_buffer
; {
-; uint x[8];
+; uint x[4];
; };
;
-; shared uint wg_data[8];
+; shared uint wg_data[4];
;
; void main() {
; atomicExchange(wg_data[gl_LocalInvocationIndex], gl_LocalInvocationIndex);
-; uint val = atomicExchange(wg_data[(gl_LocalInvocationIndex+1)%8], 0);
+; uint val = atomicExchange(wg_data[(gl_LocalInvocationIndex+1)%4], 0);
; x[gl_LocalInvocationIndex] = val;
; }
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %main "main" %wg_data %gl_LocalInvocationIndex %_
- OpExecutionMode %main LocalSize 2 2 2
+ OpExecutionMode %main LocalSize 2 2 1
OpSource GLSL 430
OpName %main "main"
OpName %wg_data "wg_data"
@@ -34,7 +34,7 @@
OpMemberName %output_buffer 0 "x"
OpName %_ ""
OpDecorate %gl_LocalInvocationIndex BuiltIn LocalInvocationIndex
- OpDecorate %_arr_uint_uint_8_0 ArrayStride 4
+ OpDecorate %_arr_uint_uint_4_0 ArrayStride 4
OpMemberDecorate %output_buffer 0 Offset 0
OpDecorate %output_buffer Block
OpDecorate %_ DescriptorSet 0
@@ -43,18 +43,18 @@
%void = OpTypeVoid
%3 = OpTypeFunction %void
%uint = OpTypeInt 32 0
- %uint_8 = OpConstant %uint 8
-%_arr_uint_uint_8 = OpTypeArray %uint %uint_8
-%_ptr_Workgroup__arr_uint_uint_8 = OpTypePointer Workgroup %_arr_uint_uint_8
- %wg_data = OpVariable %_ptr_Workgroup__arr_uint_uint_8 Workgroup
+ %uint_4 = OpConstant %uint 4
+%_arr_uint_uint_4 = OpTypeArray %uint %uint_4
+%_ptr_Workgroup__arr_uint_uint_4 = OpTypePointer Workgroup %_arr_uint_uint_4
+ %wg_data = OpVariable %_ptr_Workgroup__arr_uint_uint_4 Workgroup
%_ptr_Input_uint = OpTypePointer Input %uint
%gl_LocalInvocationIndex = OpVariable %_ptr_Input_uint Input
%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint
%uint_1 = OpConstant %uint 1
%uint_0 = OpConstant %uint 0
%_ptr_Function_uint = OpTypePointer Function %uint
-%_arr_uint_uint_8_0 = OpTypeArray %uint %uint_8
-%output_buffer = OpTypeStruct %_arr_uint_uint_8_0
+%_arr_uint_uint_4_0 = OpTypeArray %uint %uint_4
+%output_buffer = OpTypeStruct %_arr_uint_uint_4_0
%_ptr_StorageBuffer_output_buffer = OpTypePointer StorageBuffer %output_buffer
%_ = OpVariable %_ptr_StorageBuffer_output_buffer StorageBuffer
%int = OpTypeInt 32 1
@@ -62,7 +62,7 @@
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
%v3uint = OpTypeVector %uint 3
%uint_2 = OpConstant %uint 2
-%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_2
+%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_1
%main = OpFunction %void None %3
%5 = OpLabel
%val = OpVariable %_ptr_Function_uint Function
@@ -72,7 +72,7 @@
%19 = OpAtomicExchange %uint %15 %uint_1 %uint_0 %16
%22 = OpLoad %uint %gl_LocalInvocationIndex
%23 = OpIAdd %uint %22 %uint_1
- %24 = OpUMod %uint %23 %uint_8
+ %24 = OpUMod %uint %23 %uint_4
%25 = OpAccessChain %_ptr_Workgroup_uint %wg_data %24
%26 = OpAtomicExchange %uint %25 %uint_1 %uint_0 %uint_0
OpStore %val %26
@@ -84,9 +84,8 @@
OpFunctionEnd
[test]
-ssbo 0:1 subdata int 0 -1 -1 -1 -1 -1 -1 -1 -1
-
+ssbo 0:1 subdata int 0 -1 -1 -1 -1
compute entrypoint main
compute 1 1 1
-probe ssbo int 0:1 0 == 1 2 3 4 5 6 7 0
+probe ssbo int 0:1 0 == 1 2 3 0
\ No newline at end of file
diff --git a/external/vulkancts/doc/vulkan-cts-withdrawal-2021-01.txt b/external/vulkancts/doc/vulkan-cts-withdrawal-2021-01.txt
new file mode 100644
index 0000000..f47d57d
--- /dev/null
+++ b/external/vulkancts/doc/vulkan-cts-withdrawal-2021-01.txt
@@ -0,0 +1,34 @@
+Dear Adopters,
+
+This announcement provides notification that the Khronos Group Inc. intends
+to withdraw Vulkan CTS 1.2.1.x releases.
+
+These releases are being discontinued due to improved quality and coverage
+provided by more recent releases. Once the releases are withdrawn it will not be
+possible to make conformance submissions against these releases.
+
+The Khronos Group recommends updating to Vulkan CTS 1.2.5.x and more recent releases
+as early as possible.
+
+This announcement covers the following tags as listed on
+https://github.com/KhronosGroup/VK-GL-CTS/tags:
+- vulkan-cts-1.2.1.0
+- vulkan-cts-1.2.1.1
+- vulkan-cts-1.2.1.2
+
+More information about Khronos Conformance and withdrawal policies can be found
+in the Khronos Group Conformance Process document
+(https://www.khronos.org/files/conformance_procedures.pdf) Attachment M.
+Please contact the Vulkan CTS TSG chair (alexander.galazin at arm.com) or
+the Vulkan Working Group chair (tom.olson at arm.com) if you have any questions.
+
+Below are some key dates to acknowledge:
+
+2021-01-17 Notice of intent to withdraw Vulkan CTS 1.2.1.x
+ distributed via email to adopters.
+
+2021-07-16 The affected releases are withdrawn.
+
+11 January 2021
+Alexander Galazin
+Vulkan CTS TSG Chair
diff --git a/external/vulkancts/framework/vulkan/vkBasicTypes.inl b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
index 8c408da..099d5c0 100644
--- a/external/vulkancts/framework/vulkan/vkBasicTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkBasicTypes.inl
@@ -1,28 +1,28 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*/
-#define VK_API_VERSION_1_0 (static_cast<deUint32> (VK_MAKE_VERSION(1, 0, 0)))
-#define VK_API_VERSION_1_1 (static_cast<deUint32> (VK_MAKE_VERSION(1, 1, 0)))
-#define VK_API_VERSION_1_2 (static_cast<deUint32> (VK_MAKE_VERSION(1, 2, 0)))
-#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE (static_cast<size_t> (256))
-#define VK_MAX_EXTENSION_NAME_SIZE (static_cast<size_t> (256))
-#define VK_MAX_DRIVER_NAME_SIZE (static_cast<size_t> (256))
-#define VK_MAX_DRIVER_INFO_SIZE (static_cast<size_t> (256))
-#define VK_UUID_SIZE (static_cast<size_t> (16))
-#define VK_LUID_SIZE (static_cast<size_t> (8))
-#define VK_MAX_MEMORY_TYPES (static_cast<size_t> (32))
-#define VK_MAX_MEMORY_HEAPS (static_cast<size_t> (16))
-#define VK_MAX_DESCRIPTION_SIZE (static_cast<size_t> (256))
-#define VK_MAX_DEVICE_GROUP_SIZE (static_cast<size_t> (32))
+#define VK_API_VERSION_1_0 (static_cast<deUint32> (VK_MAKE_API_VERSION(0, 1, 0, 0)))
+#define VK_API_VERSION_1_1 (static_cast<deUint32> (VK_MAKE_API_VERSION(0, 1, 1, 0)))
+#define VK_API_VERSION_1_2 (static_cast<deUint32> (VK_MAKE_API_VERSION(0, 1, 2, 0)))
+#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE (static_cast<size_t> (256U))
+#define VK_MAX_EXTENSION_NAME_SIZE (static_cast<size_t> (256U))
+#define VK_MAX_DRIVER_NAME_SIZE (static_cast<size_t> (256U))
+#define VK_MAX_DRIVER_INFO_SIZE (static_cast<size_t> (256U))
+#define VK_UUID_SIZE (static_cast<size_t> (16U))
+#define VK_LUID_SIZE (static_cast<size_t> (8U))
+#define VK_MAX_MEMORY_TYPES (static_cast<size_t> (32U))
+#define VK_MAX_MEMORY_HEAPS (static_cast<size_t> (16U))
+#define VK_MAX_DESCRIPTION_SIZE (static_cast<size_t> (256U))
+#define VK_MAX_DEVICE_GROUP_SIZE (static_cast<size_t> (32U))
#define VK_ATTACHMENT_UNUSED (static_cast<deUint32> ((~0U)))
#define VK_SUBPASS_EXTERNAL (static_cast<deUint32> ((~0U)))
#define VK_QUEUE_FAMILY_IGNORED (static_cast<deUint32> ((~0U)))
-#define VK_QUEUE_FAMILY_EXTERNAL (static_cast<deUint32> ((~0U-1)))
+#define VK_QUEUE_FAMILY_EXTERNAL (static_cast<deUint32> ((~1U)))
#define VK_REMAINING_MIP_LEVELS (static_cast<deUint32> ((~0U)))
#define VK_REMAINING_ARRAY_LAYERS (static_cast<deUint32> ((~0U)))
#define VK_WHOLE_SIZE (static_cast<vk::VkDeviceSize> ((~0ULL)))
-#define VK_TRUE (static_cast<vk::VkBool32> (1))
-#define VK_FALSE (static_cast<vk::VkBool32> (0))
+#define VK_TRUE (static_cast<vk::VkBool32> (1U))
+#define VK_FALSE (static_cast<vk::VkBool32> (0U))
#define VK_API_MAX_FRAMEWORK_VERSION VK_API_VERSION_1_2
VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkBuffer, HANDLE_TYPE_BUFFER);
@@ -65,6 +65,8 @@
VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkIndirectCommandsLayoutNV, HANDLE_TYPE_INDIRECT_COMMANDS_LAYOUT_NV);
VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkPrivateDataSlotEXT, HANDLE_TYPE_PRIVATE_DATA_SLOT_EXT);
VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkAccelerationStructureKHR, HANDLE_TYPE_ACCELERATION_STRUCTURE_KHR);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkVideoSessionKHR, HANDLE_TYPE_VIDEO_SESSION_KHR);
+VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkVideoSessionParametersKHR, HANDLE_TYPE_VIDEO_SESSION_PARAMETERS_KHR);
VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkSamplerYcbcrConversionKHR, HANDLE_TYPE_SAMPLER_YCBCR_CONVERSION);
VK_DEFINE_NON_DISPATCHABLE_HANDLE (VkDescriptorUpdateTemplateKHR, HANDLE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE);
@@ -304,6 +306,25 @@
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000,
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001,
VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002,
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR = 1000023000,
+ VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001,
+ VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR = 1000023002,
+ VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR = 1000023003,
+ VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR = 1000023004,
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005,
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006,
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007,
+ VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR = 1000023008,
+ VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR = 1000023009,
+ VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010,
+ VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR = 1000023011,
+ VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR = 1000023012,
+ VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR = 1000023013,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014,
+ VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR = 1000299000,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR = 1000299001,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002,
@@ -312,6 +333,23 @@
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002,
VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000,
VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT = 1000038000,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT = 1000038001,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000038002,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000038003,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT = 1000038004,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT = 1000038005,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT = 1000038006,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT = 1000038007,
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT = 1000038008,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT = 1000040001,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040002,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT = 1000040003,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT = 1000040004,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040005,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040006,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040007,
VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,
VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000,
@@ -467,6 +505,13 @@
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT = 1000187001,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187002,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187003,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT = 1000187004,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187005,
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187006,
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
@@ -551,6 +596,8 @@
VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV = 1000277005,
VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000,
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = 1000281001,
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000,
@@ -584,6 +631,7 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001,
VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV = 1000326002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001,
VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000,
@@ -604,6 +652,18 @@
VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = 1000351000,
VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = 1000351002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000,
+ VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001,
+ VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002,
+ VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000,
+ VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001,
+ VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002,
+ VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365000,
+ VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000,
+ VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000,
+ VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,
VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
@@ -739,6 +799,12 @@
VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002,
VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000,
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001,
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002,
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000,
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001,
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002,
VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = 1000164003,
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
@@ -789,6 +855,8 @@
VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000,
VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001,
VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000,
+ VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000,
+ VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001,
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000,
VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,
@@ -1080,6 +1148,10 @@
VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = 1000066011,
VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = 1000066012,
VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = 1000066013,
+ VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT = 1000330000,
+ VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT = 1000330001,
+ VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT = 1000330002,
+ VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT = 1000330003,
VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = 1000340000,
VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = 1000340001,
VK_FORMAT_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM,
@@ -1152,6 +1224,8 @@
VK_QUERY_TYPE_OCCLUSION = 0,
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
VK_QUERY_TYPE_TIMESTAMP = 2,
+ VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000,
+ VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR = 1000299000,
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000,
@@ -1322,6 +1396,13 @@
VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT = 1000267009,
VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT = 1000267010,
VK_DYNAMIC_STATE_STENCIL_OP_EXT = 1000267011,
+ VK_DYNAMIC_STATE_VERTEX_INPUT_EXT = 1000352000,
+ VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT = 1000377000,
+ VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT = 1000377001,
+ VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT = 1000377002,
+ VK_DYNAMIC_STATE_LOGIC_OP_EXT = 1000377003,
+ VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT = 1000377004,
+ VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT = 1000381000,
VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF,
};
@@ -1598,6 +1679,7 @@
VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,
VK_DRIVER_ID_MESA_LLVMPIPE = 13,
VK_DRIVER_ID_MOLTENVK = 14,
+ VK_DRIVER_ID_COREAVI_PROPRIETARY = 15,
VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY,
VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE,
VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV,
@@ -2197,6 +2279,208 @@
VK_SHADER_GROUP_SHADER_MAX_ENUM_KHR = 0x7FFFFFFF,
};
+enum VkQueryResultStatusKHR
+{
+ VK_QUERY_RESULT_STATUS_ERROR_KHR = -1,
+ VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0,
+ VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1,
+ VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+
+enum StdVideoH264ChromaFormatIdc
+{
+ std_video_h264_chroma_format_idc_monochrome = 0,
+ std_video_h264_chroma_format_idc_420 = 1,
+ std_video_h264_chroma_format_idc_422 = 2,
+ std_video_h264_chroma_format_idc_444 = 3,
+ STD_VIDEO_H264_CHROMA_FORMAT_IDC_LAST,
+};
+
+enum StdVideoH264ProfileIdc
+{
+ std_video_h264_profile_idc_baseline = 66,
+ std_video_h264_profile_idc_main = 77,
+ std_video_h264_profile_idc_high = 100,
+ std_video_h264_profile_idc_high_444_predictive = 244,
+ std_video_h264_profile_idc_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264Level
+{
+ std_video_h264_level_1_0 = 0,
+ std_video_h264_level_1_1 = 1,
+ std_video_h264_level_1_2 = 2,
+ std_video_h264_level_1_3 = 3,
+ std_video_h264_level_2_0 = 4,
+ std_video_h264_level_2_1 = 5,
+ std_video_h264_level_2_2 = 6,
+ std_video_h264_level_3_0 = 7,
+ std_video_h264_level_3_1 = 8,
+ std_video_h264_level_3_2 = 9,
+ std_video_h264_level_4_0 = 10,
+ std_video_h264_level_4_1 = 11,
+ std_video_h264_level_4_2 = 12,
+ std_video_h264_level_5_0 = 13,
+ std_video_h264_level_5_1 = 14,
+ std_video_h264_level_5_2 = 15,
+ std_video_h264_level_6_0 = 16,
+ std_video_h264_level_6_1 = 17,
+ std_video_h264_level_6_2 = 18,
+ STD_VIDEO_H264_LEVEL_LAST,
+ std_video_h264_level_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264PocType
+{
+ std_video_h264_poc_type_0 = 0,
+ std_video_h264_poc_type_1 = 1,
+ std_video_h264_poc_type_2 = 2,
+ STD_VIDEO_H264_POC_TYPE_LAST,
+ std_video_h264_poc_type_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264AspectRatioIdc
+{
+ std_video_h264_aspect_ratio_idc_unspecified = 0,
+ std_video_h264_aspect_ratio_idc_square = 1,
+ std_video_h264_aspect_ratio_idc_12_11 = 2,
+ std_video_h264_aspect_ratio_idc_10_11 = 3,
+ std_video_h264_aspect_ratio_idc_16_11 = 4,
+ std_video_h264_aspect_ratio_idc_40_33 = 5,
+ std_video_h264_aspect_ratio_idc_24_11 = 6,
+ std_video_h264_aspect_ratio_idc_20_11 = 7,
+ std_video_h264_aspect_ratio_idc_32_11 = 8,
+ std_video_h264_aspect_ratio_idc_80_33 = 9,
+ std_video_h264_aspect_ratio_idc_18_11 = 10,
+ std_video_h264_aspect_ratio_idc_15_11 = 11,
+ std_video_h264_aspect_ratio_idc_64_33 = 12,
+ std_video_h264_aspect_ratio_idc_160_99 = 13,
+ std_video_h264_aspect_ratio_idc_4_3 = 14,
+ std_video_h264_aspect_ratio_idc_3_2 = 15,
+ std_video_h264_aspect_ratio_idc_2_1 = 16,
+ std_video_h264_aspect_ratio_idc_extended_sar = 255,
+ std_video_h264_aspect_ratio_idc_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264WeightedBiPredIdc
+{
+ std_video_h264_default_weighted_b_slices_prediction_idc = 0,
+ std_video_h264_explicit_weighted_b_slices_prediction_idc = 1,
+ std_video_h264_implicit_weighted_b_slices_prediction_idc = 2,
+ STD_VIDEO_H264_WEIGHTED_BI_PRED_IDC_LAST,
+ std_video_h264_invalid_weighted_b_slices_prediction_idc = 0x7FFFFFFF,
+};
+
+enum StdVideoH264ModificationOfPicNumsIdc
+{
+ std_video_h264_modification_of_pic_nums_idc_short_term_subtract = 0,
+ std_video_h264_modification_of_pic_nums_idc_short_term_add = 1,
+ std_video_h264_modification_of_pic_nums_idc_long_term = 2,
+ std_video_h264_modification_of_pic_nums_idc_end = 3,
+ STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LAST,
+ std_video_h264_modification_of_pic_nums_idc_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264MemMgmtControlOp
+{
+ std_video_h264_mem_mgmt_control_op_end = 0,
+ std_video_h264_mem_mgmt_control_op_unmark_short_term = 1,
+ std_video_h264_mem_mgmt_control_op_unmark_long_term = 2,
+ std_video_h264_mem_mgmt_control_op_mark_long_term = 3,
+ std_video_h264_mem_mgmt_control_op_set_max_long_term_index = 4,
+ std_video_h264_mem_mgmt_control_op_unmark_all = 5,
+ std_video_h264_mem_mgmt_control_op_mark_current_as_long_term = 6,
+ STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_LAST,
+ std_video_h264_mem_mgmt_control_op_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264CabacInitIdc
+{
+ std_video_h264_cabac_init_idc_0 = 0,
+ std_video_h264_cabac_init_idc_1 = 1,
+ std_video_h264_cabac_init_idc_2 = 2,
+ STD_VIDEO_H264_CABAC_INIT_IDC_LAST,
+ std_video_h264_cabac_init_idc_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264DisableDeblockingFilterIdc
+{
+ std_video_h264_disable_deblocking_filter_idc_disabled = 0,
+ std_video_h264_disable_deblocking_filter_idc_enabled = 1,
+ std_video_h264_disable_deblocking_filter_idc_partial = 2,
+ STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_LAST,
+ std_video_h264_disable_deblocking_filter_idc_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264PictureType
+{
+ std_video_h264_picture_type_i = 0,
+ std_video_h264_picture_type_p = 1,
+ std_video_h264_picture_type_b = 2,
+ STD_VIDEO_H264_PICTURE_TYPE_LAST,
+ std_video_h264_picture_type_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264SliceType
+{
+ std_video_h264_slice_type_i = 0,
+ std_video_h264_slice_type_p = 1,
+ std_video_h264_slice_type_b = 2,
+ STD_VIDEO_H264_SLICE_TYPE_LAST,
+ std_video_h264_slice_type_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH264NonVclNaluType
+{
+ std_video_h264_non_vcl_nalu_type_sps = 0,
+ std_video_h264_non_vcl_nalu_type_pps = 1,
+ std_video_h264_non_vcl_nalu_type_aud = 2,
+ std_video_h264_non_vcl_nalu_type_prefix = 3,
+ std_video_h264_non_vcl_nalu_type_end_of_sequence = 4,
+ std_video_h264_non_vcl_nalu_type_end_of_stream = 5,
+ std_video_h264_non_vcl_nalu_type_precoded = 6,
+ STD_VIDEO_H264_NON_VCL_NALU_TYPE_LAST,
+ std_video_h264_non_vcl_nalu_type_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH265ChromaFormatIdc
+{
+ std_video_h265_chroma_format_idc_monochrome = 0,
+ std_video_h265_chroma_format_idc_420 = 1,
+ std_video_h265_chroma_format_idc_422 = 2,
+ std_video_h265_chroma_format_idc_444 = 3,
+ STD_VIDEO_H265_CHROMA_FORMAT_IDC_LAST,
+};
+
+enum StdVideoH265ProfileIdc
+{
+ std_video_h265_profile_idc_main = 1,
+ std_video_h265_profile_idc_main_10 = 2,
+ std_video_h265_profile_idc_main_still_picture = 3,
+ std_video_h265_profile_idc_format_range_extensions = 4,
+ std_video_h265_profile_idc_scc_extensions = 9,
+ std_video_h265_profile_idc_invalid = 0x7FFFFFFF,
+};
+
+enum StdVideoH265Level
+{
+ std_video_h265_level_1_0 = 0,
+ std_video_h265_level_2_0 = 1,
+ std_video_h265_level_2_1 = 2,
+ std_video_h265_level_3_0 = 3,
+ std_video_h265_level_3_1 = 4,
+ std_video_h265_level_4_0 = 5,
+ std_video_h265_level_4_1 = 6,
+ std_video_h265_level_5_0 = 7,
+ std_video_h265_level_5_1 = 8,
+ std_video_h265_level_5_2 = 9,
+ std_video_h265_level_6_0 = 10,
+ std_video_h265_level_6_1 = 11,
+ std_video_h265_level_6_2 = 12,
+ STD_VIDEO_H265_LEVEL_LAST,
+ std_video_h265_level_invalid = 0x7FFFFFFF,
+};
+
enum VkFullScreenExclusiveEXT
{
VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT = 0,
@@ -2319,6 +2603,10 @@
VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000,
+ VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000,
+ VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000,
+ VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR = 0x08000000,
+ VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000,
VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000,
VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,
VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000,
@@ -2387,6 +2675,12 @@
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
+ VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400,
+ VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800,
+ VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000,
+ VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000,
+ VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000,
+ VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000,
VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = 0x00000100,
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV,
@@ -2419,12 +2713,14 @@
enum VkQueueFlagBits
{
- VK_QUEUE_GRAPHICS_BIT = 0x00000001,
- VK_QUEUE_COMPUTE_BIT = 0x00000002,
- VK_QUEUE_TRANSFER_BIT = 0x00000004,
- VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,
- VK_QUEUE_PROTECTED_BIT = 0x00000010,
- VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
+ VK_QUEUE_GRAPHICS_BIT = 0x00000001,
+ VK_QUEUE_COMPUTE_BIT = 0x00000002,
+ VK_QUEUE_TRANSFER_BIT = 0x00000004,
+ VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,
+ VK_QUEUE_PROTECTED_BIT = 0x00000010,
+ VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020,
+ VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040,
+ VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkQueueFlags;
@@ -2524,6 +2820,7 @@
VK_QUERY_RESULT_WAIT_BIT = 0x00000002,
VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004,
VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008,
+ VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0x00000010,
VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF,
};
typedef deUint32 VkQueryResultFlags;
@@ -2553,6 +2850,10 @@
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000,
+ VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000,
+ VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000,
+ VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000,
+ VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
@@ -2845,6 +3146,7 @@
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000400,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100,
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA = 0x00000800,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
@@ -2915,6 +3217,7 @@
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT = 0x00000008,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000010,
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA = 0x00000080,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,
@@ -3226,6 +3529,156 @@
};
typedef deUint32 VkAccelerationStructureCreateFlagsKHR;
+enum VkVideoCodecOperationFlagBitsKHR
+{
+ VK_VIDEO_CODEC_OPERATION_INVALID_BIT_KHR = 0,
+ VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT = 0x00010000,
+ VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT = 0x00000001,
+ VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT = 0x00000002,
+ VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoCodecOperationFlagsKHR;
+
+enum VkVideoChromaSubsamplingFlagBitsKHR
+{
+ VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_BIT_KHR = 0,
+ VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0x00000001,
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0x00000002,
+ VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0x00000004,
+ VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0x00000008,
+ VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoChromaSubsamplingFlagsKHR;
+
+enum VkVideoComponentBitDepthFlagBitsKHR
+{
+ VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR = 0,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0x00000001,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0x00000004,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0x00000010,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoComponentBitDepthFlagsKHR;
+
+enum VkVideoCapabilitiesFlagBitsKHR
+{
+ VK_VIDEO_CAPABILITIES_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
+ VK_VIDEO_CAPABILITIES_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002,
+ VK_VIDEO_CAPABILITIES_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoCapabilitiesFlagsKHR;
+
+enum VkVideoSessionCreateFlagBitsKHR
+{
+ VK_VIDEO_SESSION_CREATE_DEFAULT_KHR = 0,
+ VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
+ VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoSessionCreateFlagsKHR;
+
+enum VkVideoCodingControlFlagBitsKHR
+{
+ VK_VIDEO_CODING_CONTROL_DEFAULT_KHR = 0,
+ VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0x00000001,
+ VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoCodingControlFlagsKHR;
+
+enum VkVideoCodingQualityPresetFlagBitsKHR
+{
+ VK_VIDEO_CODING_QUALITY_PRESET_DEFAULT_BIT_KHR = 0,
+ VK_VIDEO_CODING_QUALITY_PRESET_NORMAL_BIT_KHR = 0x00000001,
+ VK_VIDEO_CODING_QUALITY_PRESET_POWER_BIT_KHR = 0x00000002,
+ VK_VIDEO_CODING_QUALITY_PRESET_QUALITY_BIT_KHR = 0x00000004,
+ VK_VIDEO_CODING_QUALITY_PRESET_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoCodingQualityPresetFlagsKHR;
+
+enum VkVideoDecodeFlagBitsKHR
+{
+ VK_VIDEO_DECODE_DEFAULT_KHR = 0,
+ VK_VIDEO_DECODE_RESERVED_0_BIT_KHR = 0x00000001,
+ VK_VIDEO_DECODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoDecodeFlagsKHR;
+
+enum VkVideoEncodeFlagBitsKHR
+{
+ VK_VIDEO_ENCODE_DEFAULT_KHR = 0,
+ VK_VIDEO_ENCODE_RESERVED_0_BIT_KHR = 0x00000001,
+ VK_VIDEO_ENCODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoEncodeFlagsKHR;
+
+enum VkVideoEncodeRateControlFlagBitsKHR
+{
+ VK_VIDEO_ENCODE_RATE_CONTROL_DEFAULT_KHR = 0,
+ VK_VIDEO_ENCODE_RATE_CONTROL_RESET_BIT_KHR = 0x00000001,
+ VK_VIDEO_ENCODE_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoEncodeRateControlFlagsKHR;
+
+enum VkVideoEncodeRateControlModeFlagBitsKHR
+{
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR = 0,
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR = 1,
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR = 2,
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoEncodeRateControlModeFlagsKHR;
+
+enum VkVideoEncodeH264CapabilitiesFlagBitsEXT
+{
+ VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT = 0x00000002,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT = 0x00000004,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT = 0x00000008,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT = 0x00000010,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT = 0x00000020,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT = 0x00000040,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT = 0x00000080,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT = 0x00000100,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT = 0x00000200,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT = 0x00000400,
+ VK_VIDEO_ENCODE_H264_CAPABILITIES_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoEncodeH264CapabilitiesFlagsEXT;
+
+enum VkVideoEncodeH264InputModeFlagBitsEXT
+{
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT = 0x00000002,
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT = 0x00000004,
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoEncodeH264InputModeFlagsEXT;
+
+enum VkVideoEncodeH264OutputModeFlagBitsEXT
+{
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT = 0x00000002,
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT = 0x00000004,
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoEncodeH264OutputModeFlagsEXT;
+
+enum VkVideoEncodeH264CreateFlagBitsEXT
+{
+ VK_VIDEO_ENCODE_H264_CREATE_DEFAULT_EXT = 0,
+ VK_VIDEO_ENCODE_H264_CREATE_RESERVED_0_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_CREATE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoEncodeH264CreateFlagsEXT;
+
+enum VkVideoDecodeH264FieldLayoutFlagBitsEXT
+{
+ VK_VIDEO_DECODE_H264_PROGRESSIVE_PICTURES_ONLY_EXT = 0,
+ VK_VIDEO_DECODE_H264_FIELD_LAYOUT_LINE_INTERLACED_PLANE_BIT_EXT = 0x00000001,
+ VK_VIDEO_DECODE_H264_FIELD_LAYOUT_SEPARATE_INTERLACED_PLANE_BIT_EXT = 0x00000002,
+ VK_VIDEO_DECODE_H264_FIELD_LAYOUT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF,
+};
+typedef deUint32 VkVideoDecodeH264FieldLayoutFlagsEXT;
+
typedef deUint32 VkInstanceCreateFlags;
typedef deUint32 VkDeviceCreateFlags;
@@ -3296,6 +3749,14 @@
typedef deUint32 VkAndroidSurfaceCreateFlagsKHR;
+typedef deUint32 VkVideoBeginCodingFlagsKHR;
+
+typedef deUint32 VkVideoEndCodingFlagsKHR;
+
+typedef deUint32 VkVideoDecodeH264CreateFlagsEXT;
+
+typedef deUint32 VkVideoDecodeH265CreateFlagsEXT;
+
typedef deUint32 VkImagePipeSurfaceCreateFlagsFUCHSIA;
typedef deUint32 VkStreamDescriptorSurfaceCreateFlagsGGP;
@@ -3353,81 +3814,91 @@
typedef VkDescriptorUpdateTemplateCreateFlags VkDescriptorUpdateTemplateCreateFlagsKHR;
typedef deUint64 VkPipelineStageFlags2KHR;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_NONE_KHR = 0;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000;
+typedef deUint64 VkPipelineStageFlagBits2KHR;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_NONE_KHR = 0ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_FLAG_BITS_2KHR_MAX_ENUM_KHR = 0x7FFFFFFFFFFFFFFFULL;
typedef deUint64 VkAccessFlags2KHR;
-static const VkAccessFlags2KHR VK_ACCESS_2_NONE_KHR = 0;
-static const VkAccessFlags2KHR VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001;
-static const VkAccessFlags2KHR VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002;
-static const VkAccessFlags2KHR VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004;
-static const VkAccessFlags2KHR VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008;
-static const VkAccessFlags2KHR VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100;
-static const VkAccessFlags2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200;
-static const VkAccessFlags2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000;
-static const VkAccessFlags2KHR VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000;
-static const VkAccessFlags2KHR VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000;
-static const VkAccessFlags2KHR VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000;
-static const VkAccessFlags2KHR VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000;
-static const VkAccessFlags2KHR VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000;
-static const VkAccessFlags2KHR VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000;
+typedef deUint64 VkAccessFlagBits2KHR;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_NONE_KHR = 0ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0x4000000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_FLAG_BITS_2KHR_MAX_ENUM_KHR = 0x7FFFFFFFFFFFFFFFULL;
VK_DEFINE_PLATFORM_TYPE(XlibDisplayPtr, void*);
VK_DEFINE_PLATFORM_TYPE(XlibWindow, deUintptr);
@@ -3475,7 +3946,7 @@
#define VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION 2
#define VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION 1
#define VK_KHR_16BIT_STORAGE_SPEC_VERSION 1
-#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 1
+#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 2
#define VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_SPEC_VERSION 1
#define VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION 1
#define VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME "VK_KHR_create_renderpass2"
@@ -3524,7 +3995,7 @@
#define VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_SPEC_VERSION 1
#define VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION 1
#define VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME "VK_KHR_copy_commands2"
-#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9
+#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 10
#define VK_NV_GLSL_SHADER_SPEC_VERSION 1
#define VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION 1
#define VK_IMG_FILTER_CUBIC_SPEC_VERSION 1
@@ -3570,7 +4041,7 @@
#define VK_EXT_HDR_METADATA_SPEC_VERSION 2
#define VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION 1
#define VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION 1
-#define VK_QUEUE_FAMILY_FOREIGN_EXT (~0U-2)
+#define VK_QUEUE_FAMILY_FOREIGN_EXT (~2U)
#define VK_EXT_DEBUG_UTILS_SPEC_VERSION 2
#define VK_EXT_SAMPLER_FILTER_MINMAX_SPEC_VERSION 2
#define VK_AMD_GPU_SHADER_INT16_SPEC_VERSION 2
@@ -3600,7 +4071,7 @@
#define VK_EXT_EXTERNAL_MEMORY_HOST_SPEC_VERSION 1
#define VK_AMD_BUFFER_MARKER_SPEC_VERSION 1
#define VK_AMD_PIPELINE_COMPILER_CONTROL_SPEC_VERSION 1
-#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 1
+#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 2
#define VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION 2
#define VK_AMD_MEMORY_OVERALLOCATION_BEHAVIOR_SPEC_VERSION 1
#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 3
@@ -3643,8 +4114,9 @@
#define VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION 1
#define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1
#define VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION 3
+#define VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION 1
#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION 1
-#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 1
+#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 2
#define VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION 2
#define VK_EXT_ROBUSTNESS_2_SPEC_VERSION 1
#define VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION 12
@@ -3654,19 +4126,37 @@
#define VK_NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION 1
#define VK_QCOM_render_pass_store_ops_EXTENSION_NAME "VK_QCOM_render_pass_store_ops"
#define VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION 1
+#define VK_EXT_YCBCR_2PLANE_444_FORMATS_SPEC_VERSION 1
#define VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION 1
-#define VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION 0
+#define VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION 1
#define VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION 1
#define VK_EXT_4444_FORMATS_SPEC_VERSION 1
#define VK_NV_ACQUIRE_WINRT_DISPLAY_SPEC_VERSION 1
#define VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION 1
+#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION 2
+#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION 1
+#define VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION 1
#define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 11
#define VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION 1
#define VK_KHR_RAY_QUERY_SPEC_VERSION 1
#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3
+#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION 1
+#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 1
#define VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION 1
+#define VK_KHR_VIDEO_ENCODE_QUEUE_SPEC_VERSION 2
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9 VK_MAKE_VIDEO_STD_VERSION(0, 9, 0)
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264"
+#define VK_EXT_VIDEO_ENCODE_H264_SPEC_VERSION 1
+#define VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION 1
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_API_VERSION_0_5 VK_MAKE_VIDEO_STD_VERSION(0, 5, 0)
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_API_VERSION_0_5
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265"
+#define VK_EXT_VIDEO_DECODE_H265_SPEC_VERSION 1
#define VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION 1
+#define VK_FUCHSIA_EXTERNAL_MEMORY_SPEC_VERSION 1
+#define VK_FUCHSIA_EXTERNAL_SEMAPHORE_SPEC_VERSION 1
#define VK_GGP_STREAM_DESCRIPTOR_SURFACE_SPEC_VERSION 1
#define VK_GGP_FRAME_TOKEN_SPEC_VERSION 1
#define VK_MVK_IOS_SURFACE_SPEC_VERSION 3
diff --git a/external/vulkancts/framework/vulkan/vkCmdUtil.cpp b/external/vulkancts/framework/vulkan/vkCmdUtil.cpp
index 20171b3..e3e530a 100644
--- a/external/vulkancts/framework/vulkan/vkCmdUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkCmdUtil.cpp
@@ -198,18 +198,30 @@
vk.cmdEndRenderPass(commandBuffer);
}
-void submitCommandsAndWait (const DeviceInterface& vk,
- const VkDevice device,
- const VkQueue queue,
- const VkCommandBuffer commandBuffer,
- const bool useDeviceGroups,
- const deUint32 deviceMask)
+void submitCommandsAndWait (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkQueue queue,
+ const VkCommandBuffer commandBuffer,
+ const bool useDeviceGroups,
+ const deUint32 deviceMask,
+ const deUint32 waitSemaphoreCount,
+ const VkSemaphore* waitSemaphores,
+ const VkPipelineStageFlags* waitStages)
{
+ // For simplicity. A more complete approach can be found in vkt::sparse::submitCommandsAndWait().
+ DE_ASSERT(!(useDeviceGroups && waitSemaphoreCount > 0u));
+
+ if (waitSemaphoreCount > 0u)
+ {
+ DE_ASSERT(waitSemaphores != nullptr);
+ DE_ASSERT(waitStages != nullptr);
+ }
+
const Unique<VkFence> fence (createFence(vk, device));
VkDeviceGroupSubmitInfo deviceGroupSubmitInfo =
{
- VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHR, // VkStructureType sType;
+ VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // deUint32 waitSemaphoreCount;
DE_NULL, // const deUint32* pWaitSemaphoreDeviceIndices;
@@ -223,13 +235,13 @@
{
VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
useDeviceGroups ? &deviceGroupSubmitInfo : DE_NULL, // const void* pNext;
- 0u, // deUint32 waitSemaphoreCount;
- DE_NULL, // const VkSemaphore* pWaitSemaphores;
- (const VkPipelineStageFlags*)DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
+ waitSemaphoreCount, // deUint32 waitSemaphoreCount;
+ waitSemaphores, // const VkSemaphore* pWaitSemaphores;
+ waitStages, // const VkPipelineStageFlags* pWaitDstStageMask;
1u, // deUint32 commandBufferCount;
&commandBuffer, // const VkCommandBuffer* pCommandBuffers;
0u, // deUint32 signalSemaphoreCount;
- DE_NULL, // const VkSemaphore* pSignalSemaphores;
+ nullptr, // const VkSemaphore* pSignalSemaphores;
};
VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
diff --git a/external/vulkancts/framework/vulkan/vkCmdUtil.hpp b/external/vulkancts/framework/vulkan/vkCmdUtil.hpp
index 91a7e42..a766e2d 100644
--- a/external/vulkancts/framework/vulkan/vkCmdUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkCmdUtil.hpp
@@ -110,12 +110,15 @@
void endRenderPass (const DeviceInterface& vk,
const VkCommandBuffer commandBuffer);
-void submitCommandsAndWait (const DeviceInterface& vk,
- const VkDevice device,
- const VkQueue queue,
- const VkCommandBuffer commandBuffer,
- const bool useDeviceGroups = false,
- const deUint32 deviceMask = 1u);
+void submitCommandsAndWait (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkQueue queue,
+ const VkCommandBuffer commandBuffer,
+ const bool useDeviceGroups = false,
+ const deUint32 deviceMask = 1u,
+ const deUint32 waitSemaphoreCount = 0u,
+ const VkSemaphore* waitSemaphores = nullptr,
+ const VkPipelineStageFlags* waitStages = nullptr);
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
index f99b22d..787e2e2 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
@@ -295,6 +295,13 @@
virtual VkResult setPrivateDataEXT (VkDevice device, VkObjectType objectType, deUint64 objectHandle, VkPrivateDataSlotEXT privateDataSlot, deUint64 data) const;
virtual void getPrivateDataEXT (VkDevice device, VkObjectType objectType, deUint64 objectHandle, VkPrivateDataSlotEXT privateDataSlot, deUint64* pData) const;
virtual void cmdSetFragmentShadingRateEnumNV (VkCommandBuffer commandBuffer, VkFragmentShadingRateNV shadingRate, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]) const;
+virtual void cmdSetVertexInputEXT (VkCommandBuffer commandBuffer, deUint32 vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, deUint32 vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions) const;
+virtual void cmdSetPatchControlPointsEXT (VkCommandBuffer commandBuffer, deUint32 patchControlPoints) const;
+virtual void cmdSetRasterizerDiscardEnableEXT (VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable) const;
+virtual void cmdSetDepthBiasEnableEXT (VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) const;
+virtual void cmdSetLogicOpEXT (VkCommandBuffer commandBuffer, VkLogicOp logicOp) const;
+virtual void cmdSetPrimitiveRestartEnableEXT (VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable) const;
+virtual void cmdSetColorWriteEnableEXT (VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkBool32* pColorWriteEnables) const;
virtual VkResult createAccelerationStructureKHR (VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure) const;
virtual void destroyAccelerationStructureKHR (VkDevice device, VkAccelerationStructureKHR accelerationStructure, const VkAllocationCallbacks* pAllocator) const;
virtual void cmdBuildAccelerationStructuresKHR (VkCommandBuffer commandBuffer, deUint32 infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos) const;
@@ -319,6 +326,22 @@
virtual void cmdSetRayTracingPipelineStackSizeKHR (VkCommandBuffer commandBuffer, deUint32 pipelineStackSize) const;
virtual VkResult getAndroidHardwareBufferPropertiesANDROID (VkDevice device, const struct pt::AndroidHardwareBufferPtr buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties) const;
virtual VkResult getMemoryAndroidHardwareBufferANDROID (VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct pt::AndroidHardwareBufferPtr* pBuffer) const;
+virtual VkResult createVideoSessionKHR (VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession) const;
+virtual void destroyVideoSessionKHR (VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult getVideoSessionMemoryRequirementsKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32* pVideoSessionMemoryRequirementsCount, VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements) const;
+virtual VkResult bindVideoSessionMemoryKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32 videoSessionBindMemoryCount, const VkVideoBindMemoryKHR* pVideoSessionBindMemories) const;
+virtual VkResult createVideoSessionParametersKHR (VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters) const;
+virtual VkResult updateVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo) const;
+virtual void destroyVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator) const;
+virtual void cmdBeginVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo) const;
+virtual void cmdEndVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo) const;
+virtual void cmdControlVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo) const;
+virtual void cmdDecodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pFrameInfo) const;
+virtual void cmdEncodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo) const;
+virtual VkResult getMemoryZirconHandleFUCHSIA (VkDevice device, const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle) const;
+virtual VkResult getMemoryZirconHandlePropertiesFUCHSIA (VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, pt::zx_handle_t zirconHandle, VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties) const;
+virtual VkResult importSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo) const;
+virtual VkResult getSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle) const;
virtual VkResult getMemoryWin32HandleKHR (VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const;
virtual VkResult getMemoryWin32HandlePropertiesKHR (VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) const;
virtual VkResult importSemaphoreWin32HandleKHR (VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) const;
diff --git a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
index 345fc2a..555d831 100644
--- a/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
@@ -64,6 +64,8 @@
virtual VkResult acquireWinrtDisplayNV (VkPhysicalDevice physicalDevice, VkDisplayKHR display) const;
virtual VkResult getWinrtDisplayNV (VkPhysicalDevice physicalDevice, deUint32 deviceRelativeId, VkDisplayKHR* pDisplay) const;
virtual VkResult createAndroidSurfaceKHR (VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkResult getPhysicalDeviceVideoCapabilitiesKHR (VkPhysicalDevice physicalDevice, const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities) const;
+virtual VkResult getPhysicalDeviceVideoFormatPropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, deUint32* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties) const;
virtual VkResult createImagePipeSurfaceFUCHSIA (VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
virtual VkResult createStreamDescriptorSurfaceGGP (VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
virtual VkResult createIOSSurfaceMVK (VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
diff --git a/external/vulkancts/framework/vulkan/vkDefs.hpp b/external/vulkancts/framework/vulkan/vkDefs.hpp
index 051c226..22dd256 100644
--- a/external/vulkancts/framework/vulkan/vkDefs.hpp
+++ b/external/vulkancts/framework/vulkan/vkDefs.hpp
@@ -49,12 +49,15 @@
}; \
} // pt
-#define VK_MAKE_VERSION(MAJOR, MINOR, PATCH) (((deUint32)(MAJOR) << 22u) | ((deUint32)(MINOR) << 12u) | (deUint32)(PATCH))
+#define VK_MAKE_API_VERSION(VARIANT, MAJOR, MINOR, PATCH) \
+ ((((deUint32)(VARIANT)) << 29) | (((deUint32)(MAJOR)) << 22) | (((deUint32)(MINOR)) << 12) | ((deUint32)(PATCH)))
+#define VK_MAKE_VERSION(MAJOR, MINOR, PATCH) VK_MAKE_API_VERSION(0, MAJOR, MINOR, PATCH)
#define VK_BIT(NUM) (1u<<(deUint32)(NUM))
-#define VK_VERSION_MAJOR(version) ((deUint32)(version) >> 22)
-#define VK_VERSION_MINOR(version) (((deUint32)(version) >> 12) & 0x3ff)
-#define VK_VERSION_PATCH(version) ((deUint32)(version) & 0xfff)
+#define VK_API_VERSION_VARIANT(version) ((deUint32)(version) >> 29)
+#define VK_API_VERSION_MAJOR(version) (((deUint32)(version) >> 22) & 0x7FU)
+#define VK_API_VERSION_MINOR(version) (((deUint32)(version) >> 12) & 0x3FFU)
+#define VK_API_VERSION_PATCH(version) ((deUint32)(version) & 0xFFFU)
#define VK_CHECK(EXPR) vk::checkResult((EXPR), #EXPR, __FILE__, __LINE__)
#define VK_CHECK_MSG(EXPR, MSG) vk::checkResult((EXPR), MSG, __FILE__, __LINE__)
@@ -135,6 +138,7 @@
TYPE_ANDROID,
TYPE_WIN32,
TYPE_MACOS,
+ TYPE_HEADLESS,
TYPE_LAST
};
diff --git a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
index 186e6ce..1267153 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
@@ -1472,6 +1472,41 @@
m_vk.cmdSetFragmentShadingRateEnumNV(commandBuffer, shadingRate, combinerOps);
}
+void DeviceDriver::cmdSetVertexInputEXT (VkCommandBuffer commandBuffer, deUint32 vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, deUint32 vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions) const
+{
+ m_vk.cmdSetVertexInputEXT(commandBuffer, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions);
+}
+
+void DeviceDriver::cmdSetPatchControlPointsEXT (VkCommandBuffer commandBuffer, deUint32 patchControlPoints) const
+{
+ m_vk.cmdSetPatchControlPointsEXT(commandBuffer, patchControlPoints);
+}
+
+void DeviceDriver::cmdSetRasterizerDiscardEnableEXT (VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable) const
+{
+ m_vk.cmdSetRasterizerDiscardEnableEXT(commandBuffer, rasterizerDiscardEnable);
+}
+
+void DeviceDriver::cmdSetDepthBiasEnableEXT (VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) const
+{
+ m_vk.cmdSetDepthBiasEnableEXT(commandBuffer, depthBiasEnable);
+}
+
+void DeviceDriver::cmdSetLogicOpEXT (VkCommandBuffer commandBuffer, VkLogicOp logicOp) const
+{
+ m_vk.cmdSetLogicOpEXT(commandBuffer, logicOp);
+}
+
+void DeviceDriver::cmdSetPrimitiveRestartEnableEXT (VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable) const
+{
+ m_vk.cmdSetPrimitiveRestartEnableEXT(commandBuffer, primitiveRestartEnable);
+}
+
+void DeviceDriver::cmdSetColorWriteEnableEXT (VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkBool32* pColorWriteEnables) const
+{
+ m_vk.cmdSetColorWriteEnableEXT(commandBuffer, attachmentCount, pColorWriteEnables);
+}
+
VkResult DeviceDriver::createAccelerationStructureKHR (VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure) const
{
return m_vk.createAccelerationStructureKHR(device, pCreateInfo, pAllocator, pAccelerationStructure);
@@ -1592,6 +1627,86 @@
return m_vk.getMemoryAndroidHardwareBufferANDROID(device, pInfo, pBuffer);
}
+VkResult DeviceDriver::createVideoSessionKHR (VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession) const
+{
+ return m_vk.createVideoSessionKHR(device, pCreateInfo, pAllocator, pVideoSession);
+}
+
+void DeviceDriver::destroyVideoSessionKHR (VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator) const
+{
+ m_vk.destroyVideoSessionKHR(device, videoSession, pAllocator);
+}
+
+VkResult DeviceDriver::getVideoSessionMemoryRequirementsKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32* pVideoSessionMemoryRequirementsCount, VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements) const
+{
+ return m_vk.getVideoSessionMemoryRequirementsKHR(device, videoSession, pVideoSessionMemoryRequirementsCount, pVideoSessionMemoryRequirements);
+}
+
+VkResult DeviceDriver::bindVideoSessionMemoryKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32 videoSessionBindMemoryCount, const VkVideoBindMemoryKHR* pVideoSessionBindMemories) const
+{
+ return m_vk.bindVideoSessionMemoryKHR(device, videoSession, videoSessionBindMemoryCount, pVideoSessionBindMemories);
+}
+
+VkResult DeviceDriver::createVideoSessionParametersKHR (VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters) const
+{
+ return m_vk.createVideoSessionParametersKHR(device, pCreateInfo, pAllocator, pVideoSessionParameters);
+}
+
+VkResult DeviceDriver::updateVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo) const
+{
+ return m_vk.updateVideoSessionParametersKHR(device, videoSessionParameters, pUpdateInfo);
+}
+
+void DeviceDriver::destroyVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator) const
+{
+ m_vk.destroyVideoSessionParametersKHR(device, videoSessionParameters, pAllocator);
+}
+
+void DeviceDriver::cmdBeginVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo) const
+{
+ m_vk.cmdBeginVideoCodingKHR(commandBuffer, pBeginInfo);
+}
+
+void DeviceDriver::cmdEndVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo) const
+{
+ m_vk.cmdEndVideoCodingKHR(commandBuffer, pEndCodingInfo);
+}
+
+void DeviceDriver::cmdControlVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo) const
+{
+ m_vk.cmdControlVideoCodingKHR(commandBuffer, pCodingControlInfo);
+}
+
+void DeviceDriver::cmdDecodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pFrameInfo) const
+{
+ m_vk.cmdDecodeVideoKHR(commandBuffer, pFrameInfo);
+}
+
+void DeviceDriver::cmdEncodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo) const
+{
+ m_vk.cmdEncodeVideoKHR(commandBuffer, pEncodeInfo);
+}
+
+VkResult DeviceDriver::getMemoryZirconHandleFUCHSIA (VkDevice device, const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle) const
+{
+ return m_vk.getMemoryZirconHandleFUCHSIA(device, pGetZirconHandleInfo, pZirconHandle);
+}
+
+VkResult DeviceDriver::getMemoryZirconHandlePropertiesFUCHSIA (VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, pt::zx_handle_t zirconHandle, VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties) const
+{
+ return m_vk.getMemoryZirconHandlePropertiesFUCHSIA(device, handleType, zirconHandle, pMemoryZirconHandleProperties);
+}
+
+VkResult DeviceDriver::importSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo) const
+{
+ return m_vk.importSemaphoreZirconHandleFUCHSIA(device, pImportSemaphoreZirconHandleInfo);
+}
+
+VkResult DeviceDriver::getSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle) const
+{
+ return m_vk.getSemaphoreZirconHandleFUCHSIA(device, pGetZirconHandleInfo, pZirconHandle);
+}
+
VkResult DeviceDriver::getMemoryWin32HandleKHR (VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const
{
return m_vk.getMemoryWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
diff --git a/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl b/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl
index ca7ee8e..7b29a81 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceExtensions.inl
@@ -73,5 +73,6 @@
"VK_KHR_zero_initialize_workgroup_memory",
"VK_KHR_workgroup_memory_explicit_layout",
"VK_KHR_synchronization2",
+ "VK_EXT_color_write_enable",
};
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl b/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl
index 3973ec7..4c45dd7 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeatures.inl
@@ -14,6 +14,7 @@
#define VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_KHR_buffer_device_address"
#define VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_EXT_buffer_device_address"
#define DECL_AMD_COHERENT_MEMORY_EXTENSION_NAME "not_existent_feature"
+#define VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME "VK_EXT_color_write_enable"
#define VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME "VK_NV_compute_shader_derivatives"
#define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering"
#define VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME "VK_NV_cooperative_matrix"
@@ -28,6 +29,7 @@
#define DECL_NV_DIAGNOSTICS_CONFIG_EXTENSION_NAME "not_existent_feature"
#define VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME "VK_NV_scissor_exclusive"
#define VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME "VK_EXT_extended_dynamic_state"
+#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME "VK_EXT_extended_dynamic_state2"
#define VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME "VK_EXT_fragment_density_map"
#define VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME "VK_EXT_fragment_density_map2"
#define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME "VK_NV_fragment_shader_barycentric"
@@ -38,6 +40,7 @@
#define VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME "VK_KHR_imageless_framebuffer"
#define VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME "VK_EXT_image_robustness"
#define VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME "VK_EXT_index_type_uint8"
+#define VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME "VK_NV_inherited_viewport_scissor"
#define VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME "VK_EXT_inline_uniform_block"
#define VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME "VK_EXT_line_rasterization"
#define VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME "VK_EXT_memory_priority"
@@ -79,8 +82,10 @@
#define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout"
#define VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME "VK_KHR_variable_pointers"
#define VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_EXT_vertex_attribute_divisor"
+#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME "VK_EXT_vertex_input_dynamic_state"
#define VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME "VK_KHR_vulkan_memory_model"
#define VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME "VK_KHR_workgroup_memory_explicit_layout"
+#define DECL_EXT_YCBCR_2_PLANE_444_FORMATS_EXTENSION_NAME "not_existent_feature"
#define VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME "VK_EXT_ycbcr_image_arrays"
#define VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME "VK_KHR_zero_initialize_workgroup_memory"
@@ -239,6 +244,7 @@
template<> void initFeatureFromBlob<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(VkPhysicalDeviceExtendedDynamicStateFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>(VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV&, const AllFeaturesBlobs&) {}
+template<> void initFeatureFromBlob<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(VkPhysicalDeviceInheritedViewportScissorFeaturesNV&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT>(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceRobustness2FeaturesEXT>(VkPhysicalDeviceRobustness2FeaturesEXT&, const AllFeaturesBlobs&) {}
@@ -247,92 +253,101 @@
template<> void initFeatureFromBlob<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceDiagnosticsConfigFeaturesNV>(VkPhysicalDeviceDiagnosticsConfigFeaturesNV&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV>(VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV&, const AllFeaturesBlobs&) {}
+template<> void initFeatureFromBlob<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(VkPhysicalDeviceFragmentDensityMap2FeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceImageRobustnessFeaturesEXT>(VkPhysicalDeviceImageRobustnessFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDevice4444FormatsFeaturesEXT>(VkPhysicalDevice4444FormatsFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE>(VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE&, const AllFeaturesBlobs&) {}
+template<> void initFeatureFromBlob<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT&, const AllFeaturesBlobs&) {}
+template<> void initFeatureFromBlob<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(VkPhysicalDeviceExtendedDynamicState2FeaturesEXT&, const AllFeaturesBlobs&) {}
+template<> void initFeatureFromBlob<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(VkPhysicalDeviceColorWriteEnableFeaturesEXT&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(VkPhysicalDeviceAccelerationStructureFeaturesKHR&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(VkPhysicalDeviceRayTracingPipelineFeaturesKHR&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDeviceRayQueryFeaturesKHR>(VkPhysicalDeviceRayQueryFeaturesKHR&, const AllFeaturesBlobs&) {}
template<> void initFeatureFromBlob<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(VkPhysicalDevicePortabilitySubsetFeaturesKHR&, const AllFeaturesBlobs&) {}
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice16BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, VK_KHR_16BIT_STORAGE_EXTENSION_NAME, VK_KHR_16BIT_STORAGE_SPEC_VERSION, 78}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice4444FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, VK_EXT_4444_FORMATS_EXTENSION_NAME, VK_EXT_4444_FORMATS_SPEC_VERSION, 77}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice8BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_SPEC_VERSION, 76}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION, 75}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceASTCDecodeFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, 74}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION, 73}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 72}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 71}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, DECL_AMD_COHERENT_MEMORY_EXTENSION_NAME, 0, 70}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION, 69}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION, 68}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION, 67}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCornerSampledImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME, VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION, 66}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoverageReductionModeFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME, VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION, 65}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION, 64}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION, 63}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClipEnableFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION, 62}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorIndexingFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION, 61}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION, 60}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION, 59}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDiagnosticsConfigFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, DECL_NV_DIAGNOSTICS_CONFIG_EXTENSION_NAME, 0, 58}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExclusiveScissorFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION, 57}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION, 56}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION, 55}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION, 54}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION, 53}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION, 52}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION, 51}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION, 50}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceHostQueryResetFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION, 49}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImagelessFramebufferFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION, 48}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageRobustnessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION, 47}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION, 46}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION, 45}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLineRasterizationFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, VK_EXT_LINE_RASTERIZATION_SPEC_VERSION, 44}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMemoryPriorityFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, VK_EXT_MEMORY_PRIORITY_SPEC_VERSION, 43}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMeshShaderFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION, 42}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiviewFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, 41}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE, VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME, VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION, 40}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePerformanceQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION, 39}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_SPEC_VERSION, 38}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION, 37}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION, 36}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrivateDataFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT, VK_EXT_PRIVATE_DATA_EXTENSION_NAME, VK_EXT_PRIVATE_DATA_SPEC_VERSION, 35}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceProtectedMemoryFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0, 34}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, VK_KHR_RAY_QUERY_EXTENSION_NAME, VK_KHR_RAY_QUERY_SPEC_VERSION, 33}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION, 32}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION, 31}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRobustness2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, VK_EXT_ROBUSTNESS_2_SPEC_VERSION, 30}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION, 29}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceScalarBlockLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION, 28}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION, 27}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION, 26}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicInt64Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION, 25}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderClockFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, VK_KHR_SHADER_CLOCK_EXTENSION_NAME, VK_KHR_SHADER_CLOCK_SPEC_VERSION, 24}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION, 23}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderDrawParametersFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION, 22}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderFloat16Int8Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION, 21}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION, 20}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION, 19}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION, 18}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME, VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION, 17}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION, 16}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR, VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME, VK_KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION, 15}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShadingRateImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION, 14}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION, 13}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSynchronization2FeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, VK_KHR_SYNCHRONIZATION_2_SPEC_VERSION, 12}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION, 11}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION, 10}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTimelineSemaphoreFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION, 9}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION, 8}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION, 7}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVariablePointersFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, VK_KHR_VARIABLE_POINTERS_SPEC_VERSION, 6}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION, 5}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVulkanMemoryModelFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION, 4}; }
-template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION, 3}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice16BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, VK_KHR_16BIT_STORAGE_EXTENSION_NAME, VK_KHR_16BIT_STORAGE_SPEC_VERSION, 83}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice4444FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT, VK_EXT_4444_FORMATS_EXTENSION_NAME, VK_EXT_4444_FORMATS_SPEC_VERSION, 82}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevice8BitStorageFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, VK_KHR_8BIT_STORAGE_EXTENSION_NAME, VK_KHR_8BIT_STORAGE_SPEC_VERSION, 81}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceAccelerationStructureFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR, VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION, 80}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceASTCDecodeFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, 79}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, VK_EXT_BLEND_OPERATION_ADVANCED_SPEC_VERSION, 78}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 77}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, 76}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, DECL_AMD_COHERENT_MEMORY_EXTENSION_NAME, 0, 75}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT, VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME, VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION, 74}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION, 73}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION, 72}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION, 71}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCornerSampledImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, VK_NV_CORNER_SAMPLED_IMAGE_EXTENSION_NAME, VK_NV_CORNER_SAMPLED_IMAGE_SPEC_VERSION, 70}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCoverageReductionModeFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, VK_NV_COVERAGE_REDUCTION_MODE_EXTENSION_NAME, VK_NV_COVERAGE_REDUCTION_MODE_SPEC_VERSION, 69}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION, 68}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_IMAGE_ALIASING_SPEC_VERSION, 67}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDepthClipEnableFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_SPEC_VERSION, 66}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDescriptorIndexingFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_SPEC_VERSION, 65}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME, VK_NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION, 64}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT, VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION, 63}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceDiagnosticsConfigFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, DECL_NV_DIAGNOSTICS_CONFIG_EXTENSION_NAME, 0, 62}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExclusiveScissorFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION, 61}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION, 60}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION, 59}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION, 58}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION, 57}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION, 56}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, VK_EXT_FRAGMENT_SHADER_INTERLOCK_SPEC_VERSION, 55}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION, 54}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME, VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION, 53}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceHostQueryResetFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION, 52}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImagelessFramebufferFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION, 51}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceImageRobustnessFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION, 50}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION, 49}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV, VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME, VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION, 48}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION, 47}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceLineRasterizationFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, VK_EXT_LINE_RASTERIZATION_SPEC_VERSION, 46}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMemoryPriorityFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, VK_EXT_MEMORY_PRIORITY_SPEC_VERSION, 45}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMeshShaderFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, VK_NV_MESH_SHADER_EXTENSION_NAME, VK_NV_MESH_SHADER_SPEC_VERSION, 44}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMultiviewFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VK_KHR_MULTIVIEW_EXTENSION_NAME, VK_KHR_MULTIVIEW_SPEC_VERSION, 43}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE, VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME, VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION, 42}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePerformanceQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, VK_KHR_PERFORMANCE_QUERY_SPEC_VERSION, 41}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_SPEC_VERSION, 40}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_SPEC_VERSION, 39}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePortabilitySubsetFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION, 38}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDevicePrivateDataFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT, VK_EXT_PRIVATE_DATA_EXTENSION_NAME, VK_EXT_PRIVATE_DATA_SPEC_VERSION, 37}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceProtectedMemoryFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, DECL_PROTECTED_MEMORY_EXTENSION_NAME, 0, 36}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayQueryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR, VK_KHR_RAY_QUERY_EXTENSION_NAME, VK_KHR_RAY_QUERY_SPEC_VERSION, 35}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR, VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, VK_KHR_RAY_TRACING_PIPELINE_SPEC_VERSION, 34}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME, VK_NV_REPRESENTATIVE_FRAGMENT_TEST_SPEC_VERSION, 33}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceRobustness2FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, VK_EXT_ROBUSTNESS_2_SPEC_VERSION, 32}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, VK_KHR_SAMPLER_YCBCR_CONVERSION_SPEC_VERSION, 31}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceScalarBlockLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION, 30}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_SPEC_VERSION, 29}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, VK_EXT_SHADER_ATOMIC_FLOAT_SPEC_VERSION, 28}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderAtomicInt64Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, VK_KHR_SHADER_ATOMIC_INT64_SPEC_VERSION, 27}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderClockFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, VK_KHR_SHADER_CLOCK_EXTENSION_NAME, VK_KHR_SHADER_CLOCK_SPEC_VERSION, 26}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION, 25}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderDrawParametersFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME, VK_KHR_SHADER_DRAW_PARAMETERS_SPEC_VERSION, 24}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderFloat16Int8Features>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION, 23}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME, VK_EXT_SHADER_IMAGE_ATOMIC_INT64_SPEC_VERSION, 22}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderImageFootprintFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION, 21}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_EXTENSION_NAME, VK_INTEL_SHADER_INTEGER_FUNCTIONS_2_SPEC_VERSION, 20}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSMBuiltinsFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, VK_NV_SHADER_SM_BUILTINS_EXTENSION_NAME, VK_NV_SHADER_SM_BUILTINS_SPEC_VERSION, 19}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME, VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_SPEC_VERSION, 18}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR, VK_KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME, VK_KHR_SHADER_TERMINATE_INVOCATION_SPEC_VERSION, 17}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceShadingRateImageFeaturesNV>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME, VK_NV_SHADING_RATE_IMAGE_SPEC_VERSION, 16}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSubgroupSizeControlFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, VK_EXT_SUBGROUP_SIZE_CONTROL_SPEC_VERSION, 15}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceSynchronization2FeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, VK_KHR_SYNCHRONIZATION_2_SPEC_VERSION, 14}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME, VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION, 13}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_SPEC_VERSION, 12}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTimelineSemaphoreFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, VK_KHR_TIMELINE_SEMAPHORE_SPEC_VERSION, 11}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceTransformFeedbackFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, VK_EXT_TRANSFORM_FEEDBACK_SPEC_VERSION, 10}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION, 9}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVariablePointersFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, VK_KHR_VARIABLE_POINTERS_SPEC_VERSION, 8}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION, 7}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION, 6}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceVulkanMemoryModelFeatures>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION, 5}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION, 4}; }
+template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT, DECL_EXT_YCBCR_2_PLANE_444_FORMATS_EXTENSION_NAME, 0, 3}; }
template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME, VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION, 2}; }
template<> FeatureDesc makeFeatureDesc<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR>(void) { return FeatureDesc{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_SPEC_VERSION, 1}; }
@@ -348,6 +363,7 @@
{ createFeatureStructWrapper<VkPhysicalDeviceBufferDeviceAddressFeatures>, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>, VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceCoherentMemoryFeaturesAMD>, DECL_AMD_COHERENT_MEMORY_EXTENSION_NAME, 0 },
+ { createFeatureStructWrapper<VkPhysicalDeviceColorWriteEnableFeaturesEXT>, VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME, VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>, VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceConditionalRenderingFeaturesEXT>, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceCooperativeMatrixFeaturesNV>, VK_NV_COOPERATIVE_MATRIX_EXTENSION_NAME, VK_NV_COOPERATIVE_MATRIX_SPEC_VERSION },
@@ -362,6 +378,7 @@
{ createFeatureStructWrapper<VkPhysicalDeviceDiagnosticsConfigFeaturesNV>, DECL_NV_DIAGNOSTICS_CONFIG_EXTENSION_NAME, 0 },
{ createFeatureStructWrapper<VkPhysicalDeviceExclusiveScissorFeaturesNV>, VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME, VK_NV_SCISSOR_EXCLUSIVE_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION },
@@ -372,6 +389,7 @@
{ createFeatureStructWrapper<VkPhysicalDeviceImagelessFramebufferFeatures>, VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceImageRobustnessFeaturesEXT>, VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, VK_EXT_IMAGE_ROBUSTNESS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>, VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>, VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME, VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceLineRasterizationFeaturesEXT>, VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME, VK_EXT_LINE_RASTERIZATION_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceMemoryPriorityFeaturesEXT>, VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, VK_EXT_MEMORY_PRIORITY_SPEC_VERSION },
@@ -413,8 +431,10 @@
{ createFeatureStructWrapper<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceVariablePointersFeatures>, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, VK_KHR_VARIABLE_POINTERS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceVulkanMemoryModelFeatures>, VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, VK_KHR_VULKAN_MEMORY_MODEL_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_SPEC_VERSION },
+ { createFeatureStructWrapper<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>, DECL_EXT_YCBCR_2_PLANE_444_FORMATS_EXTENSION_NAME, 0 },
{ createFeatureStructWrapper<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>, VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME, VK_EXT_YCBCR_IMAGE_ARRAYS_SPEC_VERSION },
{ createFeatureStructWrapper<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR>, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_EXTENSION_NAME, VK_KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY_SPEC_VERSION },
};
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl
index d8492ba..0496a5a 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDecl.inl
@@ -10,6 +10,7 @@
const vk::VkPhysicalDeviceBufferDeviceAddressFeatures& getBufferDeviceAddressFeatures (void) const;
const vk::VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& getBufferDeviceAddressFeaturesEXT (void) const;
const vk::VkPhysicalDeviceCoherentMemoryFeaturesAMD& getCoherentMemoryFeaturesAMD (void) const;
+const vk::VkPhysicalDeviceColorWriteEnableFeaturesEXT& getColorWriteEnableFeaturesEXT (void) const;
const vk::VkPhysicalDeviceComputeShaderDerivativesFeaturesNV& getComputeShaderDerivativesFeatures (void) const;
const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& getConditionalRenderingFeaturesEXT (void) const;
const vk::VkPhysicalDeviceCooperativeMatrixFeaturesNV& getCooperativeMatrixFeatures (void) const;
@@ -24,6 +25,7 @@
const vk::VkPhysicalDeviceDiagnosticsConfigFeaturesNV& getDiagnosticsConfigFeatures (void) const;
const vk::VkPhysicalDeviceExclusiveScissorFeaturesNV& getExclusiveScissorFeatures (void) const;
const vk::VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& getExtendedDynamicStateFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceExtendedDynamicState2FeaturesEXT& getExtendedDynamicState2FeaturesEXT (void) const;
const vk::VkPhysicalDeviceFragmentDensityMapFeaturesEXT& getFragmentDensityMapFeaturesEXT (void) const;
const vk::VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& getFragmentDensityMap2FeaturesEXT (void) const;
const vk::VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& getFragmentShaderBarycentricFeatures (void) const;
@@ -34,6 +36,7 @@
const vk::VkPhysicalDeviceImagelessFramebufferFeatures& getImagelessFramebufferFeatures (void) const;
const vk::VkPhysicalDeviceImageRobustnessFeaturesEXT& getImageRobustnessFeaturesEXT (void) const;
const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT& getIndexTypeUint8FeaturesEXT (void) const;
+const vk::VkPhysicalDeviceInheritedViewportScissorFeaturesNV& getInheritedViewportScissorFeatures (void) const;
const vk::VkPhysicalDeviceInlineUniformBlockFeaturesEXT& getInlineUniformBlockFeaturesEXT (void) const;
const vk::VkPhysicalDeviceLineRasterizationFeaturesEXT& getLineRasterizationFeaturesEXT (void) const;
const vk::VkPhysicalDeviceMemoryPriorityFeaturesEXT& getMemoryPriorityFeaturesEXT (void) const;
@@ -75,7 +78,9 @@
const vk::VkPhysicalDeviceUniformBufferStandardLayoutFeatures& getUniformBufferStandardLayoutFeatures (void) const;
const vk::VkPhysicalDeviceVariablePointersFeatures& getVariablePointersFeatures (void) const;
const vk::VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& getVertexAttributeDivisorFeaturesEXT (void) const;
+const vk::VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT& getVertexInputDynamicStateFeaturesEXT (void) const;
const vk::VkPhysicalDeviceVulkanMemoryModelFeatures& getVulkanMemoryModelFeatures (void) const;
const vk::VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR& getWorkgroupMemoryExplicitLayoutFeatures (void) const;
+const vk::VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT& getYcbcr2Plane444FormatsFeaturesEXT (void) const;
const vk::VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& getYcbcrImageArraysFeaturesEXT (void) const;
const vk::VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR& getZeroInitializeWorkgroupMemoryFeatures (void) const;
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl
index fe49ef6..23de5a4 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForContextDefs.inl
@@ -10,6 +10,7 @@
const vk::VkPhysicalDeviceBufferDeviceAddressFeatures& Context::getBufferDeviceAddressFeatures (void) const { return m_device->getBufferDeviceAddressFeatures(); }
const vk::VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& Context::getBufferDeviceAddressFeaturesEXT (void) const { return m_device->getBufferDeviceAddressFeaturesEXT(); }
const vk::VkPhysicalDeviceCoherentMemoryFeaturesAMD& Context::getCoherentMemoryFeaturesAMD (void) const { return m_device->getCoherentMemoryFeaturesAMD(); }
+const vk::VkPhysicalDeviceColorWriteEnableFeaturesEXT& Context::getColorWriteEnableFeaturesEXT (void) const { return m_device->getColorWriteEnableFeaturesEXT(); }
const vk::VkPhysicalDeviceComputeShaderDerivativesFeaturesNV& Context::getComputeShaderDerivativesFeatures (void) const { return m_device->getComputeShaderDerivativesFeatures(); }
const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& Context::getConditionalRenderingFeaturesEXT (void) const { return m_device->getConditionalRenderingFeaturesEXT(); }
const vk::VkPhysicalDeviceCooperativeMatrixFeaturesNV& Context::getCooperativeMatrixFeatures (void) const { return m_device->getCooperativeMatrixFeatures(); }
@@ -24,6 +25,7 @@
const vk::VkPhysicalDeviceDiagnosticsConfigFeaturesNV& Context::getDiagnosticsConfigFeatures (void) const { return m_device->getDiagnosticsConfigFeatures(); }
const vk::VkPhysicalDeviceExclusiveScissorFeaturesNV& Context::getExclusiveScissorFeatures (void) const { return m_device->getExclusiveScissorFeatures(); }
const vk::VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& Context::getExtendedDynamicStateFeaturesEXT (void) const { return m_device->getExtendedDynamicStateFeaturesEXT(); }
+const vk::VkPhysicalDeviceExtendedDynamicState2FeaturesEXT& Context::getExtendedDynamicState2FeaturesEXT (void) const { return m_device->getExtendedDynamicState2FeaturesEXT(); }
const vk::VkPhysicalDeviceFragmentDensityMapFeaturesEXT& Context::getFragmentDensityMapFeaturesEXT (void) const { return m_device->getFragmentDensityMapFeaturesEXT(); }
const vk::VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& Context::getFragmentDensityMap2FeaturesEXT (void) const { return m_device->getFragmentDensityMap2FeaturesEXT(); }
const vk::VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& Context::getFragmentShaderBarycentricFeatures (void) const { return m_device->getFragmentShaderBarycentricFeatures(); }
@@ -34,6 +36,7 @@
const vk::VkPhysicalDeviceImagelessFramebufferFeatures& Context::getImagelessFramebufferFeatures (void) const { return m_device->getImagelessFramebufferFeatures(); }
const vk::VkPhysicalDeviceImageRobustnessFeaturesEXT& Context::getImageRobustnessFeaturesEXT (void) const { return m_device->getImageRobustnessFeaturesEXT(); }
const vk::VkPhysicalDeviceIndexTypeUint8FeaturesEXT& Context::getIndexTypeUint8FeaturesEXT (void) const { return m_device->getIndexTypeUint8FeaturesEXT(); }
+const vk::VkPhysicalDeviceInheritedViewportScissorFeaturesNV& Context::getInheritedViewportScissorFeatures (void) const { return m_device->getInheritedViewportScissorFeatures(); }
const vk::VkPhysicalDeviceInlineUniformBlockFeaturesEXT& Context::getInlineUniformBlockFeaturesEXT (void) const { return m_device->getInlineUniformBlockFeaturesEXT(); }
const vk::VkPhysicalDeviceLineRasterizationFeaturesEXT& Context::getLineRasterizationFeaturesEXT (void) const { return m_device->getLineRasterizationFeaturesEXT(); }
const vk::VkPhysicalDeviceMemoryPriorityFeaturesEXT& Context::getMemoryPriorityFeaturesEXT (void) const { return m_device->getMemoryPriorityFeaturesEXT(); }
@@ -75,7 +78,9 @@
const vk::VkPhysicalDeviceUniformBufferStandardLayoutFeatures& Context::getUniformBufferStandardLayoutFeatures (void) const { return m_device->getUniformBufferStandardLayoutFeatures(); }
const vk::VkPhysicalDeviceVariablePointersFeatures& Context::getVariablePointersFeatures (void) const { return m_device->getVariablePointersFeatures(); }
const vk::VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& Context::getVertexAttributeDivisorFeaturesEXT (void) const { return m_device->getVertexAttributeDivisorFeaturesEXT(); }
+const vk::VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT& Context::getVertexInputDynamicStateFeaturesEXT (void) const { return m_device->getVertexInputDynamicStateFeaturesEXT(); }
const vk::VkPhysicalDeviceVulkanMemoryModelFeatures& Context::getVulkanMemoryModelFeatures (void) const { return m_device->getVulkanMemoryModelFeatures(); }
const vk::VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR& Context::getWorkgroupMemoryExplicitLayoutFeatures (void) const { return m_device->getWorkgroupMemoryExplicitLayoutFeatures(); }
+const vk::VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT& Context::getYcbcr2Plane444FormatsFeaturesEXT (void) const { return m_device->getYcbcr2Plane444FormatsFeaturesEXT(); }
const vk::VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& Context::getYcbcrImageArraysFeaturesEXT (void) const { return m_device->getYcbcrImageArraysFeaturesEXT(); }
const vk::VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR& Context::getZeroInitializeWorkgroupMemoryFeatures (void) const { return m_device->getZeroInitializeWorkgroupMemoryFeatures(); }
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl
index f544c32..9a05f26 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFeaturesForDefaultDeviceDefs.inl
@@ -10,6 +10,7 @@
const VkPhysicalDeviceBufferDeviceAddressFeatures& getBufferDeviceAddressFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceBufferDeviceAddressFeatures>(); }
const VkPhysicalDeviceBufferDeviceAddressFeaturesEXT& getBufferDeviceAddressFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(); }
const VkPhysicalDeviceCoherentMemoryFeaturesAMD& getCoherentMemoryFeaturesAMD (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceCoherentMemoryFeaturesAMD>(); }
+const VkPhysicalDeviceColorWriteEnableFeaturesEXT& getColorWriteEnableFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceColorWriteEnableFeaturesEXT>(); }
const VkPhysicalDeviceComputeShaderDerivativesFeaturesNV& getComputeShaderDerivativesFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceComputeShaderDerivativesFeaturesNV>(); }
const VkPhysicalDeviceConditionalRenderingFeaturesEXT& getConditionalRenderingFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceConditionalRenderingFeaturesEXT>(); }
const VkPhysicalDeviceCooperativeMatrixFeaturesNV& getCooperativeMatrixFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(); }
@@ -24,6 +25,7 @@
const VkPhysicalDeviceDiagnosticsConfigFeaturesNV& getDiagnosticsConfigFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceDiagnosticsConfigFeaturesNV>(); }
const VkPhysicalDeviceExclusiveScissorFeaturesNV& getExclusiveScissorFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceExclusiveScissorFeaturesNV>(); }
const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& getExtendedDynamicStateFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(); }
+const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT& getExtendedDynamicState2FeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>(); }
const VkPhysicalDeviceFragmentDensityMapFeaturesEXT& getFragmentDensityMapFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(); }
const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& getFragmentDensityMap2FeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(); }
const VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV& getFragmentShaderBarycentricFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV>(); }
@@ -34,6 +36,7 @@
const VkPhysicalDeviceImagelessFramebufferFeatures& getImagelessFramebufferFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceImagelessFramebufferFeatures>(); }
const VkPhysicalDeviceImageRobustnessFeaturesEXT& getImageRobustnessFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceImageRobustnessFeaturesEXT>(); }
const VkPhysicalDeviceIndexTypeUint8FeaturesEXT& getIndexTypeUint8FeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(); }
+const VkPhysicalDeviceInheritedViewportScissorFeaturesNV& getInheritedViewportScissorFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceInheritedViewportScissorFeaturesNV>(); }
const VkPhysicalDeviceInlineUniformBlockFeaturesEXT& getInlineUniformBlockFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(); }
const VkPhysicalDeviceLineRasterizationFeaturesEXT& getLineRasterizationFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceLineRasterizationFeaturesEXT>(); }
const VkPhysicalDeviceMemoryPriorityFeaturesEXT& getMemoryPriorityFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceMemoryPriorityFeaturesEXT>(); }
@@ -75,7 +78,9 @@
const VkPhysicalDeviceUniformBufferStandardLayoutFeatures& getUniformBufferStandardLayoutFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceUniformBufferStandardLayoutFeatures>(); }
const VkPhysicalDeviceVariablePointersFeatures& getVariablePointersFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVariablePointersFeatures>(); }
const VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT& getVertexAttributeDivisorFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(); }
+const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT& getVertexInputDynamicStateFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>(); }
const VkPhysicalDeviceVulkanMemoryModelFeatures& getVulkanMemoryModelFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceVulkanMemoryModelFeatures>(); }
const VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR& getWorkgroupMemoryExplicitLayoutFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR>(); }
+const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT& getYcbcr2Plane444FormatsFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>(); }
const VkPhysicalDeviceYcbcrImageArraysFeaturesEXT& getYcbcrImageArraysFeaturesEXT (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceYcbcrImageArraysFeaturesEXT>(); }
const VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR& getZeroInitializeWorkgroupMemoryFeatures (void) const { return m_deviceFeatures.getFeatureType<VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR>(); }
diff --git a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
index 4a8cca4..c48da3e 100644
--- a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
@@ -295,6 +295,13 @@
SetPrivateDataEXTFunc setPrivateDataEXT;
GetPrivateDataEXTFunc getPrivateDataEXT;
CmdSetFragmentShadingRateEnumNVFunc cmdSetFragmentShadingRateEnumNV;
+CmdSetVertexInputEXTFunc cmdSetVertexInputEXT;
+CmdSetPatchControlPointsEXTFunc cmdSetPatchControlPointsEXT;
+CmdSetRasterizerDiscardEnableEXTFunc cmdSetRasterizerDiscardEnableEXT;
+CmdSetDepthBiasEnableEXTFunc cmdSetDepthBiasEnableEXT;
+CmdSetLogicOpEXTFunc cmdSetLogicOpEXT;
+CmdSetPrimitiveRestartEnableEXTFunc cmdSetPrimitiveRestartEnableEXT;
+CmdSetColorWriteEnableEXTFunc cmdSetColorWriteEnableEXT;
CreateAccelerationStructureKHRFunc createAccelerationStructureKHR;
DestroyAccelerationStructureKHRFunc destroyAccelerationStructureKHR;
CmdBuildAccelerationStructuresKHRFunc cmdBuildAccelerationStructuresKHR;
@@ -319,6 +326,22 @@
CmdSetRayTracingPipelineStackSizeKHRFunc cmdSetRayTracingPipelineStackSizeKHR;
GetAndroidHardwareBufferPropertiesANDROIDFunc getAndroidHardwareBufferPropertiesANDROID;
GetMemoryAndroidHardwareBufferANDROIDFunc getMemoryAndroidHardwareBufferANDROID;
+CreateVideoSessionKHRFunc createVideoSessionKHR;
+DestroyVideoSessionKHRFunc destroyVideoSessionKHR;
+GetVideoSessionMemoryRequirementsKHRFunc getVideoSessionMemoryRequirementsKHR;
+BindVideoSessionMemoryKHRFunc bindVideoSessionMemoryKHR;
+CreateVideoSessionParametersKHRFunc createVideoSessionParametersKHR;
+UpdateVideoSessionParametersKHRFunc updateVideoSessionParametersKHR;
+DestroyVideoSessionParametersKHRFunc destroyVideoSessionParametersKHR;
+CmdBeginVideoCodingKHRFunc cmdBeginVideoCodingKHR;
+CmdEndVideoCodingKHRFunc cmdEndVideoCodingKHR;
+CmdControlVideoCodingKHRFunc cmdControlVideoCodingKHR;
+CmdDecodeVideoKHRFunc cmdDecodeVideoKHR;
+CmdEncodeVideoKHRFunc cmdEncodeVideoKHR;
+GetMemoryZirconHandleFUCHSIAFunc getMemoryZirconHandleFUCHSIA;
+GetMemoryZirconHandlePropertiesFUCHSIAFunc getMemoryZirconHandlePropertiesFUCHSIA;
+ImportSemaphoreZirconHandleFUCHSIAFunc importSemaphoreZirconHandleFUCHSIA;
+GetSemaphoreZirconHandleFUCHSIAFunc getSemaphoreZirconHandleFUCHSIA;
GetMemoryWin32HandleKHRFunc getMemoryWin32HandleKHR;
GetMemoryWin32HandlePropertiesKHRFunc getMemoryWin32HandlePropertiesKHR;
ImportSemaphoreWin32HandleKHRFunc importSemaphoreWin32HandleKHR;
diff --git a/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl b/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl
index 0cbf152..e201baf 100644
--- a/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl
+++ b/external/vulkancts/framework/vulkan/vkExtensionFunctions.inl
@@ -785,6 +785,10 @@
{
return;
}
+ if (extName == "VK_NV_inherited_viewport_scissor")
+ {
+ return;
+ }
if (extName == "VK_EXT_texel_buffer_alignment")
{
return;
@@ -825,6 +829,10 @@
{
return;
}
+ if (extName == "VK_EXT_ycbcr_2plane_444_formats")
+ {
+ return;
+ }
if (extName == "VK_EXT_fragment_density_map2")
{
return;
@@ -851,6 +859,18 @@
{
return;
}
+ if (extName == "VK_EXT_vertex_input_dynamic_state")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_extended_dynamic_state2")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_color_write_enable")
+ {
+ return;
+ }
if (extName == "VK_KHR_acceleration_structure")
{
return;
@@ -872,15 +892,49 @@
{
return;
}
+ if (extName == "VK_KHR_video_queue")
+ {
+ functions.push_back("vkGetPhysicalDeviceVideoCapabilitiesKHR");
+ functions.push_back("vkGetPhysicalDeviceVideoFormatPropertiesKHR");
+ return;
+ }
+ if (extName == "VK_KHR_video_decode_queue")
+ {
+ return;
+ }
if (extName == "VK_KHR_portability_subset")
{
return;
}
+ if (extName == "VK_KHR_video_encode_queue")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_video_encode_h264")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_video_decode_h264")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_video_decode_h265")
+ {
+ return;
+ }
if (extName == "VK_FUCHSIA_imagepipe_surface")
{
functions.push_back("vkCreateImagePipeSurfaceFUCHSIA");
return;
}
+ if (extName == "VK_FUCHSIA_external_memory")
+ {
+ return;
+ }
+ if (extName == "VK_FUCHSIA_external_semaphore")
+ {
+ return;
+ }
if (extName == "VK_GGP_stream_descriptor_surface")
{
functions.push_back("vkCreateStreamDescriptorSurfaceGGP");
@@ -1873,6 +1927,10 @@
functions.push_back("vkDestroyIndirectCommandsLayoutNV");
return;
}
+ if (extName == "VK_NV_inherited_viewport_scissor")
+ {
+ return;
+ }
if (extName == "VK_EXT_texel_buffer_alignment")
{
return;
@@ -1918,6 +1976,10 @@
functions.push_back("vkCmdSetFragmentShadingRateEnumNV");
return;
}
+ if (extName == "VK_EXT_ycbcr_2plane_444_formats")
+ {
+ return;
+ }
if (extName == "VK_EXT_fragment_density_map2")
{
return;
@@ -1942,6 +2004,25 @@
{
return;
}
+ if (extName == "VK_EXT_vertex_input_dynamic_state")
+ {
+ functions.push_back("vkCmdSetVertexInputEXT");
+ return;
+ }
+ if (extName == "VK_EXT_extended_dynamic_state2")
+ {
+ functions.push_back("vkCmdSetPatchControlPointsEXT");
+ functions.push_back("vkCmdSetRasterizerDiscardEnableEXT");
+ functions.push_back("vkCmdSetDepthBiasEnableEXT");
+ functions.push_back("vkCmdSetLogicOpEXT");
+ functions.push_back("vkCmdSetPrimitiveRestartEnableEXT");
+ return;
+ }
+ if (extName == "VK_EXT_color_write_enable")
+ {
+ functions.push_back("vkCmdSetColorWriteEnableEXT");
+ return;
+ }
if (extName == "VK_KHR_acceleration_structure")
{
functions.push_back("vkCreateAccelerationStructureKHR");
@@ -1986,14 +2067,62 @@
functions.push_back("vkGetMemoryAndroidHardwareBufferANDROID");
return;
}
+ if (extName == "VK_KHR_video_queue")
+ {
+ functions.push_back("vkCreateVideoSessionKHR");
+ functions.push_back("vkDestroyVideoSessionKHR");
+ functions.push_back("vkGetVideoSessionMemoryRequirementsKHR");
+ functions.push_back("vkBindVideoSessionMemoryKHR");
+ functions.push_back("vkCreateVideoSessionParametersKHR");
+ functions.push_back("vkUpdateVideoSessionParametersKHR");
+ functions.push_back("vkDestroyVideoSessionParametersKHR");
+ functions.push_back("vkCmdBeginVideoCodingKHR");
+ functions.push_back("vkCmdEndVideoCodingKHR");
+ functions.push_back("vkCmdControlVideoCodingKHR");
+ return;
+ }
+ if (extName == "VK_KHR_video_decode_queue")
+ {
+ functions.push_back("vkCmdDecodeVideoKHR");
+ return;
+ }
if (extName == "VK_KHR_portability_subset")
{
return;
}
+ if (extName == "VK_KHR_video_encode_queue")
+ {
+ functions.push_back("vkCmdEncodeVideoKHR");
+ return;
+ }
+ if (extName == "VK_EXT_video_encode_h264")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_video_decode_h264")
+ {
+ return;
+ }
+ if (extName == "VK_EXT_video_decode_h265")
+ {
+ return;
+ }
if (extName == "VK_FUCHSIA_imagepipe_surface")
{
return;
}
+ if (extName == "VK_FUCHSIA_external_memory")
+ {
+ functions.push_back("vkGetMemoryZirconHandleFUCHSIA");
+ functions.push_back("vkGetMemoryZirconHandlePropertiesFUCHSIA");
+ return;
+ }
+ if (extName == "VK_FUCHSIA_external_semaphore")
+ {
+ functions.push_back("vkImportSemaphoreZirconHandleFUCHSIA");
+ functions.push_back("vkGetSemaphoreZirconHandleFUCHSIA");
+ return;
+ }
if (extName == "VK_GGP_stream_descriptor_surface")
{
return;
@@ -2103,6 +2232,7 @@
"VK_EXT_headless_surface",
"VK_NV_acquire_winrt_display",
"VK_KHR_android_surface",
+ "VK_KHR_video_queue",
"VK_FUCHSIA_imagepipe_surface",
"VK_GGP_stream_descriptor_surface",
"VK_MVK_ios_surface",
@@ -2172,9 +2302,16 @@
"VK_NV_device_generated_commands",
"VK_EXT_private_data",
"VK_NV_fragment_shading_rate_enums",
+ "VK_EXT_vertex_input_dynamic_state",
+ "VK_EXT_extended_dynamic_state2",
+ "VK_EXT_color_write_enable",
"VK_KHR_acceleration_structure",
"VK_KHR_ray_tracing_pipeline",
"VK_ANDROID_external_memory_android_hardware_buffer",
+ "VK_KHR_video_decode_queue",
+ "VK_KHR_video_encode_queue",
+ "VK_FUCHSIA_external_memory",
+ "VK_FUCHSIA_external_semaphore",
"VK_KHR_external_memory_win32",
"VK_KHR_external_semaphore_win32",
"VK_KHR_external_fence_win32",
diff --git a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
index bb3d9ad..e85e72d 100644
--- a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
@@ -401,6 +401,13 @@
typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetFragmentShadingRateEnumNVFunc) (VkCommandBuffer commandBuffer, VkFragmentShadingRateNV shadingRate, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* AcquireWinrtDisplayNVFunc) (VkPhysicalDevice physicalDevice, VkDisplayKHR display);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetWinrtDisplayNVFunc) (VkPhysicalDevice physicalDevice, deUint32 deviceRelativeId, VkDisplayKHR* pDisplay);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetVertexInputEXTFunc) (VkCommandBuffer commandBuffer, deUint32 vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, deUint32 vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetPatchControlPointsEXTFunc) (VkCommandBuffer commandBuffer, deUint32 patchControlPoints);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetRasterizerDiscardEnableEXTFunc) (VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetDepthBiasEnableEXTFunc) (VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetLogicOpEXTFunc) (VkCommandBuffer commandBuffer, VkLogicOp logicOp);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetPrimitiveRestartEnableEXTFunc) (VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdSetColorWriteEnableEXTFunc) (VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkBool32* pColorWriteEnables);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateAccelerationStructureKHRFunc) (VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure);
typedef VKAPI_ATTR void (VKAPI_CALL* DestroyAccelerationStructureKHRFunc) (VkDevice device, VkAccelerationStructureKHR accelerationStructure, const VkAllocationCallbacks* pAllocator);
typedef VKAPI_ATTR void (VKAPI_CALL* CmdBuildAccelerationStructuresKHRFunc) (VkCommandBuffer commandBuffer, deUint32 infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);
@@ -426,7 +433,25 @@
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateAndroidSurfaceKHRFunc) (VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetAndroidHardwareBufferPropertiesANDROIDFunc) (VkDevice device, const struct pt::AndroidHardwareBufferPtr buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetMemoryAndroidHardwareBufferANDROIDFunc) (VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct pt::AndroidHardwareBufferPtr* pBuffer);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceVideoCapabilitiesKHRFunc) (VkPhysicalDevice physicalDevice, const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceVideoFormatPropertiesKHRFunc) (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, deUint32* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateVideoSessionKHRFunc) (VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession);
+typedef VKAPI_ATTR void (VKAPI_CALL* DestroyVideoSessionKHRFunc) (VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetVideoSessionMemoryRequirementsKHRFunc) (VkDevice device, VkVideoSessionKHR videoSession, deUint32* pVideoSessionMemoryRequirementsCount, VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* BindVideoSessionMemoryKHRFunc) (VkDevice device, VkVideoSessionKHR videoSession, deUint32 videoSessionBindMemoryCount, const VkVideoBindMemoryKHR* pVideoSessionBindMemories);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateVideoSessionParametersKHRFunc) (VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* UpdateVideoSessionParametersKHRFunc) (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* DestroyVideoSessionParametersKHRFunc) (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdBeginVideoCodingKHRFunc) (VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdEndVideoCodingKHRFunc) (VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdControlVideoCodingKHRFunc) (VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdDecodeVideoKHRFunc) (VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pFrameInfo);
+typedef VKAPI_ATTR void (VKAPI_CALL* CmdEncodeVideoKHRFunc) (VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateImagePipeSurfaceFUCHSIAFunc) (VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetMemoryZirconHandleFUCHSIAFunc) (VkDevice device, const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetMemoryZirconHandlePropertiesFUCHSIAFunc) (VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, pt::zx_handle_t zirconHandle, VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* ImportSemaphoreZirconHandleFUCHSIAFunc) (VkDevice device, const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo);
+typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetSemaphoreZirconHandleFUCHSIAFunc) (VkDevice device, const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateStreamDescriptorSurfaceGGPFunc) (VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateIOSSurfaceMVKFunc) (VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateMacOSSurfaceMVKFunc) (VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
diff --git a/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl b/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
index 119e5ed..1af5bc3 100644
--- a/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkGetStructureTypeImpl.inl
@@ -1976,6 +1976,16 @@
return VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV;
}
+template<> VkStructureType getStructureType<VkPhysicalDeviceInheritedViewportScissorFeaturesNV> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV;
+}
+
+template<> VkStructureType getStructureType<VkCommandBufferInheritanceViewportScissorInfoNV> (void)
+{
+ return VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV;
+}
+
template<> VkStructureType getStructureType<VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT;
@@ -2081,6 +2091,11 @@
return VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV;
}
+template<> VkStructureType getStructureType<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT;
+}
+
template<> VkStructureType getStructureType<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT;
@@ -2116,6 +2131,36 @@
return VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE;
}
+template<> VkStructureType getStructureType<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVertexInputBindingDescription2EXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVertexInputAttributeDescription2EXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceColorWriteEnableFeaturesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkPipelineColorWriteCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT;
+}
+
template<> VkStructureType getStructureType<VkAccelerationStructureGeometryTrianglesDataKHR> (void)
{
return VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;
@@ -2256,6 +2301,91 @@
return VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
}
+template<> VkStructureType getStructureType<VkVideoQueueFamilyProperties2KHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoProfileKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoProfilesKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoCapabilitiesKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
+}
+
+template<> VkStructureType getStructureType<VkPhysicalDeviceVideoFormatInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoFormatPropertiesKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoPictureResourceKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoReferenceSlotKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoGetMemoryPropertiesKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoBindMemoryKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoSessionCreateInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoSessionParametersCreateInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoSessionParametersUpdateInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoBeginCodingInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoEndCodingInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoCodingControlInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR;
+}
+
template<> VkStructureType getStructureType<VkPhysicalDevicePortabilitySubsetFeaturesKHR> (void)
{
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR;
@@ -2266,11 +2396,166 @@
return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR;
}
+template<> VkStructureType getStructureType<VkVideoEncodeInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeRateControlInfoKHR> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264CapabilitiesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264SessionCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264SessionParametersAddInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264SessionParametersCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264DpbSlotInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264NaluSliceEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264VclFrameInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264EmitPictureParametersEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoEncodeH264ProfileEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264ProfileEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264CapabilitiesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264SessionCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264SessionParametersAddInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264SessionParametersCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264PictureInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264MvcEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH264DpbSlotInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH265ProfileEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH265CapabilitiesEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH265SessionCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH265SessionParametersAddInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH265SessionParametersCreateInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH265PictureInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT;
+}
+
+template<> VkStructureType getStructureType<VkVideoDecodeH265DpbSlotInfoEXT> (void)
+{
+ return VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT;
+}
+
template<> VkStructureType getStructureType<VkImagePipeSurfaceCreateInfoFUCHSIA> (void)
{
return VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA;
}
+template<> VkStructureType getStructureType<VkImportMemoryZirconHandleInfoFUCHSIA> (void)
+{
+ return VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA;
+}
+
+template<> VkStructureType getStructureType<VkMemoryZirconHandlePropertiesFUCHSIA> (void)
+{
+ return VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA;
+}
+
+template<> VkStructureType getStructureType<VkMemoryGetZirconHandleInfoFUCHSIA> (void)
+{
+ return VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA;
+}
+
+template<> VkStructureType getStructureType<VkImportSemaphoreZirconHandleInfoFUCHSIA> (void)
+{
+ return VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA;
+}
+
+template<> VkStructureType getStructureType<VkSemaphoreGetZirconHandleInfoFUCHSIA> (void)
+{
+ return VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA;
+}
+
template<> VkStructureType getStructureType<VkStreamDescriptorSurfaceCreateInfoGGP> (void)
{
return VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP;
diff --git a/external/vulkancts/framework/vulkan/vkHandleType.inl b/external/vulkancts/framework/vulkan/vkHandleType.inl
index 755dbc4..b45d6c6 100644
--- a/external/vulkancts/framework/vulkan/vkHandleType.inl
+++ b/external/vulkancts/framework/vulkan/vkHandleType.inl
@@ -43,8 +43,10 @@
HANDLE_TYPE_INDIRECT_COMMANDS_LAYOUT_NV,
HANDLE_TYPE_PRIVATE_DATA_SLOT_EXT,
HANDLE_TYPE_ACCELERATION_STRUCTURE_KHR,
+ HANDLE_TYPE_VIDEO_SESSION_KHR,
+ HANDLE_TYPE_VIDEO_SESSION_PARAMETERS_KHR,
HANDLE_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = HANDLE_TYPE_SAMPLER_YCBCR_CONVERSION,
HANDLE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = HANDLE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE,
- HANDLE_TYPE_LAST = HANDLE_TYPE_ACCELERATION_STRUCTURE_KHR + 1
+ HANDLE_TYPE_LAST = HANDLE_TYPE_VIDEO_SESSION_PARAMETERS_KHR + 1
};
diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.cpp b/external/vulkancts/framework/vulkan/vkImageUtil.cpp
index 89b3e0e..8895f1b 100644
--- a/external/vulkancts/framework/vulkan/vkImageUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkImageUtil.cpp
@@ -203,40 +203,44 @@
{
switch (format)
{
- case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
- case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
- case VK_FORMAT_R10X6_UNORM_PACK16_KHR:
- case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:
- case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR:
- case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
- case VK_FORMAT_R12X4_UNORM_PACK16_KHR:
- case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR:
- case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR:
- case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
- case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
- case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
+ case VK_FORMAT_G8B8G8R8_422_UNORM:
+ case VK_FORMAT_B8G8R8G8_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
+ case VK_FORMAT_R10X6_UNORM_PACK16:
+ case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
+ case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
+ case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
+ case VK_FORMAT_R12X4_UNORM_PACK16:
+ case VK_FORMAT_R12X4G12X4_UNORM_2PACK16:
+ case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
+ case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
+ case VK_FORMAT_G16B16G16R16_422_UNORM:
+ case VK_FORMAT_B16G16R16G16_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT:
return true;
default:
@@ -244,18 +248,33 @@
}
}
+bool isYCbCrExtensionFormat (VkFormat format)
+{
+ switch (format)
+ {
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
bool isYCbCr420Format (VkFormat format)
{
switch (format)
{
- case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
return true;
default:
@@ -267,22 +286,22 @@
{
switch (format)
{
- case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
- case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
- case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
- case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
+ case VK_FORMAT_G8B8G8R8_422_UNORM:
+ case VK_FORMAT_B8G8R8G8_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
+ case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G16B16G16R16_422_UNORM:
+ case VK_FORMAT_B16G16R16G16_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
return true;
default:
@@ -301,16 +320,105 @@
const deUint8 unorm = (deUint8)tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
+ if (format >= VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT && format <= VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT)
+ {
+ static const PlanarFormatDescription s_formatInfo[] =
+ {
+ // VK_FORMAT_G8_B8R8_2PLANE_444_UNORM
+ {
+ 2, // planes
+ chanR|chanG|chanB,
+ 1,1,
+ {
+ // Size WDiv HDiv planeCompatibleFormat
+ { 1, 1, 1, VK_FORMAT_R8_UNORM },
+ { 2, 1, 1, VK_FORMAT_R8G8_UNORM },
+ { 0, 0, 0, VK_FORMAT_UNDEFINED },
+ },
+ {
+ // Plane Type Offs Size Stride
+ { 1, unorm, 8, 8, 2 }, // R
+ { 0, unorm, 0, 8, 1 }, // G
+ { 1, unorm, 0, 8, 2 }, // B
+ { 0, 0, 0, 0, 0 }
+ }
+ },
+ // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT
+ {
+ 2, // planes
+ chanR|chanG|chanB,
+ 1,1,
+ {
+ // Size WDiv HDiv planeCompatibleFormat
+ { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
+ { 4, 1, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 },
+ { 0, 0, 0, VK_FORMAT_UNDEFINED },
+ },
+ {
+ // Plane Type Offs Size Stride
+ { 1, unorm, 22, 10, 4 }, // R
+ { 0, unorm, 6, 10, 2 }, // G
+ { 1, unorm, 6, 10, 4 }, // B
+ { 0, 0, 0, 0, 0 }
+ }
+ },
+ // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT
+ {
+ 2, // planes
+ chanR|chanG|chanB,
+ 1,1,
+ {
+ // Size WDiv HDiv planeCompatibleFormat
+ { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
+ { 4, 1, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 },
+ { 0, 0, 0, VK_FORMAT_UNDEFINED },
+ },
+ {
+ // Plane Type Offs Size Stride
+ { 1, unorm, 20, 12, 4 }, // R
+ { 0, unorm, 4, 12, 2 }, // G
+ { 1, unorm, 4, 12, 4 }, // B
+ { 0, 0, 0, 0, 0 }
+ }
+ },
+ // VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT
+ {
+ 2, // planes
+ chanR|chanG|chanB,
+ 1,1,
+ {
+ // Size WDiv HDiv planeCompatibleFormat
+ { 2, 1, 1, VK_FORMAT_R16_UNORM },
+ { 4, 1, 1, VK_FORMAT_R16G16_UNORM },
+ { 0, 0, 0, VK_FORMAT_UNDEFINED },
+ },
+ {
+ // Plane Type Offs Size Stride
+ { 1, unorm, 16, 16, 4 }, // R
+ { 0, unorm, 0, 16, 2 }, // G
+ { 1, unorm, 0, 16, 4 }, // B
+ { 0, 0, 0, 0, 0 }
+ }
+ },
+ };
+
+ const size_t offset = (size_t)VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT;
+
+ DE_ASSERT(de::inBounds<size_t>((size_t)format, offset, offset+(size_t)DE_LENGTH_OF_ARRAY(s_formatInfo)));
+
+ return s_formatInfo[(size_t)format-offset];
+ }
+
static const PlanarFormatDescription s_formatInfo[] =
{
- // VK_FORMAT_G8B8G8R8_422_UNORM_KHR
+ // VK_FORMAT_G8B8G8R8_422_UNORM
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 4, 1, 1, VK_FORMAT_G8B8G8R8_422_UNORM_KHR },
+ { 4, 1, 1, VK_FORMAT_G8B8G8R8_422_UNORM },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -322,14 +430,14 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_B8G8R8G8_422_UNORM_KHR
+ // VK_FORMAT_B8G8R8G8_422_UNORM
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 4, 1, 1, VK_FORMAT_B8G8R8G8_422_UNORM_KHR },
+ { 4, 1, 1, VK_FORMAT_B8G8R8G8_422_UNORM },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -341,7 +449,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR
+ // VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM
{
3, // planes
chanR|chanG|chanB,
@@ -360,7 +468,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR
+ // VK_FORMAT_G8_B8R8_2PLANE_420_UNORM
{
2, // planes
chanR|chanG|chanB,
@@ -379,7 +487,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR
+ // VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM
{
3, // planes
chanR|chanG|chanB,
@@ -398,7 +506,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR
+ // VK_FORMAT_G8_B8R8_2PLANE_422_UNORM
{
2, // planes
chanR|chanG|chanB,
@@ -417,7 +525,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR
+ // VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM
{
3, // planes
chanR|chanG|chanB,
@@ -436,14 +544,14 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_R10X6_UNORM_PACK16_KHR
+ // VK_FORMAT_R10X6_UNORM_PACK16
{
1, // planes
chanR,
1,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16_KHR },
+ { 2, 1, 1, VK_FORMAT_R10X6_UNORM_PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -455,14 +563,14 @@
{ 0, 0, 0, 0, 0 },
}
},
- // VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR
+ // VK_FORMAT_R10X6G10X6_UNORM_2PACK16
{
1, // planes
chanR|chanG,
1,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 4, 1, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR },
+ { 4, 1, 1, VK_FORMAT_R10X6G10X6_UNORM_2PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -474,14 +582,14 @@
{ 0, 0, 0, 0, 0 },
}
},
- // VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR
+ // VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16
{
1, // planes
chanR|chanG|chanB|chanA,
1,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR },
+ { 8, 1, 1, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -493,14 +601,14 @@
{ 0, unorm, 54, 10, 8 }, // A
}
},
- // VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR
+ // VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR },
+ { 8, 1, 1, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -512,14 +620,14 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR
+ // VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR },
+ { 8, 1, 1, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -531,7 +639,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR
+ // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16
{
3, // planes
chanR|chanG|chanB,
@@ -550,7 +658,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR
+ // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16
{
2, // planes
chanR|chanG|chanB,
@@ -569,7 +677,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR
+ // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16
{
3, // planes
chanR|chanG|chanB,
@@ -588,7 +696,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR
+ // VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16
{
2, // planes
chanR|chanG|chanB,
@@ -607,7 +715,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR
+ // VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16
{
3, // planes
chanR|chanG|chanB,
@@ -626,14 +734,14 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_R12X4_UNORM_PACK16_KHR
+ // VK_FORMAT_R12X4_UNORM_PACK16
{
1, // planes
chanR,
1,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16_KHR },
+ { 2, 1, 1, VK_FORMAT_R12X4_UNORM_PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -645,14 +753,14 @@
{ 0, 0, 0, 0, 0 },
}
},
- // VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR
+ // VK_FORMAT_R12X4G12X4_UNORM_2PACK16
{
1, // planes
chanR|chanG,
1,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 4, 1, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR },
+ { 4, 1, 1, VK_FORMAT_R12X4G12X4_UNORM_2PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -664,14 +772,14 @@
{ 0, 0, 0, 0, 0 },
}
},
- // VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR
+ // VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16
{
1, // planes
chanR|chanG|chanB|chanA,
1,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR },
+ { 8, 1, 1, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -683,14 +791,14 @@
{ 0, unorm, 52, 12, 8 }, // A
}
},
- // VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR
+ // VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR },
+ { 8, 1, 1, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -702,14 +810,14 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR
+ // VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR },
+ { 8, 1, 1, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -721,7 +829,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR
+ // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16
{
3, // planes
chanR|chanG|chanB,
@@ -740,7 +848,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR
+ // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16
{
2, // planes
chanR|chanG|chanB,
@@ -759,7 +867,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR
+ // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16
{
3, // planes
chanR|chanG|chanB,
@@ -778,7 +886,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR
+ // VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16
{
2, // planes
chanR|chanG|chanB,
@@ -797,7 +905,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR
+ // VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16
{
3, // planes
chanR|chanG|chanB,
@@ -816,14 +924,14 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G16B16G16R16_422_UNORM_KHR
+ // VK_FORMAT_G16B16G16R16_422_UNORM
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_G16B16G16R16_422_UNORM_KHR },
+ { 8, 1, 1, VK_FORMAT_G16B16G16R16_422_UNORM },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -835,14 +943,14 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_B16G16R16G16_422_UNORM_KHR
+ // VK_FORMAT_B16G16R16G16_422_UNORM
{
1, // planes
chanR|chanG|chanB,
2,1,
{
// Size WDiv HDiv planeCompatibleFormat
- { 8, 1, 1, VK_FORMAT_B16G16R16G16_422_UNORM_KHR },
+ { 8, 1, 1, VK_FORMAT_B16G16R16G16_422_UNORM },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
{ 0, 0, 0, VK_FORMAT_UNDEFINED },
},
@@ -854,7 +962,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR
+ // VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM
{
3, // planes
chanR|chanG|chanB,
@@ -873,7 +981,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR
+ // VK_FORMAT_G16_B16R16_2PLANE_420_UNORM
{
2, // planes
chanR|chanG|chanB,
@@ -892,7 +1000,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR
+ // VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM
{
3, // planes
chanR|chanG|chanB,
@@ -911,7 +1019,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR
+ // VK_FORMAT_G16_B16R16_2PLANE_422_UNORM
{
2, // planes
chanR|chanG|chanB,
@@ -930,7 +1038,7 @@
{ 0, 0, 0, 0, 0 }
}
},
- // VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR
+ // VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM
{
3, // planes
chanR|chanG|chanB,
@@ -951,7 +1059,7 @@
},
};
- const size_t offset = (size_t)VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
+ const size_t offset = (size_t)VK_FORMAT_G8B8G8R8_422_UNORM;
DE_ASSERT(de::inBounds<size_t>((size_t)format, offset, offset+(size_t)DE_LENGTH_OF_ARRAY(s_formatInfo)));
@@ -2272,44 +2380,48 @@
{
switch (format)
{
- case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
- case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
- case VK_FORMAT_R10X6_UNORM_PACK16_KHR:
- case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR:
- case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR:
- case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_R12X4_UNORM_PACK16_KHR:
- case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR:
- case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR:
- case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
- case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
+ case VK_FORMAT_G8B8G8R8_422_UNORM:
+ case VK_FORMAT_B8G8R8G8_422_UNORM:
+ case VK_FORMAT_R10X6_UNORM_PACK16:
+ case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
+ case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
+ case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_R12X4_UNORM_PACK16:
+ case VK_FORMAT_R12X4G12X4_UNORM_2PACK16:
+ case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
+ case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_G16B16G16R16_422_UNORM:
+ case VK_FORMAT_B16G16R16G16_422_UNORM:
return 1;
- case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
- case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT:
return 2;
- case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR:
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
return 3;
default:
@@ -2424,16 +2536,16 @@
VkImageAspectFlagBits getPlaneAspect (deUint32 planeNdx)
{
DE_ASSERT(de::inBounds(planeNdx, 0u, 3u));
- return (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_PLANE_0_BIT_KHR << planeNdx);
+ return (VkImageAspectFlagBits)(VK_IMAGE_ASPECT_PLANE_0_BIT << planeNdx);
}
deUint32 getAspectPlaneNdx (VkImageAspectFlagBits flags)
{
switch (flags)
{
- case VK_IMAGE_ASPECT_PLANE_0_BIT_KHR: return 0;
- case VK_IMAGE_ASPECT_PLANE_1_BIT_KHR: return 1;
- case VK_IMAGE_ASPECT_PLANE_2_BIT_KHR: return 2;
+ case VK_IMAGE_ASPECT_PLANE_0_BIT: return 0;
+ case VK_IMAGE_ASPECT_PLANE_1_BIT: return 1;
+ case VK_IMAGE_ASPECT_PLANE_2_BIT: return 2;
default:
DE_FATAL("Invalid plane aspect");
return 0;
@@ -2444,30 +2556,30 @@
{
switch (format)
{
- case VK_FORMAT_G8B8G8R8_422_UNORM_KHR:
- case VK_FORMAT_B8G8R8G8_422_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR:
- case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR:
- case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR:
- case VK_FORMAT_G16B16G16R16_422_UNORM_KHR:
- case VK_FORMAT_B16G16R16G16_422_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR:
- case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR:
- case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR:
+ case VK_FORMAT_G8B8G8R8_422_UNORM:
+ case VK_FORMAT_B8G8R8G8_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
+ case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G16B16G16R16_422_UNORM:
+ case VK_FORMAT_B16G16R16G16_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
return true;
default:
@@ -2670,13 +2782,13 @@
case FMT_CASE(DS, UNSIGNED_INT_24_8_REV): return VK_FORMAT_D24_UNORM_S8_UINT;
case FMT_CASE(DS, FLOAT_UNSIGNED_INT_24_8_REV): return VK_FORMAT_D32_SFLOAT_S8_UINT;
- case FMT_CASE(R, UNORM_SHORT_10): return VK_FORMAT_R10X6_UNORM_PACK16_KHR;
- case FMT_CASE(RG, UNORM_SHORT_10): return VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR;
- case FMT_CASE(RGBA, UNORM_SHORT_10): return VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR;
+ case FMT_CASE(R, UNORM_SHORT_10): return VK_FORMAT_R10X6_UNORM_PACK16;
+ case FMT_CASE(RG, UNORM_SHORT_10): return VK_FORMAT_R10X6G10X6_UNORM_2PACK16;
+ case FMT_CASE(RGBA, UNORM_SHORT_10): return VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16;
- case FMT_CASE(R, UNORM_SHORT_12): return VK_FORMAT_R12X4_UNORM_PACK16_KHR;
- case FMT_CASE(RG, UNORM_SHORT_12): return VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR;
- case FMT_CASE(RGBA, UNORM_SHORT_12): return VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR;
+ case FMT_CASE(R, UNORM_SHORT_12): return VK_FORMAT_R12X4_UNORM_PACK16;
+ case FMT_CASE(RG, UNORM_SHORT_12): return VK_FORMAT_R12X4G12X4_UNORM_2PACK16;
+ case FMT_CASE(RGBA, UNORM_SHORT_12): return VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16;
case FMT_CASE(R, USCALED_INT8): return VK_FORMAT_R8_USCALED;
case FMT_CASE(RG, USCALED_INT8): return VK_FORMAT_R8G8_USCALED;
@@ -2954,13 +3066,13 @@
case VK_FORMAT_A2B10G10R10_SINT_PACK32: return TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT_1010102_REV);
// YCbCr formats that can be mapped
- case VK_FORMAT_R10X6_UNORM_PACK16_KHR: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_10);
- case VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_SHORT_10);
- case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_10);
+ case VK_FORMAT_R10X6_UNORM_PACK16: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_10);
+ case VK_FORMAT_R10X6G10X6_UNORM_2PACK16: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_SHORT_10);
+ case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_10);
- case VK_FORMAT_R12X4_UNORM_PACK16_KHR: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_12);
- case VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_SHORT_12);
- case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_12);
+ case VK_FORMAT_R12X4_UNORM_PACK16: return TextureFormat(TextureFormat::R, TextureFormat::UNORM_SHORT_12);
+ case VK_FORMAT_R12X4G12X4_UNORM_2PACK16: return TextureFormat(TextureFormat::RG, TextureFormat::UNORM_SHORT_12);
+ case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: return TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_12);
case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT: return TextureFormat(TextureFormat::ARGB, TextureFormat::UNORM_SHORT_4444);
case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT: return TextureFormat(TextureFormat::ABGR, TextureFormat::UNORM_SHORT_4444);
@@ -3317,7 +3429,17 @@
}
}
- for (int formatNdx = VK_FORMAT_G8B8G8R8_422_UNORM_KHR; formatNdx <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR; formatNdx++)
+ for (int formatNdx = VK_FORMAT_G8B8G8R8_422_UNORM; formatNdx <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM; formatNdx++)
+ {
+ const VkFormat format = (VkFormat)formatNdx;
+ const PlanarFormatDescription& info = getPlanarFormatDescription(format);
+
+ DE_TEST_ASSERT(isYCbCrFormat(format));
+ DE_TEST_ASSERT(de::inRange<deUint8>(info.numPlanes, 1u, 3u));
+ DE_TEST_ASSERT(info.numPlanes == getPlaneCount(format));
+ }
+
+ for (int formatNdx = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT; formatNdx <= VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT; formatNdx++)
{
const VkFormat format = (VkFormat)formatNdx;
const PlanarFormatDescription& info = getPlanarFormatDescription(format);
@@ -3689,7 +3811,7 @@
const VkStructureType nextType = *reinterpret_cast<const VkStructureType*>(pNext);
switch (nextType)
{
- case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT:
+ case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
{
const VkSamplerReductionModeCreateInfo reductionModeCreateInfo = *reinterpret_cast<const VkSamplerReductionModeCreateInfo*>(pNext);
reductionMode = mapVkSamplerReductionMode(reductionModeCreateInfo.reductionMode);
@@ -4971,12 +5093,21 @@
bool checkSparseImageFormatSupport (const VkPhysicalDevice physicalDevice,
const InstanceInterface& instance,
+ const VkFormat format,
+ const VkImageType imageType,
+ const VkSampleCountFlagBits sampleCount,
+ const VkImageUsageFlags usageFlags,
+ const VkImageTiling imageTiling)
+{
+ const auto propVec = getPhysicalDeviceSparseImageFormatProperties(instance, physicalDevice, format, imageType, sampleCount, usageFlags, imageTiling);
+ return (propVec.size() != 0);
+}
+
+bool checkSparseImageFormatSupport (const VkPhysicalDevice physicalDevice,
+ const InstanceInterface& instance,
const VkImageCreateInfo& imageCreateInfo)
{
- const std::vector<VkSparseImageFormatProperties> sparseImageFormatPropVec =
- getPhysicalDeviceSparseImageFormatProperties(instance, physicalDevice, imageCreateInfo.format, imageCreateInfo.imageType, imageCreateInfo.samples, imageCreateInfo.usage, imageCreateInfo.tiling);
-
- return (sparseImageFormatPropVec.size() != 0);
+ return checkSparseImageFormatSupport(physicalDevice, instance, imageCreateInfo.format, imageCreateInfo.imageType, imageCreateInfo.samples, imageCreateInfo.usage, imageCreateInfo.tiling);
}
} // vk
diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.hpp b/external/vulkancts/framework/vulkan/vkImageUtil.hpp
index 0bfe4d9..b26d006 100644
--- a/external/vulkancts/framework/vulkan/vkImageUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkImageUtil.hpp
@@ -130,6 +130,7 @@
};
bool isYCbCrFormat (VkFormat format);
+bool isYCbCrExtensionFormat (VkFormat format);
PlanarFormatDescription getPlanarFormatDescription (VkFormat format);
int getPlaneCount (VkFormat format);
deUint32 getMipmapCount (VkFormat format,
@@ -327,6 +328,14 @@
* Checks if the physical device supports creation of the specified
* image format.
*//*--------------------------------------------------------------------*/
+bool checkSparseImageFormatSupport (const VkPhysicalDevice physicalDevice,
+ const InstanceInterface& instance,
+ const VkFormat format,
+ const VkImageType imageType,
+ const VkSampleCountFlagBits sampleCount,
+ const VkImageUsageFlags usageFlags,
+ const VkImageTiling imageTiling);
+
bool checkSparseImageFormatSupport (const vk::VkPhysicalDevice physicalDevice,
const vk::InstanceInterface& instance,
const vk::VkImageCreateInfo& imageCreateInfo);
diff --git a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
index f7ab547..c98a0ec 100644
--- a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
@@ -351,6 +351,13 @@
m_vk.setPrivateDataEXT = (SetPrivateDataEXTFunc) GET_PROC_ADDR("vkSetPrivateDataEXT");
m_vk.getPrivateDataEXT = (GetPrivateDataEXTFunc) GET_PROC_ADDR("vkGetPrivateDataEXT");
m_vk.cmdSetFragmentShadingRateEnumNV = (CmdSetFragmentShadingRateEnumNVFunc) GET_PROC_ADDR("vkCmdSetFragmentShadingRateEnumNV");
+m_vk.cmdSetVertexInputEXT = (CmdSetVertexInputEXTFunc) GET_PROC_ADDR("vkCmdSetVertexInputEXT");
+m_vk.cmdSetPatchControlPointsEXT = (CmdSetPatchControlPointsEXTFunc) GET_PROC_ADDR("vkCmdSetPatchControlPointsEXT");
+m_vk.cmdSetRasterizerDiscardEnableEXT = (CmdSetRasterizerDiscardEnableEXTFunc) GET_PROC_ADDR("vkCmdSetRasterizerDiscardEnableEXT");
+m_vk.cmdSetDepthBiasEnableEXT = (CmdSetDepthBiasEnableEXTFunc) GET_PROC_ADDR("vkCmdSetDepthBiasEnableEXT");
+m_vk.cmdSetLogicOpEXT = (CmdSetLogicOpEXTFunc) GET_PROC_ADDR("vkCmdSetLogicOpEXT");
+m_vk.cmdSetPrimitiveRestartEnableEXT = (CmdSetPrimitiveRestartEnableEXTFunc) GET_PROC_ADDR("vkCmdSetPrimitiveRestartEnableEXT");
+m_vk.cmdSetColorWriteEnableEXT = (CmdSetColorWriteEnableEXTFunc) GET_PROC_ADDR("vkCmdSetColorWriteEnableEXT");
m_vk.createAccelerationStructureKHR = (CreateAccelerationStructureKHRFunc) GET_PROC_ADDR("vkCreateAccelerationStructureKHR");
m_vk.destroyAccelerationStructureKHR = (DestroyAccelerationStructureKHRFunc) GET_PROC_ADDR("vkDestroyAccelerationStructureKHR");
m_vk.cmdBuildAccelerationStructuresKHR = (CmdBuildAccelerationStructuresKHRFunc) GET_PROC_ADDR("vkCmdBuildAccelerationStructuresKHR");
@@ -375,6 +382,22 @@
m_vk.cmdSetRayTracingPipelineStackSizeKHR = (CmdSetRayTracingPipelineStackSizeKHRFunc) GET_PROC_ADDR("vkCmdSetRayTracingPipelineStackSizeKHR");
m_vk.getAndroidHardwareBufferPropertiesANDROID = (GetAndroidHardwareBufferPropertiesANDROIDFunc) GET_PROC_ADDR("vkGetAndroidHardwareBufferPropertiesANDROID");
m_vk.getMemoryAndroidHardwareBufferANDROID = (GetMemoryAndroidHardwareBufferANDROIDFunc) GET_PROC_ADDR("vkGetMemoryAndroidHardwareBufferANDROID");
+m_vk.createVideoSessionKHR = (CreateVideoSessionKHRFunc) GET_PROC_ADDR("vkCreateVideoSessionKHR");
+m_vk.destroyVideoSessionKHR = (DestroyVideoSessionKHRFunc) GET_PROC_ADDR("vkDestroyVideoSessionKHR");
+m_vk.getVideoSessionMemoryRequirementsKHR = (GetVideoSessionMemoryRequirementsKHRFunc) GET_PROC_ADDR("vkGetVideoSessionMemoryRequirementsKHR");
+m_vk.bindVideoSessionMemoryKHR = (BindVideoSessionMemoryKHRFunc) GET_PROC_ADDR("vkBindVideoSessionMemoryKHR");
+m_vk.createVideoSessionParametersKHR = (CreateVideoSessionParametersKHRFunc) GET_PROC_ADDR("vkCreateVideoSessionParametersKHR");
+m_vk.updateVideoSessionParametersKHR = (UpdateVideoSessionParametersKHRFunc) GET_PROC_ADDR("vkUpdateVideoSessionParametersKHR");
+m_vk.destroyVideoSessionParametersKHR = (DestroyVideoSessionParametersKHRFunc) GET_PROC_ADDR("vkDestroyVideoSessionParametersKHR");
+m_vk.cmdBeginVideoCodingKHR = (CmdBeginVideoCodingKHRFunc) GET_PROC_ADDR("vkCmdBeginVideoCodingKHR");
+m_vk.cmdEndVideoCodingKHR = (CmdEndVideoCodingKHRFunc) GET_PROC_ADDR("vkCmdEndVideoCodingKHR");
+m_vk.cmdControlVideoCodingKHR = (CmdControlVideoCodingKHRFunc) GET_PROC_ADDR("vkCmdControlVideoCodingKHR");
+m_vk.cmdDecodeVideoKHR = (CmdDecodeVideoKHRFunc) GET_PROC_ADDR("vkCmdDecodeVideoKHR");
+m_vk.cmdEncodeVideoKHR = (CmdEncodeVideoKHRFunc) GET_PROC_ADDR("vkCmdEncodeVideoKHR");
+m_vk.getMemoryZirconHandleFUCHSIA = (GetMemoryZirconHandleFUCHSIAFunc) GET_PROC_ADDR("vkGetMemoryZirconHandleFUCHSIA");
+m_vk.getMemoryZirconHandlePropertiesFUCHSIA = (GetMemoryZirconHandlePropertiesFUCHSIAFunc) GET_PROC_ADDR("vkGetMemoryZirconHandlePropertiesFUCHSIA");
+m_vk.importSemaphoreZirconHandleFUCHSIA = (ImportSemaphoreZirconHandleFUCHSIAFunc) GET_PROC_ADDR("vkImportSemaphoreZirconHandleFUCHSIA");
+m_vk.getSemaphoreZirconHandleFUCHSIA = (GetSemaphoreZirconHandleFUCHSIAFunc) GET_PROC_ADDR("vkGetSemaphoreZirconHandleFUCHSIA");
m_vk.getMemoryWin32HandleKHR = (GetMemoryWin32HandleKHRFunc) GET_PROC_ADDR("vkGetMemoryWin32HandleKHR");
m_vk.getMemoryWin32HandlePropertiesKHR = (GetMemoryWin32HandlePropertiesKHRFunc) GET_PROC_ADDR("vkGetMemoryWin32HandlePropertiesKHR");
m_vk.importSemaphoreWin32HandleKHR = (ImportSemaphoreWin32HandleKHRFunc) GET_PROC_ADDR("vkImportSemaphoreWin32HandleKHR");
diff --git a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
index 91762e4..9f93b6d 100644
--- a/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
@@ -96,6 +96,8 @@
m_vk.acquireWinrtDisplayNV = (AcquireWinrtDisplayNVFunc) GET_PROC_ADDR("vkAcquireWinrtDisplayNV");
m_vk.getWinrtDisplayNV = (GetWinrtDisplayNVFunc) GET_PROC_ADDR("vkGetWinrtDisplayNV");
m_vk.createAndroidSurfaceKHR = (CreateAndroidSurfaceKHRFunc) GET_PROC_ADDR("vkCreateAndroidSurfaceKHR");
+m_vk.getPhysicalDeviceVideoCapabilitiesKHR = (GetPhysicalDeviceVideoCapabilitiesKHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceVideoCapabilitiesKHR");
+m_vk.getPhysicalDeviceVideoFormatPropertiesKHR = (GetPhysicalDeviceVideoFormatPropertiesKHRFunc) GET_PROC_ADDR("vkGetPhysicalDeviceVideoFormatPropertiesKHR");
m_vk.createImagePipeSurfaceFUCHSIA = (CreateImagePipeSurfaceFUCHSIAFunc) GET_PROC_ADDR("vkCreateImagePipeSurfaceFUCHSIA");
m_vk.createStreamDescriptorSurfaceGGP = (CreateStreamDescriptorSurfaceGGPFunc) GET_PROC_ADDR("vkCreateStreamDescriptorSurfaceGGP");
m_vk.createIOSSurfaceMVK = (CreateIOSSurfaceMVKFunc) GET_PROC_ADDR("vkCreateIOSSurfaceMVK");
diff --git a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
index 35287ab..3e21058 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
@@ -367,6 +367,16 @@
return m_vk.createAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
}
+VkResult InstanceDriver::getPhysicalDeviceVideoCapabilitiesKHR (VkPhysicalDevice physicalDevice, const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities) const
+{
+ return m_vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, pVideoProfile, pCapabilities);
+}
+
+VkResult InstanceDriver::getPhysicalDeviceVideoFormatPropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, deUint32* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties) const
+{
+ return m_vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, pVideoFormatInfo, pVideoFormatPropertyCount, pVideoFormatProperties);
+}
+
VkResult InstanceDriver::createImagePipeSurfaceFUCHSIA (VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const
{
return m_vk.createImagePipeSurfaceFUCHSIA(instance, pCreateInfo, pAllocator, pSurface);
diff --git a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
index a0b66a3..9355e33 100644
--- a/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
+++ b/external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
@@ -74,6 +74,8 @@
AcquireWinrtDisplayNVFunc acquireWinrtDisplayNV;
GetWinrtDisplayNVFunc getWinrtDisplayNV;
CreateAndroidSurfaceKHRFunc createAndroidSurfaceKHR;
+GetPhysicalDeviceVideoCapabilitiesKHRFunc getPhysicalDeviceVideoCapabilitiesKHR;
+GetPhysicalDeviceVideoFormatPropertiesKHRFunc getPhysicalDeviceVideoFormatPropertiesKHR;
CreateImagePipeSurfaceFUCHSIAFunc createImagePipeSurfaceFUCHSIA;
CreateStreamDescriptorSurfaceGGPFunc createStreamDescriptorSurfaceGGP;
CreateIOSSurfaceMVKFunc createIOSSurfaceMVK;
diff --git a/external/vulkancts/framework/vulkan/vkKnownDriverIds.inl b/external/vulkancts/framework/vulkan/vkKnownDriverIds.inl
index 8864702..6ba473f 100644
--- a/external/vulkancts/framework/vulkan/vkKnownDriverIds.inl
+++ b/external/vulkancts/framework/vulkan/vkKnownDriverIds.inl
@@ -21,6 +21,7 @@
{"VK_DRIVER_ID_BROADCOM_PROPRIETARY", 12},
{"VK_DRIVER_ID_MESA_LLVMPIPE", 13},
{"VK_DRIVER_ID_MOLTENVK", 14},
+ {"VK_DRIVER_ID_COREAVI_PROPRIETARY", 15},
{"VK_DRIVER_ID_AMD_PROPRIETARY_KHR", 1}, // VK_DRIVER_ID_AMD_PROPRIETARY
{"VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR", 2}, // VK_DRIVER_ID_AMD_OPEN_SOURCE
{"VK_DRIVER_ID_MESA_RADV_KHR", 3}, // VK_DRIVER_ID_MESA_RADV
diff --git a/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl b/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl
index 71e2fd3..9063c90 100644
--- a/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl
+++ b/external/vulkancts/framework/vulkan/vkMandatoryFeatures.inl
@@ -46,16 +46,36 @@
nextPtr = &physicalDevice8BitStorageFeaturesKHR.pNext;
}
+ vk::VkPhysicalDeviceAccelerationStructureFeaturesKHR physicalDeviceAccelerationStructureFeaturesKHR;
+ deMemset(&physicalDeviceAccelerationStructureFeaturesKHR, 0, sizeof(physicalDeviceAccelerationStructureFeaturesKHR));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ physicalDeviceAccelerationStructureFeaturesKHR.sType = getStructureType<VkPhysicalDeviceAccelerationStructureFeaturesKHR>();
+ *nextPtr = &physicalDeviceAccelerationStructureFeaturesKHR;
+ nextPtr = &physicalDeviceAccelerationStructureFeaturesKHR.pNext;
+ }
+
vk::VkPhysicalDeviceBufferDeviceAddressFeaturesKHR physicalDeviceBufferDeviceAddressFeaturesKHR;
deMemset(&physicalDeviceBufferDeviceAddressFeaturesKHR, 0, sizeof(physicalDeviceBufferDeviceAddressFeaturesKHR));
- if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_buffer_device_address")) )
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_buffer_device_address")) || context.contextSupports(vk::ApiVersion(1, 1, 0)) )
{
physicalDeviceBufferDeviceAddressFeaturesKHR.sType = getStructureType<VkPhysicalDeviceBufferDeviceAddressFeaturesKHR>();
*nextPtr = &physicalDeviceBufferDeviceAddressFeaturesKHR;
nextPtr = &physicalDeviceBufferDeviceAddressFeaturesKHR.pNext;
}
+ vk::VkPhysicalDeviceColorWriteEnableFeaturesEXT physicalDeviceColorWriteEnableFeaturesEXT;
+ deMemset(&physicalDeviceColorWriteEnableFeaturesEXT, 0, sizeof(physicalDeviceColorWriteEnableFeaturesEXT));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_color_write_enable")) )
+ {
+ physicalDeviceColorWriteEnableFeaturesEXT.sType = getStructureType<VkPhysicalDeviceColorWriteEnableFeaturesEXT>();
+ *nextPtr = &physicalDeviceColorWriteEnableFeaturesEXT;
+ nextPtr = &physicalDeviceColorWriteEnableFeaturesEXT.pNext;
+ }
+
vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT physicalDeviceConditionalRenderingFeaturesEXT;
deMemset(&physicalDeviceConditionalRenderingFeaturesEXT, 0, sizeof(physicalDeviceConditionalRenderingFeaturesEXT));
@@ -79,13 +99,23 @@
vk::VkPhysicalDeviceDescriptorIndexingFeaturesEXT physicalDeviceDescriptorIndexingFeaturesEXT;
deMemset(&physicalDeviceDescriptorIndexingFeaturesEXT, 0, sizeof(physicalDeviceDescriptorIndexingFeaturesEXT));
- if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_descriptor_indexing")) )
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_descriptor_indexing")) || context.contextSupports(vk::ApiVersion(1, 1, 0)) )
{
physicalDeviceDescriptorIndexingFeaturesEXT.sType = getStructureType<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
*nextPtr = &physicalDeviceDescriptorIndexingFeaturesEXT;
nextPtr = &physicalDeviceDescriptorIndexingFeaturesEXT.pNext;
}
+ vk::VkPhysicalDeviceExtendedDynamicState2FeaturesEXT physicalDeviceExtendedDynamicState2FeaturesEXT;
+ deMemset(&physicalDeviceExtendedDynamicState2FeaturesEXT, 0, sizeof(physicalDeviceExtendedDynamicState2FeaturesEXT));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_extended_dynamic_state2")) )
+ {
+ physicalDeviceExtendedDynamicState2FeaturesEXT.sType = getStructureType<VkPhysicalDeviceExtendedDynamicState2FeaturesEXT>();
+ *nextPtr = &physicalDeviceExtendedDynamicState2FeaturesEXT;
+ nextPtr = &physicalDeviceExtendedDynamicState2FeaturesEXT.pNext;
+ }
+
vk::VkPhysicalDeviceFragmentDensityMapFeaturesEXT physicalDeviceFragmentDensityMapFeaturesEXT;
deMemset(&physicalDeviceFragmentDensityMapFeaturesEXT, 0, sizeof(physicalDeviceFragmentDensityMapFeaturesEXT));
@@ -186,6 +216,16 @@
nextPtr = &physicalDevicePerformanceQueryFeaturesKHR.pNext;
}
+ vk::VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT physicalDevicePipelineCreationCacheControlFeaturesEXT;
+ deMemset(&physicalDevicePipelineCreationCacheControlFeaturesEXT, 0, sizeof(physicalDevicePipelineCreationCacheControlFeaturesEXT));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_pipeline_creation_cache_control")) )
+ {
+ physicalDevicePipelineCreationCacheControlFeaturesEXT.sType = getStructureType<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>();
+ *nextPtr = &physicalDevicePipelineCreationCacheControlFeaturesEXT;
+ nextPtr = &physicalDevicePipelineCreationCacheControlFeaturesEXT.pNext;
+ }
+
vk::VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR physicalDevicePipelineExecutablePropertiesFeaturesKHR;
deMemset(&physicalDevicePipelineExecutablePropertiesFeaturesKHR, 0, sizeof(physicalDevicePipelineExecutablePropertiesFeaturesKHR));
@@ -196,6 +236,26 @@
nextPtr = &physicalDevicePipelineExecutablePropertiesFeaturesKHR.pNext;
}
+ vk::VkPhysicalDeviceRayQueryFeaturesKHR physicalDeviceRayQueryFeaturesKHR;
+ deMemset(&physicalDeviceRayQueryFeaturesKHR, 0, sizeof(physicalDeviceRayQueryFeaturesKHR));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_ray_query")) )
+ {
+ physicalDeviceRayQueryFeaturesKHR.sType = getStructureType<VkPhysicalDeviceRayQueryFeaturesKHR>();
+ *nextPtr = &physicalDeviceRayQueryFeaturesKHR;
+ nextPtr = &physicalDeviceRayQueryFeaturesKHR.pNext;
+ }
+
+ vk::VkPhysicalDeviceRayTracingPipelineFeaturesKHR physicalDeviceRayTracingPipelineFeaturesKHR;
+ deMemset(&physicalDeviceRayTracingPipelineFeaturesKHR, 0, sizeof(physicalDeviceRayTracingPipelineFeaturesKHR));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_ray_tracing_pipeline")) )
+ {
+ physicalDeviceRayTracingPipelineFeaturesKHR.sType = getStructureType<VkPhysicalDeviceRayTracingPipelineFeaturesKHR>();
+ *nextPtr = &physicalDeviceRayTracingPipelineFeaturesKHR;
+ nextPtr = &physicalDeviceRayTracingPipelineFeaturesKHR.pNext;
+ }
+
vk::VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR physicalDeviceSamplerYcbcrConversionFeaturesKHR;
deMemset(&physicalDeviceSamplerYcbcrConversionFeaturesKHR, 0, sizeof(physicalDeviceSamplerYcbcrConversionFeaturesKHR));
@@ -386,6 +446,16 @@
nextPtr = &physicalDeviceVertexAttributeDivisorFeaturesEXT.pNext;
}
+ vk::VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT physicalDeviceVertexInputDynamicStateFeaturesEXT;
+ deMemset(&physicalDeviceVertexInputDynamicStateFeaturesEXT, 0, sizeof(physicalDeviceVertexInputDynamicStateFeaturesEXT));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_vertex_input_dynamic_state")) )
+ {
+ physicalDeviceVertexInputDynamicStateFeaturesEXT.sType = getStructureType<VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT>();
+ *nextPtr = &physicalDeviceVertexInputDynamicStateFeaturesEXT;
+ nextPtr = &physicalDeviceVertexInputDynamicStateFeaturesEXT.pNext;
+ }
+
vk::VkPhysicalDeviceVulkan11Features physicalDeviceVulkan11Features;
deMemset(&physicalDeviceVulkan11Features, 0, sizeof(physicalDeviceVulkan11Features));
@@ -426,6 +496,16 @@
nextPtr = &physicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.pNext;
}
+ vk::VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT physicalDeviceYcbcr2Plane444FormatsFeaturesEXT;
+ deMemset(&physicalDeviceYcbcr2Plane444FormatsFeaturesEXT, 0, sizeof(physicalDeviceYcbcr2Plane444FormatsFeaturesEXT));
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_ycbcr_2plane_444_formats")) )
+ {
+ physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.sType = getStructureType<VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT>();
+ *nextPtr = &physicalDeviceYcbcr2Plane444FormatsFeaturesEXT;
+ nextPtr = &physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.pNext;
+ }
+
vk::VkPhysicalDeviceYcbcrImageArraysFeaturesEXT physicalDeviceYcbcrImageArraysFeaturesEXT;
deMemset(&physicalDeviceYcbcrImageArraysFeaturesEXT, 0, sizeof(physicalDeviceYcbcrImageArraysFeaturesEXT));
@@ -763,6 +843,15 @@
}
}
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_pipeline_creation_cache_control")) )
+ {
+ if ( physicalDevicePipelineCreationCacheControlFeaturesEXT.pipelineCreationCacheControl == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature pipelineCreationCacheControl not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) )
{
if ( physicalDeviceVulkan12Features.separateDepthStencilLayouts == VK_FALSE )
@@ -810,6 +899,24 @@
if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && physicalDeviceVulkan12Features.descriptorIndexing )
{
+ if ( coreFeatures.features.shaderSampledImageArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderSampledImageArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
+ if ( coreFeatures.features.shaderStorageBufferArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderStorageBufferArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && physicalDeviceVulkan12Features.descriptorIndexing )
+ {
if ( physicalDeviceVulkan12Features.shaderUniformTexelBufferArrayDynamicIndexing == VK_FALSE )
{
log << tcu::TestLog::Message << "Mandatory feature shaderUniformTexelBufferArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
@@ -1213,6 +1320,357 @@
}
}
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature accelerationStructure not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceAccelerationStructureFeaturesKHR.descriptorBindingAccelerationStructureUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingAccelerationStructureUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( coreFeatures.features.shaderSampledImageArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderSampledImageArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( coreFeatures.features.shaderStorageBufferArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderStorageBufferArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.shaderUniformTexelBufferArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderUniformTexelBufferArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.shaderStorageTexelBufferArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderStorageTexelBufferArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.shaderSampledImageArrayNonUniformIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderSampledImageArrayNonUniformIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.shaderStorageBufferArrayNonUniformIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderStorageBufferArrayNonUniformIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.shaderUniformTexelBufferArrayNonUniformIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderUniformTexelBufferArrayNonUniformIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.descriptorBindingSampledImageUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingSampledImageUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.descriptorBindingStorageImageUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingStorageImageUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.descriptorBindingStorageBufferUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingStorageBufferUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.descriptorBindingUniformTexelBufferUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingUniformTexelBufferUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.descriptorBindingStorageTexelBufferUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingStorageTexelBufferUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.descriptorBindingUpdateUnusedWhilePending == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingUpdateUnusedWhilePending not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.descriptorBindingPartiallyBound == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingPartiallyBound not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.runtimeDescriptorArray == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature runtimeDescriptorArray not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 2, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceVulkan12Features.bufferDeviceAddress == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature bufferDeviceAddress not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceBufferDeviceAddressFeaturesKHR.bufferDeviceAddress == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature bufferDeviceAddress not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.shaderUniformTexelBufferArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderUniformTexelBufferArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.shaderStorageTexelBufferArrayDynamicIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderStorageTexelBufferArrayDynamicIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.shaderSampledImageArrayNonUniformIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderSampledImageArrayNonUniformIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.shaderStorageBufferArrayNonUniformIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderStorageBufferArrayNonUniformIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.shaderUniformTexelBufferArrayNonUniformIndexing == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature shaderUniformTexelBufferArrayNonUniformIndexing not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.descriptorBindingSampledImageUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingSampledImageUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.descriptorBindingStorageImageUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingStorageImageUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.descriptorBindingStorageBufferUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingStorageBufferUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.descriptorBindingUniformTexelBufferUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingUniformTexelBufferUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.descriptorBindingStorageTexelBufferUpdateAfterBind == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingStorageTexelBufferUpdateAfterBind not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.descriptorBindingUpdateUnusedWhilePending == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingUpdateUnusedWhilePending not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.descriptorBindingPartiallyBound == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature descriptorBindingPartiallyBound not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( context.contextSupports(vk::ApiVersion(1, 1, 0)) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_acceleration_structure")) )
+ {
+ if ( physicalDeviceDescriptorIndexingFeaturesEXT.runtimeDescriptorArray == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature runtimeDescriptorArray not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_ray_tracing_pipeline")) )
+ {
+ if ( ( physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline == VK_FALSE ) && ( physicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineTraceRaysIndirect == VK_FALSE ) )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature rayTracingPipeline or rayTracingPipelineTraceRaysIndirect not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_ray_tracing_pipeline")) && isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_ray_query")) )
+ {
+ if ( physicalDeviceRayTracingPipelineFeaturesKHR.rayTraversalPrimitiveCulling == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature rayTraversalPrimitiveCulling not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_KHR_ray_query")) )
+ {
+ if ( physicalDeviceRayQueryFeaturesKHR.rayQuery == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature rayQuery not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_vertex_input_dynamic_state")) )
+ {
+ if ( physicalDeviceVertexInputDynamicStateFeaturesEXT.vertexInputDynamicState == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature vertexInputDynamicState not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_color_write_enable")) )
+ {
+ if ( physicalDeviceColorWriteEnableFeaturesEXT.colorWriteEnable == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature colorWriteEnable not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_ycbcr_2plane_444_formats")) )
+ {
+ if ( physicalDeviceYcbcr2Plane444FormatsFeaturesEXT.ycbcr2plane444Formats == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature ycbcr2plane444Formats not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if ( isExtensionSupported(deviceExtensions, RequiredExtension("VK_EXT_extended_dynamic_state2")) )
+ {
+ if ( physicalDeviceExtendedDynamicState2FeaturesEXT.extendedDynamicState2 == VK_FALSE )
+ {
+ log << tcu::TestLog::Message << "Mandatory feature extendedDynamicState2 not supported" << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
return result;
}
diff --git a/external/vulkancts/framework/vulkan/vkMemUtil.cpp b/external/vulkancts/framework/vulkan/vkMemUtil.cpp
index 0642cd0..d5f4801 100644
--- a/external/vulkancts/framework/vulkan/vkMemUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkMemUtil.cpp
@@ -237,7 +237,7 @@
if (requirement & MemoryRequirement::DeviceAddress)
{
- allocFlagsInfo.flags |= VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;
+ allocFlagsInfo.flags |= VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT;
allocInfo.pNext = &allocFlagsInfo;
}
@@ -292,7 +292,7 @@
const VkMemoryRequirements memoryRequirements = getBufferMemoryRequirements(vkd, device, buffer);
const VkMemoryDedicatedAllocateInfo dedicatedAllocationInfo =
{
- VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, // VkStructureType sType
+ VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, // VkStructureType sType
DE_NULL, // const void* pNext
DE_NULL, // VkImage image
buffer // VkBuffer buffer
@@ -311,7 +311,7 @@
const VkMemoryRequirements memoryRequirements = getImageMemoryRequirements(vkd, device, image);
const VkMemoryDedicatedAllocateInfo dedicatedAllocationInfo =
{
- VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, // VkStructureType sType
+ VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, // VkStructureType sType
DE_NULL, // const void* pNext
image, // VkImage image
DE_NULL // VkBuffer buffer
@@ -391,7 +391,7 @@
VkBindImagePlaneMemoryInfo planeInfo =
{
- VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR,
+ VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO,
DE_NULL,
planeAspect
};
@@ -399,7 +399,7 @@
VkBindImageMemoryInfo coreInfo =
{
- VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR,
+ VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
&planeInfos.back(),
image,
allocations.back()->getMemory(),
diff --git a/external/vulkancts/framework/vulkan/vkNullDriver.cpp b/external/vulkancts/framework/vulkan/vkNullDriver.cpp
index e7b58d8..b0dfcea 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriver.cpp
+++ b/external/vulkancts/framework/vulkan/vkNullDriver.cpp
@@ -545,6 +545,20 @@
{}
};
+class VideoSessionKHR
+{
+public:
+ VideoSessionKHR (VkDevice, const VkVideoSessionCreateInfoKHR*)
+ {}
+};
+
+class VideoSessionParametersKHR
+{
+public:
+ VideoSessionParametersKHR (VkDevice, const VkVideoSessionParametersCreateInfoKHR*)
+ {}
+};
+
class ValidationCacheEXT
{
public:
@@ -1243,7 +1257,7 @@
#if defined(USE_ANDROID_O_HARDWARE_BUFFER)
VK_NULL_RETURN((*pMemory = allocateNonDispHandle<ExternalDeviceMemoryAndroid, DeviceMemory, VkDeviceMemory>(device, pAllocateInfo, pAllocator)));
#else
- return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR;
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
#endif
}
else
@@ -1391,7 +1405,7 @@
if (pExternalBufferInfo->handleType == VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
{
- pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR;
+ pExternalBufferProperties->externalMemoryProperties.externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
pExternalBufferProperties->externalMemoryProperties.exportFromImportedHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
pExternalBufferProperties->externalMemoryProperties.compatibleHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
}
@@ -1434,8 +1448,8 @@
}
if ((pImageFormatInfo->flags & ~(VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
- /*| VK_IMAGE_CREATE_PROTECTED_BIT_KHR*/
- /*| VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR*/))
+ /*| VK_IMAGE_CREATE_PROTECTED_BIT*/
+ /*| VK_IMAGE_CREATE_EXTENDED_USAGE_BIT*/))
!= 0)
{
return VK_ERROR_FORMAT_NOT_SUPPORTED;
@@ -1443,9 +1457,9 @@
if (externalProperties)
{
- externalProperties->externalMemoryProperties.externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR
- | VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR
- | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR;
+ externalProperties->externalMemoryProperties.externalMemoryFeatures = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT
+ | VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT
+ | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
externalProperties->externalMemoryProperties.exportFromImportedHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
externalProperties->externalMemoryProperties.compatibleHandleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
}
diff --git a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
index cfeeb6c..589b38f 100644
--- a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
@@ -205,6 +205,18 @@
VK_NULL_RETURN((*pSurface = allocateNonDispHandle<SurfaceKHR, VkSurfaceKHR>(instance, pCreateInfo, pAllocator)));
}
+VKAPI_ATTR VkResult VKAPI_CALL createVideoSessionKHR (VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession)
+{
+ DE_UNREF(pAllocator);
+ VK_NULL_RETURN((*pVideoSession = allocateNonDispHandle<VideoSessionKHR, VkVideoSessionKHR>(device, pCreateInfo, pAllocator)));
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL createVideoSessionParametersKHR (VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters)
+{
+ DE_UNREF(pAllocator);
+ VK_NULL_RETURN((*pVideoSessionParameters = allocateNonDispHandle<VideoSessionParametersKHR, VkVideoSessionParametersKHR>(device, pCreateInfo, pAllocator)));
+}
+
VKAPI_ATTR VkResult VKAPI_CALL createImagePipeSurfaceFUCHSIA (VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface)
{
DE_UNREF(pAllocator);
@@ -461,6 +473,18 @@
freeNonDispHandle<AccelerationStructureKHR, VkAccelerationStructureKHR>(accelerationStructure, pAllocator);
}
+VKAPI_ATTR void VKAPI_CALL destroyVideoSessionKHR (VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator)
+{
+ DE_UNREF(device);
+ freeNonDispHandle<VideoSessionKHR, VkVideoSessionKHR>(videoSession, pAllocator);
+}
+
+VKAPI_ATTR void VKAPI_CALL destroyVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator)
+{
+ DE_UNREF(device);
+ freeNonDispHandle<VideoSessionParametersKHR, VkVideoSessionParametersKHR>(videoSessionParameters, pAllocator);
+}
+
VKAPI_ATTR VkResult VKAPI_CALL enumerateInstanceLayerProperties (deUint32* pPropertyCount, VkLayerProperties* pProperties)
{
DE_UNREF(pPropertyCount);
@@ -2627,6 +2651,52 @@
return VK_SUCCESS;
}
+VKAPI_ATTR void VKAPI_CALL cmdSetVertexInputEXT (VkCommandBuffer commandBuffer, deUint32 vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, deUint32 vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(vertexBindingDescriptionCount);
+ DE_UNREF(pVertexBindingDescriptions);
+ DE_UNREF(vertexAttributeDescriptionCount);
+ DE_UNREF(pVertexAttributeDescriptions);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetPatchControlPointsEXT (VkCommandBuffer commandBuffer, deUint32 patchControlPoints)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(patchControlPoints);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetRasterizerDiscardEnableEXT (VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(rasterizerDiscardEnable);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetDepthBiasEnableEXT (VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(depthBiasEnable);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetLogicOpEXT (VkCommandBuffer commandBuffer, VkLogicOp logicOp)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(logicOp);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetPrimitiveRestartEnableEXT (VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(primitiveRestartEnable);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdSetColorWriteEnableEXT (VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkBool32* pColorWriteEnables)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(attachmentCount);
+ DE_UNREF(pColorWriteEnables);
+}
+
VKAPI_ATTR void VKAPI_CALL cmdBuildAccelerationStructuresKHR (VkCommandBuffer commandBuffer, deUint32 infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
{
DE_UNREF(commandBuffer);
@@ -2798,6 +2868,111 @@
return VK_SUCCESS;
}
+VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceVideoCapabilitiesKHR (VkPhysicalDevice physicalDevice, const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities)
+{
+ DE_UNREF(physicalDevice);
+ DE_UNREF(pVideoProfile);
+ DE_UNREF(pCapabilities);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceVideoFormatPropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, deUint32* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties)
+{
+ DE_UNREF(physicalDevice);
+ DE_UNREF(pVideoFormatInfo);
+ DE_UNREF(pVideoFormatPropertyCount);
+ DE_UNREF(pVideoFormatProperties);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getVideoSessionMemoryRequirementsKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32* pVideoSessionMemoryRequirementsCount, VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements)
+{
+ DE_UNREF(device);
+ DE_UNREF(videoSession);
+ DE_UNREF(pVideoSessionMemoryRequirementsCount);
+ DE_UNREF(pVideoSessionMemoryRequirements);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL bindVideoSessionMemoryKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32 videoSessionBindMemoryCount, const VkVideoBindMemoryKHR* pVideoSessionBindMemories)
+{
+ DE_UNREF(device);
+ DE_UNREF(videoSession);
+ DE_UNREF(videoSessionBindMemoryCount);
+ DE_UNREF(pVideoSessionBindMemories);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL updateVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(videoSessionParameters);
+ DE_UNREF(pUpdateInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdBeginVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pBeginInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdEndVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pEndCodingInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdControlVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pCodingControlInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdDecodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pFrameInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pFrameInfo);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdEncodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo)
+{
+ DE_UNREF(commandBuffer);
+ DE_UNREF(pEncodeInfo);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getMemoryZirconHandleFUCHSIA (VkDevice device, const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle)
+{
+ DE_UNREF(device);
+ DE_UNREF(pGetZirconHandleInfo);
+ DE_UNREF(pZirconHandle);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getMemoryZirconHandlePropertiesFUCHSIA (VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, pt::zx_handle_t zirconHandle, VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties)
+{
+ DE_UNREF(device);
+ DE_UNREF(handleType);
+ DE_UNREF(zirconHandle);
+ DE_UNREF(pMemoryZirconHandleProperties);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL importSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo)
+{
+ DE_UNREF(device);
+ DE_UNREF(pImportSemaphoreZirconHandleInfo);
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle)
+{
+ DE_UNREF(device);
+ DE_UNREF(pGetZirconHandleInfo);
+ DE_UNREF(pZirconHandle);
+ return VK_SUCCESS;
+}
+
VKAPI_ATTR VkBool32 VKAPI_CALL getPhysicalDeviceWaylandPresentationSupportKHR (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::WaylandDisplayPtr display)
{
DE_UNREF(physicalDevice);
@@ -3020,6 +3195,8 @@
VK_NULL_FUNC_ENTRY(vkAcquireWinrtDisplayNV, acquireWinrtDisplayNV),
VK_NULL_FUNC_ENTRY(vkGetWinrtDisplayNV, getWinrtDisplayNV),
VK_NULL_FUNC_ENTRY(vkCreateAndroidSurfaceKHR, createAndroidSurfaceKHR),
+ VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceVideoCapabilitiesKHR, getPhysicalDeviceVideoCapabilitiesKHR),
+ VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceVideoFormatPropertiesKHR, getPhysicalDeviceVideoFormatPropertiesKHR),
VK_NULL_FUNC_ENTRY(vkCreateImagePipeSurfaceFUCHSIA, createImagePipeSurfaceFUCHSIA),
VK_NULL_FUNC_ENTRY(vkCreateStreamDescriptorSurfaceGGP, createStreamDescriptorSurfaceGGP),
VK_NULL_FUNC_ENTRY(vkCreateIOSSurfaceMVK, createIOSSurfaceMVK),
@@ -3363,6 +3540,13 @@
VK_NULL_FUNC_ENTRY(vkSetPrivateDataEXT, setPrivateDataEXT),
VK_NULL_FUNC_ENTRY(vkGetPrivateDataEXT, getPrivateDataEXT),
VK_NULL_FUNC_ENTRY(vkCmdSetFragmentShadingRateEnumNV, cmdSetFragmentShadingRateEnumNV),
+ VK_NULL_FUNC_ENTRY(vkCmdSetVertexInputEXT, cmdSetVertexInputEXT),
+ VK_NULL_FUNC_ENTRY(vkCmdSetPatchControlPointsEXT, cmdSetPatchControlPointsEXT),
+ VK_NULL_FUNC_ENTRY(vkCmdSetRasterizerDiscardEnableEXT, cmdSetRasterizerDiscardEnableEXT),
+ VK_NULL_FUNC_ENTRY(vkCmdSetDepthBiasEnableEXT, cmdSetDepthBiasEnableEXT),
+ VK_NULL_FUNC_ENTRY(vkCmdSetLogicOpEXT, cmdSetLogicOpEXT),
+ VK_NULL_FUNC_ENTRY(vkCmdSetPrimitiveRestartEnableEXT, cmdSetPrimitiveRestartEnableEXT),
+ VK_NULL_FUNC_ENTRY(vkCmdSetColorWriteEnableEXT, cmdSetColorWriteEnableEXT),
VK_NULL_FUNC_ENTRY(vkCreateAccelerationStructureKHR, createAccelerationStructureKHR),
VK_NULL_FUNC_ENTRY(vkDestroyAccelerationStructureKHR, destroyAccelerationStructureKHR),
VK_NULL_FUNC_ENTRY(vkCmdBuildAccelerationStructuresKHR, cmdBuildAccelerationStructuresKHR),
@@ -3387,6 +3571,22 @@
VK_NULL_FUNC_ENTRY(vkCmdSetRayTracingPipelineStackSizeKHR, cmdSetRayTracingPipelineStackSizeKHR),
VK_NULL_FUNC_ENTRY(vkGetAndroidHardwareBufferPropertiesANDROID, getAndroidHardwareBufferPropertiesANDROID),
VK_NULL_FUNC_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID, getMemoryAndroidHardwareBufferANDROID),
+ VK_NULL_FUNC_ENTRY(vkCreateVideoSessionKHR, createVideoSessionKHR),
+ VK_NULL_FUNC_ENTRY(vkDestroyVideoSessionKHR, destroyVideoSessionKHR),
+ VK_NULL_FUNC_ENTRY(vkGetVideoSessionMemoryRequirementsKHR, getVideoSessionMemoryRequirementsKHR),
+ VK_NULL_FUNC_ENTRY(vkBindVideoSessionMemoryKHR, bindVideoSessionMemoryKHR),
+ VK_NULL_FUNC_ENTRY(vkCreateVideoSessionParametersKHR, createVideoSessionParametersKHR),
+ VK_NULL_FUNC_ENTRY(vkUpdateVideoSessionParametersKHR, updateVideoSessionParametersKHR),
+ VK_NULL_FUNC_ENTRY(vkDestroyVideoSessionParametersKHR, destroyVideoSessionParametersKHR),
+ VK_NULL_FUNC_ENTRY(vkCmdBeginVideoCodingKHR, cmdBeginVideoCodingKHR),
+ VK_NULL_FUNC_ENTRY(vkCmdEndVideoCodingKHR, cmdEndVideoCodingKHR),
+ VK_NULL_FUNC_ENTRY(vkCmdControlVideoCodingKHR, cmdControlVideoCodingKHR),
+ VK_NULL_FUNC_ENTRY(vkCmdDecodeVideoKHR, cmdDecodeVideoKHR),
+ VK_NULL_FUNC_ENTRY(vkCmdEncodeVideoKHR, cmdEncodeVideoKHR),
+ VK_NULL_FUNC_ENTRY(vkGetMemoryZirconHandleFUCHSIA, getMemoryZirconHandleFUCHSIA),
+ VK_NULL_FUNC_ENTRY(vkGetMemoryZirconHandlePropertiesFUCHSIA, getMemoryZirconHandlePropertiesFUCHSIA),
+ VK_NULL_FUNC_ENTRY(vkImportSemaphoreZirconHandleFUCHSIA, importSemaphoreZirconHandleFUCHSIA),
+ VK_NULL_FUNC_ENTRY(vkGetSemaphoreZirconHandleFUCHSIA, getSemaphoreZirconHandleFUCHSIA),
VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleKHR, getMemoryWin32HandleKHR),
VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandlePropertiesKHR, getMemoryWin32HandlePropertiesKHR),
VK_NULL_FUNC_ENTRY(vkImportSemaphoreWin32HandleKHR, importSemaphoreWin32HandleKHR),
diff --git a/external/vulkancts/framework/vulkan/vkObjTypeImpl.inl b/external/vulkancts/framework/vulkan/vkObjTypeImpl.inl
index 7ab87b9..10bc0ed 100644
--- a/external/vulkancts/framework/vulkan/vkObjTypeImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkObjTypeImpl.inl
@@ -44,4 +44,6 @@
template<> inline VkObjectType getObjectType<VkIndirectCommandsLayoutNV> (void) { return VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV; }
template<> inline VkObjectType getObjectType<VkPrivateDataSlotEXT> (void) { return VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT; }
template<> inline VkObjectType getObjectType<VkAccelerationStructureKHR> (void) { return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR; }
+template<> inline VkObjectType getObjectType<VkVideoSessionKHR> (void) { return VK_OBJECT_TYPE_VIDEO_SESSION_KHR; }
+template<> inline VkObjectType getObjectType<VkVideoSessionParametersKHR> (void) { return VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR; }
}
diff --git a/external/vulkancts/framework/vulkan/vkObjUtil.cpp b/external/vulkancts/framework/vulkan/vkObjUtil.cpp
index 3c14334..6203a31 100644
--- a/external/vulkancts/framework/vulkan/vkObjUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkObjUtil.cpp
@@ -29,9 +29,42 @@
#include "tcuVector.hpp"
+#include "deSTLUtil.hpp"
+
namespace vk
{
+Move<VkPipeline> makeComputePipeline (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkPipelineLayout pipelineLayout,
+ const VkPipelineCreateFlags pipelineFlags,
+ const VkShaderModule shaderModule,
+ const VkPipelineShaderStageCreateFlags shaderFlags,
+ const VkSpecializationInfo* specializationInfo)
+{
+ const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ shaderFlags, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ shaderModule, // VkShaderModule module;
+ "main", // const char* pName;
+ specializationInfo, // const VkSpecializationInfo* pSpecializationInfo;
+ };
+ const VkComputePipelineCreateInfo pipelineCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ pipelineFlags, // VkPipelineCreateFlags flags;
+ pipelineShaderStageParams, // VkPipelineShaderStageCreateInfo stage;
+ pipelineLayout, // VkPipelineLayout layout;
+ DE_NULL, // VkPipeline basePipelineHandle;
+ 0, // deInt32 basePipelineIndex;
+ };
+ return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo);
+}
+
Move<VkPipeline> makeGraphicsPipeline(const DeviceInterface& vk,
const VkDevice device,
const VkPipelineLayout pipelineLayout,
@@ -545,6 +578,28 @@
return bufferCreateInfo;
}
+VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize size,
+ const VkBufferUsageFlags usage,
+ const std::vector<deUint32>& queueFamilyIndices)
+{
+ const deUint32 queueFamilyIndexCount = static_cast<deUint32>(queueFamilyIndices.size());
+ const deUint32* pQueueFamilyIndices = de::dataSafe(queueFamilyIndices);
+ const VkBufferCreateInfo bufferCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (VkBufferCreateFlags)0, // VkBufferCreateFlags flags;
+ size, // VkDeviceSize size;
+ usage, // VkBufferUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ queueFamilyIndexCount, // deUint32 queueFamilyIndexCount;
+ pQueueFamilyIndices, // const deUint32* pQueueFamilyIndices;
+ };
+
+ return bufferCreateInfo;
+}
+
+
Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk,
const VkDevice device,
const VkDescriptorSetLayout descriptorSetLayout)
@@ -552,6 +607,19 @@
return makePipelineLayout(vk, device, (descriptorSetLayout == DE_NULL) ? 0u : 1u, &descriptorSetLayout);
}
+Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk,
+ const VkDevice device,
+ const std::vector<vk::Move<VkDescriptorSetLayout>> &descriptorSetLayouts)
+{
+ // Create a list of descriptor sets without move pointers.
+ std::vector<vk::VkDescriptorSetLayout> descriptorSetLayoutsUnWrapped;
+ for (const auto& descriptorSetLayout : descriptorSetLayouts)
+ {
+ descriptorSetLayoutsUnWrapped.push_back(descriptorSetLayout.get());
+ }
+ return vk::makePipelineLayout(vk, device, static_cast<deUint32>(descriptorSetLayoutsUnWrapped.size()), descriptorSetLayoutsUnWrapped.data());
+}
+
Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk,
const VkDevice device,
const deUint32 setLayoutCount,
diff --git a/external/vulkancts/framework/vulkan/vkObjUtil.hpp b/external/vulkancts/framework/vulkan/vkObjUtil.hpp
index ac6396c..19b51ef 100644
--- a/external/vulkancts/framework/vulkan/vkObjUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkObjUtil.hpp
@@ -29,6 +29,13 @@
namespace vk
{
+Move<VkPipeline> makeComputePipeline (const DeviceInterface& vk,
+ const VkDevice device,
+ const VkPipelineLayout pipelineLayout,
+ const VkPipelineCreateFlags pipelineFlags,
+ const VkShaderModule shaderModule,
+ const VkPipelineShaderStageCreateFlags shaderFlags,
+ const VkSpecializationInfo* specializationInfo);
Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk,
const VkDevice device,
@@ -88,7 +95,7 @@
const VkImageViewType imageViewType,
const VkFormat format,
const VkImageSubresourceRange subresourceRange,
- const vk::VkImageViewUsageCreateInfo* imageUsageCreateInfoKHR = DE_NULL);
+ const vk::VkImageViewUsageCreateInfo* imageUsageCreateInfo = DE_NULL);
Move<VkBufferView> makeBufferView (const DeviceInterface& vk,
const VkDevice vkDevice,
@@ -106,10 +113,18 @@
VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize size,
const VkBufferUsageFlags usage);
+VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize size,
+ const VkBufferUsageFlags usage,
+ const std::vector<deUint32>& queueFamilyIndices);
+
Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk,
const VkDevice device,
const VkDescriptorSetLayout descriptorSetLayout = DE_NULL);
+Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk,
+ const VkDevice device,
+ const std::vector<vk::Move<VkDescriptorSetLayout>> &descriptorSetLayouts);
+
Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk,
const VkDevice device,
const deUint32 setLayoutCount,
diff --git a/external/vulkancts/framework/vulkan/vkPrograms.cpp b/external/vulkancts/framework/vulkan/vkPrograms.cpp
index 6444570..2e41282 100644
--- a/external/vulkancts/framework/vulkan/vkPrograms.cpp
+++ b/external/vulkancts/framework/vulkan/vkPrograms.cpp
@@ -60,6 +60,7 @@
ProgramBinary::ProgramBinary (ProgramFormat format, size_t binarySize, const deUint8* binary)
: m_format (format)
, m_binary (binary, binary+binarySize)
+ , m_used (false)
{
}
@@ -697,6 +698,8 @@
(const deUint32*)binary.getBinary(),
};
+ binary.setUsed();
+
return createShaderModule(deviceInterface, device, &shaderModuleInfo);
}
else
@@ -751,7 +754,7 @@
{
vk::SpirvVersion result = vk::SPIRV_VERSION_LAST;
- deUint32 vulkanVersionMajorMinor = VK_MAKE_VERSION(VK_VERSION_MAJOR(vulkanVersion), VK_VERSION_MINOR(vulkanVersion), 0);
+ deUint32 vulkanVersionMajorMinor = VK_MAKE_VERSION(VK_API_VERSION_MAJOR(vulkanVersion), VK_API_VERSION_MINOR(vulkanVersion), 0);
if (vulkanVersionMajorMinor == VK_API_VERSION_1_0)
result = vk::SPIRV_VERSION_1_0;
else if (vulkanVersionMajorMinor == VK_API_VERSION_1_1)
diff --git a/external/vulkancts/framework/vulkan/vkPrograms.hpp b/external/vulkancts/framework/vulkan/vkPrograms.hpp
index fe43469..9b8f344 100644
--- a/external/vulkancts/framework/vulkan/vkPrograms.hpp
+++ b/external/vulkancts/framework/vulkan/vkPrograms.hpp
@@ -53,9 +53,13 @@
size_t getSize (void) const { return m_binary.size(); }
const deUint8* getBinary (void) const { return m_binary.empty() ? DE_NULL : &m_binary[0]; }
+ inline void setUsed (void) const { m_used = true; }
+ inline bool getUsed (void) const { return m_used; }
+
private:
const ProgramFormat m_format;
const std::vector<deUint8> m_binary;
+ mutable bool m_used;
};
struct BinaryBuildOptions
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
index 957b6af..3926e5a 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp
@@ -104,7 +104,7 @@
properties.resize(numDeviceGroups);
for (deUint32 i = 0; i < numDeviceGroups; i++)
{
- properties[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR;
+ properties[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
properties[i].pNext = DE_NULL;
}
VK_CHECK(vk.enumeratePhysicalDeviceGroups(instance, &numDeviceGroups, &properties[0]));
@@ -331,14 +331,14 @@
deMemset(&planeInfo, 0, sizeof(planeInfo));
deMemset(&reqs, 0, sizeof(reqs));
- coreInfo.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR;
+ coreInfo.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2;
coreInfo.pNext = &planeInfo;
coreInfo.image = image;
- planeInfo.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR;
+ planeInfo.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO;
planeInfo.planeAspect = planeAspect;
- reqs.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR;
+ reqs.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
vkd.getImageMemoryRequirements2(device, &coreInfo, &reqs);
@@ -525,6 +525,24 @@
return const_cast<void*>(findStructureInChain(const_cast<const void*>(first), type));
}
+void appendStructurePtrToVulkanChain (const void** chainHead, const void* structurePtr)
+{
+ struct StructureBase
+ {
+ VkStructureType sType;
+ const void* pNext;
+ };
+
+ while (*chainHead != DE_NULL)
+ {
+ StructureBase* ptr = (StructureBase*)(*chainHead);
+
+ chainHead = &(ptr->pNext);
+ }
+
+ (*chainHead) = structurePtr;
+}
+
// getStructureType<T> implementations
#include "vkGetStructureTypeImpl.inl"
diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
index 0a3ffeb..28bb56d 100644
--- a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp
@@ -232,6 +232,9 @@
const VkPhysicalDevice m_physicalDevice;
};
+// Walks through chain to find empty pNext and assigns what to found pNext
+void appendStructurePtrToVulkanChain (const void** chainHead, const void* structurePtr);
+
namespace ValidateQueryBits
{
diff --git a/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp b/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp
index e5601bf..d3d5a59 100644
--- a/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkRayTracingUtil.cpp
@@ -36,6 +36,7 @@
namespace vk
{
+
struct DeferredThreadParams
{
const DeviceInterface& vk;
@@ -572,6 +573,18 @@
return m_storageSize;
}
+deUint64 SerialStorage::getDeserializedSize ()
+{
+ deUint64 result = 0;
+ const deUint8* startPtr = static_cast<deUint8*>(m_buffer->getAllocation().getHostPtr());
+
+ DE_ASSERT(sizeof(result) == DESERIALIZED_SIZE_SIZE);
+
+ deMemcpy(&result, startPtr + DESERIALIZED_SIZE_OFFSET, sizeof(result));
+
+ return result;
+}
+
BottomLevelAccelerationStructure::~BottomLevelAccelerationStructure ()
{
}
@@ -597,7 +610,8 @@
addGeometry(geometryData, triangles, geometryFlags);
}
-void BottomLevelAccelerationStructure::setDefaultGeometryData (const VkShaderStageFlagBits testStage)
+void BottomLevelAccelerationStructure::setDefaultGeometryData (const VkShaderStageFlagBits testStage,
+ const VkGeometryFlagsKHR geometryFlags)
{
bool trianglesData = false;
float z = 0.0f;
@@ -635,7 +649,7 @@
setGeometryCount(1u);
- addGeometry(geometryData, trianglesData);
+ addGeometry(geometryData, trianglesData, geometryFlags);
}
void BottomLevelAccelerationStructure::setGeometryCount (const size_t geometryCount)
@@ -1391,8 +1405,8 @@
VkDeviceAddress deviceAddress )
{
DE_ASSERT(storage != NULL);
- DE_ASSERT(storage->getStorageSize() != 0u);
- create(vk, device, allocator, storage->getStorageSize(), deviceAddress);
+ DE_ASSERT(storage->getStorageSize() >= SerialStorage::SERIAL_STORAGE_SIZE_MIN);
+ create(vk, device, allocator, storage->getDeserializedSize(), deviceAddress);
deserialize(vk, device, cmdBuffer, storage);
}
@@ -1468,8 +1482,8 @@
VkDeviceAddress deviceAddress)
{
DE_ASSERT(storage != NULL);
- DE_ASSERT(storage->getStorageSize() != 0u);
- create(vk, device, allocator, storage->getStorageSize(), deviceAddress);
+ DE_ASSERT(storage->getStorageSize() >= SerialStorage::SERIAL_STORAGE_SIZE_MIN);
+ create(vk, device, allocator, storage->getDeserializedSize(), deviceAddress);
deserialize(vk, device, cmdBuffer, storage);
}
diff --git a/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp b/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp
index 876657d..f4f83df 100644
--- a/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkRayTracingUtil.hpp
@@ -458,6 +458,16 @@
class SerialStorage
{
public:
+ enum
+ {
+ DE_SERIALIZED_FIELD(DRIVER_UUID, VK_UUID_SIZE), // VK_UUID_SIZE bytes of data matching VkPhysicalDeviceIDProperties::driverUUID
+ DE_SERIALIZED_FIELD(COMPAT_UUID, VK_UUID_SIZE), // VK_UUID_SIZE bytes of data identifying the compatibility for comparison using vkGetDeviceAccelerationStructureCompatibilityKHR
+ DE_SERIALIZED_FIELD(SERIALIZED_SIZE, sizeof(deUint64)), // A 64-bit integer of the total size matching the value queried using VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
+ DE_SERIALIZED_FIELD(DESERIALIZED_SIZE, sizeof(deUint64)), // A 64-bit integer of the deserialized size to be passed in to VkAccelerationStructureCreateInfoKHR::size
+ DE_SERIALIZED_FIELD(HANDLES_COUNT, sizeof(deUint64)), // A 64-bit integer of the count of the number of acceleration structure handles following. This will be zero for a bottom-level acceleration structure.
+ SERIAL_STORAGE_SIZE_MIN
+ };
+
SerialStorage () = delete;
SerialStorage (const DeviceInterface& vk,
const VkDevice device,
@@ -470,6 +480,8 @@
VkDeviceOrHostAddressConstKHR getAddressConst (const DeviceInterface& vk,
const VkDevice device);
VkDeviceSize getStorageSize ();
+ deUint64 getDeserializedSize ();
+
protected:
VkAccelerationStructureBuildTypeKHR m_buildType;
de::MovePtr<BufferWithMemory> m_buffer;
@@ -489,7 +501,8 @@
virtual void setGeometryData (const std::vector<tcu::Vec3>& geometryData,
const bool triangles,
const VkGeometryFlagsKHR geometryFlags = 0u );
- virtual void setDefaultGeometryData (const VkShaderStageFlagBits testStage);
+ virtual void setDefaultGeometryData (const VkShaderStageFlagBits testStage,
+ const VkGeometryFlagsKHR geometryFlags = 0u );
virtual void setGeometryCount (const size_t geometryCount);
virtual void addGeometry (de::SharedPtr<RaytracedGeometryBase>& raytracedGeometry);
virtual void addGeometry (const std::vector<tcu::Vec3>& geometryData,
diff --git a/external/vulkancts/framework/vulkan/vkRefUtil.inl b/external/vulkancts/framework/vulkan/vkRefUtil.inl
index 68b4fab..5df489b 100644
--- a/external/vulkancts/framework/vulkan/vkRefUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkRefUtil.inl
@@ -37,6 +37,8 @@
Move<VkPrivateDataSlotEXT> createPrivateDataSlotEXT (const DeviceInterface& vk, VkDevice device, const VkPrivateDataSlotCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkAccelerationStructureKHR> createAccelerationStructureKHR (const DeviceInterface& vk, VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSurfaceKHR> createAndroidSurfaceKHR (const InstanceInterface& vk, VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
+Move<VkVideoSessionKHR> createVideoSessionKHR (const DeviceInterface& vk, VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
+Move<VkVideoSessionParametersKHR> createVideoSessionParametersKHR (const DeviceInterface& vk, VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSurfaceKHR> createImagePipeSurfaceFUCHSIA (const InstanceInterface& vk, VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSurfaceKHR> createStreamDescriptorSurfaceGGP (const InstanceInterface& vk, VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
Move<VkSurfaceKHR> createIOSSurfaceMVK (const InstanceInterface& vk, VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator = DE_NULL);
diff --git a/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl b/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl
index bbdef34..74f4ccf 100644
--- a/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkRefUtilImpl.inl
@@ -172,6 +172,18 @@
m_deviceIface->destroyAccelerationStructureKHR(m_device, obj, m_allocator);
}
+template<>
+void Deleter<VkVideoSessionKHR>::operator() (VkVideoSessionKHR obj) const
+{
+ m_deviceIface->destroyVideoSessionKHR(m_device, obj, m_allocator);
+}
+
+template<>
+void Deleter<VkVideoSessionParametersKHR>::operator() (VkVideoSessionParametersKHR obj) const
+{
+ m_deviceIface->destroyVideoSessionParametersKHR(m_device, obj, m_allocator);
+}
+
} // refdetails
Move<VkInstance> createInstance (const PlatformInterface& vk, const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator)
@@ -426,6 +438,20 @@
return Move<VkSurfaceKHR>(check<VkSurfaceKHR>(object), Deleter<VkSurfaceKHR>(vk, instance, pAllocator));
}
+Move<VkVideoSessionKHR> createVideoSessionKHR (const DeviceInterface& vk, VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator)
+{
+ VkVideoSessionKHR object = 0;
+ VK_CHECK(vk.createVideoSessionKHR(device, pCreateInfo, pAllocator, &object));
+ return Move<VkVideoSessionKHR>(check<VkVideoSessionKHR>(object), Deleter<VkVideoSessionKHR>(vk, device, pAllocator));
+}
+
+Move<VkVideoSessionParametersKHR> createVideoSessionParametersKHR (const DeviceInterface& vk, VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator)
+{
+ VkVideoSessionParametersKHR object = 0;
+ VK_CHECK(vk.createVideoSessionParametersKHR(device, pCreateInfo, pAllocator, &object));
+ return Move<VkVideoSessionParametersKHR>(check<VkVideoSessionParametersKHR>(object), Deleter<VkVideoSessionParametersKHR>(vk, device, pAllocator));
+}
+
Move<VkSurfaceKHR> createImagePipeSurfaceFUCHSIA (const InstanceInterface& vk, VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator)
{
VkSurfaceKHR object = 0;
diff --git a/external/vulkancts/framework/vulkan/vkStrUtil.inl b/external/vulkancts/framework/vulkan/vkStrUtil.inl
index 1c1ec1d..ae78d86 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtil.inl
@@ -97,6 +97,23 @@
const char* getAccelerationStructureBuildTypeKHRName (VkAccelerationStructureBuildTypeKHR value);
const char* getAccelerationStructureCompatibilityKHRName (VkAccelerationStructureCompatibilityKHR value);
const char* getShaderGroupShaderKHRName (VkShaderGroupShaderKHR value);
+const char* getQueryResultStatusKHRName (VkQueryResultStatusKHR value);
+const char* getdVideoH264ChromaFormatIdcName (StdVideoH264ChromaFormatIdc value);
+const char* getdVideoH264ProfileIdcName (StdVideoH264ProfileIdc value);
+const char* getdVideoH264LevelName (StdVideoH264Level value);
+const char* getdVideoH264PocTypeName (StdVideoH264PocType value);
+const char* getdVideoH264AspectRatioIdcName (StdVideoH264AspectRatioIdc value);
+const char* getdVideoH264WeightedBiPredIdcName (StdVideoH264WeightedBiPredIdc value);
+const char* getdVideoH264ModificationOfPicNumsIdcName (StdVideoH264ModificationOfPicNumsIdc value);
+const char* getdVideoH264MemMgmtControlOpName (StdVideoH264MemMgmtControlOp value);
+const char* getdVideoH264CabacInitIdcName (StdVideoH264CabacInitIdc value);
+const char* getdVideoH264DisableDeblockingFilterIdcName (StdVideoH264DisableDeblockingFilterIdc value);
+const char* getdVideoH264PictureTypeName (StdVideoH264PictureType value);
+const char* getdVideoH264SliceTypeName (StdVideoH264SliceType value);
+const char* getdVideoH264NonVclNaluTypeName (StdVideoH264NonVclNaluType value);
+const char* getdVideoH265ChromaFormatIdcName (StdVideoH265ChromaFormatIdc value);
+const char* getdVideoH265ProfileIdcName (StdVideoH265ProfileIdc value);
+const char* getdVideoH265LevelName (StdVideoH265Level value);
const char* getFullScreenExclusiveEXTName (VkFullScreenExclusiveEXT value);
inline tcu::Format::Enum<VkResult> getResultStr (VkResult value) { return tcu::Format::Enum<VkResult>(getResultName, value); }
@@ -195,6 +212,23 @@
inline tcu::Format::Enum<VkAccelerationStructureBuildTypeKHR> getAccelerationStructureBuildTypeKHRStr (VkAccelerationStructureBuildTypeKHR value) { return tcu::Format::Enum<VkAccelerationStructureBuildTypeKHR>(getAccelerationStructureBuildTypeKHRName, value); }
inline tcu::Format::Enum<VkAccelerationStructureCompatibilityKHR> getAccelerationStructureCompatibilityKHRStr (VkAccelerationStructureCompatibilityKHR value) { return tcu::Format::Enum<VkAccelerationStructureCompatibilityKHR>(getAccelerationStructureCompatibilityKHRName, value); }
inline tcu::Format::Enum<VkShaderGroupShaderKHR> getShaderGroupShaderKHRStr (VkShaderGroupShaderKHR value) { return tcu::Format::Enum<VkShaderGroupShaderKHR>(getShaderGroupShaderKHRName, value); }
+inline tcu::Format::Enum<VkQueryResultStatusKHR> getQueryResultStatusKHRStr (VkQueryResultStatusKHR value) { return tcu::Format::Enum<VkQueryResultStatusKHR>(getQueryResultStatusKHRName, value); }
+inline tcu::Format::Enum<StdVideoH264ChromaFormatIdc> getdVideoH264ChromaFormatIdcStr (StdVideoH264ChromaFormatIdc value) { return tcu::Format::Enum<StdVideoH264ChromaFormatIdc>(getdVideoH264ChromaFormatIdcName, value); }
+inline tcu::Format::Enum<StdVideoH264ProfileIdc> getdVideoH264ProfileIdcStr (StdVideoH264ProfileIdc value) { return tcu::Format::Enum<StdVideoH264ProfileIdc>(getdVideoH264ProfileIdcName, value); }
+inline tcu::Format::Enum<StdVideoH264Level> getdVideoH264LevelStr (StdVideoH264Level value) { return tcu::Format::Enum<StdVideoH264Level>(getdVideoH264LevelName, value); }
+inline tcu::Format::Enum<StdVideoH264PocType> getdVideoH264PocTypeStr (StdVideoH264PocType value) { return tcu::Format::Enum<StdVideoH264PocType>(getdVideoH264PocTypeName, value); }
+inline tcu::Format::Enum<StdVideoH264AspectRatioIdc> getdVideoH264AspectRatioIdcStr (StdVideoH264AspectRatioIdc value) { return tcu::Format::Enum<StdVideoH264AspectRatioIdc>(getdVideoH264AspectRatioIdcName, value); }
+inline tcu::Format::Enum<StdVideoH264WeightedBiPredIdc> getdVideoH264WeightedBiPredIdcStr (StdVideoH264WeightedBiPredIdc value) { return tcu::Format::Enum<StdVideoH264WeightedBiPredIdc>(getdVideoH264WeightedBiPredIdcName, value); }
+inline tcu::Format::Enum<StdVideoH264ModificationOfPicNumsIdc> getdVideoH264ModificationOfPicNumsIdcStr (StdVideoH264ModificationOfPicNumsIdc value) { return tcu::Format::Enum<StdVideoH264ModificationOfPicNumsIdc>(getdVideoH264ModificationOfPicNumsIdcName, value); }
+inline tcu::Format::Enum<StdVideoH264MemMgmtControlOp> getdVideoH264MemMgmtControlOpStr (StdVideoH264MemMgmtControlOp value) { return tcu::Format::Enum<StdVideoH264MemMgmtControlOp>(getdVideoH264MemMgmtControlOpName, value); }
+inline tcu::Format::Enum<StdVideoH264CabacInitIdc> getdVideoH264CabacInitIdcStr (StdVideoH264CabacInitIdc value) { return tcu::Format::Enum<StdVideoH264CabacInitIdc>(getdVideoH264CabacInitIdcName, value); }
+inline tcu::Format::Enum<StdVideoH264DisableDeblockingFilterIdc> getdVideoH264DisableDeblockingFilterIdcStr (StdVideoH264DisableDeblockingFilterIdc value) { return tcu::Format::Enum<StdVideoH264DisableDeblockingFilterIdc>(getdVideoH264DisableDeblockingFilterIdcName, value); }
+inline tcu::Format::Enum<StdVideoH264PictureType> getdVideoH264PictureTypeStr (StdVideoH264PictureType value) { return tcu::Format::Enum<StdVideoH264PictureType>(getdVideoH264PictureTypeName, value); }
+inline tcu::Format::Enum<StdVideoH264SliceType> getdVideoH264SliceTypeStr (StdVideoH264SliceType value) { return tcu::Format::Enum<StdVideoH264SliceType>(getdVideoH264SliceTypeName, value); }
+inline tcu::Format::Enum<StdVideoH264NonVclNaluType> getdVideoH264NonVclNaluTypeStr (StdVideoH264NonVclNaluType value) { return tcu::Format::Enum<StdVideoH264NonVclNaluType>(getdVideoH264NonVclNaluTypeName, value); }
+inline tcu::Format::Enum<StdVideoH265ChromaFormatIdc> getdVideoH265ChromaFormatIdcStr (StdVideoH265ChromaFormatIdc value) { return tcu::Format::Enum<StdVideoH265ChromaFormatIdc>(getdVideoH265ChromaFormatIdcName, value); }
+inline tcu::Format::Enum<StdVideoH265ProfileIdc> getdVideoH265ProfileIdcStr (StdVideoH265ProfileIdc value) { return tcu::Format::Enum<StdVideoH265ProfileIdc>(getdVideoH265ProfileIdcName, value); }
+inline tcu::Format::Enum<StdVideoH265Level> getdVideoH265LevelStr (StdVideoH265Level value) { return tcu::Format::Enum<StdVideoH265Level>(getdVideoH265LevelName, value); }
inline tcu::Format::Enum<VkFullScreenExclusiveEXT> getFullScreenExclusiveEXTStr (VkFullScreenExclusiveEXT value) { return tcu::Format::Enum<VkFullScreenExclusiveEXT>(getFullScreenExclusiveEXTName, value); }
inline std::ostream& operator<< (std::ostream& s, VkResult value) { return s << getResultStr(value); }
@@ -293,6 +327,23 @@
inline std::ostream& operator<< (std::ostream& s, VkAccelerationStructureBuildTypeKHR value) { return s << getAccelerationStructureBuildTypeKHRStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkAccelerationStructureCompatibilityKHR value) { return s << getAccelerationStructureCompatibilityKHRStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkShaderGroupShaderKHR value) { return s << getShaderGroupShaderKHRStr(value); }
+inline std::ostream& operator<< (std::ostream& s, VkQueryResultStatusKHR value) { return s << getQueryResultStatusKHRStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264ChromaFormatIdc value) { return s << getdVideoH264ChromaFormatIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264ProfileIdc value) { return s << getdVideoH264ProfileIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264Level value) { return s << getdVideoH264LevelStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264PocType value) { return s << getdVideoH264PocTypeStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264AspectRatioIdc value) { return s << getdVideoH264AspectRatioIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264WeightedBiPredIdc value) { return s << getdVideoH264WeightedBiPredIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264ModificationOfPicNumsIdc value) { return s << getdVideoH264ModificationOfPicNumsIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264MemMgmtControlOp value) { return s << getdVideoH264MemMgmtControlOpStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264CabacInitIdc value) { return s << getdVideoH264CabacInitIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264DisableDeblockingFilterIdc value) { return s << getdVideoH264DisableDeblockingFilterIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264PictureType value) { return s << getdVideoH264PictureTypeStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264SliceType value) { return s << getdVideoH264SliceTypeStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH264NonVclNaluType value) { return s << getdVideoH264NonVclNaluTypeStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH265ChromaFormatIdc value) { return s << getdVideoH265ChromaFormatIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH265ProfileIdc value) { return s << getdVideoH265ProfileIdcStr(value); }
+inline std::ostream& operator<< (std::ostream& s, StdVideoH265Level value) { return s << getdVideoH265LevelStr(value); }
inline std::ostream& operator<< (std::ostream& s, VkFullScreenExclusiveEXT value) { return s << getFullScreenExclusiveEXTStr(value); }
tcu::Format::Bitfield<32> getAccessFlagsStr (VkAccessFlags value);
@@ -377,6 +428,22 @@
tcu::Format::Bitfield<32> getPrivateDataSlotCreateFlagsEXTStr (VkPrivateDataSlotCreateFlagsEXT value);
tcu::Format::Bitfield<32> getDeviceDiagnosticsConfigFlagsNVStr (VkDeviceDiagnosticsConfigFlagsNV value);
tcu::Format::Bitfield<32> getAccelerationStructureCreateFlagsKHRStr (VkAccelerationStructureCreateFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoCodecOperationFlagsKHRStr (VkVideoCodecOperationFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoChromaSubsamplingFlagsKHRStr (VkVideoChromaSubsamplingFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoComponentBitDepthFlagsKHRStr (VkVideoComponentBitDepthFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoCapabilitiesFlagsKHRStr (VkVideoCapabilitiesFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoSessionCreateFlagsKHRStr (VkVideoSessionCreateFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoCodingControlFlagsKHRStr (VkVideoCodingControlFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoCodingQualityPresetFlagsKHRStr (VkVideoCodingQualityPresetFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoDecodeFlagsKHRStr (VkVideoDecodeFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoEncodeFlagsKHRStr (VkVideoEncodeFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoEncodeRateControlFlagsKHRStr (VkVideoEncodeRateControlFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoEncodeRateControlModeFlagsKHRStr (VkVideoEncodeRateControlModeFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoEncodeH264CapabilitiesFlagsEXTStr (VkVideoEncodeH264CapabilitiesFlagsEXT value);
+tcu::Format::Bitfield<32> getVideoEncodeH264InputModeFlagsEXTStr (VkVideoEncodeH264InputModeFlagsEXT value);
+tcu::Format::Bitfield<32> getVideoEncodeH264OutputModeFlagsEXTStr (VkVideoEncodeH264OutputModeFlagsEXT value);
+tcu::Format::Bitfield<32> getVideoEncodeH264CreateFlagsEXTStr (VkVideoEncodeH264CreateFlagsEXT value);
+tcu::Format::Bitfield<32> getVideoDecodeH264FieldLayoutFlagsEXTStr (VkVideoDecodeH264FieldLayoutFlagsEXT value);
tcu::Format::Bitfield<32> getInstanceCreateFlagsStr (VkInstanceCreateFlags value);
tcu::Format::Bitfield<32> getDeviceCreateFlagsStr (VkDeviceCreateFlags value);
tcu::Format::Bitfield<32> getMemoryMapFlagsStr (VkMemoryMapFlags value);
@@ -412,6 +479,10 @@
tcu::Format::Bitfield<32> getHeadlessSurfaceCreateFlagsEXTStr (VkHeadlessSurfaceCreateFlagsEXT value);
tcu::Format::Bitfield<32> getDeviceMemoryReportFlagsEXTStr (VkDeviceMemoryReportFlagsEXT value);
tcu::Format::Bitfield<32> getAndroidSurfaceCreateFlagsKHRStr (VkAndroidSurfaceCreateFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoBeginCodingFlagsKHRStr (VkVideoBeginCodingFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoEndCodingFlagsKHRStr (VkVideoEndCodingFlagsKHR value);
+tcu::Format::Bitfield<32> getVideoDecodeH264CreateFlagsEXTStr (VkVideoDecodeH264CreateFlagsEXT value);
+tcu::Format::Bitfield<32> getVideoDecodeH265CreateFlagsEXTStr (VkVideoDecodeH265CreateFlagsEXT value);
tcu::Format::Bitfield<32> getImagePipeSurfaceCreateFlagsFUCHSIAStr (VkImagePipeSurfaceCreateFlagsFUCHSIA value);
tcu::Format::Bitfield<32> getStreamDescriptorSurfaceCreateFlagsGGPStr (VkStreamDescriptorSurfaceCreateFlagsGGP value);
tcu::Format::Bitfield<32> getIOSSurfaceCreateFlagsMVKStr (VkIOSSurfaceCreateFlagsMVK value);
@@ -926,6 +997,8 @@
std::ostream& operator<< (std::ostream& s, const VkIndirectCommandsLayoutCreateInfoNV& value);
std::ostream& operator<< (std::ostream& s, const VkGeneratedCommandsInfoNV& value);
std::ostream& operator<< (std::ostream& s, const VkGeneratedCommandsMemoryRequirementsInfoNV& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceInheritedViewportScissorFeaturesNV& value);
+std::ostream& operator<< (std::ostream& s, const VkCommandBufferInheritanceViewportScissorInfoNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkRenderPassTransformBeginInfoQCOM& value);
@@ -947,6 +1020,7 @@
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV& value);
std::ostream& operator<< (std::ostream& s, const VkPipelineFragmentShadingRateEnumStateCreateInfoNV& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT& value);
std::ostream& operator<< (std::ostream& s, const VkCopyCommandTransformInfoQCOM& value);
@@ -955,6 +1029,12 @@
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE& value);
std::ostream& operator<< (std::ostream& s, const VkMutableDescriptorTypeListVALVE& value);
std::ostream& operator<< (std::ostream& s, const VkMutableDescriptorTypeCreateInfoVALVE& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVertexInputBindingDescription2EXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVertexInputAttributeDescription2EXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceColorWriteEnableFeaturesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkPipelineColorWriteCreateInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkDeviceOrHostAddressKHR& value);
std::ostream& operator<< (std::ostream& s, const VkDeviceOrHostAddressConstKHR& value);
std::ostream& operator<< (std::ostream& s, const VkAccelerationStructureBuildRangeInfoKHR& value);
@@ -989,9 +1069,98 @@
std::ostream& operator<< (std::ostream& s, const VkImportAndroidHardwareBufferInfoANDROID& value);
std::ostream& operator<< (std::ostream& s, const VkMemoryGetAndroidHardwareBufferInfoANDROID& value);
std::ostream& operator<< (std::ostream& s, const VkExternalFormatANDROID& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoQueueFamilyProperties2KHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoProfileKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoProfilesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoCapabilitiesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVideoFormatInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoFormatPropertiesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoPictureResourceKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoReferenceSlotKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoGetMemoryPropertiesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoBindMemoryKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoSessionCreateInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoSessionParametersCreateInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoSessionParametersUpdateInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoBeginCodingInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEndCodingInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoCodingControlInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeInfoKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePortabilitySubsetFeaturesKHR& value);
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePortabilitySubsetPropertiesKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeRateControlInfoKHR& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SpsVuiFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264HrdParameters& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SequenceParameterSetVui& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SpsFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264ScalingLists& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SequenceParameterSet& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264PpsFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH264PictureParameterSet& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264SliceHeaderFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264PictureInfoFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefMgmtFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefListModEntry& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefPicMarkingEntry& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefMemMgmtCtrlOperations& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264PictureInfo& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264SliceHeader& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264CapabilitiesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264SessionCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264SessionParametersAddInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264SessionParametersCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264DpbSlotInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264NaluSliceEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264VclFrameInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264EmitPictureParametersEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264ProfileEXT& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264PictureInfoFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264PictureInfo& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264ReferenceInfoFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264ReferenceInfo& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264MvcElementFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264MvcElement& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264Mvc& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264ProfileEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264CapabilitiesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersAddInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264PictureInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264MvcEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264DpbSlotInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265DecPicBufMgr& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SubLayerHrdParameters& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265HrdFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265HrdParameters& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265VpsFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265VideoParameterSet& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265ScalingLists& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SpsVuiFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SequenceParameterSetVui& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265PredictorPaletteEntries& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SpsFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SequenceParameterSet& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265PpsFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoH265PictureParameterSet& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265PictureInfoFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265PictureInfo& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265ReferenceInfoFlags& value);
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265ReferenceInfo& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265ProfileEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265CapabilitiesEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersAddInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersCreateInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265PictureInfoEXT& value);
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265DpbSlotInfoEXT& value);
std::ostream& operator<< (std::ostream& s, const VkImagePipeSurfaceCreateInfoFUCHSIA& value);
+std::ostream& operator<< (std::ostream& s, const VkImportMemoryZirconHandleInfoFUCHSIA& value);
+std::ostream& operator<< (std::ostream& s, const VkMemoryZirconHandlePropertiesFUCHSIA& value);
+std::ostream& operator<< (std::ostream& s, const VkMemoryGetZirconHandleInfoFUCHSIA& value);
+std::ostream& operator<< (std::ostream& s, const VkImportSemaphoreZirconHandleInfoFUCHSIA& value);
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreGetZirconHandleInfoFUCHSIA& value);
std::ostream& operator<< (std::ostream& s, const VkStreamDescriptorSurfaceCreateInfoGGP& value);
std::ostream& operator<< (std::ostream& s, const VkPresentFrameTokenGGP& value);
std::ostream& operator<< (std::ostream& s, const VkIOSSurfaceCreateInfoMVK& value);
diff --git a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
index 99eba3d..c0762a0 100644
--- a/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
+++ b/external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
@@ -41,6 +41,8 @@
template<> const char* getTypeName<VkIndirectCommandsLayoutNV> (void) { return "VkIndirectCommandsLayoutNV"; }
template<> const char* getTypeName<VkPrivateDataSlotEXT> (void) { return "VkPrivateDataSlotEXT"; }
template<> const char* getTypeName<VkAccelerationStructureKHR> (void) { return "VkAccelerationStructureKHR"; }
+template<> const char* getTypeName<VkVideoSessionKHR> (void) { return "VkVideoSessionKHR"; }
+template<> const char* getTypeName<VkVideoSessionParametersKHR> (void) { return "VkVideoSessionParametersKHR"; }
namespace pt
{
@@ -305,6 +307,25 @@
case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT: return "VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT";
case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT: return "VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT";
case VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT: return "VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR: return "VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR: return "VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR: return "VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR: return "VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR: return "VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR";
case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV";
case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV";
case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: return "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV";
@@ -313,6 +334,23 @@
case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX: return "VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX";
case VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX: return "VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT";
case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: return "VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD";
case VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP: return "VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV";
@@ -468,6 +506,13 @@
case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: return "VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD";
case VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT: return "VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT";
+ case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT";
case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: return "VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT";
@@ -552,6 +597,8 @@
case VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV: return "VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV";
case VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV: return "VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV";
+ case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV: return "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM: return "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM";
@@ -585,6 +632,7 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV";
case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM: return "VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM";
@@ -605,6 +653,18 @@
case VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE";
case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: return "VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT: return "VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT";
+ case VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT: return "VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT";
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: return "VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA";
+ case VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA: return "VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA";
+ case VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA: return "VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA";
+ case VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA: return "VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA";
+ case VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA: return "VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX: return "VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT: return "VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_MAX_ENUM: return "VK_STRUCTURE_TYPE_MAX_ENUM";
default: return DE_NULL;
}
@@ -630,6 +690,12 @@
case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL: return "VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL";
case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL: return "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL";
case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: return "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR";
+ case VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR: return "VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR";
+ case VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR: return "VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR";
+ case VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR: return "VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR";
+ case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR: return "VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR";
+ case VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR: return "VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR";
+ case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR: return "VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR";
case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR: return "VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR";
case VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV: return "VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV";
case VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT: return "VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT";
@@ -677,6 +743,8 @@
case VK_OBJECT_TYPE_DISPLAY_KHR: return "VK_OBJECT_TYPE_DISPLAY_KHR";
case VK_OBJECT_TYPE_DISPLAY_MODE_KHR: return "VK_OBJECT_TYPE_DISPLAY_MODE_KHR";
case VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT: return "VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT";
+ case VK_OBJECT_TYPE_VIDEO_SESSION_KHR: return "VK_OBJECT_TYPE_VIDEO_SESSION_KHR";
+ case VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR: return "VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR";
case VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT: return "VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT";
case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR: return "VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR";
case VK_OBJECT_TYPE_VALIDATION_CACHE_EXT: return "VK_OBJECT_TYPE_VALIDATION_CACHE_EXT";
@@ -743,251 +811,255 @@
{
switch (value)
{
- case VK_FORMAT_UNDEFINED: return "VK_FORMAT_UNDEFINED";
- case VK_FORMAT_R4G4_UNORM_PACK8: return "VK_FORMAT_R4G4_UNORM_PACK8";
- case VK_FORMAT_R4G4B4A4_UNORM_PACK16: return "VK_FORMAT_R4G4B4A4_UNORM_PACK16";
- case VK_FORMAT_B4G4R4A4_UNORM_PACK16: return "VK_FORMAT_B4G4R4A4_UNORM_PACK16";
- case VK_FORMAT_R5G6B5_UNORM_PACK16: return "VK_FORMAT_R5G6B5_UNORM_PACK16";
- case VK_FORMAT_B5G6R5_UNORM_PACK16: return "VK_FORMAT_B5G6R5_UNORM_PACK16";
- case VK_FORMAT_R5G5B5A1_UNORM_PACK16: return "VK_FORMAT_R5G5B5A1_UNORM_PACK16";
- case VK_FORMAT_B5G5R5A1_UNORM_PACK16: return "VK_FORMAT_B5G5R5A1_UNORM_PACK16";
- case VK_FORMAT_A1R5G5B5_UNORM_PACK16: return "VK_FORMAT_A1R5G5B5_UNORM_PACK16";
- case VK_FORMAT_R8_UNORM: return "VK_FORMAT_R8_UNORM";
- case VK_FORMAT_R8_SNORM: return "VK_FORMAT_R8_SNORM";
- case VK_FORMAT_R8_USCALED: return "VK_FORMAT_R8_USCALED";
- case VK_FORMAT_R8_SSCALED: return "VK_FORMAT_R8_SSCALED";
- case VK_FORMAT_R8_UINT: return "VK_FORMAT_R8_UINT";
- case VK_FORMAT_R8_SINT: return "VK_FORMAT_R8_SINT";
- case VK_FORMAT_R8_SRGB: return "VK_FORMAT_R8_SRGB";
- case VK_FORMAT_R8G8_UNORM: return "VK_FORMAT_R8G8_UNORM";
- case VK_FORMAT_R8G8_SNORM: return "VK_FORMAT_R8G8_SNORM";
- case VK_FORMAT_R8G8_USCALED: return "VK_FORMAT_R8G8_USCALED";
- case VK_FORMAT_R8G8_SSCALED: return "VK_FORMAT_R8G8_SSCALED";
- case VK_FORMAT_R8G8_UINT: return "VK_FORMAT_R8G8_UINT";
- case VK_FORMAT_R8G8_SINT: return "VK_FORMAT_R8G8_SINT";
- case VK_FORMAT_R8G8_SRGB: return "VK_FORMAT_R8G8_SRGB";
- case VK_FORMAT_R8G8B8_UNORM: return "VK_FORMAT_R8G8B8_UNORM";
- case VK_FORMAT_R8G8B8_SNORM: return "VK_FORMAT_R8G8B8_SNORM";
- case VK_FORMAT_R8G8B8_USCALED: return "VK_FORMAT_R8G8B8_USCALED";
- case VK_FORMAT_R8G8B8_SSCALED: return "VK_FORMAT_R8G8B8_SSCALED";
- case VK_FORMAT_R8G8B8_UINT: return "VK_FORMAT_R8G8B8_UINT";
- case VK_FORMAT_R8G8B8_SINT: return "VK_FORMAT_R8G8B8_SINT";
- case VK_FORMAT_R8G8B8_SRGB: return "VK_FORMAT_R8G8B8_SRGB";
- case VK_FORMAT_B8G8R8_UNORM: return "VK_FORMAT_B8G8R8_UNORM";
- case VK_FORMAT_B8G8R8_SNORM: return "VK_FORMAT_B8G8R8_SNORM";
- case VK_FORMAT_B8G8R8_USCALED: return "VK_FORMAT_B8G8R8_USCALED";
- case VK_FORMAT_B8G8R8_SSCALED: return "VK_FORMAT_B8G8R8_SSCALED";
- case VK_FORMAT_B8G8R8_UINT: return "VK_FORMAT_B8G8R8_UINT";
- case VK_FORMAT_B8G8R8_SINT: return "VK_FORMAT_B8G8R8_SINT";
- case VK_FORMAT_B8G8R8_SRGB: return "VK_FORMAT_B8G8R8_SRGB";
- case VK_FORMAT_R8G8B8A8_UNORM: return "VK_FORMAT_R8G8B8A8_UNORM";
- case VK_FORMAT_R8G8B8A8_SNORM: return "VK_FORMAT_R8G8B8A8_SNORM";
- case VK_FORMAT_R8G8B8A8_USCALED: return "VK_FORMAT_R8G8B8A8_USCALED";
- case VK_FORMAT_R8G8B8A8_SSCALED: return "VK_FORMAT_R8G8B8A8_SSCALED";
- case VK_FORMAT_R8G8B8A8_UINT: return "VK_FORMAT_R8G8B8A8_UINT";
- case VK_FORMAT_R8G8B8A8_SINT: return "VK_FORMAT_R8G8B8A8_SINT";
- case VK_FORMAT_R8G8B8A8_SRGB: return "VK_FORMAT_R8G8B8A8_SRGB";
- case VK_FORMAT_B8G8R8A8_UNORM: return "VK_FORMAT_B8G8R8A8_UNORM";
- case VK_FORMAT_B8G8R8A8_SNORM: return "VK_FORMAT_B8G8R8A8_SNORM";
- case VK_FORMAT_B8G8R8A8_USCALED: return "VK_FORMAT_B8G8R8A8_USCALED";
- case VK_FORMAT_B8G8R8A8_SSCALED: return "VK_FORMAT_B8G8R8A8_SSCALED";
- case VK_FORMAT_B8G8R8A8_UINT: return "VK_FORMAT_B8G8R8A8_UINT";
- case VK_FORMAT_B8G8R8A8_SINT: return "VK_FORMAT_B8G8R8A8_SINT";
- case VK_FORMAT_B8G8R8A8_SRGB: return "VK_FORMAT_B8G8R8A8_SRGB";
- case VK_FORMAT_A8B8G8R8_UNORM_PACK32: return "VK_FORMAT_A8B8G8R8_UNORM_PACK32";
- case VK_FORMAT_A8B8G8R8_SNORM_PACK32: return "VK_FORMAT_A8B8G8R8_SNORM_PACK32";
- case VK_FORMAT_A8B8G8R8_USCALED_PACK32: return "VK_FORMAT_A8B8G8R8_USCALED_PACK32";
- case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: return "VK_FORMAT_A8B8G8R8_SSCALED_PACK32";
- case VK_FORMAT_A8B8G8R8_UINT_PACK32: return "VK_FORMAT_A8B8G8R8_UINT_PACK32";
- case VK_FORMAT_A8B8G8R8_SINT_PACK32: return "VK_FORMAT_A8B8G8R8_SINT_PACK32";
- case VK_FORMAT_A8B8G8R8_SRGB_PACK32: return "VK_FORMAT_A8B8G8R8_SRGB_PACK32";
- case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return "VK_FORMAT_A2R10G10B10_UNORM_PACK32";
- case VK_FORMAT_A2R10G10B10_SNORM_PACK32: return "VK_FORMAT_A2R10G10B10_SNORM_PACK32";
- case VK_FORMAT_A2R10G10B10_USCALED_PACK32: return "VK_FORMAT_A2R10G10B10_USCALED_PACK32";
- case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: return "VK_FORMAT_A2R10G10B10_SSCALED_PACK32";
- case VK_FORMAT_A2R10G10B10_UINT_PACK32: return "VK_FORMAT_A2R10G10B10_UINT_PACK32";
- case VK_FORMAT_A2R10G10B10_SINT_PACK32: return "VK_FORMAT_A2R10G10B10_SINT_PACK32";
- case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return "VK_FORMAT_A2B10G10R10_UNORM_PACK32";
- case VK_FORMAT_A2B10G10R10_SNORM_PACK32: return "VK_FORMAT_A2B10G10R10_SNORM_PACK32";
- case VK_FORMAT_A2B10G10R10_USCALED_PACK32: return "VK_FORMAT_A2B10G10R10_USCALED_PACK32";
- case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: return "VK_FORMAT_A2B10G10R10_SSCALED_PACK32";
- case VK_FORMAT_A2B10G10R10_UINT_PACK32: return "VK_FORMAT_A2B10G10R10_UINT_PACK32";
- case VK_FORMAT_A2B10G10R10_SINT_PACK32: return "VK_FORMAT_A2B10G10R10_SINT_PACK32";
- case VK_FORMAT_R16_UNORM: return "VK_FORMAT_R16_UNORM";
- case VK_FORMAT_R16_SNORM: return "VK_FORMAT_R16_SNORM";
- case VK_FORMAT_R16_USCALED: return "VK_FORMAT_R16_USCALED";
- case VK_FORMAT_R16_SSCALED: return "VK_FORMAT_R16_SSCALED";
- case VK_FORMAT_R16_UINT: return "VK_FORMAT_R16_UINT";
- case VK_FORMAT_R16_SINT: return "VK_FORMAT_R16_SINT";
- case VK_FORMAT_R16_SFLOAT: return "VK_FORMAT_R16_SFLOAT";
- case VK_FORMAT_R16G16_UNORM: return "VK_FORMAT_R16G16_UNORM";
- case VK_FORMAT_R16G16_SNORM: return "VK_FORMAT_R16G16_SNORM";
- case VK_FORMAT_R16G16_USCALED: return "VK_FORMAT_R16G16_USCALED";
- case VK_FORMAT_R16G16_SSCALED: return "VK_FORMAT_R16G16_SSCALED";
- case VK_FORMAT_R16G16_UINT: return "VK_FORMAT_R16G16_UINT";
- case VK_FORMAT_R16G16_SINT: return "VK_FORMAT_R16G16_SINT";
- case VK_FORMAT_R16G16_SFLOAT: return "VK_FORMAT_R16G16_SFLOAT";
- case VK_FORMAT_R16G16B16_UNORM: return "VK_FORMAT_R16G16B16_UNORM";
- case VK_FORMAT_R16G16B16_SNORM: return "VK_FORMAT_R16G16B16_SNORM";
- case VK_FORMAT_R16G16B16_USCALED: return "VK_FORMAT_R16G16B16_USCALED";
- case VK_FORMAT_R16G16B16_SSCALED: return "VK_FORMAT_R16G16B16_SSCALED";
- case VK_FORMAT_R16G16B16_UINT: return "VK_FORMAT_R16G16B16_UINT";
- case VK_FORMAT_R16G16B16_SINT: return "VK_FORMAT_R16G16B16_SINT";
- case VK_FORMAT_R16G16B16_SFLOAT: return "VK_FORMAT_R16G16B16_SFLOAT";
- case VK_FORMAT_R16G16B16A16_UNORM: return "VK_FORMAT_R16G16B16A16_UNORM";
- case VK_FORMAT_R16G16B16A16_SNORM: return "VK_FORMAT_R16G16B16A16_SNORM";
- case VK_FORMAT_R16G16B16A16_USCALED: return "VK_FORMAT_R16G16B16A16_USCALED";
- case VK_FORMAT_R16G16B16A16_SSCALED: return "VK_FORMAT_R16G16B16A16_SSCALED";
- case VK_FORMAT_R16G16B16A16_UINT: return "VK_FORMAT_R16G16B16A16_UINT";
- case VK_FORMAT_R16G16B16A16_SINT: return "VK_FORMAT_R16G16B16A16_SINT";
- case VK_FORMAT_R16G16B16A16_SFLOAT: return "VK_FORMAT_R16G16B16A16_SFLOAT";
- case VK_FORMAT_R32_UINT: return "VK_FORMAT_R32_UINT";
- case VK_FORMAT_R32_SINT: return "VK_FORMAT_R32_SINT";
- case VK_FORMAT_R32_SFLOAT: return "VK_FORMAT_R32_SFLOAT";
- case VK_FORMAT_R32G32_UINT: return "VK_FORMAT_R32G32_UINT";
- case VK_FORMAT_R32G32_SINT: return "VK_FORMAT_R32G32_SINT";
- case VK_FORMAT_R32G32_SFLOAT: return "VK_FORMAT_R32G32_SFLOAT";
- case VK_FORMAT_R32G32B32_UINT: return "VK_FORMAT_R32G32B32_UINT";
- case VK_FORMAT_R32G32B32_SINT: return "VK_FORMAT_R32G32B32_SINT";
- case VK_FORMAT_R32G32B32_SFLOAT: return "VK_FORMAT_R32G32B32_SFLOAT";
- case VK_FORMAT_R32G32B32A32_UINT: return "VK_FORMAT_R32G32B32A32_UINT";
- case VK_FORMAT_R32G32B32A32_SINT: return "VK_FORMAT_R32G32B32A32_SINT";
- case VK_FORMAT_R32G32B32A32_SFLOAT: return "VK_FORMAT_R32G32B32A32_SFLOAT";
- case VK_FORMAT_R64_UINT: return "VK_FORMAT_R64_UINT";
- case VK_FORMAT_R64_SINT: return "VK_FORMAT_R64_SINT";
- case VK_FORMAT_R64_SFLOAT: return "VK_FORMAT_R64_SFLOAT";
- case VK_FORMAT_R64G64_UINT: return "VK_FORMAT_R64G64_UINT";
- case VK_FORMAT_R64G64_SINT: return "VK_FORMAT_R64G64_SINT";
- case VK_FORMAT_R64G64_SFLOAT: return "VK_FORMAT_R64G64_SFLOAT";
- case VK_FORMAT_R64G64B64_UINT: return "VK_FORMAT_R64G64B64_UINT";
- case VK_FORMAT_R64G64B64_SINT: return "VK_FORMAT_R64G64B64_SINT";
- case VK_FORMAT_R64G64B64_SFLOAT: return "VK_FORMAT_R64G64B64_SFLOAT";
- case VK_FORMAT_R64G64B64A64_UINT: return "VK_FORMAT_R64G64B64A64_UINT";
- case VK_FORMAT_R64G64B64A64_SINT: return "VK_FORMAT_R64G64B64A64_SINT";
- case VK_FORMAT_R64G64B64A64_SFLOAT: return "VK_FORMAT_R64G64B64A64_SFLOAT";
- case VK_FORMAT_B10G11R11_UFLOAT_PACK32: return "VK_FORMAT_B10G11R11_UFLOAT_PACK32";
- case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: return "VK_FORMAT_E5B9G9R9_UFLOAT_PACK32";
- case VK_FORMAT_D16_UNORM: return "VK_FORMAT_D16_UNORM";
- case VK_FORMAT_X8_D24_UNORM_PACK32: return "VK_FORMAT_X8_D24_UNORM_PACK32";
- case VK_FORMAT_D32_SFLOAT: return "VK_FORMAT_D32_SFLOAT";
- case VK_FORMAT_S8_UINT: return "VK_FORMAT_S8_UINT";
- case VK_FORMAT_D16_UNORM_S8_UINT: return "VK_FORMAT_D16_UNORM_S8_UINT";
- case VK_FORMAT_D24_UNORM_S8_UINT: return "VK_FORMAT_D24_UNORM_S8_UINT";
- case VK_FORMAT_D32_SFLOAT_S8_UINT: return "VK_FORMAT_D32_SFLOAT_S8_UINT";
- case VK_FORMAT_BC1_RGB_UNORM_BLOCK: return "VK_FORMAT_BC1_RGB_UNORM_BLOCK";
- case VK_FORMAT_BC1_RGB_SRGB_BLOCK: return "VK_FORMAT_BC1_RGB_SRGB_BLOCK";
- case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: return "VK_FORMAT_BC1_RGBA_UNORM_BLOCK";
- case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: return "VK_FORMAT_BC1_RGBA_SRGB_BLOCK";
- case VK_FORMAT_BC2_UNORM_BLOCK: return "VK_FORMAT_BC2_UNORM_BLOCK";
- case VK_FORMAT_BC2_SRGB_BLOCK: return "VK_FORMAT_BC2_SRGB_BLOCK";
- case VK_FORMAT_BC3_UNORM_BLOCK: return "VK_FORMAT_BC3_UNORM_BLOCK";
- case VK_FORMAT_BC3_SRGB_BLOCK: return "VK_FORMAT_BC3_SRGB_BLOCK";
- case VK_FORMAT_BC4_UNORM_BLOCK: return "VK_FORMAT_BC4_UNORM_BLOCK";
- case VK_FORMAT_BC4_SNORM_BLOCK: return "VK_FORMAT_BC4_SNORM_BLOCK";
- case VK_FORMAT_BC5_UNORM_BLOCK: return "VK_FORMAT_BC5_UNORM_BLOCK";
- case VK_FORMAT_BC5_SNORM_BLOCK: return "VK_FORMAT_BC5_SNORM_BLOCK";
- case VK_FORMAT_BC6H_UFLOAT_BLOCK: return "VK_FORMAT_BC6H_UFLOAT_BLOCK";
- case VK_FORMAT_BC6H_SFLOAT_BLOCK: return "VK_FORMAT_BC6H_SFLOAT_BLOCK";
- case VK_FORMAT_BC7_UNORM_BLOCK: return "VK_FORMAT_BC7_UNORM_BLOCK";
- case VK_FORMAT_BC7_SRGB_BLOCK: return "VK_FORMAT_BC7_SRGB_BLOCK";
- case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: return "VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK";
- case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: return "VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK";
- case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK";
- case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK";
- case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK";
- case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK";
- case VK_FORMAT_EAC_R11_UNORM_BLOCK: return "VK_FORMAT_EAC_R11_UNORM_BLOCK";
- case VK_FORMAT_EAC_R11_SNORM_BLOCK: return "VK_FORMAT_EAC_R11_SNORM_BLOCK";
- case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: return "VK_FORMAT_EAC_R11G11_UNORM_BLOCK";
- case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: return "VK_FORMAT_EAC_R11G11_SNORM_BLOCK";
- case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: return "VK_FORMAT_ASTC_4x4_UNORM_BLOCK";
- case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: return "VK_FORMAT_ASTC_4x4_SRGB_BLOCK";
- case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: return "VK_FORMAT_ASTC_5x4_UNORM_BLOCK";
- case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: return "VK_FORMAT_ASTC_5x4_SRGB_BLOCK";
- case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_5x5_UNORM_BLOCK";
- case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_5x5_SRGB_BLOCK";
- case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_6x5_UNORM_BLOCK";
- case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_6x5_SRGB_BLOCK";
- case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: return "VK_FORMAT_ASTC_6x6_UNORM_BLOCK";
- case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: return "VK_FORMAT_ASTC_6x6_SRGB_BLOCK";
- case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_8x5_UNORM_BLOCK";
- case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_8x5_SRGB_BLOCK";
- case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: return "VK_FORMAT_ASTC_8x6_UNORM_BLOCK";
- case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: return "VK_FORMAT_ASTC_8x6_SRGB_BLOCK";
- case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: return "VK_FORMAT_ASTC_8x8_UNORM_BLOCK";
- case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: return "VK_FORMAT_ASTC_8x8_SRGB_BLOCK";
- case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x5_UNORM_BLOCK";
- case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x5_SRGB_BLOCK";
- case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x6_UNORM_BLOCK";
- case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x6_SRGB_BLOCK";
- case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x8_UNORM_BLOCK";
- case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x8_SRGB_BLOCK";
- case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x10_UNORM_BLOCK";
- case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x10_SRGB_BLOCK";
- case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: return "VK_FORMAT_ASTC_12x10_UNORM_BLOCK";
- case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: return "VK_FORMAT_ASTC_12x10_SRGB_BLOCK";
- case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: return "VK_FORMAT_ASTC_12x12_UNORM_BLOCK";
- case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: return "VK_FORMAT_ASTC_12x12_SRGB_BLOCK";
- case VK_FORMAT_G8B8G8R8_422_UNORM: return "VK_FORMAT_G8B8G8R8_422_UNORM";
- case VK_FORMAT_B8G8R8G8_422_UNORM: return "VK_FORMAT_B8G8R8G8_422_UNORM";
- case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: return "VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM";
- case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: return "VK_FORMAT_G8_B8R8_2PLANE_420_UNORM";
- case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: return "VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM";
- case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: return "VK_FORMAT_G8_B8R8_2PLANE_422_UNORM";
- case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: return "VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM";
- case VK_FORMAT_R10X6_UNORM_PACK16: return "VK_FORMAT_R10X6_UNORM_PACK16";
- case VK_FORMAT_R10X6G10X6_UNORM_2PACK16: return "VK_FORMAT_R10X6G10X6_UNORM_2PACK16";
- case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: return "VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16";
- case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: return "VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16";
- case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: return "VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16";
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16";
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16";
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16";
- case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16";
- case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16";
- case VK_FORMAT_R12X4_UNORM_PACK16: return "VK_FORMAT_R12X4_UNORM_PACK16";
- case VK_FORMAT_R12X4G12X4_UNORM_2PACK16: return "VK_FORMAT_R12X4G12X4_UNORM_2PACK16";
- case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: return "VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16";
- case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: return "VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16";
- case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: return "VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16";
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16";
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16";
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16";
- case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16";
- case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16";
- case VK_FORMAT_G16B16G16R16_422_UNORM: return "VK_FORMAT_G16B16G16R16_422_UNORM";
- case VK_FORMAT_B16G16R16G16_422_UNORM: return "VK_FORMAT_B16G16R16G16_422_UNORM";
- case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: return "VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM";
- case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: return "VK_FORMAT_G16_B16R16_2PLANE_420_UNORM";
- case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: return "VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM";
- case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: return "VK_FORMAT_G16_B16R16_2PLANE_422_UNORM";
- case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: return "VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM";
- case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG";
- case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG";
- case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG";
- case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG";
- case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG";
- case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG";
- case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG";
- case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG";
- case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT";
- case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT: return "VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT";
- case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT: return "VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT";
- case VK_FORMAT_MAX_ENUM: return "VK_FORMAT_MAX_ENUM";
- default: return DE_NULL;
+ case VK_FORMAT_UNDEFINED: return "VK_FORMAT_UNDEFINED";
+ case VK_FORMAT_R4G4_UNORM_PACK8: return "VK_FORMAT_R4G4_UNORM_PACK8";
+ case VK_FORMAT_R4G4B4A4_UNORM_PACK16: return "VK_FORMAT_R4G4B4A4_UNORM_PACK16";
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16: return "VK_FORMAT_B4G4R4A4_UNORM_PACK16";
+ case VK_FORMAT_R5G6B5_UNORM_PACK16: return "VK_FORMAT_R5G6B5_UNORM_PACK16";
+ case VK_FORMAT_B5G6R5_UNORM_PACK16: return "VK_FORMAT_B5G6R5_UNORM_PACK16";
+ case VK_FORMAT_R5G5B5A1_UNORM_PACK16: return "VK_FORMAT_R5G5B5A1_UNORM_PACK16";
+ case VK_FORMAT_B5G5R5A1_UNORM_PACK16: return "VK_FORMAT_B5G5R5A1_UNORM_PACK16";
+ case VK_FORMAT_A1R5G5B5_UNORM_PACK16: return "VK_FORMAT_A1R5G5B5_UNORM_PACK16";
+ case VK_FORMAT_R8_UNORM: return "VK_FORMAT_R8_UNORM";
+ case VK_FORMAT_R8_SNORM: return "VK_FORMAT_R8_SNORM";
+ case VK_FORMAT_R8_USCALED: return "VK_FORMAT_R8_USCALED";
+ case VK_FORMAT_R8_SSCALED: return "VK_FORMAT_R8_SSCALED";
+ case VK_FORMAT_R8_UINT: return "VK_FORMAT_R8_UINT";
+ case VK_FORMAT_R8_SINT: return "VK_FORMAT_R8_SINT";
+ case VK_FORMAT_R8_SRGB: return "VK_FORMAT_R8_SRGB";
+ case VK_FORMAT_R8G8_UNORM: return "VK_FORMAT_R8G8_UNORM";
+ case VK_FORMAT_R8G8_SNORM: return "VK_FORMAT_R8G8_SNORM";
+ case VK_FORMAT_R8G8_USCALED: return "VK_FORMAT_R8G8_USCALED";
+ case VK_FORMAT_R8G8_SSCALED: return "VK_FORMAT_R8G8_SSCALED";
+ case VK_FORMAT_R8G8_UINT: return "VK_FORMAT_R8G8_UINT";
+ case VK_FORMAT_R8G8_SINT: return "VK_FORMAT_R8G8_SINT";
+ case VK_FORMAT_R8G8_SRGB: return "VK_FORMAT_R8G8_SRGB";
+ case VK_FORMAT_R8G8B8_UNORM: return "VK_FORMAT_R8G8B8_UNORM";
+ case VK_FORMAT_R8G8B8_SNORM: return "VK_FORMAT_R8G8B8_SNORM";
+ case VK_FORMAT_R8G8B8_USCALED: return "VK_FORMAT_R8G8B8_USCALED";
+ case VK_FORMAT_R8G8B8_SSCALED: return "VK_FORMAT_R8G8B8_SSCALED";
+ case VK_FORMAT_R8G8B8_UINT: return "VK_FORMAT_R8G8B8_UINT";
+ case VK_FORMAT_R8G8B8_SINT: return "VK_FORMAT_R8G8B8_SINT";
+ case VK_FORMAT_R8G8B8_SRGB: return "VK_FORMAT_R8G8B8_SRGB";
+ case VK_FORMAT_B8G8R8_UNORM: return "VK_FORMAT_B8G8R8_UNORM";
+ case VK_FORMAT_B8G8R8_SNORM: return "VK_FORMAT_B8G8R8_SNORM";
+ case VK_FORMAT_B8G8R8_USCALED: return "VK_FORMAT_B8G8R8_USCALED";
+ case VK_FORMAT_B8G8R8_SSCALED: return "VK_FORMAT_B8G8R8_SSCALED";
+ case VK_FORMAT_B8G8R8_UINT: return "VK_FORMAT_B8G8R8_UINT";
+ case VK_FORMAT_B8G8R8_SINT: return "VK_FORMAT_B8G8R8_SINT";
+ case VK_FORMAT_B8G8R8_SRGB: return "VK_FORMAT_B8G8R8_SRGB";
+ case VK_FORMAT_R8G8B8A8_UNORM: return "VK_FORMAT_R8G8B8A8_UNORM";
+ case VK_FORMAT_R8G8B8A8_SNORM: return "VK_FORMAT_R8G8B8A8_SNORM";
+ case VK_FORMAT_R8G8B8A8_USCALED: return "VK_FORMAT_R8G8B8A8_USCALED";
+ case VK_FORMAT_R8G8B8A8_SSCALED: return "VK_FORMAT_R8G8B8A8_SSCALED";
+ case VK_FORMAT_R8G8B8A8_UINT: return "VK_FORMAT_R8G8B8A8_UINT";
+ case VK_FORMAT_R8G8B8A8_SINT: return "VK_FORMAT_R8G8B8A8_SINT";
+ case VK_FORMAT_R8G8B8A8_SRGB: return "VK_FORMAT_R8G8B8A8_SRGB";
+ case VK_FORMAT_B8G8R8A8_UNORM: return "VK_FORMAT_B8G8R8A8_UNORM";
+ case VK_FORMAT_B8G8R8A8_SNORM: return "VK_FORMAT_B8G8R8A8_SNORM";
+ case VK_FORMAT_B8G8R8A8_USCALED: return "VK_FORMAT_B8G8R8A8_USCALED";
+ case VK_FORMAT_B8G8R8A8_SSCALED: return "VK_FORMAT_B8G8R8A8_SSCALED";
+ case VK_FORMAT_B8G8R8A8_UINT: return "VK_FORMAT_B8G8R8A8_UINT";
+ case VK_FORMAT_B8G8R8A8_SINT: return "VK_FORMAT_B8G8R8A8_SINT";
+ case VK_FORMAT_B8G8R8A8_SRGB: return "VK_FORMAT_B8G8R8A8_SRGB";
+ case VK_FORMAT_A8B8G8R8_UNORM_PACK32: return "VK_FORMAT_A8B8G8R8_UNORM_PACK32";
+ case VK_FORMAT_A8B8G8R8_SNORM_PACK32: return "VK_FORMAT_A8B8G8R8_SNORM_PACK32";
+ case VK_FORMAT_A8B8G8R8_USCALED_PACK32: return "VK_FORMAT_A8B8G8R8_USCALED_PACK32";
+ case VK_FORMAT_A8B8G8R8_SSCALED_PACK32: return "VK_FORMAT_A8B8G8R8_SSCALED_PACK32";
+ case VK_FORMAT_A8B8G8R8_UINT_PACK32: return "VK_FORMAT_A8B8G8R8_UINT_PACK32";
+ case VK_FORMAT_A8B8G8R8_SINT_PACK32: return "VK_FORMAT_A8B8G8R8_SINT_PACK32";
+ case VK_FORMAT_A8B8G8R8_SRGB_PACK32: return "VK_FORMAT_A8B8G8R8_SRGB_PACK32";
+ case VK_FORMAT_A2R10G10B10_UNORM_PACK32: return "VK_FORMAT_A2R10G10B10_UNORM_PACK32";
+ case VK_FORMAT_A2R10G10B10_SNORM_PACK32: return "VK_FORMAT_A2R10G10B10_SNORM_PACK32";
+ case VK_FORMAT_A2R10G10B10_USCALED_PACK32: return "VK_FORMAT_A2R10G10B10_USCALED_PACK32";
+ case VK_FORMAT_A2R10G10B10_SSCALED_PACK32: return "VK_FORMAT_A2R10G10B10_SSCALED_PACK32";
+ case VK_FORMAT_A2R10G10B10_UINT_PACK32: return "VK_FORMAT_A2R10G10B10_UINT_PACK32";
+ case VK_FORMAT_A2R10G10B10_SINT_PACK32: return "VK_FORMAT_A2R10G10B10_SINT_PACK32";
+ case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return "VK_FORMAT_A2B10G10R10_UNORM_PACK32";
+ case VK_FORMAT_A2B10G10R10_SNORM_PACK32: return "VK_FORMAT_A2B10G10R10_SNORM_PACK32";
+ case VK_FORMAT_A2B10G10R10_USCALED_PACK32: return "VK_FORMAT_A2B10G10R10_USCALED_PACK32";
+ case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: return "VK_FORMAT_A2B10G10R10_SSCALED_PACK32";
+ case VK_FORMAT_A2B10G10R10_UINT_PACK32: return "VK_FORMAT_A2B10G10R10_UINT_PACK32";
+ case VK_FORMAT_A2B10G10R10_SINT_PACK32: return "VK_FORMAT_A2B10G10R10_SINT_PACK32";
+ case VK_FORMAT_R16_UNORM: return "VK_FORMAT_R16_UNORM";
+ case VK_FORMAT_R16_SNORM: return "VK_FORMAT_R16_SNORM";
+ case VK_FORMAT_R16_USCALED: return "VK_FORMAT_R16_USCALED";
+ case VK_FORMAT_R16_SSCALED: return "VK_FORMAT_R16_SSCALED";
+ case VK_FORMAT_R16_UINT: return "VK_FORMAT_R16_UINT";
+ case VK_FORMAT_R16_SINT: return "VK_FORMAT_R16_SINT";
+ case VK_FORMAT_R16_SFLOAT: return "VK_FORMAT_R16_SFLOAT";
+ case VK_FORMAT_R16G16_UNORM: return "VK_FORMAT_R16G16_UNORM";
+ case VK_FORMAT_R16G16_SNORM: return "VK_FORMAT_R16G16_SNORM";
+ case VK_FORMAT_R16G16_USCALED: return "VK_FORMAT_R16G16_USCALED";
+ case VK_FORMAT_R16G16_SSCALED: return "VK_FORMAT_R16G16_SSCALED";
+ case VK_FORMAT_R16G16_UINT: return "VK_FORMAT_R16G16_UINT";
+ case VK_FORMAT_R16G16_SINT: return "VK_FORMAT_R16G16_SINT";
+ case VK_FORMAT_R16G16_SFLOAT: return "VK_FORMAT_R16G16_SFLOAT";
+ case VK_FORMAT_R16G16B16_UNORM: return "VK_FORMAT_R16G16B16_UNORM";
+ case VK_FORMAT_R16G16B16_SNORM: return "VK_FORMAT_R16G16B16_SNORM";
+ case VK_FORMAT_R16G16B16_USCALED: return "VK_FORMAT_R16G16B16_USCALED";
+ case VK_FORMAT_R16G16B16_SSCALED: return "VK_FORMAT_R16G16B16_SSCALED";
+ case VK_FORMAT_R16G16B16_UINT: return "VK_FORMAT_R16G16B16_UINT";
+ case VK_FORMAT_R16G16B16_SINT: return "VK_FORMAT_R16G16B16_SINT";
+ case VK_FORMAT_R16G16B16_SFLOAT: return "VK_FORMAT_R16G16B16_SFLOAT";
+ case VK_FORMAT_R16G16B16A16_UNORM: return "VK_FORMAT_R16G16B16A16_UNORM";
+ case VK_FORMAT_R16G16B16A16_SNORM: return "VK_FORMAT_R16G16B16A16_SNORM";
+ case VK_FORMAT_R16G16B16A16_USCALED: return "VK_FORMAT_R16G16B16A16_USCALED";
+ case VK_FORMAT_R16G16B16A16_SSCALED: return "VK_FORMAT_R16G16B16A16_SSCALED";
+ case VK_FORMAT_R16G16B16A16_UINT: return "VK_FORMAT_R16G16B16A16_UINT";
+ case VK_FORMAT_R16G16B16A16_SINT: return "VK_FORMAT_R16G16B16A16_SINT";
+ case VK_FORMAT_R16G16B16A16_SFLOAT: return "VK_FORMAT_R16G16B16A16_SFLOAT";
+ case VK_FORMAT_R32_UINT: return "VK_FORMAT_R32_UINT";
+ case VK_FORMAT_R32_SINT: return "VK_FORMAT_R32_SINT";
+ case VK_FORMAT_R32_SFLOAT: return "VK_FORMAT_R32_SFLOAT";
+ case VK_FORMAT_R32G32_UINT: return "VK_FORMAT_R32G32_UINT";
+ case VK_FORMAT_R32G32_SINT: return "VK_FORMAT_R32G32_SINT";
+ case VK_FORMAT_R32G32_SFLOAT: return "VK_FORMAT_R32G32_SFLOAT";
+ case VK_FORMAT_R32G32B32_UINT: return "VK_FORMAT_R32G32B32_UINT";
+ case VK_FORMAT_R32G32B32_SINT: return "VK_FORMAT_R32G32B32_SINT";
+ case VK_FORMAT_R32G32B32_SFLOAT: return "VK_FORMAT_R32G32B32_SFLOAT";
+ case VK_FORMAT_R32G32B32A32_UINT: return "VK_FORMAT_R32G32B32A32_UINT";
+ case VK_FORMAT_R32G32B32A32_SINT: return "VK_FORMAT_R32G32B32A32_SINT";
+ case VK_FORMAT_R32G32B32A32_SFLOAT: return "VK_FORMAT_R32G32B32A32_SFLOAT";
+ case VK_FORMAT_R64_UINT: return "VK_FORMAT_R64_UINT";
+ case VK_FORMAT_R64_SINT: return "VK_FORMAT_R64_SINT";
+ case VK_FORMAT_R64_SFLOAT: return "VK_FORMAT_R64_SFLOAT";
+ case VK_FORMAT_R64G64_UINT: return "VK_FORMAT_R64G64_UINT";
+ case VK_FORMAT_R64G64_SINT: return "VK_FORMAT_R64G64_SINT";
+ case VK_FORMAT_R64G64_SFLOAT: return "VK_FORMAT_R64G64_SFLOAT";
+ case VK_FORMAT_R64G64B64_UINT: return "VK_FORMAT_R64G64B64_UINT";
+ case VK_FORMAT_R64G64B64_SINT: return "VK_FORMAT_R64G64B64_SINT";
+ case VK_FORMAT_R64G64B64_SFLOAT: return "VK_FORMAT_R64G64B64_SFLOAT";
+ case VK_FORMAT_R64G64B64A64_UINT: return "VK_FORMAT_R64G64B64A64_UINT";
+ case VK_FORMAT_R64G64B64A64_SINT: return "VK_FORMAT_R64G64B64A64_SINT";
+ case VK_FORMAT_R64G64B64A64_SFLOAT: return "VK_FORMAT_R64G64B64A64_SFLOAT";
+ case VK_FORMAT_B10G11R11_UFLOAT_PACK32: return "VK_FORMAT_B10G11R11_UFLOAT_PACK32";
+ case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32: return "VK_FORMAT_E5B9G9R9_UFLOAT_PACK32";
+ case VK_FORMAT_D16_UNORM: return "VK_FORMAT_D16_UNORM";
+ case VK_FORMAT_X8_D24_UNORM_PACK32: return "VK_FORMAT_X8_D24_UNORM_PACK32";
+ case VK_FORMAT_D32_SFLOAT: return "VK_FORMAT_D32_SFLOAT";
+ case VK_FORMAT_S8_UINT: return "VK_FORMAT_S8_UINT";
+ case VK_FORMAT_D16_UNORM_S8_UINT: return "VK_FORMAT_D16_UNORM_S8_UINT";
+ case VK_FORMAT_D24_UNORM_S8_UINT: return "VK_FORMAT_D24_UNORM_S8_UINT";
+ case VK_FORMAT_D32_SFLOAT_S8_UINT: return "VK_FORMAT_D32_SFLOAT_S8_UINT";
+ case VK_FORMAT_BC1_RGB_UNORM_BLOCK: return "VK_FORMAT_BC1_RGB_UNORM_BLOCK";
+ case VK_FORMAT_BC1_RGB_SRGB_BLOCK: return "VK_FORMAT_BC1_RGB_SRGB_BLOCK";
+ case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: return "VK_FORMAT_BC1_RGBA_UNORM_BLOCK";
+ case VK_FORMAT_BC1_RGBA_SRGB_BLOCK: return "VK_FORMAT_BC1_RGBA_SRGB_BLOCK";
+ case VK_FORMAT_BC2_UNORM_BLOCK: return "VK_FORMAT_BC2_UNORM_BLOCK";
+ case VK_FORMAT_BC2_SRGB_BLOCK: return "VK_FORMAT_BC2_SRGB_BLOCK";
+ case VK_FORMAT_BC3_UNORM_BLOCK: return "VK_FORMAT_BC3_UNORM_BLOCK";
+ case VK_FORMAT_BC3_SRGB_BLOCK: return "VK_FORMAT_BC3_SRGB_BLOCK";
+ case VK_FORMAT_BC4_UNORM_BLOCK: return "VK_FORMAT_BC4_UNORM_BLOCK";
+ case VK_FORMAT_BC4_SNORM_BLOCK: return "VK_FORMAT_BC4_SNORM_BLOCK";
+ case VK_FORMAT_BC5_UNORM_BLOCK: return "VK_FORMAT_BC5_UNORM_BLOCK";
+ case VK_FORMAT_BC5_SNORM_BLOCK: return "VK_FORMAT_BC5_SNORM_BLOCK";
+ case VK_FORMAT_BC6H_UFLOAT_BLOCK: return "VK_FORMAT_BC6H_UFLOAT_BLOCK";
+ case VK_FORMAT_BC6H_SFLOAT_BLOCK: return "VK_FORMAT_BC6H_SFLOAT_BLOCK";
+ case VK_FORMAT_BC7_UNORM_BLOCK: return "VK_FORMAT_BC7_UNORM_BLOCK";
+ case VK_FORMAT_BC7_SRGB_BLOCK: return "VK_FORMAT_BC7_SRGB_BLOCK";
+ case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: return "VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK";
+ case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK: return "VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK";
+ case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK";
+ case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK";
+ case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK";
+ case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK: return "VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK";
+ case VK_FORMAT_EAC_R11_UNORM_BLOCK: return "VK_FORMAT_EAC_R11_UNORM_BLOCK";
+ case VK_FORMAT_EAC_R11_SNORM_BLOCK: return "VK_FORMAT_EAC_R11_SNORM_BLOCK";
+ case VK_FORMAT_EAC_R11G11_UNORM_BLOCK: return "VK_FORMAT_EAC_R11G11_UNORM_BLOCK";
+ case VK_FORMAT_EAC_R11G11_SNORM_BLOCK: return "VK_FORMAT_EAC_R11G11_SNORM_BLOCK";
+ case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: return "VK_FORMAT_ASTC_4x4_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_4x4_SRGB_BLOCK: return "VK_FORMAT_ASTC_4x4_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_5x4_UNORM_BLOCK: return "VK_FORMAT_ASTC_5x4_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_5x4_SRGB_BLOCK: return "VK_FORMAT_ASTC_5x4_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_5x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_5x5_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_5x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_5x5_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_6x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_6x5_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_6x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_6x5_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: return "VK_FORMAT_ASTC_6x6_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_6x6_SRGB_BLOCK: return "VK_FORMAT_ASTC_6x6_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_8x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_8x5_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_8x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_8x5_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_8x6_UNORM_BLOCK: return "VK_FORMAT_ASTC_8x6_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_8x6_SRGB_BLOCK: return "VK_FORMAT_ASTC_8x6_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: return "VK_FORMAT_ASTC_8x8_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_8x8_SRGB_BLOCK: return "VK_FORMAT_ASTC_8x8_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_10x5_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x5_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_10x5_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x5_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_10x6_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x6_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_10x6_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x6_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_10x8_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x8_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_10x8_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x8_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_10x10_UNORM_BLOCK: return "VK_FORMAT_ASTC_10x10_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_10x10_SRGB_BLOCK: return "VK_FORMAT_ASTC_10x10_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: return "VK_FORMAT_ASTC_12x10_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: return "VK_FORMAT_ASTC_12x10_SRGB_BLOCK";
+ case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: return "VK_FORMAT_ASTC_12x12_UNORM_BLOCK";
+ case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: return "VK_FORMAT_ASTC_12x12_SRGB_BLOCK";
+ case VK_FORMAT_G8B8G8R8_422_UNORM: return "VK_FORMAT_G8B8G8R8_422_UNORM";
+ case VK_FORMAT_B8G8R8G8_422_UNORM: return "VK_FORMAT_B8G8R8G8_422_UNORM";
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: return "VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM";
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: return "VK_FORMAT_G8_B8R8_2PLANE_420_UNORM";
+ case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM: return "VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM";
+ case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM: return "VK_FORMAT_G8_B8R8_2PLANE_422_UNORM";
+ case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM: return "VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM";
+ case VK_FORMAT_R10X6_UNORM_PACK16: return "VK_FORMAT_R10X6_UNORM_PACK16";
+ case VK_FORMAT_R10X6G10X6_UNORM_2PACK16: return "VK_FORMAT_R10X6G10X6_UNORM_2PACK16";
+ case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16: return "VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16";
+ case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16: return "VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16";
+ case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16: return "VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16";
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16";
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16";
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16";
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16";
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16: return "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16";
+ case VK_FORMAT_R12X4_UNORM_PACK16: return "VK_FORMAT_R12X4_UNORM_PACK16";
+ case VK_FORMAT_R12X4G12X4_UNORM_2PACK16: return "VK_FORMAT_R12X4G12X4_UNORM_2PACK16";
+ case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16: return "VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16";
+ case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16: return "VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16";
+ case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16: return "VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16";
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16";
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16";
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16";
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16";
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16: return "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16";
+ case VK_FORMAT_G16B16G16R16_422_UNORM: return "VK_FORMAT_G16B16G16R16_422_UNORM";
+ case VK_FORMAT_B16G16R16G16_422_UNORM: return "VK_FORMAT_B16G16R16G16_422_UNORM";
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM: return "VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM";
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM: return "VK_FORMAT_G16_B16R16_2PLANE_420_UNORM";
+ case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: return "VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM";
+ case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: return "VK_FORMAT_G16_B16R16_2PLANE_422_UNORM";
+ case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: return "VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM";
+ case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG";
+ case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG";
+ case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG";
+ case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: return "VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG";
+ case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG";
+ case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG";
+ case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG";
+ case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: return "VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG";
+ case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT: return "VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT";
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT: return "VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT";
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT: return "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT";
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT: return "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT";
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT: return "VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT";
+ case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT: return "VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT";
+ case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT: return "VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT";
+ case VK_FORMAT_MAX_ENUM: return "VK_FORMAT_MAX_ENUM";
+ default: return DE_NULL;
}
}
@@ -1036,6 +1108,8 @@
case VK_QUERY_TYPE_OCCLUSION: return "VK_QUERY_TYPE_OCCLUSION";
case VK_QUERY_TYPE_PIPELINE_STATISTICS: return "VK_QUERY_TYPE_PIPELINE_STATISTICS";
case VK_QUERY_TYPE_TIMESTAMP: return "VK_QUERY_TYPE_TIMESTAMP";
+ case VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR: return "VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR";
+ case VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR: return "VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR";
case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT: return "VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT";
case VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR: return "VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR";
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: return "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR";
@@ -1229,6 +1303,13 @@
case VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT: return "VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT";
case VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT: return "VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT";
case VK_DYNAMIC_STATE_STENCIL_OP_EXT: return "VK_DYNAMIC_STATE_STENCIL_OP_EXT";
+ case VK_DYNAMIC_STATE_VERTEX_INPUT_EXT: return "VK_DYNAMIC_STATE_VERTEX_INPUT_EXT";
+ case VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT: return "VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT";
+ case VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT: return "VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT";
+ case VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT: return "VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT";
+ case VK_DYNAMIC_STATE_LOGIC_OP_EXT: return "VK_DYNAMIC_STATE_LOGIC_OP_EXT";
+ case VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT: return "VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT";
+ case VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT: return "VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT";
case VK_DYNAMIC_STATE_MAX_ENUM: return "VK_DYNAMIC_STATE_MAX_ENUM";
default: return DE_NULL;
}
@@ -1567,6 +1648,7 @@
case VK_DRIVER_ID_BROADCOM_PROPRIETARY: return "VK_DRIVER_ID_BROADCOM_PROPRIETARY";
case VK_DRIVER_ID_MESA_LLVMPIPE: return "VK_DRIVER_ID_MESA_LLVMPIPE";
case VK_DRIVER_ID_MOLTENVK: return "VK_DRIVER_ID_MOLTENVK";
+ case VK_DRIVER_ID_COREAVI_PROPRIETARY: return "VK_DRIVER_ID_COREAVI_PROPRIETARY";
case VK_DRIVER_ID_MAX_ENUM: return "VK_DRIVER_ID_MAX_ENUM";
default: return DE_NULL;
}
@@ -2293,6 +2375,263 @@
}
}
+const char* getQueryResultStatusKHRName (VkQueryResultStatusKHR value)
+{
+ switch (value)
+ {
+ case VK_QUERY_RESULT_STATUS_ERROR_KHR: return "VK_QUERY_RESULT_STATUS_ERROR_KHR";
+ case VK_QUERY_RESULT_STATUS_NOT_READY_KHR: return "VK_QUERY_RESULT_STATUS_NOT_READY_KHR";
+ case VK_QUERY_RESULT_STATUS_COMPLETE_KHR: return "VK_QUERY_RESULT_STATUS_COMPLETE_KHR";
+ case VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR: return "VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264ChromaFormatIdcName (StdVideoH264ChromaFormatIdc value)
+{
+ switch (value)
+ {
+ case std_video_h264_chroma_format_idc_monochrome: return "std_video_h264_chroma_format_idc_monochrome";
+ case std_video_h264_chroma_format_idc_420: return "std_video_h264_chroma_format_idc_420";
+ case std_video_h264_chroma_format_idc_422: return "std_video_h264_chroma_format_idc_422";
+ case std_video_h264_chroma_format_idc_444: return "std_video_h264_chroma_format_idc_444";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264ProfileIdcName (StdVideoH264ProfileIdc value)
+{
+ switch (value)
+ {
+ case std_video_h264_profile_idc_baseline: return "std_video_h264_profile_idc_baseline";
+ case std_video_h264_profile_idc_main: return "std_video_h264_profile_idc_main";
+ case std_video_h264_profile_idc_high: return "std_video_h264_profile_idc_high";
+ case std_video_h264_profile_idc_high_444_predictive: return "std_video_h264_profile_idc_high_444_predictive";
+ case std_video_h264_profile_idc_invalid: return "std_video_h264_profile_idc_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264LevelName (StdVideoH264Level value)
+{
+ switch (value)
+ {
+ case std_video_h264_level_1_0: return "std_video_h264_level_1_0";
+ case std_video_h264_level_1_1: return "std_video_h264_level_1_1";
+ case std_video_h264_level_1_2: return "std_video_h264_level_1_2";
+ case std_video_h264_level_1_3: return "std_video_h264_level_1_3";
+ case std_video_h264_level_2_0: return "std_video_h264_level_2_0";
+ case std_video_h264_level_2_1: return "std_video_h264_level_2_1";
+ case std_video_h264_level_2_2: return "std_video_h264_level_2_2";
+ case std_video_h264_level_3_0: return "std_video_h264_level_3_0";
+ case std_video_h264_level_3_1: return "std_video_h264_level_3_1";
+ case std_video_h264_level_3_2: return "std_video_h264_level_3_2";
+ case std_video_h264_level_4_0: return "std_video_h264_level_4_0";
+ case std_video_h264_level_4_1: return "std_video_h264_level_4_1";
+ case std_video_h264_level_4_2: return "std_video_h264_level_4_2";
+ case std_video_h264_level_5_0: return "std_video_h264_level_5_0";
+ case std_video_h264_level_5_1: return "std_video_h264_level_5_1";
+ case std_video_h264_level_5_2: return "std_video_h264_level_5_2";
+ case std_video_h264_level_6_0: return "std_video_h264_level_6_0";
+ case std_video_h264_level_6_1: return "std_video_h264_level_6_1";
+ case std_video_h264_level_6_2: return "std_video_h264_level_6_2";
+ case std_video_h264_level_invalid: return "std_video_h264_level_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264PocTypeName (StdVideoH264PocType value)
+{
+ switch (value)
+ {
+ case std_video_h264_poc_type_0: return "std_video_h264_poc_type_0";
+ case std_video_h264_poc_type_1: return "std_video_h264_poc_type_1";
+ case std_video_h264_poc_type_2: return "std_video_h264_poc_type_2";
+ case std_video_h264_poc_type_invalid: return "std_video_h264_poc_type_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264AspectRatioIdcName (StdVideoH264AspectRatioIdc value)
+{
+ switch (value)
+ {
+ case std_video_h264_aspect_ratio_idc_unspecified: return "std_video_h264_aspect_ratio_idc_unspecified";
+ case std_video_h264_aspect_ratio_idc_square: return "std_video_h264_aspect_ratio_idc_square";
+ case std_video_h264_aspect_ratio_idc_12_11: return "std_video_h264_aspect_ratio_idc_12_11";
+ case std_video_h264_aspect_ratio_idc_10_11: return "std_video_h264_aspect_ratio_idc_10_11";
+ case std_video_h264_aspect_ratio_idc_16_11: return "std_video_h264_aspect_ratio_idc_16_11";
+ case std_video_h264_aspect_ratio_idc_40_33: return "std_video_h264_aspect_ratio_idc_40_33";
+ case std_video_h264_aspect_ratio_idc_24_11: return "std_video_h264_aspect_ratio_idc_24_11";
+ case std_video_h264_aspect_ratio_idc_20_11: return "std_video_h264_aspect_ratio_idc_20_11";
+ case std_video_h264_aspect_ratio_idc_32_11: return "std_video_h264_aspect_ratio_idc_32_11";
+ case std_video_h264_aspect_ratio_idc_80_33: return "std_video_h264_aspect_ratio_idc_80_33";
+ case std_video_h264_aspect_ratio_idc_18_11: return "std_video_h264_aspect_ratio_idc_18_11";
+ case std_video_h264_aspect_ratio_idc_15_11: return "std_video_h264_aspect_ratio_idc_15_11";
+ case std_video_h264_aspect_ratio_idc_64_33: return "std_video_h264_aspect_ratio_idc_64_33";
+ case std_video_h264_aspect_ratio_idc_160_99: return "std_video_h264_aspect_ratio_idc_160_99";
+ case std_video_h264_aspect_ratio_idc_4_3: return "std_video_h264_aspect_ratio_idc_4_3";
+ case std_video_h264_aspect_ratio_idc_3_2: return "std_video_h264_aspect_ratio_idc_3_2";
+ case std_video_h264_aspect_ratio_idc_2_1: return "std_video_h264_aspect_ratio_idc_2_1";
+ case std_video_h264_aspect_ratio_idc_extended_sar: return "std_video_h264_aspect_ratio_idc_extended_sar";
+ case std_video_h264_aspect_ratio_idc_invalid: return "std_video_h264_aspect_ratio_idc_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264WeightedBiPredIdcName (StdVideoH264WeightedBiPredIdc value)
+{
+ switch (value)
+ {
+ case std_video_h264_default_weighted_b_slices_prediction_idc: return "std_video_h264_default_weighted_b_slices_prediction_idc";
+ case std_video_h264_explicit_weighted_b_slices_prediction_idc: return "std_video_h264_explicit_weighted_b_slices_prediction_idc";
+ case std_video_h264_implicit_weighted_b_slices_prediction_idc: return "std_video_h264_implicit_weighted_b_slices_prediction_idc";
+ case std_video_h264_invalid_weighted_b_slices_prediction_idc: return "std_video_h264_invalid_weighted_b_slices_prediction_idc";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264ModificationOfPicNumsIdcName (StdVideoH264ModificationOfPicNumsIdc value)
+{
+ switch (value)
+ {
+ case std_video_h264_modification_of_pic_nums_idc_short_term_subtract: return "std_video_h264_modification_of_pic_nums_idc_short_term_subtract";
+ case std_video_h264_modification_of_pic_nums_idc_short_term_add: return "std_video_h264_modification_of_pic_nums_idc_short_term_add";
+ case std_video_h264_modification_of_pic_nums_idc_long_term: return "std_video_h264_modification_of_pic_nums_idc_long_term";
+ case std_video_h264_modification_of_pic_nums_idc_end: return "std_video_h264_modification_of_pic_nums_idc_end";
+ case std_video_h264_modification_of_pic_nums_idc_invalid: return "std_video_h264_modification_of_pic_nums_idc_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264MemMgmtControlOpName (StdVideoH264MemMgmtControlOp value)
+{
+ switch (value)
+ {
+ case std_video_h264_mem_mgmt_control_op_end: return "std_video_h264_mem_mgmt_control_op_end";
+ case std_video_h264_mem_mgmt_control_op_unmark_short_term: return "std_video_h264_mem_mgmt_control_op_unmark_short_term";
+ case std_video_h264_mem_mgmt_control_op_unmark_long_term: return "std_video_h264_mem_mgmt_control_op_unmark_long_term";
+ case std_video_h264_mem_mgmt_control_op_mark_long_term: return "std_video_h264_mem_mgmt_control_op_mark_long_term";
+ case std_video_h264_mem_mgmt_control_op_set_max_long_term_index: return "std_video_h264_mem_mgmt_control_op_set_max_long_term_index";
+ case std_video_h264_mem_mgmt_control_op_unmark_all: return "std_video_h264_mem_mgmt_control_op_unmark_all";
+ case std_video_h264_mem_mgmt_control_op_mark_current_as_long_term: return "std_video_h264_mem_mgmt_control_op_mark_current_as_long_term";
+ case std_video_h264_mem_mgmt_control_op_invalid: return "std_video_h264_mem_mgmt_control_op_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264CabacInitIdcName (StdVideoH264CabacInitIdc value)
+{
+ switch (value)
+ {
+ case std_video_h264_cabac_init_idc_0: return "std_video_h264_cabac_init_idc_0";
+ case std_video_h264_cabac_init_idc_1: return "std_video_h264_cabac_init_idc_1";
+ case std_video_h264_cabac_init_idc_2: return "std_video_h264_cabac_init_idc_2";
+ case std_video_h264_cabac_init_idc_invalid: return "std_video_h264_cabac_init_idc_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264DisableDeblockingFilterIdcName (StdVideoH264DisableDeblockingFilterIdc value)
+{
+ switch (value)
+ {
+ case std_video_h264_disable_deblocking_filter_idc_disabled: return "std_video_h264_disable_deblocking_filter_idc_disabled";
+ case std_video_h264_disable_deblocking_filter_idc_enabled: return "std_video_h264_disable_deblocking_filter_idc_enabled";
+ case std_video_h264_disable_deblocking_filter_idc_partial: return "std_video_h264_disable_deblocking_filter_idc_partial";
+ case std_video_h264_disable_deblocking_filter_idc_invalid: return "std_video_h264_disable_deblocking_filter_idc_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264PictureTypeName (StdVideoH264PictureType value)
+{
+ switch (value)
+ {
+ case std_video_h264_picture_type_i: return "std_video_h264_picture_type_i";
+ case std_video_h264_picture_type_p: return "std_video_h264_picture_type_p";
+ case std_video_h264_picture_type_b: return "std_video_h264_picture_type_b";
+ case std_video_h264_picture_type_invalid: return "std_video_h264_picture_type_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264SliceTypeName (StdVideoH264SliceType value)
+{
+ switch (value)
+ {
+ case std_video_h264_slice_type_i: return "std_video_h264_slice_type_i";
+ case std_video_h264_slice_type_p: return "std_video_h264_slice_type_p";
+ case std_video_h264_slice_type_b: return "std_video_h264_slice_type_b";
+ case std_video_h264_slice_type_invalid: return "std_video_h264_slice_type_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH264NonVclNaluTypeName (StdVideoH264NonVclNaluType value)
+{
+ switch (value)
+ {
+ case std_video_h264_non_vcl_nalu_type_sps: return "std_video_h264_non_vcl_nalu_type_sps";
+ case std_video_h264_non_vcl_nalu_type_pps: return "std_video_h264_non_vcl_nalu_type_pps";
+ case std_video_h264_non_vcl_nalu_type_aud: return "std_video_h264_non_vcl_nalu_type_aud";
+ case std_video_h264_non_vcl_nalu_type_prefix: return "std_video_h264_non_vcl_nalu_type_prefix";
+ case std_video_h264_non_vcl_nalu_type_end_of_sequence: return "std_video_h264_non_vcl_nalu_type_end_of_sequence";
+ case std_video_h264_non_vcl_nalu_type_end_of_stream: return "std_video_h264_non_vcl_nalu_type_end_of_stream";
+ case std_video_h264_non_vcl_nalu_type_precoded: return "std_video_h264_non_vcl_nalu_type_precoded";
+ case std_video_h264_non_vcl_nalu_type_invalid: return "std_video_h264_non_vcl_nalu_type_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH265ChromaFormatIdcName (StdVideoH265ChromaFormatIdc value)
+{
+ switch (value)
+ {
+ case std_video_h265_chroma_format_idc_monochrome: return "std_video_h265_chroma_format_idc_monochrome";
+ case std_video_h265_chroma_format_idc_420: return "std_video_h265_chroma_format_idc_420";
+ case std_video_h265_chroma_format_idc_422: return "std_video_h265_chroma_format_idc_422";
+ case std_video_h265_chroma_format_idc_444: return "std_video_h265_chroma_format_idc_444";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH265ProfileIdcName (StdVideoH265ProfileIdc value)
+{
+ switch (value)
+ {
+ case std_video_h265_profile_idc_main: return "std_video_h265_profile_idc_main";
+ case std_video_h265_profile_idc_main_10: return "std_video_h265_profile_idc_main_10";
+ case std_video_h265_profile_idc_main_still_picture: return "std_video_h265_profile_idc_main_still_picture";
+ case std_video_h265_profile_idc_format_range_extensions: return "std_video_h265_profile_idc_format_range_extensions";
+ case std_video_h265_profile_idc_scc_extensions: return "std_video_h265_profile_idc_scc_extensions";
+ case std_video_h265_profile_idc_invalid: return "std_video_h265_profile_idc_invalid";
+ default: return DE_NULL;
+ }
+}
+
+const char* getdVideoH265LevelName (StdVideoH265Level value)
+{
+ switch (value)
+ {
+ case std_video_h265_level_1_0: return "std_video_h265_level_1_0";
+ case std_video_h265_level_2_0: return "std_video_h265_level_2_0";
+ case std_video_h265_level_2_1: return "std_video_h265_level_2_1";
+ case std_video_h265_level_3_0: return "std_video_h265_level_3_0";
+ case std_video_h265_level_3_1: return "std_video_h265_level_3_1";
+ case std_video_h265_level_4_0: return "std_video_h265_level_4_0";
+ case std_video_h265_level_4_1: return "std_video_h265_level_4_1";
+ case std_video_h265_level_5_0: return "std_video_h265_level_5_0";
+ case std_video_h265_level_5_1: return "std_video_h265_level_5_1";
+ case std_video_h265_level_5_2: return "std_video_h265_level_5_2";
+ case std_video_h265_level_6_0: return "std_video_h265_level_6_0";
+ case std_video_h265_level_6_1: return "std_video_h265_level_6_1";
+ case std_video_h265_level_6_2: return "std_video_h265_level_6_2";
+ case std_video_h265_level_invalid: return "std_video_h265_level_invalid";
+ default: return DE_NULL;
+ }
+}
+
const char* getFullScreenExclusiveEXTName (VkFullScreenExclusiveEXT value)
{
switch (value)
@@ -2398,6 +2737,10 @@
tcu::Format::BitDesc(VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, "VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT, "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG, "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG"),
+ tcu::Format::BitDesc(VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR, "VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR"),
+ tcu::Format::BitDesc(VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR, "VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR"),
+ tcu::Format::BitDesc(VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR, "VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR"),
+ tcu::Format::BitDesc(VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR, "VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR, "VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT, "VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT"),
tcu::Format::BitDesc(VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, "VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR"),
@@ -2475,6 +2818,12 @@
tcu::Format::BitDesc(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT"),
tcu::Format::BitDesc(VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, "VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT"),
tcu::Format::BitDesc(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, "VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT"),
+ tcu::Format::BitDesc(VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR, "VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR"),
+ tcu::Format::BitDesc(VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR, "VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR"),
+ tcu::Format::BitDesc(VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR, "VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR"),
+ tcu::Format::BitDesc(VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR, "VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR"),
+ tcu::Format::BitDesc(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR, "VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR"),
+ tcu::Format::BitDesc(VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR, "VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR"),
tcu::Format::BitDesc(VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, "VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV"),
tcu::Format::BitDesc(VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, "VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT"),
tcu::Format::BitDesc(VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, "VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR"),
@@ -2521,6 +2870,8 @@
tcu::Format::BitDesc(VK_QUEUE_TRANSFER_BIT, "VK_QUEUE_TRANSFER_BIT"),
tcu::Format::BitDesc(VK_QUEUE_SPARSE_BINDING_BIT, "VK_QUEUE_SPARSE_BINDING_BIT"),
tcu::Format::BitDesc(VK_QUEUE_PROTECTED_BIT, "VK_QUEUE_PROTECTED_BIT"),
+ tcu::Format::BitDesc(VK_QUEUE_VIDEO_DECODE_BIT_KHR, "VK_QUEUE_VIDEO_DECODE_BIT_KHR"),
+ tcu::Format::BitDesc(VK_QUEUE_VIDEO_ENCODE_BIT_KHR, "VK_QUEUE_VIDEO_ENCODE_BIT_KHR"),
tcu::Format::BitDesc(VK_QUEUE_FLAG_BITS_MAX_ENUM, "VK_QUEUE_FLAG_BITS_MAX_ENUM"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
@@ -2645,6 +2996,7 @@
tcu::Format::BitDesc(VK_QUERY_RESULT_WAIT_BIT, "VK_QUERY_RESULT_WAIT_BIT"),
tcu::Format::BitDesc(VK_QUERY_RESULT_WITH_AVAILABILITY_BIT, "VK_QUERY_RESULT_WITH_AVAILABILITY_BIT"),
tcu::Format::BitDesc(VK_QUERY_RESULT_PARTIAL_BIT, "VK_QUERY_RESULT_PARTIAL_BIT"),
+ tcu::Format::BitDesc(VK_QUERY_RESULT_WITH_STATUS_BIT_KHR, "VK_QUERY_RESULT_WITH_STATUS_BIT_KHR"),
tcu::Format::BitDesc(VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM, "VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM"),
};
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
@@ -2680,6 +3032,10 @@
tcu::Format::BitDesc(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, "VK_BUFFER_USAGE_VERTEX_BUFFER_BIT"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, "VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT"),
+ tcu::Format::BitDesc(VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR, "VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR"),
+ tcu::Format::BitDesc(VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR, "VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR"),
+ tcu::Format::BitDesc(VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR, "VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR"),
+ tcu::Format::BitDesc(VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR, "VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT, "VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT, "VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT"),
tcu::Format::BitDesc(VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT, "VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT"),
@@ -3050,6 +3406,7 @@
tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID"),
tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, "VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT"),
tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT, "VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT"),
+ tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA, "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA"),
tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR, "VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR"),
tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR, "VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR"),
tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR, "VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR"),
@@ -3138,6 +3495,7 @@
tcu::Format::BitDesc(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT"),
tcu::Format::BitDesc(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT, "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT"),
tcu::Format::BitDesc(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT"),
+ tcu::Format::BitDesc(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA, "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA"),
tcu::Format::BitDesc(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT, "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT"),
tcu::Format::BitDesc(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR, "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR"),
tcu::Format::BitDesc(VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR, "VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR"),
@@ -3543,6 +3901,204 @@
return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
}
+tcu::Format::Bitfield<32> getVideoCodecOperationFlagsKHRStr (VkVideoCodecOperationFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_INVALID_BIT_KHR, "VK_VIDEO_CODEC_OPERATION_INVALID_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT, "VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT, "VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT, "VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoChromaSubsamplingFlagsKHRStr (VkVideoChromaSubsamplingFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_BIT_KHR, "VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR, "VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR, "VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR, "VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR, "VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoComponentBitDepthFlagsKHRStr (VkVideoComponentBitDepthFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR, "VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR, "VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR, "VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR, "VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoCapabilitiesFlagsKHRStr (VkVideoCapabilitiesFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_CAPABILITIES_PROTECTED_CONTENT_BIT_KHR, "VK_VIDEO_CAPABILITIES_PROTECTED_CONTENT_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CAPABILITIES_SEPARATE_REFERENCE_IMAGES_BIT_KHR, "VK_VIDEO_CAPABILITIES_SEPARATE_REFERENCE_IMAGES_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CAPABILITIES_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_CAPABILITIES_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoSessionCreateFlagsKHRStr (VkVideoSessionCreateFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_SESSION_CREATE_DEFAULT_KHR, "VK_VIDEO_SESSION_CREATE_DEFAULT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR, "VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoCodingControlFlagsKHRStr (VkVideoCodingControlFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_CODING_CONTROL_DEFAULT_KHR, "VK_VIDEO_CODING_CONTROL_DEFAULT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR, "VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoCodingQualityPresetFlagsKHRStr (VkVideoCodingQualityPresetFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_CODING_QUALITY_PRESET_DEFAULT_BIT_KHR, "VK_VIDEO_CODING_QUALITY_PRESET_DEFAULT_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODING_QUALITY_PRESET_NORMAL_BIT_KHR, "VK_VIDEO_CODING_QUALITY_PRESET_NORMAL_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODING_QUALITY_PRESET_POWER_BIT_KHR, "VK_VIDEO_CODING_QUALITY_PRESET_POWER_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODING_QUALITY_PRESET_QUALITY_BIT_KHR, "VK_VIDEO_CODING_QUALITY_PRESET_QUALITY_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_CODING_QUALITY_PRESET_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_CODING_QUALITY_PRESET_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoDecodeFlagsKHRStr (VkVideoDecodeFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_DEFAULT_KHR, "VK_VIDEO_DECODE_DEFAULT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_RESERVED_0_BIT_KHR, "VK_VIDEO_DECODE_RESERVED_0_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_DECODE_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoEncodeFlagsKHRStr (VkVideoEncodeFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_DEFAULT_KHR, "VK_VIDEO_ENCODE_DEFAULT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RESERVED_0_BIT_KHR, "VK_VIDEO_ENCODE_RESERVED_0_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_ENCODE_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoEncodeRateControlFlagsKHRStr (VkVideoEncodeRateControlFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RATE_CONTROL_DEFAULT_KHR, "VK_VIDEO_ENCODE_RATE_CONTROL_DEFAULT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RATE_CONTROL_RESET_BIT_KHR, "VK_VIDEO_ENCODE_RATE_CONTROL_RESET_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_ENCODE_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoEncodeRateControlModeFlagsKHRStr (VkVideoEncodeRateControlModeFlagsKHR value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR, "VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR, "VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR, "VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_RATE_CONTROL_MODE_FLAG_BITS_MAX_ENUM_KHR, "VK_VIDEO_ENCODE_RATE_CONTROL_MODE_FLAG_BITS_MAX_ENUM_KHR"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoEncodeH264CapabilitiesFlagsEXTStr (VkVideoEncodeH264CapabilitiesFlagsEXT value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CAPABILITIES_FLAG_BITS_MAX_ENUM_EXT, "VK_VIDEO_ENCODE_H264_CAPABILITIES_FLAG_BITS_MAX_ENUM_EXT"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoEncodeH264InputModeFlagsEXTStr (VkVideoEncodeH264InputModeFlagsEXT value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT, "VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT, "VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT, "VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_INPUT_MODE_FLAG_BITS_MAX_ENUM_EXT, "VK_VIDEO_ENCODE_H264_INPUT_MODE_FLAG_BITS_MAX_ENUM_EXT"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoEncodeH264OutputModeFlagsEXTStr (VkVideoEncodeH264OutputModeFlagsEXT value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT, "VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT, "VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT, "VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FLAG_BITS_MAX_ENUM_EXT, "VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FLAG_BITS_MAX_ENUM_EXT"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoEncodeH264CreateFlagsEXTStr (VkVideoEncodeH264CreateFlagsEXT value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CREATE_DEFAULT_EXT, "VK_VIDEO_ENCODE_H264_CREATE_DEFAULT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CREATE_RESERVED_0_BIT_EXT, "VK_VIDEO_ENCODE_H264_CREATE_RESERVED_0_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_ENCODE_H264_CREATE_FLAG_BITS_MAX_ENUM_EXT, "VK_VIDEO_ENCODE_H264_CREATE_FLAG_BITS_MAX_ENUM_EXT"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getVideoDecodeH264FieldLayoutFlagsEXTStr (VkVideoDecodeH264FieldLayoutFlagsEXT value)
+{
+ static const tcu::Format::BitDesc s_desc[] =
+ {
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_PROGRESSIVE_PICTURES_ONLY_EXT, "VK_VIDEO_DECODE_H264_PROGRESSIVE_PICTURES_ONLY_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_FIELD_LAYOUT_LINE_INTERLACED_PLANE_BIT_EXT, "VK_VIDEO_DECODE_H264_FIELD_LAYOUT_LINE_INTERLACED_PLANE_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_FIELD_LAYOUT_SEPARATE_INTERLACED_PLANE_BIT_EXT, "VK_VIDEO_DECODE_H264_FIELD_LAYOUT_SEPARATE_INTERLACED_PLANE_BIT_EXT"),
+ tcu::Format::BitDesc(VK_VIDEO_DECODE_H264_FIELD_LAYOUT_FLAG_BITS_MAX_ENUM_EXT, "VK_VIDEO_DECODE_H264_FIELD_LAYOUT_FLAG_BITS_MAX_ENUM_EXT"),
+ };
+ return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
tcu::Format::Bitfield<32> getInstanceCreateFlagsStr (VkInstanceCreateFlags value)
{
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
@@ -3718,6 +4274,26 @@
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
}
+tcu::Format::Bitfield<32> getVideoBeginCodingFlagsKHRStr (VkVideoBeginCodingFlagsKHR value)
+{
+ return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
+}
+
+tcu::Format::Bitfield<32> getVideoEndCodingFlagsKHRStr (VkVideoEndCodingFlagsKHR value)
+{
+ return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
+}
+
+tcu::Format::Bitfield<32> getVideoDecodeH264CreateFlagsEXTStr (VkVideoDecodeH264CreateFlagsEXT value)
+{
+ return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
+}
+
+tcu::Format::Bitfield<32> getVideoDecodeH265CreateFlagsEXTStr (VkVideoDecodeH265CreateFlagsEXT value)
+{
+ return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
+}
+
tcu::Format::Bitfield<32> getImagePipeSurfaceCreateFlagsFUCHSIAStr (VkImagePipeSurfaceCreateFlagsFUCHSIA value)
{
return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
@@ -10073,6 +10649,28 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceInheritedViewportScissorFeaturesNV& value)
+{
+ s << "VkPhysicalDeviceInheritedViewportScissorFeaturesNV = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tinheritedViewportScissor2D = " << value.inheritedViewportScissor2D << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkCommandBufferInheritanceViewportScissorInfoNV& value)
+{
+ s << "VkCommandBufferInheritanceViewportScissorInfoNV = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tviewportScissor2D = " << value.viewportScissor2D << '\n';
+ s << "\tviewportDepthCount = " << value.viewportDepthCount << '\n';
+ s << "\tpViewportDepths = " << value.pViewportDepths << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT& value)
{
s << "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT = {\n";
@@ -10304,6 +10902,16 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT& value)
+{
+ s << "VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tycbcr2plane444Formats = " << value.ycbcr2plane444Formats << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& value)
{
s << "VkPhysicalDeviceFragmentDensityMap2FeaturesEXT = {\n";
@@ -10388,6 +10996,75 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT& value)
+{
+ s << "VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tvertexInputDynamicState = " << value.vertexInputDynamicState << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVertexInputBindingDescription2EXT& value)
+{
+ s << "VkVertexInputBindingDescription2EXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tbinding = " << value.binding << '\n';
+ s << "\tstride = " << value.stride << '\n';
+ s << "\tinputRate = " << value.inputRate << '\n';
+ s << "\tdivisor = " << value.divisor << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVertexInputAttributeDescription2EXT& value)
+{
+ s << "VkVertexInputAttributeDescription2EXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tlocation = " << value.location << '\n';
+ s << "\tbinding = " << value.binding << '\n';
+ s << "\tformat = " << value.format << '\n';
+ s << "\toffset = " << value.offset << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceExtendedDynamicState2FeaturesEXT& value)
+{
+ s << "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\textendedDynamicState2 = " << value.extendedDynamicState2 << '\n';
+ s << "\textendedDynamicState2LogicOp = " << value.extendedDynamicState2LogicOp << '\n';
+ s << "\textendedDynamicState2PatchControlPoints = " << value.extendedDynamicState2PatchControlPoints << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceColorWriteEnableFeaturesEXT& value)
+{
+ s << "VkPhysicalDeviceColorWriteEnableFeaturesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tcolorWriteEnable = " << value.colorWriteEnable << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPipelineColorWriteCreateInfoEXT& value)
+{
+ s << "VkPipelineColorWriteCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tattachmentCount = " << value.attachmentCount << '\n';
+ s << "\tpColorWriteEnables = " << value.pColorWriteEnables << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkDeviceOrHostAddressKHR& value)
{
s << "VkDeviceOrHostAddressKHR = {\n";
@@ -10807,6 +11484,218 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkVideoQueueFamilyProperties2KHR& value)
+{
+ s << "VkVideoQueueFamilyProperties2KHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tvideoCodecOperations = " << getVideoCodecOperationFlagsKHRStr(value.videoCodecOperations) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoProfileKHR& value)
+{
+ s << "VkVideoProfileKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tvideoCodecOperation = " << value.videoCodecOperation << '\n';
+ s << "\tchromaSubsampling = " << getVideoChromaSubsamplingFlagsKHRStr(value.chromaSubsampling) << '\n';
+ s << "\tlumaBitDepth = " << getVideoComponentBitDepthFlagsKHRStr(value.lumaBitDepth) << '\n';
+ s << "\tchromaBitDepth = " << getVideoComponentBitDepthFlagsKHRStr(value.chromaBitDepth) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoProfilesKHR& value)
+{
+ s << "VkVideoProfilesKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tprofileCount = " << value.profileCount << '\n';
+ s << "\tpProfiles = " << value.pProfiles << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoCapabilitiesKHR& value)
+{
+ s << "VkVideoCapabilitiesKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tcapabilityFlags = " << getVideoCapabilitiesFlagsKHRStr(value.capabilityFlags) << '\n';
+ s << "\tminBitstreamBufferOffsetAlignment = " << value.minBitstreamBufferOffsetAlignment << '\n';
+ s << "\tminBitstreamBufferSizeAlignment = " << value.minBitstreamBufferSizeAlignment << '\n';
+ s << "\tvideoPictureExtentGranularity = " << value.videoPictureExtentGranularity << '\n';
+ s << "\tminExtent = " << value.minExtent << '\n';
+ s << "\tmaxExtent = " << value.maxExtent << '\n';
+ s << "\tmaxReferencePicturesSlotsCount = " << value.maxReferencePicturesSlotsCount << '\n';
+ s << "\tmaxReferencePicturesActiveCount = " << value.maxReferencePicturesActiveCount << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkPhysicalDeviceVideoFormatInfoKHR& value)
+{
+ s << "VkPhysicalDeviceVideoFormatInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\timageUsage = " << getImageUsageFlagsStr(value.imageUsage) << '\n';
+ s << "\tpVideoProfiles = " << value.pVideoProfiles << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoFormatPropertiesKHR& value)
+{
+ s << "VkVideoFormatPropertiesKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tformat = " << value.format << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoPictureResourceKHR& value)
+{
+ s << "VkVideoPictureResourceKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tcodedOffset = " << value.codedOffset << '\n';
+ s << "\tcodedExtent = " << value.codedExtent << '\n';
+ s << "\tbaseArrayLayer = " << value.baseArrayLayer << '\n';
+ s << "\timageViewBinding = " << value.imageViewBinding << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoReferenceSlotKHR& value)
+{
+ s << "VkVideoReferenceSlotKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tslotIndex = " << value.slotIndex << '\n';
+ s << "\tpPictureResource = " << value.pPictureResource << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoGetMemoryPropertiesKHR& value)
+{
+ s << "VkVideoGetMemoryPropertiesKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmemoryBindIndex = " << value.memoryBindIndex << '\n';
+ s << "\tpMemoryRequirements = " << value.pMemoryRequirements << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoBindMemoryKHR& value)
+{
+ s << "VkVideoBindMemoryKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmemoryBindIndex = " << value.memoryBindIndex << '\n';
+ s << "\tmemory = " << value.memory << '\n';
+ s << "\tmemoryOffset = " << value.memoryOffset << '\n';
+ s << "\tmemorySize = " << value.memorySize << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoSessionCreateInfoKHR& value)
+{
+ s << "VkVideoSessionCreateInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tqueueFamilyIndex = " << value.queueFamilyIndex << '\n';
+ s << "\tflags = " << getVideoSessionCreateFlagsKHRStr(value.flags) << '\n';
+ s << "\tpVideoProfile = " << value.pVideoProfile << '\n';
+ s << "\tpictureFormat = " << value.pictureFormat << '\n';
+ s << "\tmaxCodedExtent = " << value.maxCodedExtent << '\n';
+ s << "\treferencePicturesFormat = " << value.referencePicturesFormat << '\n';
+ s << "\tmaxReferencePicturesSlotsCount = " << value.maxReferencePicturesSlotsCount << '\n';
+ s << "\tmaxReferencePicturesActiveCount = " << value.maxReferencePicturesActiveCount << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoSessionParametersCreateInfoKHR& value)
+{
+ s << "VkVideoSessionParametersCreateInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tvideoSessionParametersTemplate = " << value.videoSessionParametersTemplate << '\n';
+ s << "\tvideoSession = " << value.videoSession << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoSessionParametersUpdateInfoKHR& value)
+{
+ s << "VkVideoSessionParametersUpdateInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tupdateSequenceCount = " << value.updateSequenceCount << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoBeginCodingInfoKHR& value)
+{
+ s << "VkVideoBeginCodingInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoBeginCodingFlagsKHRStr(value.flags) << '\n';
+ s << "\tcodecQualityPreset = " << getVideoCodingQualityPresetFlagsKHRStr(value.codecQualityPreset) << '\n';
+ s << "\tvideoSession = " << value.videoSession << '\n';
+ s << "\tvideoSessionParameters = " << value.videoSessionParameters << '\n';
+ s << "\treferenceSlotCount = " << value.referenceSlotCount << '\n';
+ s << "\tpReferenceSlots = " << value.pReferenceSlots << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEndCodingInfoKHR& value)
+{
+ s << "VkVideoEndCodingInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoEndCodingFlagsKHRStr(value.flags) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoCodingControlInfoKHR& value)
+{
+ s << "VkVideoCodingControlInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoCodingControlFlagsKHRStr(value.flags) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeInfoKHR& value)
+{
+ s << "VkVideoDecodeInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoDecodeFlagsKHRStr(value.flags) << '\n';
+ s << "\tcodedOffset = " << value.codedOffset << '\n';
+ s << "\tcodedExtent = " << value.codedExtent << '\n';
+ s << "\tsrcBuffer = " << value.srcBuffer << '\n';
+ s << "\tsrcBufferOffset = " << value.srcBufferOffset << '\n';
+ s << "\tsrcBufferRange = " << value.srcBufferRange << '\n';
+ s << "\tdstPictureResource = " << value.dstPictureResource << '\n';
+ s << "\tpSetupReferenceSlot = " << value.pSetupReferenceSlot << '\n';
+ s << "\treferenceSlotCount = " << value.referenceSlotCount << '\n';
+ s << "\tpReferenceSlots = " << value.pReferenceSlots << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkPhysicalDevicePortabilitySubsetFeaturesKHR& value)
{
s << "VkPhysicalDevicePortabilitySubsetFeaturesKHR = {\n";
@@ -10841,6 +11730,1041 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeInfoKHR& value)
+{
+ s << "VkVideoEncodeInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoEncodeFlagsKHRStr(value.flags) << '\n';
+ s << "\tqualityLevel = " << value.qualityLevel << '\n';
+ s << "\tcodedExtent = " << value.codedExtent << '\n';
+ s << "\tdstBitstreamBuffer = " << value.dstBitstreamBuffer << '\n';
+ s << "\tdstBitstreamBufferOffset = " << value.dstBitstreamBufferOffset << '\n';
+ s << "\tdstBitstreamBufferMaxRange = " << value.dstBitstreamBufferMaxRange << '\n';
+ s << "\tsrcPictureResource = " << value.srcPictureResource << '\n';
+ s << "\tpSetupReferenceSlot = " << value.pSetupReferenceSlot << '\n';
+ s << "\treferenceSlotCount = " << value.referenceSlotCount << '\n';
+ s << "\tpReferenceSlots = " << value.pReferenceSlots << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeRateControlInfoKHR& value)
+{
+ s << "VkVideoEncodeRateControlInfoKHR = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoEncodeRateControlFlagsKHRStr(value.flags) << '\n';
+ s << "\trateControlMode = " << value.rateControlMode << '\n';
+ s << "\taverageBitrate = " << value.averageBitrate << '\n';
+ s << "\tpeakToAverageBitrateRatio = " << value.peakToAverageBitrateRatio << '\n';
+ s << "\tframeRateNumerator = " << value.frameRateNumerator << '\n';
+ s << "\tframeRateDenominator = " << value.frameRateDenominator << '\n';
+ s << "\tvirtualBufferSizeInMs = " << value.virtualBufferSizeInMs << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SpsVuiFlags& value)
+{
+ s << "StdVideoH264SpsVuiFlags = {\n";
+ s << "\taspect_ratio_info_present_flag = " << value.aspect_ratio_info_present_flag << '\n';
+ s << "\toverscan_info_present_flag = " << value.overscan_info_present_flag << '\n';
+ s << "\toverscan_appropriate_flag = " << value.overscan_appropriate_flag << '\n';
+ s << "\tvideo_signal_type_present_flag = " << value.video_signal_type_present_flag << '\n';
+ s << "\tvideo_full_range_flag = " << value.video_full_range_flag << '\n';
+ s << "\tcolor_description_present_flag = " << value.color_description_present_flag << '\n';
+ s << "\tchroma_loc_info_present_flag = " << value.chroma_loc_info_present_flag << '\n';
+ s << "\ttiming_info_present_flag = " << value.timing_info_present_flag << '\n';
+ s << "\tfixed_frame_rate_flag = " << value.fixed_frame_rate_flag << '\n';
+ s << "\tbitstream_restriction_flag = " << value.bitstream_restriction_flag << '\n';
+ s << "\tnal_hrd_parameters_present_flag = " << value.nal_hrd_parameters_present_flag << '\n';
+ s << "\tvcl_hrd_parameters_present_flag = " << value.vcl_hrd_parameters_present_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264HrdParameters& value)
+{
+ s << "StdVideoH264HrdParameters = {\n";
+ s << "\tcpb_cnt_minus1 = " << value.cpb_cnt_minus1 << '\n';
+ s << "\tbit_rate_scale = " << value.bit_rate_scale << '\n';
+ s << "\tcpb_size_scale = " << value.cpb_size_scale << '\n';
+ s << "\tbit_rate_value_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.bit_rate_value_minus1), DE_ARRAY_END(value.bit_rate_value_minus1)) << '\n';
+ s << "\tcpb_size_value_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.cpb_size_value_minus1), DE_ARRAY_END(value.cpb_size_value_minus1)) << '\n';
+ s << "\tcbr_flag = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.cbr_flag)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.cbr_flag))) << '\n';
+ s << "\tinitial_cpb_removal_delay_length_minus1 = " << value.initial_cpb_removal_delay_length_minus1 << '\n';
+ s << "\tcpb_removal_delay_length_minus1 = " << value.cpb_removal_delay_length_minus1 << '\n';
+ s << "\tdpb_output_delay_length_minus1 = " << value.dpb_output_delay_length_minus1 << '\n';
+ s << "\ttime_offset_length = " << value.time_offset_length << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SequenceParameterSetVui& value)
+{
+ s << "StdVideoH264SequenceParameterSetVui = {\n";
+ s << "\taspect_ratio_idc = " << value.aspect_ratio_idc << '\n';
+ s << "\tsar_width = " << value.sar_width << '\n';
+ s << "\tsar_height = " << value.sar_height << '\n';
+ s << "\tvideo_format = " << value.video_format << '\n';
+ s << "\tcolor_primaries = " << value.color_primaries << '\n';
+ s << "\ttransfer_characteristics = " << value.transfer_characteristics << '\n';
+ s << "\tmatrix_coefficients = " << value.matrix_coefficients << '\n';
+ s << "\tnum_units_in_tick = " << value.num_units_in_tick << '\n';
+ s << "\ttime_scale = " << value.time_scale << '\n';
+ s << "\thrd_parameters = " << value.hrd_parameters << '\n';
+ s << "\tnum_reorder_frames = " << value.num_reorder_frames << '\n';
+ s << "\tmax_dec_frame_buffering = " << value.max_dec_frame_buffering << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SpsFlags& value)
+{
+ s << "StdVideoH264SpsFlags = {\n";
+ s << "\tconstraint_set0_flag = " << value.constraint_set0_flag << '\n';
+ s << "\tconstraint_set1_flag = " << value.constraint_set1_flag << '\n';
+ s << "\tconstraint_set2_flag = " << value.constraint_set2_flag << '\n';
+ s << "\tconstraint_set3_flag = " << value.constraint_set3_flag << '\n';
+ s << "\tconstraint_set4_flag = " << value.constraint_set4_flag << '\n';
+ s << "\tconstraint_set5_flag = " << value.constraint_set5_flag << '\n';
+ s << "\tdirect_8x8_inference_flag = " << value.direct_8x8_inference_flag << '\n';
+ s << "\tmb_adaptive_frame_field_flag = " << value.mb_adaptive_frame_field_flag << '\n';
+ s << "\tframe_mbs_only_flag = " << value.frame_mbs_only_flag << '\n';
+ s << "\tdelta_pic_order_always_zero_flag = " << value.delta_pic_order_always_zero_flag << '\n';
+ s << "\tresidual_colour_transform_flag = " << value.residual_colour_transform_flag << '\n';
+ s << "\tgaps_in_frame_num_value_allowed_flag = " << value.gaps_in_frame_num_value_allowed_flag << '\n';
+ s << "\tfirst_picture_after_seek_flag = " << value.first_picture_after_seek_flag << '\n';
+ s << "\tqpprime_y_zero_transform_bypass_flag = " << value.qpprime_y_zero_transform_bypass_flag << '\n';
+ s << "\tframe_cropping_flag = " << value.frame_cropping_flag << '\n';
+ s << "\tscaling_matrix_present_flag = " << value.scaling_matrix_present_flag << '\n';
+ s << "\tvui_parameters_present_flag = " << value.vui_parameters_present_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264ScalingLists& value)
+{
+ s << "StdVideoH264ScalingLists = {\n";
+ s << "\tscaling_list_present_mask = " << value.scaling_list_present_mask << '\n';
+ s << "\tuse_default_scaling_matrix_mask = " << value.use_default_scaling_matrix_mask << '\n';
+ s << "\tScalingList4x4 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.ScalingList4x4), DE_ARRAY_END(value.ScalingList4x4)) << '\n';
+ s << "\tScalingList8x8 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.ScalingList8x8), DE_ARRAY_END(value.ScalingList8x8)) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264SequenceParameterSet& value)
+{
+ s << "StdVideoH264SequenceParameterSet = {\n";
+ s << "\tprofile_idc = " << value.profile_idc << '\n';
+ s << "\tlevel_idc = " << value.level_idc << '\n';
+ s << "\tseq_parameter_set_id = " << value.seq_parameter_set_id << '\n';
+ s << "\tchroma_format_idc = " << value.chroma_format_idc << '\n';
+ s << "\tbit_depth_luma_minus8 = " << value.bit_depth_luma_minus8 << '\n';
+ s << "\tbit_depth_chroma_minus8 = " << value.bit_depth_chroma_minus8 << '\n';
+ s << "\tlog2_max_frame_num_minus4 = " << value.log2_max_frame_num_minus4 << '\n';
+ s << "\tpic_order_cnt_type = " << value.pic_order_cnt_type << '\n';
+ s << "\tlog2_max_pic_order_cnt_lsb_minus4 = " << value.log2_max_pic_order_cnt_lsb_minus4 << '\n';
+ s << "\toffset_for_non_ref_pic = " << value.offset_for_non_ref_pic << '\n';
+ s << "\toffset_for_top_to_bottom_field = " << value.offset_for_top_to_bottom_field << '\n';
+ s << "\tnum_ref_frames_in_pic_order_cnt_cycle = " << value.num_ref_frames_in_pic_order_cnt_cycle << '\n';
+ s << "\tmax_num_ref_frames = " << value.max_num_ref_frames << '\n';
+ s << "\tpic_width_in_mbs_minus1 = " << value.pic_width_in_mbs_minus1 << '\n';
+ s << "\tpic_height_in_map_units_minus1 = " << value.pic_height_in_map_units_minus1 << '\n';
+ s << "\tframe_crop_left_offset = " << value.frame_crop_left_offset << '\n';
+ s << "\tframe_crop_right_offset = " << value.frame_crop_right_offset << '\n';
+ s << "\tframe_crop_top_offset = " << value.frame_crop_top_offset << '\n';
+ s << "\tframe_crop_bottom_offset = " << value.frame_crop_bottom_offset << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << "\toffset_for_ref_frame = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.offset_for_ref_frame), DE_ARRAY_END(value.offset_for_ref_frame)) << '\n';
+ s << "\tpScalingLists = " << value.pScalingLists << '\n';
+ s << "\tpSequenceParameterSetVui = " << value.pSequenceParameterSetVui << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264PpsFlags& value)
+{
+ s << "StdVideoH264PpsFlags = {\n";
+ s << "\ttransform_8x8_mode_flag = " << value.transform_8x8_mode_flag << '\n';
+ s << "\tredundant_pic_cnt_present_flag = " << value.redundant_pic_cnt_present_flag << '\n';
+ s << "\tconstrained_intra_pred_flag = " << value.constrained_intra_pred_flag << '\n';
+ s << "\tdeblocking_filter_control_present_flag = " << value.deblocking_filter_control_present_flag << '\n';
+ s << "\tweighted_bipred_idc_flag = " << value.weighted_bipred_idc_flag << '\n';
+ s << "\tweighted_pred_flag = " << value.weighted_pred_flag << '\n';
+ s << "\tpic_order_present_flag = " << value.pic_order_present_flag << '\n';
+ s << "\tentropy_coding_mode_flag = " << value.entropy_coding_mode_flag << '\n';
+ s << "\tscaling_matrix_present_flag = " << value.scaling_matrix_present_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH264PictureParameterSet& value)
+{
+ s << "StdVideoH264PictureParameterSet = {\n";
+ s << "\tseq_parameter_set_id = " << value.seq_parameter_set_id << '\n';
+ s << "\tpic_parameter_set_id = " << value.pic_parameter_set_id << '\n';
+ s << "\tnum_ref_idx_l0_default_active_minus1 = " << value.num_ref_idx_l0_default_active_minus1 << '\n';
+ s << "\tnum_ref_idx_l1_default_active_minus1 = " << value.num_ref_idx_l1_default_active_minus1 << '\n';
+ s << "\tweighted_bipred_idc = " << value.weighted_bipred_idc << '\n';
+ s << "\tpic_init_qp_minus26 = " << value.pic_init_qp_minus26 << '\n';
+ s << "\tpic_init_qs_minus26 = " << value.pic_init_qs_minus26 << '\n';
+ s << "\tchroma_qp_index_offset = " << value.chroma_qp_index_offset << '\n';
+ s << "\tsecond_chroma_qp_index_offset = " << value.second_chroma_qp_index_offset << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << "\tpScalingLists = " << value.pScalingLists << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264SliceHeaderFlags& value)
+{
+ s << "StdVideoEncodeH264SliceHeaderFlags = {\n";
+ s << "\tidr_flag = " << value.idr_flag << '\n';
+ s << "\tis_reference_flag = " << value.is_reference_flag << '\n';
+ s << "\tnum_ref_idx_active_override_flag = " << value.num_ref_idx_active_override_flag << '\n';
+ s << "\tno_output_of_prior_pics_flag = " << value.no_output_of_prior_pics_flag << '\n';
+ s << "\tlong_term_reference_flag = " << value.long_term_reference_flag << '\n';
+ s << "\tadaptive_ref_pic_marking_mode_flag = " << value.adaptive_ref_pic_marking_mode_flag << '\n';
+ s << "\tno_prior_references_available_flag = " << value.no_prior_references_available_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264PictureInfoFlags& value)
+{
+ s << "StdVideoEncodeH264PictureInfoFlags = {\n";
+ s << "\tidr_flag = " << value.idr_flag << '\n';
+ s << "\tis_reference_flag = " << value.is_reference_flag << '\n';
+ s << "\tlong_term_reference_flag = " << value.long_term_reference_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefMgmtFlags& value)
+{
+ s << "StdVideoEncodeH264RefMgmtFlags = {\n";
+ s << "\tref_pic_list_modification_l0_flag = " << value.ref_pic_list_modification_l0_flag << '\n';
+ s << "\tref_pic_list_modification_l1_flag = " << value.ref_pic_list_modification_l1_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefListModEntry& value)
+{
+ s << "StdVideoEncodeH264RefListModEntry = {\n";
+ s << "\tmodification_of_pic_nums_idc = " << value.modification_of_pic_nums_idc << '\n';
+ s << "\tabs_diff_pic_num_minus1 = " << value.abs_diff_pic_num_minus1 << '\n';
+ s << "\tlong_term_pic_num = " << value.long_term_pic_num << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefPicMarkingEntry& value)
+{
+ s << "StdVideoEncodeH264RefPicMarkingEntry = {\n";
+ s << "\toperation = " << value.operation << '\n';
+ s << "\tdifference_of_pic_nums_minus1 = " << value.difference_of_pic_nums_minus1 << '\n';
+ s << "\tlong_term_pic_num = " << value.long_term_pic_num << '\n';
+ s << "\tlong_term_frame_idx = " << value.long_term_frame_idx << '\n';
+ s << "\tmax_long_term_frame_idx_plus1 = " << value.max_long_term_frame_idx_plus1 << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264RefMemMgmtCtrlOperations& value)
+{
+ s << "StdVideoEncodeH264RefMemMgmtCtrlOperations = {\n";
+ s << "\tflags = " << value.flags << '\n';
+ s << "\trefList0ModOpCount = " << value.refList0ModOpCount << '\n';
+ s << "\tpRefList0ModOperations = " << value.pRefList0ModOperations << '\n';
+ s << "\trefList1ModOpCount = " << value.refList1ModOpCount << '\n';
+ s << "\tpRefList1ModOperations = " << value.pRefList1ModOperations << '\n';
+ s << "\trefPicMarkingOpCount = " << value.refPicMarkingOpCount << '\n';
+ s << "\tpRefPicMarkingOperations = " << value.pRefPicMarkingOperations << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264PictureInfo& value)
+{
+ s << "StdVideoEncodeH264PictureInfo = {\n";
+ s << "\tflags = " << value.flags << '\n';
+ s << "\tpictureType = " << value.pictureType << '\n';
+ s << "\tframeNum = " << value.frameNum << '\n';
+ s << "\tpictureOrderCount = " << value.pictureOrderCount << '\n';
+ s << "\tlong_term_pic_num = " << value.long_term_pic_num << '\n';
+ s << "\tlong_term_frame_idx = " << value.long_term_frame_idx << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoEncodeH264SliceHeader& value)
+{
+ s << "StdVideoEncodeH264SliceHeader = {\n";
+ s << "\tflags = " << value.flags << '\n';
+ s << "\tslice_type = " << value.slice_type << '\n';
+ s << "\tseq_parameter_set_id = " << value.seq_parameter_set_id << '\n';
+ s << "\tpic_parameter_set_id = " << value.pic_parameter_set_id << '\n';
+ s << "\tidr_pic_id = " << value.idr_pic_id << '\n';
+ s << "\tnum_ref_idx_l0_active_minus1 = " << value.num_ref_idx_l0_active_minus1 << '\n';
+ s << "\tnum_ref_idx_l1_active_minus1 = " << value.num_ref_idx_l1_active_minus1 << '\n';
+ s << "\tcabac_init_idc = " << value.cabac_init_idc << '\n';
+ s << "\tdisable_deblocking_filter_idc = " << value.disable_deblocking_filter_idc << '\n';
+ s << "\tslice_alpha_c0_offset_div2 = " << value.slice_alpha_c0_offset_div2 << '\n';
+ s << "\tslice_beta_offset_div2 = " << value.slice_beta_offset_div2 << '\n';
+ s << "\tpMemMgmtCtrlOperations = " << value.pMemMgmtCtrlOperations << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264CapabilitiesEXT& value)
+{
+ s << "VkVideoEncodeH264CapabilitiesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoEncodeH264CapabilitiesFlagsEXTStr(value.flags) << '\n';
+ s << "\tinputModeFlags = " << getVideoEncodeH264InputModeFlagsEXTStr(value.inputModeFlags) << '\n';
+ s << "\toutputModeFlags = " << getVideoEncodeH264OutputModeFlagsEXTStr(value.outputModeFlags) << '\n';
+ s << "\tminPictureSizeInMbs = " << value.minPictureSizeInMbs << '\n';
+ s << "\tmaxPictureSizeInMbs = " << value.maxPictureSizeInMbs << '\n';
+ s << "\tinputImageDataAlignment = " << value.inputImageDataAlignment << '\n';
+ s << "\tmaxNumL0ReferenceForP = " << value.maxNumL0ReferenceForP << '\n';
+ s << "\tmaxNumL0ReferenceForB = " << value.maxNumL0ReferenceForB << '\n';
+ s << "\tmaxNumL1Reference = " << value.maxNumL1Reference << '\n';
+ s << "\tqualityLevelCount = " << value.qualityLevelCount << '\n';
+ s << "\tstdExtensionVersion = " << value.stdExtensionVersion << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264SessionCreateInfoEXT& value)
+{
+ s << "VkVideoEncodeH264SessionCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoEncodeH264CreateFlagsEXTStr(value.flags) << '\n';
+ s << "\tmaxPictureSizeInMbs = " << value.maxPictureSizeInMbs << '\n';
+ s << "\tpStdExtensionVersion = " << value.pStdExtensionVersion << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264SessionParametersAddInfoEXT& value)
+{
+ s << "VkVideoEncodeH264SessionParametersAddInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tspsStdCount = " << value.spsStdCount << '\n';
+ s << "\tpSpsStd = " << value.pSpsStd << '\n';
+ s << "\tppsStdCount = " << value.ppsStdCount << '\n';
+ s << "\tpPpsStd = " << value.pPpsStd << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264SessionParametersCreateInfoEXT& value)
+{
+ s << "VkVideoEncodeH264SessionParametersCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxSpsStdCount = " << value.maxSpsStdCount << '\n';
+ s << "\tmaxPpsStdCount = " << value.maxPpsStdCount << '\n';
+ s << "\tpParametersAddInfo = " << value.pParametersAddInfo << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264DpbSlotInfoEXT& value)
+{
+ s << "VkVideoEncodeH264DpbSlotInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tslotIndex = " << value.slotIndex << '\n';
+ s << "\tpStdPictureInfo = " << value.pStdPictureInfo << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264NaluSliceEXT& value)
+{
+ s << "VkVideoEncodeH264NaluSliceEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpSliceHeaderStd = " << value.pSliceHeaderStd << '\n';
+ s << "\tmbCount = " << value.mbCount << '\n';
+ s << "\trefFinalList0EntryCount = " << value.refFinalList0EntryCount << '\n';
+ s << "\tpRefFinalList0Entries = " << value.pRefFinalList0Entries << '\n';
+ s << "\trefFinalList1EntryCount = " << value.refFinalList1EntryCount << '\n';
+ s << "\tpRefFinalList1Entries = " << value.pRefFinalList1Entries << '\n';
+ s << "\tprecedingNaluBytes = " << value.precedingNaluBytes << '\n';
+ s << "\tminQp = " << value.minQp << '\n';
+ s << "\tmaxQp = " << value.maxQp << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264VclFrameInfoEXT& value)
+{
+ s << "VkVideoEncodeH264VclFrameInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\trefDefaultFinalList0EntryCount = " << value.refDefaultFinalList0EntryCount << '\n';
+ s << "\tpRefDefaultFinalList0Entries = " << value.pRefDefaultFinalList0Entries << '\n';
+ s << "\trefDefaultFinalList1EntryCount = " << value.refDefaultFinalList1EntryCount << '\n';
+ s << "\tpRefDefaultFinalList1Entries = " << value.pRefDefaultFinalList1Entries << '\n';
+ s << "\tnaluSliceEntryCount = " << value.naluSliceEntryCount << '\n';
+ s << "\tpNaluSliceEntries = " << value.pNaluSliceEntries << '\n';
+ s << "\tpCurrentPictureInfo = " << value.pCurrentPictureInfo << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264EmitPictureParametersEXT& value)
+{
+ s << "VkVideoEncodeH264EmitPictureParametersEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tspsId = " << value.spsId << '\n';
+ s << "\temitSpsEnable = " << value.emitSpsEnable << '\n';
+ s << "\tppsIdEntryCount = " << value.ppsIdEntryCount << '\n';
+ s << "\tppsIdEntries = " << value.ppsIdEntries << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoEncodeH264ProfileEXT& value)
+{
+ s << "VkVideoEncodeH264ProfileEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstdProfileIdc = " << value.stdProfileIdc << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264PictureInfoFlags& value)
+{
+ s << "StdVideoDecodeH264PictureInfoFlags = {\n";
+ s << "\tfield_pic_flag = " << value.field_pic_flag << '\n';
+ s << "\tis_intra = " << value.is_intra << '\n';
+ s << "\tbottom_field_flag = " << value.bottom_field_flag << '\n';
+ s << "\tis_reference = " << value.is_reference << '\n';
+ s << "\tcomplementary_field_pair = " << value.complementary_field_pair << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264PictureInfo& value)
+{
+ s << "StdVideoDecodeH264PictureInfo = {\n";
+ s << "\tseq_parameter_set_id = " << value.seq_parameter_set_id << '\n';
+ s << "\tpic_parameter_set_id = " << value.pic_parameter_set_id << '\n';
+ s << "\treserved = " << value.reserved << '\n';
+ s << "\tframe_num = " << value.frame_num << '\n';
+ s << "\tidr_pic_id = " << value.idr_pic_id << '\n';
+ s << "\tPicOrderCnt = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.PicOrderCnt), DE_ARRAY_END(value.PicOrderCnt)) << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264ReferenceInfoFlags& value)
+{
+ s << "StdVideoDecodeH264ReferenceInfoFlags = {\n";
+ s << "\ttop_field_flag = " << value.top_field_flag << '\n';
+ s << "\tbottom_field_flag = " << value.bottom_field_flag << '\n';
+ s << "\tis_long_term = " << value.is_long_term << '\n';
+ s << "\tis_non_existing = " << value.is_non_existing << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264ReferenceInfo& value)
+{
+ s << "StdVideoDecodeH264ReferenceInfo = {\n";
+ s << "\tFrameNum = " << value.FrameNum << '\n';
+ s << "\treserved = " << value.reserved << '\n';
+ s << "\tPicOrderCnt = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.PicOrderCnt), DE_ARRAY_END(value.PicOrderCnt)) << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264MvcElementFlags& value)
+{
+ s << "StdVideoDecodeH264MvcElementFlags = {\n";
+ s << "\tnon_idr = " << value.non_idr << '\n';
+ s << "\tanchor_pic = " << value.anchor_pic << '\n';
+ s << "\tinter_view = " << value.inter_view << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264MvcElement& value)
+{
+ s << "StdVideoDecodeH264MvcElement = {\n";
+ s << "\tflags = " << value.flags << '\n';
+ s << "\tviewOrderIndex = " << value.viewOrderIndex << '\n';
+ s << "\tviewId = " << value.viewId << '\n';
+ s << "\ttemporalId = " << value.temporalId << '\n';
+ s << "\tpriorityId = " << value.priorityId << '\n';
+ s << "\tnumOfAnchorRefsInL0 = " << value.numOfAnchorRefsInL0 << '\n';
+ s << "\tviewIdOfAnchorRefsInL0 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.viewIdOfAnchorRefsInL0), DE_ARRAY_END(value.viewIdOfAnchorRefsInL0)) << '\n';
+ s << "\tnumOfAnchorRefsInL1 = " << value.numOfAnchorRefsInL1 << '\n';
+ s << "\tviewIdOfAnchorRefsInL1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.viewIdOfAnchorRefsInL1), DE_ARRAY_END(value.viewIdOfAnchorRefsInL1)) << '\n';
+ s << "\tnumOfNonAnchorRefsInL0 = " << value.numOfNonAnchorRefsInL0 << '\n';
+ s << "\tviewIdOfNonAnchorRefsInL0 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.viewIdOfNonAnchorRefsInL0), DE_ARRAY_END(value.viewIdOfNonAnchorRefsInL0)) << '\n';
+ s << "\tnumOfNonAnchorRefsInL1 = " << value.numOfNonAnchorRefsInL1 << '\n';
+ s << "\tviewIdOfNonAnchorRefsInL1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.viewIdOfNonAnchorRefsInL1), DE_ARRAY_END(value.viewIdOfNonAnchorRefsInL1)) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH264Mvc& value)
+{
+ s << "StdVideoDecodeH264Mvc = {\n";
+ s << "\tviewId0 = " << value.viewId0 << '\n';
+ s << "\tmvcElementCount = " << value.mvcElementCount << '\n';
+ s << "\tpMvcElements = " << value.pMvcElements << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264ProfileEXT& value)
+{
+ s << "VkVideoDecodeH264ProfileEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstdProfileIdc = " << value.stdProfileIdc << '\n';
+ s << "\tfieldLayout = " << getVideoDecodeH264FieldLayoutFlagsEXTStr(value.fieldLayout) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264CapabilitiesEXT& value)
+{
+ s << "VkVideoDecodeH264CapabilitiesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxLevel = " << value.maxLevel << '\n';
+ s << "\tfieldOffsetGranularity = " << value.fieldOffsetGranularity << '\n';
+ s << "\tstdExtensionVersion = " << value.stdExtensionVersion << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionCreateInfoEXT& value)
+{
+ s << "VkVideoDecodeH264SessionCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoDecodeH264CreateFlagsEXTStr(value.flags) << '\n';
+ s << "\tpStdExtensionVersion = " << value.pStdExtensionVersion << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersAddInfoEXT& value)
+{
+ s << "VkVideoDecodeH264SessionParametersAddInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tspsStdCount = " << value.spsStdCount << '\n';
+ s << "\tpSpsStd = " << value.pSpsStd << '\n';
+ s << "\tppsStdCount = " << value.ppsStdCount << '\n';
+ s << "\tpPpsStd = " << value.pPpsStd << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264SessionParametersCreateInfoEXT& value)
+{
+ s << "VkVideoDecodeH264SessionParametersCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxSpsStdCount = " << value.maxSpsStdCount << '\n';
+ s << "\tmaxPpsStdCount = " << value.maxPpsStdCount << '\n';
+ s << "\tpParametersAddInfo = " << value.pParametersAddInfo << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264PictureInfoEXT& value)
+{
+ s << "VkVideoDecodeH264PictureInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpStdPictureInfo = " << value.pStdPictureInfo << '\n';
+ s << "\tslicesCount = " << value.slicesCount << '\n';
+ s << "\tpSlicesDataOffsets = " << value.pSlicesDataOffsets << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264MvcEXT& value)
+{
+ s << "VkVideoDecodeH264MvcEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpStdMvc = " << value.pStdMvc << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH264DpbSlotInfoEXT& value)
+{
+ s << "VkVideoDecodeH264DpbSlotInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpStdReferenceInfo = " << value.pStdReferenceInfo << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265DecPicBufMgr& value)
+{
+ s << "StdVideoH265DecPicBufMgr = {\n";
+ s << "\tmax_latency_increase_plus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.max_latency_increase_plus1), DE_ARRAY_END(value.max_latency_increase_plus1)) << '\n';
+ s << "\tmax_dec_pic_buffering_minus1 = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.max_dec_pic_buffering_minus1)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.max_dec_pic_buffering_minus1))) << '\n';
+ s << "\tmax_num_reorder_pics = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.max_num_reorder_pics)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.max_num_reorder_pics))) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SubLayerHrdParameters& value)
+{
+ s << "StdVideoH265SubLayerHrdParameters = {\n";
+ s << "\tbit_rate_value_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.bit_rate_value_minus1), DE_ARRAY_END(value.bit_rate_value_minus1)) << '\n';
+ s << "\tcpb_size_value_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.cpb_size_value_minus1), DE_ARRAY_END(value.cpb_size_value_minus1)) << '\n';
+ s << "\tcpb_size_du_value_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.cpb_size_du_value_minus1), DE_ARRAY_END(value.cpb_size_du_value_minus1)) << '\n';
+ s << "\tbit_rate_du_value_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.bit_rate_du_value_minus1), DE_ARRAY_END(value.bit_rate_du_value_minus1)) << '\n';
+ s << "\tcbr_flag = " << value.cbr_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265HrdFlags& value)
+{
+ s << "StdVideoH265HrdFlags = {\n";
+ s << "\tnal_hrd_parameters_present_flag = " << value.nal_hrd_parameters_present_flag << '\n';
+ s << "\tvcl_hrd_parameters_present_flag = " << value.vcl_hrd_parameters_present_flag << '\n';
+ s << "\tsub_pic_hrd_params_present_flag = " << value.sub_pic_hrd_params_present_flag << '\n';
+ s << "\tsub_pic_cpb_params_in_pic_timing_sei_flag = " << value.sub_pic_cpb_params_in_pic_timing_sei_flag << '\n';
+ s << "\tfixed_pic_rate_general_flag = " << value.fixed_pic_rate_general_flag << '\n';
+ s << "\tfixed_pic_rate_within_cvs_flag = " << value.fixed_pic_rate_within_cvs_flag << '\n';
+ s << "\tlow_delay_hrd_flag = " << value.low_delay_hrd_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265HrdParameters& value)
+{
+ s << "StdVideoH265HrdParameters = {\n";
+ s << "\ttick_divisor_minus2 = " << value.tick_divisor_minus2 << '\n';
+ s << "\tdu_cpb_removal_delay_increment_length_minus1 = " << value.du_cpb_removal_delay_increment_length_minus1 << '\n';
+ s << "\tdpb_output_delay_du_length_minus1 = " << value.dpb_output_delay_du_length_minus1 << '\n';
+ s << "\tbit_rate_scale = " << value.bit_rate_scale << '\n';
+ s << "\tcpb_size_scale = " << value.cpb_size_scale << '\n';
+ s << "\tcpb_size_du_scale = " << value.cpb_size_du_scale << '\n';
+ s << "\tinitial_cpb_removal_delay_length_minus1 = " << value.initial_cpb_removal_delay_length_minus1 << '\n';
+ s << "\tau_cpb_removal_delay_length_minus1 = " << value.au_cpb_removal_delay_length_minus1 << '\n';
+ s << "\tdpb_output_delay_length_minus1 = " << value.dpb_output_delay_length_minus1 << '\n';
+ s << "\tcpb_cnt_minus1 = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.cpb_cnt_minus1)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.cpb_cnt_minus1))) << '\n';
+ s << "\telemental_duration_in_tc_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.elemental_duration_in_tc_minus1), DE_ARRAY_END(value.elemental_duration_in_tc_minus1)) << '\n';
+ s << "\tSubLayerHrdParametersNal = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.SubLayerHrdParametersNal), DE_ARRAY_END(value.SubLayerHrdParametersNal)) << '\n';
+ s << "\tSubLayerHrdParametersVcl = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.SubLayerHrdParametersVcl), DE_ARRAY_END(value.SubLayerHrdParametersVcl)) << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265VpsFlags& value)
+{
+ s << "StdVideoH265VpsFlags = {\n";
+ s << "\tvps_temporal_id_nesting_flag = " << value.vps_temporal_id_nesting_flag << '\n';
+ s << "\tvps_sub_layer_ordering_info_present_flag = " << value.vps_sub_layer_ordering_info_present_flag << '\n';
+ s << "\tvps_timing_info_present_flag = " << value.vps_timing_info_present_flag << '\n';
+ s << "\tvps_poc_proportional_to_timing_flag = " << value.vps_poc_proportional_to_timing_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265VideoParameterSet& value)
+{
+ s << "StdVideoH265VideoParameterSet = {\n";
+ s << "\tvps_video_parameter_set_id = " << value.vps_video_parameter_set_id << '\n';
+ s << "\tvps_max_sub_layers_minus1 = " << value.vps_max_sub_layers_minus1 << '\n';
+ s << "\tvps_num_units_in_tick = " << value.vps_num_units_in_tick << '\n';
+ s << "\tvps_time_scale = " << value.vps_time_scale << '\n';
+ s << "\tvps_num_ticks_poc_diff_one_minus1 = " << value.vps_num_ticks_poc_diff_one_minus1 << '\n';
+ s << "\tpDecPicBufMgr = " << value.pDecPicBufMgr << '\n';
+ s << "\thrd_parameters = " << value.hrd_parameters << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265ScalingLists& value)
+{
+ s << "StdVideoH265ScalingLists = {\n";
+ s << "\tScalingList4x4 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.ScalingList4x4), DE_ARRAY_END(value.ScalingList4x4)) << '\n';
+ s << "\tScalingList8x8 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.ScalingList8x8), DE_ARRAY_END(value.ScalingList8x8)) << '\n';
+ s << "\tScalingList16x16 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.ScalingList16x16), DE_ARRAY_END(value.ScalingList16x16)) << '\n';
+ s << "\tScalingList32x32 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.ScalingList32x32), DE_ARRAY_END(value.ScalingList32x32)) << '\n';
+ s << "\tScalingListDCCoef16x16 = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.ScalingListDCCoef16x16)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.ScalingListDCCoef16x16))) << '\n';
+ s << "\tScalingListDCCoef32x32 = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.ScalingListDCCoef32x32)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.ScalingListDCCoef32x32))) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SpsVuiFlags& value)
+{
+ s << "StdVideoH265SpsVuiFlags = {\n";
+ s << "\taspect_ratio_info_present_flag = " << value.aspect_ratio_info_present_flag << '\n';
+ s << "\toverscan_info_present_flag = " << value.overscan_info_present_flag << '\n';
+ s << "\toverscan_appropriate_flag = " << value.overscan_appropriate_flag << '\n';
+ s << "\tvideo_signal_type_present_flag = " << value.video_signal_type_present_flag << '\n';
+ s << "\tvideo_full_range_flag = " << value.video_full_range_flag << '\n';
+ s << "\tcolour_description_present_flag = " << value.colour_description_present_flag << '\n';
+ s << "\tchroma_loc_info_present_flag = " << value.chroma_loc_info_present_flag << '\n';
+ s << "\tneutral_chroma_indication_flag = " << value.neutral_chroma_indication_flag << '\n';
+ s << "\tfield_seq_flag = " << value.field_seq_flag << '\n';
+ s << "\tframe_field_info_present_flag = " << value.frame_field_info_present_flag << '\n';
+ s << "\tdefault_display_window_flag = " << value.default_display_window_flag << '\n';
+ s << "\tvui_timing_info_present_flag = " << value.vui_timing_info_present_flag << '\n';
+ s << "\tvui_poc_proportional_to_timing_flag = " << value.vui_poc_proportional_to_timing_flag << '\n';
+ s << "\tvui_hrd_parameters_present_flag = " << value.vui_hrd_parameters_present_flag << '\n';
+ s << "\tbitstream_restriction_flag = " << value.bitstream_restriction_flag << '\n';
+ s << "\ttiles_fixed_structure_flag = " << value.tiles_fixed_structure_flag << '\n';
+ s << "\tmotion_vectors_over_pic_boundaries_flag = " << value.motion_vectors_over_pic_boundaries_flag << '\n';
+ s << "\trestricted_ref_pic_lists_flag = " << value.restricted_ref_pic_lists_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SequenceParameterSetVui& value)
+{
+ s << "StdVideoH265SequenceParameterSetVui = {\n";
+ s << "\taspect_ratio_idc = " << value.aspect_ratio_idc << '\n';
+ s << "\tsar_width = " << value.sar_width << '\n';
+ s << "\tsar_height = " << value.sar_height << '\n';
+ s << "\tvideo_format = " << value.video_format << '\n';
+ s << "\tcolour_primaries = " << value.colour_primaries << '\n';
+ s << "\ttransfer_characteristics = " << value.transfer_characteristics << '\n';
+ s << "\tmatrix_coeffs = " << value.matrix_coeffs << '\n';
+ s << "\tchroma_sample_loc_type_top_field = " << value.chroma_sample_loc_type_top_field << '\n';
+ s << "\tchroma_sample_loc_type_bottom_field = " << value.chroma_sample_loc_type_bottom_field << '\n';
+ s << "\tdef_disp_win_left_offset = " << value.def_disp_win_left_offset << '\n';
+ s << "\tdef_disp_win_right_offset = " << value.def_disp_win_right_offset << '\n';
+ s << "\tdef_disp_win_top_offset = " << value.def_disp_win_top_offset << '\n';
+ s << "\tdef_disp_win_bottom_offset = " << value.def_disp_win_bottom_offset << '\n';
+ s << "\tvui_num_units_in_tick = " << value.vui_num_units_in_tick << '\n';
+ s << "\tvui_time_scale = " << value.vui_time_scale << '\n';
+ s << "\tvui_num_ticks_poc_diff_one_minus1 = " << value.vui_num_ticks_poc_diff_one_minus1 << '\n';
+ s << "\thrd_parameters = " << value.hrd_parameters << '\n';
+ s << "\tmin_spatial_segmentation_idc = " << value.min_spatial_segmentation_idc << '\n';
+ s << "\tmax_bytes_per_pic_denom = " << value.max_bytes_per_pic_denom << '\n';
+ s << "\tmax_bits_per_min_cu_denom = " << value.max_bits_per_min_cu_denom << '\n';
+ s << "\tlog2_max_mv_length_horizontal = " << value.log2_max_mv_length_horizontal << '\n';
+ s << "\tlog2_max_mv_length_vertical = " << value.log2_max_mv_length_vertical << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265PredictorPaletteEntries& value)
+{
+ s << "StdVideoH265PredictorPaletteEntries = {\n";
+ s << "\tPredictorPaletteEntries = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.PredictorPaletteEntries), DE_ARRAY_END(value.PredictorPaletteEntries)) << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SpsFlags& value)
+{
+ s << "StdVideoH265SpsFlags = {\n";
+ s << "\tsps_temporal_id_nesting_flag = " << value.sps_temporal_id_nesting_flag << '\n';
+ s << "\tseparate_colour_plane_flag = " << value.separate_colour_plane_flag << '\n';
+ s << "\tscaling_list_enabled_flag = " << value.scaling_list_enabled_flag << '\n';
+ s << "\tsps_scaling_list_data_present_flag = " << value.sps_scaling_list_data_present_flag << '\n';
+ s << "\tamp_enabled_flag = " << value.amp_enabled_flag << '\n';
+ s << "\tsample_adaptive_offset_enabled_flag = " << value.sample_adaptive_offset_enabled_flag << '\n';
+ s << "\tpcm_enabled_flag = " << value.pcm_enabled_flag << '\n';
+ s << "\tpcm_loop_filter_disabled_flag = " << value.pcm_loop_filter_disabled_flag << '\n';
+ s << "\tlong_term_ref_pics_present_flag = " << value.long_term_ref_pics_present_flag << '\n';
+ s << "\tsps_temporal_mvp_enabled_flag = " << value.sps_temporal_mvp_enabled_flag << '\n';
+ s << "\tstrong_intra_smoothing_enabled_flag = " << value.strong_intra_smoothing_enabled_flag << '\n';
+ s << "\tvui_parameters_present_flag = " << value.vui_parameters_present_flag << '\n';
+ s << "\tsps_extension_present_flag = " << value.sps_extension_present_flag << '\n';
+ s << "\tsps_range_extension_flag = " << value.sps_range_extension_flag << '\n';
+ s << "\ttransform_skip_rotation_enabled_flag = " << value.transform_skip_rotation_enabled_flag << '\n';
+ s << "\ttransform_skip_context_enabled_flag = " << value.transform_skip_context_enabled_flag << '\n';
+ s << "\timplicit_rdpcm_enabled_flag = " << value.implicit_rdpcm_enabled_flag << '\n';
+ s << "\texplicit_rdpcm_enabled_flag = " << value.explicit_rdpcm_enabled_flag << '\n';
+ s << "\textended_precision_processing_flag = " << value.extended_precision_processing_flag << '\n';
+ s << "\tintra_smoothing_disabled_flag = " << value.intra_smoothing_disabled_flag << '\n';
+ s << "\thigh_precision_offsets_enabled_flag = " << value.high_precision_offsets_enabled_flag << '\n';
+ s << "\tpersistent_rice_adaptation_enabled_flag = " << value.persistent_rice_adaptation_enabled_flag << '\n';
+ s << "\tcabac_bypass_alignment_enabled_flag = " << value.cabac_bypass_alignment_enabled_flag << '\n';
+ s << "\tsps_curr_pic_ref_enabled_flag = " << value.sps_curr_pic_ref_enabled_flag << '\n';
+ s << "\tpalette_mode_enabled_flag = " << value.palette_mode_enabled_flag << '\n';
+ s << "\tsps_palette_predictor_initializer_present_flag = " << value.sps_palette_predictor_initializer_present_flag << '\n';
+ s << "\tintra_boundary_filtering_disabled_flag = " << value.intra_boundary_filtering_disabled_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265SequenceParameterSet& value)
+{
+ s << "StdVideoH265SequenceParameterSet = {\n";
+ s << "\tprofile_idc = " << value.profile_idc << '\n';
+ s << "\tlevel_idc = " << value.level_idc << '\n';
+ s << "\tpic_width_in_luma_samples = " << value.pic_width_in_luma_samples << '\n';
+ s << "\tpic_height_in_luma_samples = " << value.pic_height_in_luma_samples << '\n';
+ s << "\tsps_video_parameter_set_id = " << value.sps_video_parameter_set_id << '\n';
+ s << "\tsps_max_sub_layers_minus1 = " << value.sps_max_sub_layers_minus1 << '\n';
+ s << "\tsps_seq_parameter_set_id = " << value.sps_seq_parameter_set_id << '\n';
+ s << "\tchroma_format_idc = " << value.chroma_format_idc << '\n';
+ s << "\tbit_depth_luma_minus8 = " << value.bit_depth_luma_minus8 << '\n';
+ s << "\tbit_depth_chroma_minus8 = " << value.bit_depth_chroma_minus8 << '\n';
+ s << "\tlog2_max_pic_order_cnt_lsb_minus4 = " << value.log2_max_pic_order_cnt_lsb_minus4 << '\n';
+ s << "\tsps_max_dec_pic_buffering_minus1 = " << value.sps_max_dec_pic_buffering_minus1 << '\n';
+ s << "\tlog2_min_luma_coding_block_size_minus3 = " << value.log2_min_luma_coding_block_size_minus3 << '\n';
+ s << "\tlog2_diff_max_min_luma_coding_block_size = " << value.log2_diff_max_min_luma_coding_block_size << '\n';
+ s << "\tlog2_min_luma_transform_block_size_minus2 = " << value.log2_min_luma_transform_block_size_minus2 << '\n';
+ s << "\tlog2_diff_max_min_luma_transform_block_size = " << value.log2_diff_max_min_luma_transform_block_size << '\n';
+ s << "\tmax_transform_hierarchy_depth_inter = " << value.max_transform_hierarchy_depth_inter << '\n';
+ s << "\tmax_transform_hierarchy_depth_intra = " << value.max_transform_hierarchy_depth_intra << '\n';
+ s << "\tnum_short_term_ref_pic_sets = " << value.num_short_term_ref_pic_sets << '\n';
+ s << "\tnum_long_term_ref_pics_sps = " << value.num_long_term_ref_pics_sps << '\n';
+ s << "\tpcm_sample_bit_depth_luma_minus1 = " << value.pcm_sample_bit_depth_luma_minus1 << '\n';
+ s << "\tpcm_sample_bit_depth_chroma_minus1 = " << value.pcm_sample_bit_depth_chroma_minus1 << '\n';
+ s << "\tlog2_min_pcm_luma_coding_block_size_minus3 = " << value.log2_min_pcm_luma_coding_block_size_minus3 << '\n';
+ s << "\tlog2_diff_max_min_pcm_luma_coding_block_size = " << value.log2_diff_max_min_pcm_luma_coding_block_size << '\n';
+ s << "\tconf_win_left_offset = " << value.conf_win_left_offset << '\n';
+ s << "\tconf_win_right_offset = " << value.conf_win_right_offset << '\n';
+ s << "\tconf_win_top_offset = " << value.conf_win_top_offset << '\n';
+ s << "\tconf_win_bottom_offset = " << value.conf_win_bottom_offset << '\n';
+ s << "\tpDecPicBufMgr = " << value.pDecPicBufMgr << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << "\tpScalingLists = " << value.pScalingLists << '\n';
+ s << "\tpSequenceParameterSetVui = " << value.pSequenceParameterSetVui << '\n';
+ s << "\tpalette_max_size = " << value.palette_max_size << '\n';
+ s << "\tdelta_palette_max_predictor_size = " << value.delta_palette_max_predictor_size << '\n';
+ s << "\tmotion_vector_resolution_control_idc = " << value.motion_vector_resolution_control_idc << '\n';
+ s << "\tsps_num_palette_predictor_initializer_minus1 = " << value.sps_num_palette_predictor_initializer_minus1 << '\n';
+ s << "\tpPredictorPaletteEntries = " << value.pPredictorPaletteEntries << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265PpsFlags& value)
+{
+ s << "StdVideoH265PpsFlags = {\n";
+ s << "\tdependent_slice_segments_enabled_flag = " << value.dependent_slice_segments_enabled_flag << '\n';
+ s << "\toutput_flag_present_flag = " << value.output_flag_present_flag << '\n';
+ s << "\tsign_data_hiding_enabled_flag = " << value.sign_data_hiding_enabled_flag << '\n';
+ s << "\tcabac_init_present_flag = " << value.cabac_init_present_flag << '\n';
+ s << "\tconstrained_intra_pred_flag = " << value.constrained_intra_pred_flag << '\n';
+ s << "\ttransform_skip_enabled_flag = " << value.transform_skip_enabled_flag << '\n';
+ s << "\tcu_qp_delta_enabled_flag = " << value.cu_qp_delta_enabled_flag << '\n';
+ s << "\tpps_slice_chroma_qp_offsets_present_flag = " << value.pps_slice_chroma_qp_offsets_present_flag << '\n';
+ s << "\tweighted_pred_flag = " << value.weighted_pred_flag << '\n';
+ s << "\tweighted_bipred_flag = " << value.weighted_bipred_flag << '\n';
+ s << "\ttransquant_bypass_enabled_flag = " << value.transquant_bypass_enabled_flag << '\n';
+ s << "\ttiles_enabled_flag = " << value.tiles_enabled_flag << '\n';
+ s << "\tentropy_coding_sync_enabled_flag = " << value.entropy_coding_sync_enabled_flag << '\n';
+ s << "\tuniform_spacing_flag = " << value.uniform_spacing_flag << '\n';
+ s << "\tloop_filter_across_tiles_enabled_flag = " << value.loop_filter_across_tiles_enabled_flag << '\n';
+ s << "\tpps_loop_filter_across_slices_enabled_flag = " << value.pps_loop_filter_across_slices_enabled_flag << '\n';
+ s << "\tdeblocking_filter_control_present_flag = " << value.deblocking_filter_control_present_flag << '\n';
+ s << "\tdeblocking_filter_override_enabled_flag = " << value.deblocking_filter_override_enabled_flag << '\n';
+ s << "\tpps_deblocking_filter_disabled_flag = " << value.pps_deblocking_filter_disabled_flag << '\n';
+ s << "\tpps_scaling_list_data_present_flag = " << value.pps_scaling_list_data_present_flag << '\n';
+ s << "\tlists_modification_present_flag = " << value.lists_modification_present_flag << '\n';
+ s << "\tslice_segment_header_extension_present_flag = " << value.slice_segment_header_extension_present_flag << '\n';
+ s << "\tpps_extension_present_flag = " << value.pps_extension_present_flag << '\n';
+ s << "\tcross_component_prediction_enabled_flag = " << value.cross_component_prediction_enabled_flag << '\n';
+ s << "\tchroma_qp_offset_list_enabled_flag = " << value.chroma_qp_offset_list_enabled_flag << '\n';
+ s << "\tpps_curr_pic_ref_enabled_flag = " << value.pps_curr_pic_ref_enabled_flag << '\n';
+ s << "\tresidual_adaptive_colour_transform_enabled_flag = " << value.residual_adaptive_colour_transform_enabled_flag << '\n';
+ s << "\tpps_slice_act_qp_offsets_present_flag = " << value.pps_slice_act_qp_offsets_present_flag << '\n';
+ s << "\tpps_palette_predictor_initializer_present_flag = " << value.pps_palette_predictor_initializer_present_flag << '\n';
+ s << "\tmonochrome_palette_flag = " << value.monochrome_palette_flag << '\n';
+ s << "\tpps_range_extension_flag = " << value.pps_range_extension_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoH265PictureParameterSet& value)
+{
+ s << "StdVideoH265PictureParameterSet = {\n";
+ s << "\tpps_pic_parameter_set_id = " << value.pps_pic_parameter_set_id << '\n';
+ s << "\tpps_seq_parameter_set_id = " << value.pps_seq_parameter_set_id << '\n';
+ s << "\tnum_extra_slice_header_bits = " << value.num_extra_slice_header_bits << '\n';
+ s << "\tnum_ref_idx_l0_default_active_minus1 = " << value.num_ref_idx_l0_default_active_minus1 << '\n';
+ s << "\tnum_ref_idx_l1_default_active_minus1 = " << value.num_ref_idx_l1_default_active_minus1 << '\n';
+ s << "\tinit_qp_minus26 = " << value.init_qp_minus26 << '\n';
+ s << "\tdiff_cu_qp_delta_depth = " << value.diff_cu_qp_delta_depth << '\n';
+ s << "\tpps_cb_qp_offset = " << value.pps_cb_qp_offset << '\n';
+ s << "\tpps_cr_qp_offset = " << value.pps_cr_qp_offset << '\n';
+ s << "\tnum_tile_columns_minus1 = " << value.num_tile_columns_minus1 << '\n';
+ s << "\tnum_tile_rows_minus1 = " << value.num_tile_rows_minus1 << '\n';
+ s << "\tcolumn_width_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.column_width_minus1), DE_ARRAY_END(value.column_width_minus1)) << '\n';
+ s << "\trow_height_minus1 = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.row_height_minus1), DE_ARRAY_END(value.row_height_minus1)) << '\n';
+ s << "\tpps_beta_offset_div2 = " << value.pps_beta_offset_div2 << '\n';
+ s << "\tpps_tc_offset_div2 = " << value.pps_tc_offset_div2 << '\n';
+ s << "\tlog2_parallel_merge_level_minus2 = " << value.log2_parallel_merge_level_minus2 << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << "\tpScalingLists = " << value.pScalingLists << '\n';
+ s << "\tlog2_max_transform_skip_block_size_minus2 = " << value.log2_max_transform_skip_block_size_minus2 << '\n';
+ s << "\tdiff_cu_chroma_qp_offset_depth = " << value.diff_cu_chroma_qp_offset_depth << '\n';
+ s << "\tchroma_qp_offset_list_len_minus1 = " << value.chroma_qp_offset_list_len_minus1 << '\n';
+ s << "\tcb_qp_offset_list = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.cb_qp_offset_list), DE_ARRAY_END(value.cb_qp_offset_list)) << '\n';
+ s << "\tcr_qp_offset_list = " << '\n' << tcu::formatArray(DE_ARRAY_BEGIN(value.cr_qp_offset_list), DE_ARRAY_END(value.cr_qp_offset_list)) << '\n';
+ s << "\tlog2_sao_offset_scale_luma = " << value.log2_sao_offset_scale_luma << '\n';
+ s << "\tlog2_sao_offset_scale_chroma = " << value.log2_sao_offset_scale_chroma << '\n';
+ s << "\tpps_act_y_qp_offset_plus5 = " << value.pps_act_y_qp_offset_plus5 << '\n';
+ s << "\tpps_act_cb_qp_offset_plus5 = " << value.pps_act_cb_qp_offset_plus5 << '\n';
+ s << "\tpps_act_cr_qp_offset_plus5 = " << value.pps_act_cr_qp_offset_plus5 << '\n';
+ s << "\tpps_num_palette_predictor_initializer = " << value.pps_num_palette_predictor_initializer << '\n';
+ s << "\tluma_bit_depth_entry_minus8 = " << value.luma_bit_depth_entry_minus8 << '\n';
+ s << "\tchroma_bit_depth_entry_minus8 = " << value.chroma_bit_depth_entry_minus8 << '\n';
+ s << "\tpPredictorPaletteEntries = " << value.pPredictorPaletteEntries << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265PictureInfoFlags& value)
+{
+ s << "StdVideoDecodeH265PictureInfoFlags = {\n";
+ s << "\tIrapPicFlag = " << value.IrapPicFlag << '\n';
+ s << "\tIdrPicFlag = " << value.IdrPicFlag << '\n';
+ s << "\tIsReference = " << value.IsReference << '\n';
+ s << "\tshort_term_ref_pic_set_sps_flag = " << value.short_term_ref_pic_set_sps_flag << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265PictureInfo& value)
+{
+ s << "StdVideoDecodeH265PictureInfo = {\n";
+ s << "\tvps_video_parameter_set_id = " << value.vps_video_parameter_set_id << '\n';
+ s << "\tsps_seq_parameter_set_id = " << value.sps_seq_parameter_set_id << '\n';
+ s << "\tpps_pic_parameter_set_id = " << value.pps_pic_parameter_set_id << '\n';
+ s << "\tnum_short_term_ref_pic_sets = " << value.num_short_term_ref_pic_sets << '\n';
+ s << "\tPicOrderCntVal = " << value.PicOrderCntVal << '\n';
+ s << "\tNumBitsForSTRefPicSetInSlice = " << value.NumBitsForSTRefPicSetInSlice << '\n';
+ s << "\tNumDeltaPocsOfRefRpsIdx = " << value.NumDeltaPocsOfRefRpsIdx << '\n';
+ s << "\tRefPicSetStCurrBefore = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.RefPicSetStCurrBefore)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.RefPicSetStCurrBefore))) << '\n';
+ s << "\tRefPicSetStCurrAfter = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.RefPicSetStCurrAfter)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.RefPicSetStCurrAfter))) << '\n';
+ s << "\tRefPicSetLtCurr = " << '\n' << tcu::formatArray(tcu::Format::HexIterator<deUint8>(DE_ARRAY_BEGIN(value.RefPicSetLtCurr)), tcu::Format::HexIterator<deUint8>(DE_ARRAY_END(value.RefPicSetLtCurr))) << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265ReferenceInfoFlags& value)
+{
+ s << "StdVideoDecodeH265ReferenceInfoFlags = {\n";
+ s << "\tis_long_term = " << value.is_long_term << '\n';
+ s << "\tis_non_existing = " << value.is_non_existing << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const StdVideoDecodeH265ReferenceInfo& value)
+{
+ s << "StdVideoDecodeH265ReferenceInfo = {\n";
+ s << "\tPicOrderCntVal = " << value.PicOrderCntVal << '\n';
+ s << "\tflags = " << value.flags << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265ProfileEXT& value)
+{
+ s << "VkVideoDecodeH265ProfileEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tstdProfileIdc = " << value.stdProfileIdc << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265CapabilitiesEXT& value)
+{
+ s << "VkVideoDecodeH265CapabilitiesEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxLevel = " << value.maxLevel << '\n';
+ s << "\tstdExtensionVersion = " << value.stdExtensionVersion << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionCreateInfoEXT& value)
+{
+ s << "VkVideoDecodeH265SessionCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tflags = " << getVideoDecodeH265CreateFlagsEXTStr(value.flags) << '\n';
+ s << "\tpStdExtensionVersion = " << value.pStdExtensionVersion << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersAddInfoEXT& value)
+{
+ s << "VkVideoDecodeH265SessionParametersAddInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tspsStdCount = " << value.spsStdCount << '\n';
+ s << "\tpSpsStd = " << value.pSpsStd << '\n';
+ s << "\tppsStdCount = " << value.ppsStdCount << '\n';
+ s << "\tpPpsStd = " << value.pPpsStd << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265SessionParametersCreateInfoEXT& value)
+{
+ s << "VkVideoDecodeH265SessionParametersCreateInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmaxSpsStdCount = " << value.maxSpsStdCount << '\n';
+ s << "\tmaxPpsStdCount = " << value.maxPpsStdCount << '\n';
+ s << "\tpParametersAddInfo = " << value.pParametersAddInfo << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265PictureInfoEXT& value)
+{
+ s << "VkVideoDecodeH265PictureInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpStdPictureInfo = " << value.pStdPictureInfo << '\n';
+ s << "\tslicesCount = " << value.slicesCount << '\n';
+ s << "\tpSlicesDataOffsets = " << value.pSlicesDataOffsets << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkVideoDecodeH265DpbSlotInfoEXT& value)
+{
+ s << "VkVideoDecodeH265DpbSlotInfoEXT = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tpStdReferenceInfo = " << value.pStdReferenceInfo << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkImagePipeSurfaceCreateInfoFUCHSIA& value)
{
s << "VkImagePipeSurfaceCreateInfoFUCHSIA = {\n";
@@ -10852,6 +12776,62 @@
return s;
}
+std::ostream& operator<< (std::ostream& s, const VkImportMemoryZirconHandleInfoFUCHSIA& value)
+{
+ s << "VkImportMemoryZirconHandleInfoFUCHSIA = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\thandleType = " << value.handleType << '\n';
+ s << "\thandle = " << value.handle << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkMemoryZirconHandlePropertiesFUCHSIA& value)
+{
+ s << "VkMemoryZirconHandlePropertiesFUCHSIA = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmemoryTypeBits = " << value.memoryTypeBits << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkMemoryGetZirconHandleInfoFUCHSIA& value)
+{
+ s << "VkMemoryGetZirconHandleInfoFUCHSIA = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tmemory = " << value.memory << '\n';
+ s << "\thandleType = " << value.handleType << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImportSemaphoreZirconHandleInfoFUCHSIA& value)
+{
+ s << "VkImportSemaphoreZirconHandleInfoFUCHSIA = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsemaphore = " << value.semaphore << '\n';
+ s << "\tflags = " << getSemaphoreImportFlagsStr(value.flags) << '\n';
+ s << "\thandleType = " << value.handleType << '\n';
+ s << "\tzirconHandle = " << value.zirconHandle << '\n';
+ s << '}';
+ return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkSemaphoreGetZirconHandleInfoFUCHSIA& value)
+{
+ s << "VkSemaphoreGetZirconHandleInfoFUCHSIA = {\n";
+ s << "\tsType = " << value.sType << '\n';
+ s << "\tpNext = " << value.pNext << '\n';
+ s << "\tsemaphore = " << value.semaphore << '\n';
+ s << "\thandleType = " << value.handleType << '\n';
+ s << '}';
+ return s;
+}
+
std::ostream& operator<< (std::ostream& s, const VkStreamDescriptorSurfaceCreateInfoGGP& value)
{
s << "VkStreamDescriptorSurfaceCreateInfoGGP = {\n";
diff --git a/external/vulkancts/framework/vulkan/vkStructTypes.inl b/external/vulkancts/framework/vulkan/vkStructTypes.inl
index 89978a8..f24ecbf 100644
--- a/external/vulkancts/framework/vulkan/vkStructTypes.inl
+++ b/external/vulkancts/framework/vulkan/vkStructTypes.inl
@@ -4781,6 +4781,22 @@
deUint32 maxSequencesCount;
};
+struct VkPhysicalDeviceInheritedViewportScissorFeaturesNV
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 inheritedViewportScissor2D;
+};
+
+struct VkCommandBufferInheritanceViewportScissorInfoNV
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkBool32 viewportScissor2D;
+ deUint32 viewportDepthCount;
+ const VkViewport* pViewportDepths;
+};
+
struct VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT
{
VkStructureType sType;
@@ -4949,6 +4965,13 @@
VkFragmentShadingRateCombinerOpKHR combinerOps[2];
};
+struct VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 ycbcr2plane444Formats;
+};
+
struct VkPhysicalDeviceFragmentDensityMap2FeaturesEXT
{
VkStructureType sType;
@@ -5009,6 +5032,57 @@
const VkMutableDescriptorTypeListVALVE* pMutableDescriptorTypeLists;
};
+struct VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 vertexInputDynamicState;
+};
+
+struct VkVertexInputBindingDescription2EXT
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 binding;
+ deUint32 stride;
+ VkVertexInputRate inputRate;
+ deUint32 divisor;
+};
+
+struct VkVertexInputAttributeDescription2EXT
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 location;
+ deUint32 binding;
+ VkFormat format;
+ deUint32 offset;
+};
+
+struct VkPhysicalDeviceExtendedDynamicState2FeaturesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 extendedDynamicState2;
+ VkBool32 extendedDynamicState2LogicOp;
+ VkBool32 extendedDynamicState2PatchControlPoints;
+};
+
+struct VkPhysicalDeviceColorWriteEnableFeaturesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 colorWriteEnable;
+};
+
+struct VkPipelineColorWriteCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachmentCount;
+ const VkBool32* pColorWriteEnables;
+};
+
union VkDeviceOrHostAddressKHR
{
VkDeviceAddress deviceAddress;
@@ -5326,6 +5400,167 @@
deUint64 externalFormat;
};
+struct VkVideoQueueFamilyProperties2KHR
+{
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCodecOperationFlagsKHR videoCodecOperations;
+};
+
+struct VkVideoProfileKHR
+{
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+};
+
+struct VkVideoProfilesKHR
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 profileCount;
+ const VkVideoProfileKHR* pProfiles;
+};
+
+struct VkVideoCapabilitiesKHR
+{
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCapabilitiesFlagsKHR capabilityFlags;
+ VkDeviceSize minBitstreamBufferOffsetAlignment;
+ VkDeviceSize minBitstreamBufferSizeAlignment;
+ VkExtent2D videoPictureExtentGranularity;
+ VkExtent2D minExtent;
+ VkExtent2D maxExtent;
+ deUint32 maxReferencePicturesSlotsCount;
+ deUint32 maxReferencePicturesActiveCount;
+};
+
+struct VkPhysicalDeviceVideoFormatInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkImageUsageFlags imageUsage;
+ const VkVideoProfilesKHR* pVideoProfiles;
+};
+
+struct VkVideoFormatPropertiesKHR
+{
+ VkStructureType sType;
+ void* pNext;
+ VkFormat format;
+};
+
+struct VkVideoPictureResourceKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkOffset2D codedOffset;
+ VkExtent2D codedExtent;
+ deUint32 baseArrayLayer;
+ VkImageView imageViewBinding;
+};
+
+struct VkVideoReferenceSlotKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ deInt8 slotIndex;
+ const VkVideoPictureResourceKHR* pPictureResource;
+};
+
+struct VkVideoGetMemoryPropertiesKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 memoryBindIndex;
+ VkMemoryRequirements2* pMemoryRequirements;
+};
+
+struct VkVideoBindMemoryKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 memoryBindIndex;
+ VkDeviceMemory memory;
+ VkDeviceSize memoryOffset;
+ VkDeviceSize memorySize;
+};
+
+struct VkVideoSessionCreateInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 queueFamilyIndex;
+ VkVideoSessionCreateFlagsKHR flags;
+ const VkVideoProfileKHR* pVideoProfile;
+ VkFormat pictureFormat;
+ VkExtent2D maxCodedExtent;
+ VkFormat referencePicturesFormat;
+ deUint32 maxReferencePicturesSlotsCount;
+ deUint32 maxReferencePicturesActiveCount;
+};
+
+struct VkVideoSessionParametersCreateInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoSessionParametersKHR videoSessionParametersTemplate;
+ VkVideoSessionKHR videoSession;
+};
+
+struct VkVideoSessionParametersUpdateInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 updateSequenceCount;
+};
+
+struct VkVideoBeginCodingInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoBeginCodingFlagsKHR flags;
+ VkVideoCodingQualityPresetFlagsKHR codecQualityPreset;
+ VkVideoSessionKHR videoSession;
+ VkVideoSessionParametersKHR videoSessionParameters;
+ deUint32 referenceSlotCount;
+ const VkVideoReferenceSlotKHR* pReferenceSlots;
+};
+
+struct VkVideoEndCodingInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEndCodingFlagsKHR flags;
+};
+
+struct VkVideoCodingControlInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoCodingControlFlagsKHR flags;
+};
+
+struct VkVideoDecodeInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeFlagsKHR flags;
+ VkOffset2D codedOffset;
+ VkExtent2D codedExtent;
+ VkBuffer srcBuffer;
+ VkDeviceSize srcBufferOffset;
+ VkDeviceSize srcBufferRange;
+ VkVideoPictureResourceKHR dstPictureResource;
+ const VkVideoReferenceSlotKHR* pSetupReferenceSlot;
+ deUint32 referenceSlotCount;
+ const VkVideoReferenceSlotKHR* pReferenceSlots;
+};
+
struct VkPhysicalDevicePortabilitySubsetFeaturesKHR
{
VkStructureType sType;
@@ -5354,6 +5589,840 @@
deUint32 minVertexInputBindingStrideAlignment;
};
+struct VkVideoEncodeInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeFlagsKHR flags;
+ deUint32 qualityLevel;
+ VkExtent2D codedExtent;
+ VkBuffer dstBitstreamBuffer;
+ VkDeviceSize dstBitstreamBufferOffset;
+ VkDeviceSize dstBitstreamBufferMaxRange;
+ VkVideoPictureResourceKHR srcPictureResource;
+ const VkVideoReferenceSlotKHR* pSetupReferenceSlot;
+ deUint32 referenceSlotCount;
+ const VkVideoReferenceSlotKHR* pReferenceSlots;
+};
+
+struct VkVideoEncodeRateControlInfoKHR
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeRateControlFlagsKHR flags;
+ VkVideoEncodeRateControlModeFlagBitsKHR rateControlMode;
+ deUint32 averageBitrate;
+ deUint16 peakToAverageBitrateRatio;
+ deUint16 frameRateNumerator;
+ deUint16 frameRateDenominator;
+ deUint32 virtualBufferSizeInMs;
+};
+
+struct StdVideoH264SpsVuiFlags
+{
+ deUint32 aspect_ratio_info_present_flag:1;
+ deUint32 overscan_info_present_flag:1;
+ deUint32 overscan_appropriate_flag:1;
+ deUint32 video_signal_type_present_flag:1;
+ deUint32 video_full_range_flag:1;
+ deUint32 color_description_present_flag:1;
+ deUint32 chroma_loc_info_present_flag:1;
+ deUint32 timing_info_present_flag:1;
+ deUint32 fixed_frame_rate_flag:1;
+ deUint32 bitstream_restriction_flag:1;
+ deUint32 nal_hrd_parameters_present_flag:1;
+ deUint32 vcl_hrd_parameters_present_flag:1;
+};
+
+struct StdVideoH264HrdParameters
+{
+ deUint8 cpb_cnt_minus1;
+ deUint8 bit_rate_scale;
+ deUint8 cpb_size_scale;
+ deUint32 bit_rate_value_minus1[32];
+ deUint32 cpb_size_value_minus1[32];
+ deUint8 cbr_flag[32];
+ deUint32 initial_cpb_removal_delay_length_minus1;
+ deUint32 cpb_removal_delay_length_minus1;
+ deUint32 dpb_output_delay_length_minus1;
+ deUint32 time_offset_length;
+};
+
+struct StdVideoH264SequenceParameterSetVui
+{
+ StdVideoH264AspectRatioIdc aspect_ratio_idc;
+ deUint16 sar_width;
+ deUint16 sar_height;
+ deUint8 video_format;
+ deUint8 color_primaries;
+ deUint8 transfer_characteristics;
+ deUint8 matrix_coefficients;
+ deUint32 num_units_in_tick;
+ deUint32 time_scale;
+ StdVideoH264HrdParameters hrd_parameters;
+ deUint8 num_reorder_frames;
+ deUint8 max_dec_frame_buffering;
+ StdVideoH264SpsVuiFlags flags;
+};
+
+struct StdVideoH264SpsFlags
+{
+ deUint32 constraint_set0_flag:1;
+ deUint32 constraint_set1_flag:1;
+ deUint32 constraint_set2_flag:1;
+ deUint32 constraint_set3_flag:1;
+ deUint32 constraint_set4_flag:1;
+ deUint32 constraint_set5_flag:1;
+ deUint32 direct_8x8_inference_flag:1;
+ deUint32 mb_adaptive_frame_field_flag:1;
+ deUint32 frame_mbs_only_flag:1;
+ deUint32 delta_pic_order_always_zero_flag:1;
+ deUint32 residual_colour_transform_flag:1;
+ deUint32 gaps_in_frame_num_value_allowed_flag:1;
+ deUint32 first_picture_after_seek_flag:1;
+ deUint32 qpprime_y_zero_transform_bypass_flag:1;
+ deUint32 frame_cropping_flag:1;
+ deUint32 scaling_matrix_present_flag:1;
+ deUint32 vui_parameters_present_flag:1;
+};
+
+struct StdVideoH264ScalingLists
+{
+ deUint8 scaling_list_present_mask;
+ deUint8 use_default_scaling_matrix_mask;
+ deUint8 ScalingList4x4[6][16];
+ deUint8 ScalingList8x8[2][64];
+};
+
+struct StdVideoH264SequenceParameterSet
+{
+ StdVideoH264ProfileIdc profile_idc;
+ StdVideoH264Level level_idc;
+ deUint8 seq_parameter_set_id;
+ StdVideoH264ChromaFormatIdc chroma_format_idc;
+ deUint8 bit_depth_luma_minus8;
+ deUint8 bit_depth_chroma_minus8;
+ deUint8 log2_max_frame_num_minus4;
+ StdVideoH264PocType pic_order_cnt_type;
+ deUint8 log2_max_pic_order_cnt_lsb_minus4;
+ deInt32 offset_for_non_ref_pic;
+ deInt32 offset_for_top_to_bottom_field;
+ deUint8 num_ref_frames_in_pic_order_cnt_cycle;
+ deUint8 max_num_ref_frames;
+ deUint32 pic_width_in_mbs_minus1;
+ deUint32 pic_height_in_map_units_minus1;
+ deUint32 frame_crop_left_offset;
+ deUint32 frame_crop_right_offset;
+ deUint32 frame_crop_top_offset;
+ deUint32 frame_crop_bottom_offset;
+ StdVideoH264SpsFlags flags;
+ deInt32 offset_for_ref_frame[255];
+ StdVideoH264ScalingLists* pScalingLists;
+ StdVideoH264SequenceParameterSetVui* pSequenceParameterSetVui;
+};
+
+struct StdVideoH264PpsFlags
+{
+ deUint32 transform_8x8_mode_flag:1;
+ deUint32 redundant_pic_cnt_present_flag:1;
+ deUint32 constrained_intra_pred_flag:1;
+ deUint32 deblocking_filter_control_present_flag:1;
+ deUint32 weighted_bipred_idc_flag:1;
+ deUint32 weighted_pred_flag:1;
+ deUint32 pic_order_present_flag:1;
+ deUint32 entropy_coding_mode_flag:1;
+ deUint32 scaling_matrix_present_flag:1;
+};
+
+struct StdVideoH264PictureParameterSet
+{
+ deUint8 seq_parameter_set_id;
+ deUint8 pic_parameter_set_id;
+ deUint8 num_ref_idx_l0_default_active_minus1;
+ deUint8 num_ref_idx_l1_default_active_minus1;
+ StdVideoH264WeightedBiPredIdc weighted_bipred_idc;
+ deInt8 pic_init_qp_minus26;
+ deInt8 pic_init_qs_minus26;
+ deInt8 chroma_qp_index_offset;
+ deInt8 second_chroma_qp_index_offset;
+ StdVideoH264PpsFlags flags;
+ StdVideoH264ScalingLists* pScalingLists;
+};
+
+struct StdVideoEncodeH264SliceHeaderFlags
+{
+ deUint32 idr_flag:1;
+ deUint32 is_reference_flag:1;
+ deUint32 num_ref_idx_active_override_flag:1;
+ deUint32 no_output_of_prior_pics_flag:1;
+ deUint32 long_term_reference_flag:1;
+ deUint32 adaptive_ref_pic_marking_mode_flag:1;
+ deUint32 no_prior_references_available_flag:1;
+};
+
+struct StdVideoEncodeH264PictureInfoFlags
+{
+ deUint32 idr_flag:1;
+ deUint32 is_reference_flag:1;
+ deUint32 long_term_reference_flag:1;
+};
+
+struct StdVideoEncodeH264RefMgmtFlags
+{
+ deUint32 ref_pic_list_modification_l0_flag:1;
+ deUint32 ref_pic_list_modification_l1_flag:1;
+};
+
+struct StdVideoEncodeH264RefListModEntry
+{
+ StdVideoH264ModificationOfPicNumsIdc modification_of_pic_nums_idc;
+ deUint16 abs_diff_pic_num_minus1;
+ deUint16 long_term_pic_num;
+};
+
+struct StdVideoEncodeH264RefPicMarkingEntry
+{
+ StdVideoH264MemMgmtControlOp operation;
+ deUint16 difference_of_pic_nums_minus1;
+ deUint16 long_term_pic_num;
+ deUint16 long_term_frame_idx;
+ deUint16 max_long_term_frame_idx_plus1;
+};
+
+struct StdVideoEncodeH264RefMemMgmtCtrlOperations
+{
+ StdVideoEncodeH264RefMgmtFlags flags;
+ deUint8 refList0ModOpCount;
+ StdVideoEncodeH264RefListModEntry* pRefList0ModOperations;
+ deUint8 refList1ModOpCount;
+ StdVideoEncodeH264RefListModEntry* pRefList1ModOperations;
+ deUint8 refPicMarkingOpCount;
+ StdVideoEncodeH264RefPicMarkingEntry* pRefPicMarkingOperations;
+};
+
+struct StdVideoEncodeH264PictureInfo
+{
+ StdVideoEncodeH264PictureInfoFlags flags;
+ StdVideoH264PictureType pictureType;
+ deUint32 frameNum;
+ deUint32 pictureOrderCount;
+ deUint16 long_term_pic_num;
+ deUint16 long_term_frame_idx;
+};
+
+struct StdVideoEncodeH264SliceHeader
+{
+ StdVideoEncodeH264SliceHeaderFlags flags;
+ StdVideoH264SliceType slice_type;
+ deUint8 seq_parameter_set_id;
+ deUint8 pic_parameter_set_id;
+ deUint16 idr_pic_id;
+ deUint8 num_ref_idx_l0_active_minus1;
+ deUint8 num_ref_idx_l1_active_minus1;
+ StdVideoH264CabacInitIdc cabac_init_idc;
+ StdVideoH264DisableDeblockingFilterIdc disable_deblocking_filter_idc;
+ deInt8 slice_alpha_c0_offset_div2;
+ deInt8 slice_beta_offset_div2;
+ StdVideoEncodeH264RefMemMgmtCtrlOperations* pMemMgmtCtrlOperations;
+};
+
+struct VkVideoEncodeH264CapabilitiesEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeH264CapabilitiesFlagsEXT flags;
+ VkVideoEncodeH264InputModeFlagsEXT inputModeFlags;
+ VkVideoEncodeH264OutputModeFlagsEXT outputModeFlags;
+ VkExtent2D minPictureSizeInMbs;
+ VkExtent2D maxPictureSizeInMbs;
+ VkExtent2D inputImageDataAlignment;
+ deUint8 maxNumL0ReferenceForP;
+ deUint8 maxNumL0ReferenceForB;
+ deUint8 maxNumL1Reference;
+ deUint8 qualityLevelCount;
+ VkExtensionProperties stdExtensionVersion;
+};
+
+struct VkVideoEncodeH264SessionCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeH264CreateFlagsEXT flags;
+ VkExtent2D maxPictureSizeInMbs;
+ const VkExtensionProperties* pStdExtensionVersion;
+};
+
+struct VkVideoEncodeH264SessionParametersAddInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 spsStdCount;
+ const StdVideoH264SequenceParameterSet* pSpsStd;
+ deUint32 ppsStdCount;
+ const StdVideoH264PictureParameterSet* pPpsStd;
+};
+
+struct VkVideoEncodeH264SessionParametersCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 maxSpsStdCount;
+ deUint32 maxPpsStdCount;
+ const VkVideoEncodeH264SessionParametersAddInfoEXT* pParametersAddInfo;
+};
+
+struct VkVideoEncodeH264DpbSlotInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deInt8 slotIndex;
+ const StdVideoEncodeH264PictureInfo* pStdPictureInfo;
+};
+
+struct VkVideoEncodeH264NaluSliceEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoEncodeH264SliceHeader* pSliceHeaderStd;
+ deUint32 mbCount;
+ deUint8 refFinalList0EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefFinalList0Entries;
+ deUint8 refFinalList1EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefFinalList1Entries;
+ deUint32 precedingNaluBytes;
+ deUint8 minQp;
+ deUint8 maxQp;
+};
+
+struct VkVideoEncodeH264VclFrameInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint8 refDefaultFinalList0EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefDefaultFinalList0Entries;
+ deUint8 refDefaultFinalList1EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefDefaultFinalList1Entries;
+ deUint32 naluSliceEntryCount;
+ const VkVideoEncodeH264NaluSliceEXT* pNaluSliceEntries;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pCurrentPictureInfo;
+};
+
+struct VkVideoEncodeH264EmitPictureParametersEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint8 spsId;
+ VkBool32 emitSpsEnable;
+ deUint32 ppsIdEntryCount;
+ const deUint8* ppsIdEntries;
+};
+
+struct VkVideoEncodeH264ProfileEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH264ProfileIdc stdProfileIdc;
+};
+
+struct StdVideoDecodeH264PictureInfoFlags
+{
+ deUint32 field_pic_flag:1;
+ deUint32 is_intra:1;
+ deUint32 bottom_field_flag:1;
+ deUint32 is_reference:1;
+ deUint32 complementary_field_pair:1;
+};
+
+struct StdVideoDecodeH264PictureInfo
+{
+ deUint8 seq_parameter_set_id;
+ deUint8 pic_parameter_set_id;
+ deUint16 reserved;
+ deUint16 frame_num;
+ deUint16 idr_pic_id;
+ deInt32 PicOrderCnt[2];
+ StdVideoDecodeH264PictureInfoFlags flags;
+};
+
+struct StdVideoDecodeH264ReferenceInfoFlags
+{
+ deUint32 top_field_flag:1;
+ deUint32 bottom_field_flag:1;
+ deUint32 is_long_term:1;
+ deUint32 is_non_existing:1;
+};
+
+struct StdVideoDecodeH264ReferenceInfo
+{
+ deUint16 FrameNum;
+ deUint16 reserved;
+ deInt32 PicOrderCnt[2];
+ StdVideoDecodeH264ReferenceInfoFlags flags;
+};
+
+struct StdVideoDecodeH264MvcElementFlags
+{
+ deUint32 non_idr:1;
+ deUint32 anchor_pic:1;
+ deUint32 inter_view:1;
+};
+
+struct StdVideoDecodeH264MvcElement
+{
+ StdVideoDecodeH264MvcElementFlags flags;
+ deUint16 viewOrderIndex;
+ deUint16 viewId;
+ deUint16 temporalId;
+ deUint16 priorityId;
+ deUint16 numOfAnchorRefsInL0;
+ deUint16 viewIdOfAnchorRefsInL0[15];
+ deUint16 numOfAnchorRefsInL1;
+ deUint16 viewIdOfAnchorRefsInL1[15];
+ deUint16 numOfNonAnchorRefsInL0;
+ deUint16 viewIdOfNonAnchorRefsInL0[15];
+ deUint16 numOfNonAnchorRefsInL1;
+ deUint16 viewIdOfNonAnchorRefsInL1[15];
+};
+
+struct StdVideoDecodeH264Mvc
+{
+ deUint32 viewId0;
+ deUint32 mvcElementCount;
+ StdVideoDecodeH264MvcElement* pMvcElements;
+};
+
+struct VkVideoDecodeH264ProfileEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH264ProfileIdc stdProfileIdc;
+ VkVideoDecodeH264FieldLayoutFlagsEXT fieldLayout;
+};
+
+struct VkVideoDecodeH264CapabilitiesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 maxLevel;
+ VkOffset2D fieldOffsetGranularity;
+ VkExtensionProperties stdExtensionVersion;
+};
+
+struct VkVideoDecodeH264SessionCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeH264CreateFlagsEXT flags;
+ const VkExtensionProperties* pStdExtensionVersion;
+};
+
+struct VkVideoDecodeH264SessionParametersAddInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 spsStdCount;
+ const StdVideoH264SequenceParameterSet* pSpsStd;
+ deUint32 ppsStdCount;
+ const StdVideoH264PictureParameterSet* pPpsStd;
+};
+
+struct VkVideoDecodeH264SessionParametersCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 maxSpsStdCount;
+ deUint32 maxPpsStdCount;
+ const VkVideoDecodeH264SessionParametersAddInfoEXT* pParametersAddInfo;
+};
+
+struct VkVideoDecodeH264PictureInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264PictureInfo* pStdPictureInfo;
+ deUint32 slicesCount;
+ const deUint32* pSlicesDataOffsets;
+};
+
+struct VkVideoDecodeH264MvcEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264Mvc* pStdMvc;
+};
+
+struct VkVideoDecodeH264DpbSlotInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264ReferenceInfo* pStdReferenceInfo;
+};
+
+struct StdVideoH265DecPicBufMgr
+{
+ deUint32 max_latency_increase_plus1[7];
+ deUint8 max_dec_pic_buffering_minus1[7];
+ deUint8 max_num_reorder_pics[7];
+};
+
+struct StdVideoH265SubLayerHrdParameters
+{
+ deUint32 bit_rate_value_minus1[32];
+ deUint32 cpb_size_value_minus1[32];
+ deUint32 cpb_size_du_value_minus1[32];
+ deUint32 bit_rate_du_value_minus1[32];
+ deUint32 cbr_flag;
+};
+
+struct StdVideoH265HrdFlags
+{
+ deUint32 nal_hrd_parameters_present_flag:1;
+ deUint32 vcl_hrd_parameters_present_flag:1;
+ deUint32 sub_pic_hrd_params_present_flag:1;
+ deUint32 sub_pic_cpb_params_in_pic_timing_sei_flag:1;
+ deUint8 fixed_pic_rate_general_flag;
+ deUint8 fixed_pic_rate_within_cvs_flag;
+ deUint8 low_delay_hrd_flag;
+};
+
+struct StdVideoH265HrdParameters
+{
+ deUint8 tick_divisor_minus2;
+ deUint8 du_cpb_removal_delay_increment_length_minus1;
+ deUint8 dpb_output_delay_du_length_minus1;
+ deUint8 bit_rate_scale;
+ deUint8 cpb_size_scale;
+ deUint8 cpb_size_du_scale;
+ deUint8 initial_cpb_removal_delay_length_minus1;
+ deUint8 au_cpb_removal_delay_length_minus1;
+ deUint8 dpb_output_delay_length_minus1;
+ deUint8 cpb_cnt_minus1[7];
+ deUint16 elemental_duration_in_tc_minus1[7];
+ StdVideoH265SubLayerHrdParameters* SubLayerHrdParametersNal[7];
+ StdVideoH265SubLayerHrdParameters* SubLayerHrdParametersVcl[7];
+ StdVideoH265HrdFlags flags;
+};
+
+struct StdVideoH265VpsFlags
+{
+ deUint32 vps_temporal_id_nesting_flag:1;
+ deUint32 vps_sub_layer_ordering_info_present_flag:1;
+ deUint32 vps_timing_info_present_flag:1;
+ deUint32 vps_poc_proportional_to_timing_flag:1;
+};
+
+struct StdVideoH265VideoParameterSet
+{
+ deUint8 vps_video_parameter_set_id;
+ deUint8 vps_max_sub_layers_minus1;
+ deUint32 vps_num_units_in_tick;
+ deUint32 vps_time_scale;
+ deUint32 vps_num_ticks_poc_diff_one_minus1;
+ StdVideoH265DecPicBufMgr* pDecPicBufMgr;
+ StdVideoH265HrdParameters* hrd_parameters;
+ StdVideoH265VpsFlags flags;
+};
+
+struct StdVideoH265ScalingLists
+{
+ deUint8 ScalingList4x4[6][16];
+ deUint8 ScalingList8x8[6][64];
+ deUint8 ScalingList16x16[6][64];
+ deUint8 ScalingList32x32[2][64];
+ deUint8 ScalingListDCCoef16x16[6];
+ deUint8 ScalingListDCCoef32x32[2];
+};
+
+struct StdVideoH265SpsVuiFlags
+{
+ deUint32 aspect_ratio_info_present_flag:1;
+ deUint32 overscan_info_present_flag:1;
+ deUint32 overscan_appropriate_flag:1;
+ deUint32 video_signal_type_present_flag:1;
+ deUint32 video_full_range_flag:1;
+ deUint32 colour_description_present_flag:1;
+ deUint32 chroma_loc_info_present_flag:1;
+ deUint32 neutral_chroma_indication_flag:1;
+ deUint32 field_seq_flag:1;
+ deUint32 frame_field_info_present_flag:1;
+ deUint32 default_display_window_flag:1;
+ deUint32 vui_timing_info_present_flag:1;
+ deUint32 vui_poc_proportional_to_timing_flag:1;
+ deUint32 vui_hrd_parameters_present_flag:1;
+ deUint32 bitstream_restriction_flag:1;
+ deUint32 tiles_fixed_structure_flag:1;
+ deUint32 motion_vectors_over_pic_boundaries_flag:1;
+ deUint32 restricted_ref_pic_lists_flag:1;
+};
+
+struct StdVideoH265SequenceParameterSetVui
+{
+ deUint8 aspect_ratio_idc;
+ deUint16 sar_width;
+ deUint16 sar_height;
+ deUint8 video_format;
+ deUint8 colour_primaries;
+ deUint8 transfer_characteristics;
+ deUint8 matrix_coeffs;
+ deUint8 chroma_sample_loc_type_top_field;
+ deUint8 chroma_sample_loc_type_bottom_field;
+ deUint16 def_disp_win_left_offset;
+ deUint16 def_disp_win_right_offset;
+ deUint16 def_disp_win_top_offset;
+ deUint16 def_disp_win_bottom_offset;
+ deUint32 vui_num_units_in_tick;
+ deUint32 vui_time_scale;
+ deUint32 vui_num_ticks_poc_diff_one_minus1;
+ StdVideoH265HrdParameters* hrd_parameters;
+ deUint16 min_spatial_segmentation_idc;
+ deUint8 max_bytes_per_pic_denom;
+ deUint8 max_bits_per_min_cu_denom;
+ deUint8 log2_max_mv_length_horizontal;
+ deUint8 log2_max_mv_length_vertical;
+ StdVideoH265SpsVuiFlags flags;
+};
+
+struct StdVideoH265PredictorPaletteEntries
+{
+ deUint16 PredictorPaletteEntries[3][128];
+};
+
+struct StdVideoH265SpsFlags
+{
+ deUint32 sps_temporal_id_nesting_flag:1;
+ deUint32 separate_colour_plane_flag:1;
+ deUint32 scaling_list_enabled_flag:1;
+ deUint32 sps_scaling_list_data_present_flag:1;
+ deUint32 amp_enabled_flag:1;
+ deUint32 sample_adaptive_offset_enabled_flag:1;
+ deUint32 pcm_enabled_flag:1;
+ deUint32 pcm_loop_filter_disabled_flag:1;
+ deUint32 long_term_ref_pics_present_flag:1;
+ deUint32 sps_temporal_mvp_enabled_flag:1;
+ deUint32 strong_intra_smoothing_enabled_flag:1;
+ deUint32 vui_parameters_present_flag:1;
+ deUint32 sps_extension_present_flag:1;
+ deUint32 sps_range_extension_flag:1;
+ deUint32 transform_skip_rotation_enabled_flag:1;
+ deUint32 transform_skip_context_enabled_flag:1;
+ deUint32 implicit_rdpcm_enabled_flag:1;
+ deUint32 explicit_rdpcm_enabled_flag:1;
+ deUint32 extended_precision_processing_flag:1;
+ deUint32 intra_smoothing_disabled_flag:1;
+ deUint32 high_precision_offsets_enabled_flag:1;
+ deUint32 persistent_rice_adaptation_enabled_flag:1;
+ deUint32 cabac_bypass_alignment_enabled_flag:1;
+ deUint32 sps_curr_pic_ref_enabled_flag:1;
+ deUint32 palette_mode_enabled_flag:1;
+ deUint32 sps_palette_predictor_initializer_present_flag:1;
+ deUint32 intra_boundary_filtering_disabled_flag:1;
+};
+
+struct StdVideoH265SequenceParameterSet
+{
+ StdVideoH265ProfileIdc profile_idc;
+ StdVideoH265Level level_idc;
+ deUint32 pic_width_in_luma_samples;
+ deUint32 pic_height_in_luma_samples;
+ deUint8 sps_video_parameter_set_id;
+ deUint8 sps_max_sub_layers_minus1;
+ deUint8 sps_seq_parameter_set_id;
+ deUint8 chroma_format_idc;
+ deUint8 bit_depth_luma_minus8;
+ deUint8 bit_depth_chroma_minus8;
+ deUint8 log2_max_pic_order_cnt_lsb_minus4;
+ deUint8 sps_max_dec_pic_buffering_minus1;
+ deUint8 log2_min_luma_coding_block_size_minus3;
+ deUint8 log2_diff_max_min_luma_coding_block_size;
+ deUint8 log2_min_luma_transform_block_size_minus2;
+ deUint8 log2_diff_max_min_luma_transform_block_size;
+ deUint8 max_transform_hierarchy_depth_inter;
+ deUint8 max_transform_hierarchy_depth_intra;
+ deUint8 num_short_term_ref_pic_sets;
+ deUint8 num_long_term_ref_pics_sps;
+ deUint8 pcm_sample_bit_depth_luma_minus1;
+ deUint8 pcm_sample_bit_depth_chroma_minus1;
+ deUint8 log2_min_pcm_luma_coding_block_size_minus3;
+ deUint8 log2_diff_max_min_pcm_luma_coding_block_size;
+ deUint32 conf_win_left_offset;
+ deUint32 conf_win_right_offset;
+ deUint32 conf_win_top_offset;
+ deUint32 conf_win_bottom_offset;
+ StdVideoH265DecPicBufMgr* pDecPicBufMgr;
+ StdVideoH265SpsFlags flags;
+ StdVideoH265ScalingLists* pScalingLists;
+ StdVideoH265SequenceParameterSetVui* pSequenceParameterSetVui;
+ deUint8 palette_max_size;
+ deUint8 delta_palette_max_predictor_size;
+ deUint8 motion_vector_resolution_control_idc;
+ deUint8 sps_num_palette_predictor_initializer_minus1;
+ StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries;
+};
+
+struct StdVideoH265PpsFlags
+{
+ deUint32 dependent_slice_segments_enabled_flag:1;
+ deUint32 output_flag_present_flag:1;
+ deUint32 sign_data_hiding_enabled_flag:1;
+ deUint32 cabac_init_present_flag:1;
+ deUint32 constrained_intra_pred_flag:1;
+ deUint32 transform_skip_enabled_flag:1;
+ deUint32 cu_qp_delta_enabled_flag:1;
+ deUint32 pps_slice_chroma_qp_offsets_present_flag:1;
+ deUint32 weighted_pred_flag:1;
+ deUint32 weighted_bipred_flag:1;
+ deUint32 transquant_bypass_enabled_flag:1;
+ deUint32 tiles_enabled_flag:1;
+ deUint32 entropy_coding_sync_enabled_flag:1;
+ deUint32 uniform_spacing_flag:1;
+ deUint32 loop_filter_across_tiles_enabled_flag:1;
+ deUint32 pps_loop_filter_across_slices_enabled_flag:1;
+ deUint32 deblocking_filter_control_present_flag:1;
+ deUint32 deblocking_filter_override_enabled_flag:1;
+ deUint32 pps_deblocking_filter_disabled_flag:1;
+ deUint32 pps_scaling_list_data_present_flag:1;
+ deUint32 lists_modification_present_flag:1;
+ deUint32 slice_segment_header_extension_present_flag:1;
+ deUint32 pps_extension_present_flag:1;
+ deUint32 cross_component_prediction_enabled_flag:1;
+ deUint32 chroma_qp_offset_list_enabled_flag:1;
+ deUint32 pps_curr_pic_ref_enabled_flag:1;
+ deUint32 residual_adaptive_colour_transform_enabled_flag:1;
+ deUint32 pps_slice_act_qp_offsets_present_flag:1;
+ deUint32 pps_palette_predictor_initializer_present_flag:1;
+ deUint32 monochrome_palette_flag:1;
+ deUint32 pps_range_extension_flag:1;
+};
+
+struct StdVideoH265PictureParameterSet
+{
+ deUint8 pps_pic_parameter_set_id;
+ deUint8 pps_seq_parameter_set_id;
+ deUint8 num_extra_slice_header_bits;
+ deUint8 num_ref_idx_l0_default_active_minus1;
+ deUint8 num_ref_idx_l1_default_active_minus1;
+ deInt8 init_qp_minus26;
+ deUint8 diff_cu_qp_delta_depth;
+ deInt8 pps_cb_qp_offset;
+ deInt8 pps_cr_qp_offset;
+ deUint8 num_tile_columns_minus1;
+ deUint8 num_tile_rows_minus1;
+ deUint16 column_width_minus1[19];
+ deUint16 row_height_minus1[21];
+ deInt8 pps_beta_offset_div2;
+ deInt8 pps_tc_offset_div2;
+ deUint8 log2_parallel_merge_level_minus2;
+ StdVideoH265PpsFlags flags;
+ StdVideoH265ScalingLists* pScalingLists;
+ deUint8 log2_max_transform_skip_block_size_minus2;
+ deUint8 diff_cu_chroma_qp_offset_depth;
+ deUint8 chroma_qp_offset_list_len_minus1;
+ deInt8 cb_qp_offset_list[6];
+ deInt8 cr_qp_offset_list[6];
+ deUint8 log2_sao_offset_scale_luma;
+ deUint8 log2_sao_offset_scale_chroma;
+ deInt8 pps_act_y_qp_offset_plus5;
+ deInt8 pps_act_cb_qp_offset_plus5;
+ deInt8 pps_act_cr_qp_offset_plus5;
+ deUint8 pps_num_palette_predictor_initializer;
+ deUint8 luma_bit_depth_entry_minus8;
+ deUint8 chroma_bit_depth_entry_minus8;
+ StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries;
+};
+
+struct StdVideoDecodeH265PictureInfoFlags
+{
+ deUint32 IrapPicFlag:1;
+ deUint32 IdrPicFlag:1;
+ deUint32 IsReference:1;
+ deUint32 short_term_ref_pic_set_sps_flag:1;
+};
+
+struct StdVideoDecodeH265PictureInfo
+{
+ deUint8 vps_video_parameter_set_id;
+ deUint8 sps_seq_parameter_set_id;
+ deUint8 pps_pic_parameter_set_id;
+ deUint8 num_short_term_ref_pic_sets;
+ deInt32 PicOrderCntVal;
+ deUint16 NumBitsForSTRefPicSetInSlice;
+ deUint8 NumDeltaPocsOfRefRpsIdx;
+ deUint8 RefPicSetStCurrBefore[8];
+ deUint8 RefPicSetStCurrAfter[8];
+ deUint8 RefPicSetLtCurr[8];
+ StdVideoDecodeH265PictureInfoFlags flags;
+};
+
+struct StdVideoDecodeH265ReferenceInfoFlags
+{
+ deUint32 is_long_term:1;
+ deUint32 is_non_existing:1;
+};
+
+struct StdVideoDecodeH265ReferenceInfo
+{
+ deInt32 PicOrderCntVal;
+ StdVideoDecodeH265ReferenceInfoFlags flags;
+};
+
+struct VkVideoDecodeH265ProfileEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH265ProfileIdc stdProfileIdc;
+};
+
+struct VkVideoDecodeH265CapabilitiesEXT
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 maxLevel;
+ VkExtensionProperties stdExtensionVersion;
+};
+
+struct VkVideoDecodeH265SessionCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeH265CreateFlagsEXT flags;
+ const VkExtensionProperties* pStdExtensionVersion;
+};
+
+struct VkVideoDecodeH265SessionParametersAddInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 spsStdCount;
+ const StdVideoH265SequenceParameterSet* pSpsStd;
+ deUint32 ppsStdCount;
+ const StdVideoH265PictureParameterSet* pPpsStd;
+};
+
+struct VkVideoDecodeH265SessionParametersCreateInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 maxSpsStdCount;
+ deUint32 maxPpsStdCount;
+ const VkVideoDecodeH265SessionParametersAddInfoEXT* pParametersAddInfo;
+};
+
+struct VkVideoDecodeH265PictureInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoDecodeH265PictureInfo* pStdPictureInfo;
+ deUint32 slicesCount;
+ const deUint32* pSlicesDataOffsets;
+};
+
+struct VkVideoDecodeH265DpbSlotInfoEXT
+{
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH265ReferenceInfo* pStdReferenceInfo;
+};
+
struct VkImagePipeSurfaceCreateInfoFUCHSIA
{
VkStructureType sType;
@@ -5362,6 +6431,47 @@
pt::zx_handle_t imagePipeHandle;
};
+struct VkImportMemoryZirconHandleInfoFUCHSIA
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkExternalMemoryHandleTypeFlagBits handleType;
+ pt::zx_handle_t handle;
+};
+
+struct VkMemoryZirconHandlePropertiesFUCHSIA
+{
+ VkStructureType sType;
+ void* pNext;
+ deUint32 memoryTypeBits;
+};
+
+struct VkMemoryGetZirconHandleInfoFUCHSIA
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkDeviceMemory memory;
+ VkExternalMemoryHandleTypeFlagBits handleType;
+};
+
+struct VkImportSemaphoreZirconHandleInfoFUCHSIA
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphore semaphore;
+ VkSemaphoreImportFlags flags;
+ VkExternalSemaphoreHandleTypeFlagBits handleType;
+ pt::zx_handle_t zirconHandle;
+};
+
+struct VkSemaphoreGetZirconHandleInfoFUCHSIA
+{
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphore semaphore;
+ VkExternalSemaphoreHandleTypeFlagBits handleType;
+};
+
struct VkStreamDescriptorSurfaceCreateInfoGGP
{
VkStructureType sType;
diff --git a/external/vulkancts/framework/vulkan/vkTypeUtil.hpp b/external/vulkancts/framework/vulkan/vkTypeUtil.hpp
index b3ae6c0..e982ce9 100644
--- a/external/vulkancts/framework/vulkan/vkTypeUtil.hpp
+++ b/external/vulkancts/framework/vulkan/vkTypeUtil.hpp
@@ -180,6 +180,47 @@
return makeViewport(0.0f, 0.0f, (float)width, (float)height, 0.0f, 1.0f);
}
+inline VkPrimitiveTopology primitiveTopologyCastToList (const VkPrimitiveTopology primitiveTopology)
+{
+ DE_STATIC_ASSERT(static_cast<deUint64>(VK_PRIMITIVE_TOPOLOGY_PATCH_LIST) + 1 == static_cast<deUint64>(VK_PRIMITIVE_TOPOLOGY_LAST));
+
+ switch (primitiveTopology)
+ {
+ case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+ case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST: return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
+ default: TCU_THROW(InternalError, "Unknown primitive topology.");
+ }
+}
+
+inline bool isPrimitiveTopologyPoint (const VkPrimitiveTopology primitiveTopology)
+{
+ return primitiveTopologyCastToList(primitiveTopology) == VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
+}
+
+inline bool isPrimitiveTopologyLine (const VkPrimitiveTopology primitiveTopology)
+{
+ return primitiveTopologyCastToList(primitiveTopology) == VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+}
+
+inline bool isPrimitiveTopologyTriangle (const VkPrimitiveTopology primitiveTopology)
+{
+ return primitiveTopologyCastToList(primitiveTopology) == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+}
+
+inline bool isPrimitiveTopologyPatch (const VkPrimitiveTopology primitiveTopology)
+{
+ return primitiveTopologyCastToList(primitiveTopology) == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
+}
+
} // vk
#endif // _VKTYPEUTIL_HPP
diff --git a/external/vulkancts/framework/vulkan/vkTypeUtil.inl b/external/vulkancts/framework/vulkan/vkTypeUtil.inl
index dd9c0de..86807f9 100644
--- a/external/vulkancts/framework/vulkan/vkTypeUtil.inl
+++ b/external/vulkancts/framework/vulkan/vkTypeUtil.inl
@@ -650,3 +650,32 @@
res.depth = depth;
return res;
}
+
+inline StdVideoEncodeH264RefListModEntry makeStdVideoEncodeH264RefListModEntry (StdVideoH264ModificationOfPicNumsIdc modification_of_pic_nums_idc, deUint16 abs_diff_pic_num_minus1, deUint16 long_term_pic_num)
+{
+ StdVideoEncodeH264RefListModEntry res;
+ res.modification_of_pic_nums_idc = modification_of_pic_nums_idc;
+ res.abs_diff_pic_num_minus1 = abs_diff_pic_num_minus1;
+ res.long_term_pic_num = long_term_pic_num;
+ return res;
+}
+
+inline StdVideoEncodeH264RefPicMarkingEntry makeStdVideoEncodeH264RefPicMarkingEntry (StdVideoH264MemMgmtControlOp operation, deUint16 difference_of_pic_nums_minus1, deUint16 long_term_pic_num, deUint16 long_term_frame_idx, deUint16 max_long_term_frame_idx_plus1)
+{
+ StdVideoEncodeH264RefPicMarkingEntry res;
+ res.operation = operation;
+ res.difference_of_pic_nums_minus1 = difference_of_pic_nums_minus1;
+ res.long_term_pic_num = long_term_pic_num;
+ res.long_term_frame_idx = long_term_frame_idx;
+ res.max_long_term_frame_idx_plus1 = max_long_term_frame_idx_plus1;
+ return res;
+}
+
+inline StdVideoDecodeH264Mvc makeStdVideoDecodeH264Mvc (deUint32 viewId0, deUint32 mvcElementCount, StdVideoDecodeH264MvcElement* pMvcElements)
+{
+ StdVideoDecodeH264Mvc res;
+ res.viewId0 = viewId0;
+ res.mvcElementCount = mvcElementCount;
+ res.pMvcElements = pMvcElements;
+ return res;
+}
diff --git a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
index 59eefb6..9d5f134 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
@@ -295,6 +295,13 @@
virtual VkResult setPrivateDataEXT (VkDevice device, VkObjectType objectType, deUint64 objectHandle, VkPrivateDataSlotEXT privateDataSlot, deUint64 data) const = 0;
virtual void getPrivateDataEXT (VkDevice device, VkObjectType objectType, deUint64 objectHandle, VkPrivateDataSlotEXT privateDataSlot, deUint64* pData) const = 0;
virtual void cmdSetFragmentShadingRateEnumNV (VkCommandBuffer commandBuffer, VkFragmentShadingRateNV shadingRate, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]) const = 0;
+virtual void cmdSetVertexInputEXT (VkCommandBuffer commandBuffer, deUint32 vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, deUint32 vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions) const = 0;
+virtual void cmdSetPatchControlPointsEXT (VkCommandBuffer commandBuffer, deUint32 patchControlPoints) const = 0;
+virtual void cmdSetRasterizerDiscardEnableEXT (VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable) const = 0;
+virtual void cmdSetDepthBiasEnableEXT (VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) const = 0;
+virtual void cmdSetLogicOpEXT (VkCommandBuffer commandBuffer, VkLogicOp logicOp) const = 0;
+virtual void cmdSetPrimitiveRestartEnableEXT (VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable) const = 0;
+virtual void cmdSetColorWriteEnableEXT (VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkBool32* pColorWriteEnables) const = 0;
virtual VkResult createAccelerationStructureKHR (VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure) const = 0;
virtual void destroyAccelerationStructureKHR (VkDevice device, VkAccelerationStructureKHR accelerationStructure, const VkAllocationCallbacks* pAllocator) const = 0;
virtual void cmdBuildAccelerationStructuresKHR (VkCommandBuffer commandBuffer, deUint32 infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos) const = 0;
@@ -319,6 +326,22 @@
virtual void cmdSetRayTracingPipelineStackSizeKHR (VkCommandBuffer commandBuffer, deUint32 pipelineStackSize) const = 0;
virtual VkResult getAndroidHardwareBufferPropertiesANDROID (VkDevice device, const struct pt::AndroidHardwareBufferPtr buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties) const = 0;
virtual VkResult getMemoryAndroidHardwareBufferANDROID (VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct pt::AndroidHardwareBufferPtr* pBuffer) const = 0;
+virtual VkResult createVideoSessionKHR (VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession) const = 0;
+virtual void destroyVideoSessionKHR (VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult getVideoSessionMemoryRequirementsKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32* pVideoSessionMemoryRequirementsCount, VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements) const = 0;
+virtual VkResult bindVideoSessionMemoryKHR (VkDevice device, VkVideoSessionKHR videoSession, deUint32 videoSessionBindMemoryCount, const VkVideoBindMemoryKHR* pVideoSessionBindMemories) const = 0;
+virtual VkResult createVideoSessionParametersKHR (VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters) const = 0;
+virtual VkResult updateVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo) const = 0;
+virtual void destroyVideoSessionParametersKHR (VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual void cmdBeginVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo) const = 0;
+virtual void cmdEndVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo) const = 0;
+virtual void cmdControlVideoCodingKHR (VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo) const = 0;
+virtual void cmdDecodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pFrameInfo) const = 0;
+virtual void cmdEncodeVideoKHR (VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo) const = 0;
+virtual VkResult getMemoryZirconHandleFUCHSIA (VkDevice device, const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle) const = 0;
+virtual VkResult getMemoryZirconHandlePropertiesFUCHSIA (VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, pt::zx_handle_t zirconHandle, VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties) const = 0;
+virtual VkResult importSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo) const = 0;
+virtual VkResult getSemaphoreZirconHandleFUCHSIA (VkDevice device, const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, pt::zx_handle_t* pZirconHandle) const = 0;
virtual VkResult getMemoryWin32HandleKHR (VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, pt::Win32Handle* pHandle) const = 0;
virtual VkResult getMemoryWin32HandlePropertiesKHR (VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, pt::Win32Handle handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties) const = 0;
virtual VkResult importSemaphoreWin32HandleKHR (VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo) const = 0;
diff --git a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
index 97a6094..6ec7727 100644
--- a/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
+++ b/external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
@@ -64,6 +64,8 @@
virtual VkResult acquireWinrtDisplayNV (VkPhysicalDevice physicalDevice, VkDisplayKHR display) const = 0;
virtual VkResult getWinrtDisplayNV (VkPhysicalDevice physicalDevice, deUint32 deviceRelativeId, VkDisplayKHR* pDisplay) const = 0;
virtual VkResult createAndroidSurfaceKHR (VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkResult getPhysicalDeviceVideoCapabilitiesKHR (VkPhysicalDevice physicalDevice, const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities) const = 0;
+virtual VkResult getPhysicalDeviceVideoFormatPropertiesKHR (VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, deUint32* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties) const = 0;
virtual VkResult createImagePipeSurfaceFUCHSIA (VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
virtual VkResult createStreamDescriptorSurfaceGGP (VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
virtual VkResult createIOSSurfaceMVK (VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
diff --git a/external/vulkancts/framework/vulkan/vkVulkan_c.inl b/external/vulkancts/framework/vulkan/vkVulkan_c.inl
index 3e64082..7fedba6 100644
--- a/external/vulkancts/framework/vulkan/vkVulkan_c.inl
+++ b/external/vulkancts/framework/vulkan/vkVulkan_c.inl
@@ -1,6 +1,907 @@
/* WARNING: This is auto-generated file. Do not modify, since changes will
* be lost! Modify the generating script instead.
*/
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_COMMON_H_
+#define VULKAN_VIDEO_CODEC_COMMON_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define VK_MAKE_VIDEO_STD_VERSION(major, minor, patch) \
+ ((((deUint32)(major)) << 22) | (((deUint32)(minor)) << 12) | ((deUint32)(patch)))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_COMMON_H_
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H264STD_H_
+#define VULKAN_VIDEO_CODEC_H264STD_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+// Vulkan 0.9 provisional Vulkan video H.264 encode and decode std specification version number
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9 VK_MAKE_VIDEO_STD_VERSION(0, 9, 0) // Patch version should always be set to 0
+
+// Format must be in the form XX.XX where the first two digits are the major and the second two, the minor.
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264"
+
+// *************************************************
+// Video H.264 common definitions:
+// *************************************************
+
+typedef enum StdVideoH264ChromaFormatIdc {
+ std_video_h264_chroma_format_idc_monochrome = 0,
+ std_video_h264_chroma_format_idc_420 = 1,
+ std_video_h264_chroma_format_idc_422 = 2,
+ std_video_h264_chroma_format_idc_444 = 3,
+} StdVideoH264ChromaFormatIdc;
+
+typedef enum StdVideoH264ProfileIdc {
+ std_video_h264_profile_idc_baseline = 66, /* Only constrained baseline is supported */
+ std_video_h264_profile_idc_main = 77,
+ std_video_h264_profile_idc_high = 100,
+ std_video_h264_profile_idc_high_444_predictive = 244,
+ std_video_h264_profile_idc_invalid = 0x7FFFFFFF
+} StdVideoH264ProfileIdc;
+
+typedef enum StdVideoH264Level {
+ std_video_h264_level_1_0 = 0,
+ std_video_h264_level_1_1 = 1,
+ std_video_h264_level_1_2 = 2,
+ std_video_h264_level_1_3 = 3,
+ std_video_h264_level_2_0 = 4,
+ std_video_h264_level_2_1 = 5,
+ std_video_h264_level_2_2 = 6,
+ std_video_h264_level_3_0 = 7,
+ std_video_h264_level_3_1 = 8,
+ std_video_h264_level_3_2 = 9,
+ std_video_h264_level_4_0 = 10,
+ std_video_h264_level_4_1 = 11,
+ std_video_h264_level_4_2 = 12,
+ std_video_h264_level_5_0 = 13,
+ std_video_h264_level_5_1 = 14,
+ std_video_h264_level_5_2 = 15,
+ std_video_h264_level_6_0 = 16,
+ std_video_h264_level_6_1 = 17,
+ std_video_h264_level_6_2 = 18,
+ std_video_h264_level_invalid = 0x7FFFFFFF
+} StdVideoH264Level;
+
+typedef enum StdVideoH264PocType {
+ std_video_h264_poc_type_0 = 0,
+ std_video_h264_poc_type_1 = 1,
+ std_video_h264_poc_type_2 = 2,
+ std_video_h264_poc_type_invalid = 0x7FFFFFFF
+} StdVideoH264PocType;
+
+typedef enum StdVideoH264AspectRatioIdc {
+ std_video_h264_aspect_ratio_idc_unspecified = 0,
+ std_video_h264_aspect_ratio_idc_square = 1,
+ std_video_h264_aspect_ratio_idc_12_11 = 2,
+ std_video_h264_aspect_ratio_idc_10_11 = 3,
+ std_video_h264_aspect_ratio_idc_16_11 = 4,
+ std_video_h264_aspect_ratio_idc_40_33 = 5,
+ std_video_h264_aspect_ratio_idc_24_11 = 6,
+ std_video_h264_aspect_ratio_idc_20_11 = 7,
+ std_video_h264_aspect_ratio_idc_32_11 = 8,
+ std_video_h264_aspect_ratio_idc_80_33 = 9,
+ std_video_h264_aspect_ratio_idc_18_11 = 10,
+ std_video_h264_aspect_ratio_idc_15_11 = 11,
+ std_video_h264_aspect_ratio_idc_64_33 = 12,
+ std_video_h264_aspect_ratio_idc_160_99 = 13,
+ std_video_h264_aspect_ratio_idc_4_3 = 14,
+ std_video_h264_aspect_ratio_idc_3_2 = 15,
+ std_video_h264_aspect_ratio_idc_2_1 = 16,
+ std_video_h264_aspect_ratio_idc_extended_sar = 255,
+ std_video_h264_aspect_ratio_idc_invalid = 0x7FFFFFFF
+} StdVideoH264AspectRatioIdc;
+
+typedef enum StdVideoH264WeightedBiPredIdc {
+ std_video_h264_default_weighted_b_slices_prediction_idc = 0,
+ std_video_h264_explicit_weighted_b_slices_prediction_idc = 1,
+ std_video_h264_implicit_weighted_b_slices_prediction_idc = 2,
+ std_video_h264_invalid_weighted_b_slices_prediction_idc = 0x7FFFFFFF
+} StdVideoH264WeightedBiPredIdc;
+
+typedef enum StdVideoH264ModificationOfPicNumsIdc {
+ std_video_h264_modification_of_pic_nums_idc_short_term_subtract = 0,
+ std_video_h264_modification_of_pic_nums_idc_short_term_add = 1,
+ std_video_h264_modification_of_pic_nums_idc_long_term = 2,
+ std_video_h264_modification_of_pic_nums_idc_end = 3,
+ std_video_h264_modification_of_pic_nums_idc_invalid = 0x7FFFFFFF
+} StdVideoH264ModificationOfPicNumsIdc;
+
+typedef enum StdVideoH264MemMgmtControlOp {
+ std_video_h264_mem_mgmt_control_op_end = 0,
+ std_video_h264_mem_mgmt_control_op_unmark_short_term = 1,
+ std_video_h264_mem_mgmt_control_op_unmark_long_term = 2,
+ std_video_h264_mem_mgmt_control_op_mark_long_term = 3,
+ std_video_h264_mem_mgmt_control_op_set_max_long_term_index = 4,
+ std_video_h264_mem_mgmt_control_op_unmark_all = 5,
+ std_video_h264_mem_mgmt_control_op_mark_current_as_long_term = 6,
+ std_video_h264_mem_mgmt_control_op_invalid = 0x7FFFFFFF
+} StdVideoH264MemMgmtControlOp;
+
+typedef enum StdVideoH264CabacInitIdc {
+ std_video_h264_cabac_init_idc_0 = 0,
+ std_video_h264_cabac_init_idc_1 = 1,
+ std_video_h264_cabac_init_idc_2 = 2,
+ std_video_h264_cabac_init_idc_invalid = 0x7FFFFFFF
+} StdVideoH264CabacInitIdc;
+
+typedef enum StdVideoH264DisableDeblockingFilterIdc {
+ std_video_h264_disable_deblocking_filter_idc_disabled = 0,
+ std_video_h264_disable_deblocking_filter_idc_enabled = 1,
+ std_video_h264_disable_deblocking_filter_idc_partial = 2,
+ std_video_h264_disable_deblocking_filter_idc_invalid = 0x7FFFFFFF
+} StdVideoH264DisableDeblockingFilterIdc;
+
+typedef enum StdVideoH264PictureType {
+ std_video_h264_picture_type_i = 0,
+ std_video_h264_picture_type_p = 1,
+ std_video_h264_picture_type_b = 2,
+ std_video_h264_picture_type_invalid = 0x7FFFFFFF
+} StdVideoH264PictureType;
+
+typedef enum StdVideoH264SliceType {
+ std_video_h264_slice_type_i = 0,
+ std_video_h264_slice_type_p = 1,
+ std_video_h264_slice_type_b = 2,
+ std_video_h264_slice_type_invalid = 0x7FFFFFFF
+} StdVideoH264SliceType;
+
+typedef enum StdVideoH264NonVclNaluType {
+ std_video_h264_non_vcl_nalu_type_sps = 0,
+ std_video_h264_non_vcl_nalu_type_pps = 1,
+ std_video_h264_non_vcl_nalu_type_aud = 2,
+ std_video_h264_non_vcl_nalu_type_prefix = 3,
+ std_video_h264_non_vcl_nalu_type_end_of_sequence = 4,
+ std_video_h264_non_vcl_nalu_type_end_of_stream = 5,
+ std_video_h264_non_vcl_nalu_type_precoded = 6,
+ std_video_h264_non_vcl_nalu_type_invalid = 0x7FFFFFFF
+} StdVideoH264NonVclNaluType;
+
+typedef struct StdVideoH264SpsVuiFlags {
+ deUint32 aspect_ratio_info_present_flag:1;
+ deUint32 overscan_info_present_flag:1;
+ deUint32 overscan_appropriate_flag:1;
+ deUint32 video_signal_type_present_flag:1;
+ deUint32 video_full_range_flag:1;
+ deUint32 color_description_present_flag:1;
+ deUint32 chroma_loc_info_present_flag:1;
+ deUint32 timing_info_present_flag:1;
+ deUint32 fixed_frame_rate_flag:1;
+ deUint32 bitstream_restriction_flag:1;
+ deUint32 nal_hrd_parameters_present_flag:1;
+ deUint32 vcl_hrd_parameters_present_flag:1;
+} StdVideoH264SpsVuiFlags;
+
+typedef struct StdVideoH264HrdParameters {
+ deUint8 cpb_cnt_minus1;
+ deUint8 bit_rate_scale;
+ deUint8 cpb_size_scale;
+ deUint32 bit_rate_value_minus1[32];
+ deUint32 cpb_size_value_minus1[32];
+ deUint8 cbr_flag[32];
+ deUint32 initial_cpb_removal_delay_length_minus1;
+ deUint32 cpb_removal_delay_length_minus1;
+ deUint32 dpb_output_delay_length_minus1;
+ deUint32 time_offset_length;
+} StdVideoH264HrdParameters;
+
+typedef struct StdVideoH264SequenceParameterSetVui {
+ StdVideoH264AspectRatioIdc aspect_ratio_idc;
+ deUint16 sar_width;
+ deUint16 sar_height;
+ deUint8 video_format;
+ deUint8 color_primaries;
+ deUint8 transfer_characteristics;
+ deUint8 matrix_coefficients;
+ deUint32 num_units_in_tick;
+ deUint32 time_scale;
+ StdVideoH264HrdParameters hrd_parameters;
+ deUint8 num_reorder_frames;
+ deUint8 max_dec_frame_buffering;
+ StdVideoH264SpsVuiFlags flags;
+} StdVideoH264SequenceParameterSetVui;
+
+typedef struct StdVideoH264SpsFlags {
+ deUint32 constraint_set0_flag:1;
+ deUint32 constraint_set1_flag:1;
+ deUint32 constraint_set2_flag:1;
+ deUint32 constraint_set3_flag:1;
+ deUint32 constraint_set4_flag:1;
+ deUint32 constraint_set5_flag:1;
+ deUint32 direct_8x8_inference_flag:1;
+ deUint32 mb_adaptive_frame_field_flag:1;
+ deUint32 frame_mbs_only_flag:1;
+ deUint32 delta_pic_order_always_zero_flag:1;
+ deUint32 residual_colour_transform_flag:1;
+ deUint32 gaps_in_frame_num_value_allowed_flag:1;
+ deUint32 first_picture_after_seek_flag:1; // where is this being documented?
+ deUint32 qpprime_y_zero_transform_bypass_flag:1;
+ deUint32 frame_cropping_flag:1;
+ deUint32 scaling_matrix_present_flag:1;
+ deUint32 vui_parameters_present_flag:1;
+} StdVideoH264SpsFlags;
+
+typedef struct StdVideoH264ScalingLists
+{
+ // scaling_list_present_mask has one bit for each
+ // seq_scaling_list_present_flag[i] for SPS OR
+ // pic_scaling_list_present_flag[i] for PPS,
+ // bit 0 - 5 are for each entry of ScalingList4x4
+ // bit 6 - 7 are for each entry plus 6 for ScalingList8x8
+ deUint8 scaling_list_present_mask;
+ // use_default_scaling_matrix_mask has one bit for each
+ // UseDefaultScalingMatrix4x4Flag[ i ] and
+ // UseDefaultScalingMatrix8x8Flag[ i - 6 ] for SPS OR PPS
+ // bit 0 - 5 are for each entry of ScalingList4x4
+ // bit 6 - 7 are for each entry plus 6 for ScalingList8x8
+ deUint8 use_default_scaling_matrix_mask;
+ deUint8 ScalingList4x4[6][16];
+ deUint8 ScalingList8x8[2][64];
+} StdVideoH264ScalingLists;
+
+typedef struct StdVideoH264SequenceParameterSet
+{
+ StdVideoH264ProfileIdc profile_idc;
+ StdVideoH264Level level_idc;
+ deUint8 seq_parameter_set_id;
+ StdVideoH264ChromaFormatIdc chroma_format_idc;
+ deUint8 bit_depth_luma_minus8;
+ deUint8 bit_depth_chroma_minus8;
+ deUint8 log2_max_frame_num_minus4;
+ StdVideoH264PocType pic_order_cnt_type;
+ deUint8 log2_max_pic_order_cnt_lsb_minus4;
+ deInt32 offset_for_non_ref_pic;
+ deInt32 offset_for_top_to_bottom_field;
+ deUint8 num_ref_frames_in_pic_order_cnt_cycle;
+ deUint8 max_num_ref_frames;
+ deUint32 pic_width_in_mbs_minus1;
+ deUint32 pic_height_in_map_units_minus1;
+ deUint32 frame_crop_left_offset;
+ deUint32 frame_crop_right_offset;
+ deUint32 frame_crop_top_offset;
+ deUint32 frame_crop_bottom_offset;
+ StdVideoH264SpsFlags flags;
+ deInt32 offset_for_ref_frame[255]; // The number of valid values are defined by the num_ref_frames_in_pic_order_cnt_cycle
+ StdVideoH264ScalingLists* pScalingLists; // Must be a valid pointer if scaling_matrix_present_flag is set
+ StdVideoH264SequenceParameterSetVui* pSequenceParameterSetVui; // Must be a valid pointer if StdVideoH264SpsFlags:vui_parameters_present_flag is set
+} StdVideoH264SequenceParameterSet;
+
+typedef struct StdVideoH264PpsFlags {
+ deUint32 transform_8x8_mode_flag:1;
+ deUint32 redundant_pic_cnt_present_flag:1;
+ deUint32 constrained_intra_pred_flag:1;
+ deUint32 deblocking_filter_control_present_flag:1;
+ deUint32 weighted_bipred_idc_flag:1;
+ deUint32 weighted_pred_flag:1;
+ deUint32 pic_order_present_flag:1;
+ deUint32 entropy_coding_mode_flag:1;
+ deUint32 scaling_matrix_present_flag:1;
+} StdVideoH264PpsFlags;
+
+typedef struct StdVideoH264PictureParameterSet
+{
+ deUint8 seq_parameter_set_id;
+ deUint8 pic_parameter_set_id;
+ deUint8 num_ref_idx_l0_default_active_minus1;
+ deUint8 num_ref_idx_l1_default_active_minus1;
+ StdVideoH264WeightedBiPredIdc weighted_bipred_idc;
+ deInt8 pic_init_qp_minus26;
+ deInt8 pic_init_qs_minus26;
+ deInt8 chroma_qp_index_offset;
+ deInt8 second_chroma_qp_index_offset;
+ StdVideoH264PpsFlags flags;
+ StdVideoH264ScalingLists* pScalingLists; // Must be a valid pointer if StdVideoH264PpsFlags::scaling_matrix_present_flag is set.
+} StdVideoH264PictureParameterSet;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H264STD_H_
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_
+#define VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+// *************************************************
+// Video H.264 Encode related parameters:
+// *************************************************
+
+typedef struct StdVideoEncodeH264SliceHeaderFlags {
+ deUint32 idr_flag:1;
+ deUint32 is_reference_flag:1;
+ deUint32 num_ref_idx_active_override_flag:1;
+ deUint32 no_output_of_prior_pics_flag:1;
+ deUint32 long_term_reference_flag:1;
+ deUint32 adaptive_ref_pic_marking_mode_flag:1;
+ deUint32 no_prior_references_available_flag:1;
+} StdVideoEncodeH264SliceHeaderFlags;
+
+typedef struct StdVideoEncodeH264PictureInfoFlags {
+ deUint32 idr_flag:1;
+ deUint32 is_reference_flag:1;
+ deUint32 long_term_reference_flag:1;
+} StdVideoEncodeH264PictureInfoFlags;
+
+typedef struct StdVideoEncodeH264RefMgmtFlags {
+ deUint32 ref_pic_list_modification_l0_flag:1;
+ deUint32 ref_pic_list_modification_l1_flag:1;
+} StdVideoEncodeH264RefMgmtFlags;
+
+typedef struct StdVideoEncodeH264RefListModEntry {
+ StdVideoH264ModificationOfPicNumsIdc modification_of_pic_nums_idc;
+ deUint16 abs_diff_pic_num_minus1;
+ deUint16 long_term_pic_num;
+} StdVideoEncodeH264RefListModEntry;
+
+typedef struct StdVideoEncodeH264RefPicMarkingEntry {
+ StdVideoH264MemMgmtControlOp operation;
+ deUint16 difference_of_pic_nums_minus1;
+ deUint16 long_term_pic_num;
+ deUint16 long_term_frame_idx;
+ deUint16 max_long_term_frame_idx_plus1;
+} StdVideoEncodeH264RefPicMarkingEntry;
+
+typedef struct StdVideoEncodeH264RefMemMgmtCtrlOperations {
+ StdVideoEncodeH264RefMgmtFlags flags;
+ deUint8 refList0ModOpCount;
+ StdVideoEncodeH264RefListModEntry* pRefList0ModOperations;
+ deUint8 refList1ModOpCount;
+ StdVideoEncodeH264RefListModEntry* pRefList1ModOperations;
+ deUint8 refPicMarkingOpCount;
+ StdVideoEncodeH264RefPicMarkingEntry* pRefPicMarkingOperations;
+} StdVideoEncodeH264RefMemMgmtCtrlOperations;
+
+typedef struct StdVideoEncodeH264PictureInfo {
+ StdVideoEncodeH264PictureInfoFlags flags;
+ StdVideoH264PictureType pictureType;
+ deUint32 frameNum;
+ deUint32 pictureOrderCount;
+ deUint16 long_term_pic_num;
+ deUint16 long_term_frame_idx;
+} StdVideoEncodeH264PictureInfo;
+
+typedef struct StdVideoEncodeH264SliceHeader {
+ StdVideoEncodeH264SliceHeaderFlags flags;
+ StdVideoH264SliceType slice_type;
+ deUint8 seq_parameter_set_id;
+ deUint8 pic_parameter_set_id;
+ deUint16 idr_pic_id;
+ deUint8 num_ref_idx_l0_active_minus1;
+ deUint8 num_ref_idx_l1_active_minus1;
+ StdVideoH264CabacInitIdc cabac_init_idc;
+ StdVideoH264DisableDeblockingFilterIdc disable_deblocking_filter_idc;
+ deInt8 slice_alpha_c0_offset_div2;
+ deInt8 slice_beta_offset_div2;
+ StdVideoEncodeH264RefMemMgmtCtrlOperations* pMemMgmtCtrlOperations;
+} StdVideoEncodeH264SliceHeader;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H265STD_H_
+#define VULKAN_VIDEO_CODEC_H265STD_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+// Vulkan 0.5 version number WIP
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_API_VERSION_0_5 VK_MAKE_VIDEO_STD_VERSION(0, 5, 0) // Patch version should always be set to 0
+
+// Format must be in the form XX.XX where the first two digits are the major and the second two, the minor.
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_API_VERSION_0_5
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265"
+
+typedef enum StdVideoH265ChromaFormatIdc {
+ std_video_h265_chroma_format_idc_monochrome = 0,
+ std_video_h265_chroma_format_idc_420 = 1,
+ std_video_h265_chroma_format_idc_422 = 2,
+ std_video_h265_chroma_format_idc_444 = 3,
+} StdVideoH265ChromaFormatIdc;
+
+typedef enum StdVideoH265ProfileIdc {
+ std_video_h265_profile_idc_main = 1,
+ std_video_h265_profile_idc_main_10 = 2,
+ std_video_h265_profile_idc_main_still_picture = 3,
+ std_video_h265_profile_idc_format_range_extensions = 4,
+ std_video_h265_profile_idc_scc_extensions = 9,
+ std_video_h265_profile_idc_invalid = 0x7FFFFFFF
+} StdVideoH265ProfileIdc;
+
+typedef enum StdVideoH265Level {
+ std_video_h265_level_1_0 = 0,
+ std_video_h265_level_2_0 = 1,
+ std_video_h265_level_2_1 = 2,
+ std_video_h265_level_3_0 = 3,
+ std_video_h265_level_3_1 = 4,
+ std_video_h265_level_4_0 = 5,
+ std_video_h265_level_4_1 = 6,
+ std_video_h265_level_5_0 = 7,
+ std_video_h265_level_5_1 = 8,
+ std_video_h265_level_5_2 = 9,
+ std_video_h265_level_6_0 = 10,
+ std_video_h265_level_6_1 = 11,
+ std_video_h265_level_6_2 = 12,
+ std_video_h265_level_invalid = 0x7FFFFFFF
+} StdVideoH265Level;
+
+
+typedef struct StdVideoH265DecPicBufMgr
+{
+ deUint32 max_latency_increase_plus1[7];
+ deUint8 max_dec_pic_buffering_minus1[7];
+ deUint8 max_num_reorder_pics[7];
+} StdVideoH265DecPicBufMgr;
+
+typedef struct StdVideoH265SubLayerHrdParameters {
+ deUint32 bit_rate_value_minus1[32];
+ deUint32 cpb_size_value_minus1[32];
+ deUint32 cpb_size_du_value_minus1[32];
+ deUint32 bit_rate_du_value_minus1[32];
+ deUint32 cbr_flag; // each bit represents a range of CpbCounts (bit 0 - cpb_cnt_minus1) per sub-layer
+} StdVideoH265SubLayerHrdParameters;
+
+typedef struct StdVideoH265HrdFlags {
+ deUint32 nal_hrd_parameters_present_flag : 1;
+ deUint32 vcl_hrd_parameters_present_flag : 1;
+ deUint32 sub_pic_hrd_params_present_flag : 1;
+ deUint32 sub_pic_cpb_params_in_pic_timing_sei_flag : 1;
+ deUint8 fixed_pic_rate_general_flag; // each bit represents a sublayer, bit 0 - vps_max_sub_layers_minus1
+ deUint8 fixed_pic_rate_within_cvs_flag; // each bit represents a sublayer, bit 0 - vps_max_sub_layers_minus1
+ deUint8 low_delay_hrd_flag; // each bit represents a sublayer, bit 0 - vps_max_sub_layers_minus1
+} StdVideoH265HrdFlags;
+
+typedef struct StdVideoH265HrdParameters {
+ deUint8 tick_divisor_minus2;
+ deUint8 du_cpb_removal_delay_increment_length_minus1;
+ deUint8 dpb_output_delay_du_length_minus1;
+ deUint8 bit_rate_scale;
+ deUint8 cpb_size_scale;
+ deUint8 cpb_size_du_scale;
+ deUint8 initial_cpb_removal_delay_length_minus1;
+ deUint8 au_cpb_removal_delay_length_minus1;
+ deUint8 dpb_output_delay_length_minus1;
+ deUint8 cpb_cnt_minus1[7];
+ deUint16 elemental_duration_in_tc_minus1[7];
+ StdVideoH265SubLayerHrdParameters* SubLayerHrdParametersNal[7];
+ StdVideoH265SubLayerHrdParameters* SubLayerHrdParametersVcl[7];
+ StdVideoH265HrdFlags flags;
+} StdVideoH265HrdParameters;
+
+typedef struct StdVideoH265VpsFlags {
+ deUint32 vps_temporal_id_nesting_flag : 1;
+ deUint32 vps_sub_layer_ordering_info_present_flag : 1;
+ deUint32 vps_timing_info_present_flag : 1;
+ deUint32 vps_poc_proportional_to_timing_flag : 1;
+} StdVideoH265VpsFlags;
+
+typedef struct StdVideoH265VideoParameterSet
+{
+ deUint8 vps_video_parameter_set_id;
+ deUint8 vps_max_sub_layers_minus1;
+ deUint32 vps_num_units_in_tick;
+ deUint32 vps_time_scale;
+ deUint32 vps_num_ticks_poc_diff_one_minus1;
+ StdVideoH265DecPicBufMgr* pDecPicBufMgr;
+ StdVideoH265HrdParameters* hrd_parameters;
+ StdVideoH265VpsFlags flags;
+} StdVideoH265VideoParameterSet;
+
+typedef struct StdVideoH265ScalingLists
+{
+ deUint8 ScalingList4x4[6][16]; // ScalingList[ 0 ][ MatrixID ][ i ] (sizeID = 0)
+ deUint8 ScalingList8x8[6][64]; // ScalingList[ 1 ][ MatrixID ][ i ] (sizeID = 1)
+ deUint8 ScalingList16x16[6][64]; // ScalingList[ 2 ][ MatrixID ][ i ] (sizeID = 2)
+ deUint8 ScalingList32x32[2][64]; // ScalingList[ 3 ][ MatrixID ][ i ] (sizeID = 3)
+ deUint8 ScalingListDCCoef16x16[6]; // scaling_list_dc_coef_minus8[ sizeID - 2 ][ matrixID ] + 8, sizeID = 2
+ deUint8 ScalingListDCCoef32x32[2]; // scaling_list_dc_coef_minus8[ sizeID - 2 ][ matrixID ] + 8. sizeID = 3
+} StdVideoH265ScalingLists;
+
+typedef struct StdVideoH265SpsVuiFlags {
+ deUint32 aspect_ratio_info_present_flag : 1;
+ deUint32 overscan_info_present_flag : 1;
+ deUint32 overscan_appropriate_flag : 1;
+ deUint32 video_signal_type_present_flag : 1;
+ deUint32 video_full_range_flag : 1;
+ deUint32 colour_description_present_flag : 1;
+ deUint32 chroma_loc_info_present_flag : 1;
+ deUint32 neutral_chroma_indication_flag : 1;
+ deUint32 field_seq_flag : 1;
+ deUint32 frame_field_info_present_flag : 1;
+ deUint32 default_display_window_flag : 1;
+ deUint32 vui_timing_info_present_flag : 1;
+ deUint32 vui_poc_proportional_to_timing_flag : 1;
+ deUint32 vui_hrd_parameters_present_flag : 1;
+ deUint32 bitstream_restriction_flag : 1;
+ deUint32 tiles_fixed_structure_flag : 1;
+ deUint32 motion_vectors_over_pic_boundaries_flag : 1;
+ deUint32 restricted_ref_pic_lists_flag : 1;
+} StdVideoH265SpsVuiFlags;
+
+typedef struct StdVideoH265SequenceParameterSetVui {
+ deUint8 aspect_ratio_idc;
+ deUint16 sar_width;
+ deUint16 sar_height;
+ deUint8 video_format;
+ deUint8 colour_primaries;
+ deUint8 transfer_characteristics;
+ deUint8 matrix_coeffs;
+ deUint8 chroma_sample_loc_type_top_field;
+ deUint8 chroma_sample_loc_type_bottom_field;
+ deUint16 def_disp_win_left_offset;
+ deUint16 def_disp_win_right_offset;
+ deUint16 def_disp_win_top_offset;
+ deUint16 def_disp_win_bottom_offset;
+ deUint32 vui_num_units_in_tick;
+ deUint32 vui_time_scale;
+ deUint32 vui_num_ticks_poc_diff_one_minus1;
+ StdVideoH265HrdParameters* hrd_parameters;
+ deUint16 min_spatial_segmentation_idc;
+ deUint8 max_bytes_per_pic_denom;
+ deUint8 max_bits_per_min_cu_denom;
+ deUint8 log2_max_mv_length_horizontal;
+ deUint8 log2_max_mv_length_vertical;
+ StdVideoH265SpsVuiFlags flags;
+} StdVideoH265SequenceParameterSetVui;
+
+typedef struct StdVideoH265PredictorPaletteEntries
+{
+ deUint16 PredictorPaletteEntries[3][128];
+} StdVideoH265PredictorPaletteEntries;
+
+
+typedef struct StdVideoH265SpsFlags {
+ deUint32 sps_temporal_id_nesting_flag : 1;
+ deUint32 separate_colour_plane_flag : 1;
+ deUint32 scaling_list_enabled_flag : 1;
+ deUint32 sps_scaling_list_data_present_flag : 1;
+ deUint32 amp_enabled_flag : 1;
+ deUint32 sample_adaptive_offset_enabled_flag : 1;
+ deUint32 pcm_enabled_flag : 1;
+ deUint32 pcm_loop_filter_disabled_flag : 1;
+ deUint32 long_term_ref_pics_present_flag : 1;
+ deUint32 sps_temporal_mvp_enabled_flag : 1;
+ deUint32 strong_intra_smoothing_enabled_flag : 1;
+ deUint32 vui_parameters_present_flag : 1;
+ deUint32 sps_extension_present_flag : 1;
+ deUint32 sps_range_extension_flag : 1;
+
+ // extension SPS flags, valid when std_video_h265_profile_idc_format_range_extensions is set
+ deUint32 transform_skip_rotation_enabled_flag : 1;
+ deUint32 transform_skip_context_enabled_flag : 1;
+ deUint32 implicit_rdpcm_enabled_flag : 1;
+ deUint32 explicit_rdpcm_enabled_flag : 1;
+ deUint32 extended_precision_processing_flag : 1;
+ deUint32 intra_smoothing_disabled_flag : 1;
+ deUint32 high_precision_offsets_enabled_flag : 1;
+ deUint32 persistent_rice_adaptation_enabled_flag : 1;
+ deUint32 cabac_bypass_alignment_enabled_flag : 1;
+
+ // extension SPS flags, valid when std_video_h265_profile_idc_scc_extensions is set
+ deUint32 sps_curr_pic_ref_enabled_flag : 1;
+ deUint32 palette_mode_enabled_flag : 1;
+ deUint32 sps_palette_predictor_initializer_present_flag : 1;
+ deUint32 intra_boundary_filtering_disabled_flag : 1;
+} StdVideoH265SpsFlags;
+
+typedef struct StdVideoH265SequenceParameterSet
+{
+ StdVideoH265ProfileIdc profile_idc;
+ StdVideoH265Level level_idc;
+ deUint32 pic_width_in_luma_samples;
+ deUint32 pic_height_in_luma_samples;
+ deUint8 sps_video_parameter_set_id;
+ deUint8 sps_max_sub_layers_minus1;
+ deUint8 sps_seq_parameter_set_id;
+ deUint8 chroma_format_idc;
+ deUint8 bit_depth_luma_minus8;
+ deUint8 bit_depth_chroma_minus8;
+ deUint8 log2_max_pic_order_cnt_lsb_minus4;
+ deUint8 sps_max_dec_pic_buffering_minus1;
+ deUint8 log2_min_luma_coding_block_size_minus3;
+ deUint8 log2_diff_max_min_luma_coding_block_size;
+ deUint8 log2_min_luma_transform_block_size_minus2;
+ deUint8 log2_diff_max_min_luma_transform_block_size;
+ deUint8 max_transform_hierarchy_depth_inter;
+ deUint8 max_transform_hierarchy_depth_intra;
+ deUint8 num_short_term_ref_pic_sets;
+ deUint8 num_long_term_ref_pics_sps;
+ deUint8 pcm_sample_bit_depth_luma_minus1;
+ deUint8 pcm_sample_bit_depth_chroma_minus1;
+ deUint8 log2_min_pcm_luma_coding_block_size_minus3;
+ deUint8 log2_diff_max_min_pcm_luma_coding_block_size;
+ deUint32 conf_win_left_offset;
+ deUint32 conf_win_right_offset;
+ deUint32 conf_win_top_offset;
+ deUint32 conf_win_bottom_offset;
+ StdVideoH265DecPicBufMgr* pDecPicBufMgr;
+ StdVideoH265SpsFlags flags;
+ StdVideoH265ScalingLists* pScalingLists; // Must be a valid pointer if sps_scaling_list_data_present_flag is set
+ StdVideoH265SequenceParameterSetVui* pSequenceParameterSetVui; // Must be a valid pointer if StdVideoH265SpsFlags:vui_parameters_present_flag is set palette_max_size;
+
+ // extension SPS flags, valid when std_video_h265_profile_idc_scc_extensions is set
+ deUint8 palette_max_size;
+ deUint8 delta_palette_max_predictor_size;
+ deUint8 motion_vector_resolution_control_idc;
+ deUint8 sps_num_palette_predictor_initializer_minus1;
+ StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries; // Must be a valid pointer if sps_palette_predictor_initializer_present_flag is set
+} StdVideoH265SequenceParameterSet;
+
+
+typedef struct StdVideoH265PpsFlags {
+ deUint32 dependent_slice_segments_enabled_flag : 1;
+ deUint32 output_flag_present_flag : 1;
+ deUint32 sign_data_hiding_enabled_flag : 1;
+ deUint32 cabac_init_present_flag : 1;
+ deUint32 constrained_intra_pred_flag : 1;
+ deUint32 transform_skip_enabled_flag : 1;
+ deUint32 cu_qp_delta_enabled_flag : 1;
+ deUint32 pps_slice_chroma_qp_offsets_present_flag : 1;
+ deUint32 weighted_pred_flag : 1;
+ deUint32 weighted_bipred_flag : 1;
+ deUint32 transquant_bypass_enabled_flag : 1;
+ deUint32 tiles_enabled_flag : 1;
+ deUint32 entropy_coding_sync_enabled_flag : 1;
+ deUint32 uniform_spacing_flag : 1;
+ deUint32 loop_filter_across_tiles_enabled_flag : 1;
+ deUint32 pps_loop_filter_across_slices_enabled_flag : 1;
+ deUint32 deblocking_filter_control_present_flag : 1;
+ deUint32 deblocking_filter_override_enabled_flag : 1;
+ deUint32 pps_deblocking_filter_disabled_flag : 1;
+ deUint32 pps_scaling_list_data_present_flag : 1;
+ deUint32 lists_modification_present_flag : 1;
+ deUint32 slice_segment_header_extension_present_flag : 1;
+ deUint32 pps_extension_present_flag : 1;
+
+ // extension PPS flags, valid when std_video_h265_profile_idc_format_range_extensions is set
+ deUint32 cross_component_prediction_enabled_flag : 1;
+ deUint32 chroma_qp_offset_list_enabled_flag : 1;
+
+ // extension PPS flags, valid when std_video_h265_profile_idc_scc_extensions is set
+ deUint32 pps_curr_pic_ref_enabled_flag : 1;
+ deUint32 residual_adaptive_colour_transform_enabled_flag : 1;
+ deUint32 pps_slice_act_qp_offsets_present_flag : 1;
+ deUint32 pps_palette_predictor_initializer_present_flag : 1;
+ deUint32 monochrome_palette_flag : 1;
+ deUint32 pps_range_extension_flag : 1;
+} StdVideoH265PpsFlags;
+
+typedef struct StdVideoH265PictureParameterSet
+{
+ deUint8 pps_pic_parameter_set_id;
+ deUint8 pps_seq_parameter_set_id;
+ deUint8 num_extra_slice_header_bits;
+ deUint8 num_ref_idx_l0_default_active_minus1;
+ deUint8 num_ref_idx_l1_default_active_minus1;
+ deInt8 init_qp_minus26;
+ deUint8 diff_cu_qp_delta_depth;
+ deInt8 pps_cb_qp_offset;
+ deInt8 pps_cr_qp_offset;
+ deUint8 num_tile_columns_minus1;
+ deUint8 num_tile_rows_minus1;
+ deUint16 column_width_minus1[19];
+ deUint16 row_height_minus1[21];
+ deInt8 pps_beta_offset_div2;
+ deInt8 pps_tc_offset_div2;
+ deUint8 log2_parallel_merge_level_minus2;
+ StdVideoH265PpsFlags flags;
+ StdVideoH265ScalingLists* pScalingLists; // Must be a valid pointer if pps_scaling_list_data_present_flag is set
+
+ // extension PPS, valid when std_video_h265_profile_idc_format_range_extensions is set
+ deUint8 log2_max_transform_skip_block_size_minus2;
+ deUint8 diff_cu_chroma_qp_offset_depth;
+ deUint8 chroma_qp_offset_list_len_minus1;
+ deInt8 cb_qp_offset_list[6];
+ deInt8 cr_qp_offset_list[6];
+ deUint8 log2_sao_offset_scale_luma;
+ deUint8 log2_sao_offset_scale_chroma;
+
+ // extension PPS, valid when std_video_h265_profile_idc_scc_extensions is set
+ deInt8 pps_act_y_qp_offset_plus5;
+ deInt8 pps_act_cb_qp_offset_plus5;
+ deInt8 pps_act_cr_qp_offset_plus5;
+ deUint8 pps_num_palette_predictor_initializer;
+ deUint8 luma_bit_depth_entry_minus8;
+ deUint8 chroma_bit_depth_entry_minus8;
+ StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries; // Must be a valid pointer if pps_palette_predictor_initializer_present_flag is set
+} StdVideoH265PictureParameterSet;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H265STD_H_
+/*
+** Copyright (c) 2019-2020 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H264STD_DECODE_H_
+#define VULKAN_VIDEO_CODEC_H264STD_DECODE_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+// *************************************************
+// Video H.264 Decode related parameters:
+// *************************************************
+
+typedef struct StdVideoDecodeH264PictureInfoFlags {
+ deUint32 field_pic_flag:1; // Is field picture
+ deUint32 is_intra:1; // Is intra picture
+ deUint32 bottom_field_flag:1; // bottom (true) or top (false) field if field_pic_flag is set.
+ deUint32 is_reference:1; // This only applies to picture info, and not to the DPB lists.
+ deUint32 complementary_field_pair:1; // complementary field pair, complementary non-reference field pair, complementary reference field pair
+} StdVideoDecodeH264PictureInfoFlags;
+
+typedef struct StdVideoDecodeH264PictureInfo {
+ deUint8 seq_parameter_set_id; // Selecting SPS from the Picture Parameters
+ deUint8 pic_parameter_set_id; // Selecting PPS from the Picture Parameters and the SPS
+ deUint16 reserved; // for structure members 32-bit packing/alignment
+ deUint16 frame_num; // 7.4.3 Slice header semantics
+ deUint16 idr_pic_id; // 7.4.3 Slice header semantics
+ // PicOrderCnt is based on TopFieldOrderCnt and BottomFieldOrderCnt. See 8.2.1 Decoding process for picture order count type 0 - 2
+ deInt32 PicOrderCnt[2]; // TopFieldOrderCnt and BottomFieldOrderCnt fields.
+ StdVideoDecodeH264PictureInfoFlags flags;
+} StdVideoDecodeH264PictureInfo;
+
+typedef struct StdVideoDecodeH264ReferenceInfoFlags {
+ deUint32 top_field_flag:1; // Reference is used for top field reference.
+ deUint32 bottom_field_flag:1; // Reference is used for bottom field reference.
+ deUint32 is_long_term:1; // this is a long term reference
+ deUint32 is_non_existing:1; // Must be handled in accordance with 8.2.5.2: Decoding process for gaps in frame_num
+} StdVideoDecodeH264ReferenceInfoFlags;
+
+typedef struct StdVideoDecodeH264ReferenceInfo {
+ // FrameNum = is_long_term ? long_term_frame_idx : frame_num
+ deUint16 FrameNum; // 7.4.3.3 Decoded reference picture marking semantics
+ deUint16 reserved; // for structure members 32-bit packing/alignment
+ deInt32 PicOrderCnt[2]; // TopFieldOrderCnt and BottomFieldOrderCnt fields.
+ StdVideoDecodeH264ReferenceInfoFlags flags;
+} StdVideoDecodeH264ReferenceInfo;
+
+typedef struct StdVideoDecodeH264MvcElementFlags {
+ deUint32 non_idr:1;
+ deUint32 anchor_pic:1;
+ deUint32 inter_view:1;
+} StdVideoDecodeH264MvcElementFlags;
+
+typedef struct StdVideoDecodeH264MvcElement {
+ StdVideoDecodeH264MvcElementFlags flags;
+ deUint16 viewOrderIndex;
+ deUint16 viewId;
+ deUint16 temporalId; // move out?
+ deUint16 priorityId; // move out?
+ deUint16 numOfAnchorRefsInL0;
+ deUint16 viewIdOfAnchorRefsInL0[15];
+ deUint16 numOfAnchorRefsInL1;
+ deUint16 viewIdOfAnchorRefsInL1[15];
+ deUint16 numOfNonAnchorRefsInL0;
+ deUint16 viewIdOfNonAnchorRefsInL0[15];
+ deUint16 numOfNonAnchorRefsInL1;
+ deUint16 viewIdOfNonAnchorRefsInL1[15];
+} StdVideoDecodeH264MvcElement;
+
+typedef struct StdVideoDecodeH264Mvc {
+ deUint32 viewId0;
+ deUint32 mvcElementCount;
+ StdVideoDecodeH264MvcElement* pMvcElements;
+} StdVideoDecodeH264Mvc;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H264STD_DECODE_H_
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H265STD_DECODE_H_
+#define VULKAN_VIDEO_CODEC_H265STD_DECODE_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+// *************************************************
+// Video h265 Decode related parameters:
+// *************************************************
+
+typedef struct StdVideoDecodeH265PictureInfoFlags {
+ deUint32 IrapPicFlag : 1;
+ deUint32 IdrPicFlag : 1;
+ deUint32 IsReference : 1;
+ deUint32 short_term_ref_pic_set_sps_flag : 1;
+} StdVideoDecodeH265PictureInfoFlags;
+
+typedef struct StdVideoDecodeH265PictureInfo {
+ deUint8 vps_video_parameter_set_id;
+ deUint8 sps_seq_parameter_set_id;
+ deUint8 pps_pic_parameter_set_id;
+ deUint8 num_short_term_ref_pic_sets;
+ deInt32 PicOrderCntVal;
+ deUint16 NumBitsForSTRefPicSetInSlice; // number of bits used in st_ref_pic_set()
+ //when short_term_ref_pic_set_sps_flag is 0; otherwise set to 0.
+ deUint8 NumDeltaPocsOfRefRpsIdx; // NumDeltaPocs[ RefRpsIdx ] when short_term_ref_pic_set_sps_flag = 1, otherwise 0
+ deUint8 RefPicSetStCurrBefore[8]; // slotIndex as used in VkVideoReferenceSlotKHR structures representing
+ //pReferenceSlots in VkVideoDecodeInfoKHR, 0xff for invalid slotIndex
+ deUint8 RefPicSetStCurrAfter[8]; // slotIndex as used in VkVideoReferenceSlotKHR structures representing
+ //pReferenceSlots in VkVideoDecodeInfoKHR, 0xff for invalid slotIndex
+ deUint8 RefPicSetLtCurr[8]; // slotIndex as used in VkVideoReferenceSlotKHR structures representing
+ //pReferenceSlots in VkVideoDecodeInfoKHR, 0xff for invalid slotIndex
+ StdVideoDecodeH265PictureInfoFlags flags;
+} StdVideoDecodeH265PictureInfo;
+
+typedef struct StdVideoDecodeH265ReferenceInfoFlags {
+ deUint32 is_long_term : 1;
+ deUint32 is_non_existing : 1;
+} StdVideoDecodeH265ReferenceInfoFlags;
+
+typedef struct StdVideoDecodeH265ReferenceInfo {
+ deInt32 PicOrderCntVal;
+ StdVideoDecodeH265ReferenceInfoFlags flags;
+} StdVideoDecodeH265ReferenceInfo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H265STD_DECODE_H_
#ifndef VULKAN_CORE_H_
#define VULKAN_CORE_H_ 1
@@ -28,35 +929,71 @@
#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
-#if !defined(VK_DEFINE_NON_DISPATCHABLE_HANDLE)
-#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
- #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
-#else
- #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef deUint64 object;
-#endif
+#ifndef VK_USE_64_BIT_PTR_DEFINES
+ #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
+ #define VK_USE_64_BIT_PTR_DEFINES 1
+ #else
+ #define VK_USE_64_BIT_PTR_DEFINES 0
+ #endif
#endif
+
+#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE
+ #if (VK_USE_64_BIT_PTR_DEFINES==1)
+ #if __cplusplus >= 201103L || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))
+ #define VK_NULL_HANDLE nullptr
+ #else
+ #define VK_NULL_HANDLE ((void*)0)
+ #endif
+ #else
+ #define VK_NULL_HANDLE 0ULL
+ #endif
+#endif
+#ifndef VK_NULL_HANDLE
+ #define VK_NULL_HANDLE 0
+#endif
+
+
+#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE
+ #if (VK_USE_64_BIT_PTR_DEFINES==1)
+ #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
+ #else
+ #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef deUint64 object;
+ #endif
+#endif
+
+// DEPRECATED: This define is deprecated. VK_MAKE_API_VERSION should be used instead.
#define VK_MAKE_VERSION(major, minor, patch) \
((((deUint32)(major)) << 22) | (((deUint32)(minor)) << 12) | ((deUint32)(patch)))
// DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead.
//#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 0) // Patch version should always be set to 0
+#define VK_MAKE_API_VERSION(variant, major, minor, patch) \
+ ((((deUint32)(variant)) << 29) | (((deUint32)(major)) << 22) | (((deUint32)(minor)) << 12) | ((deUint32)(patch)))
+
// Vulkan 1.0 version number
-#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)// Patch version should always be set to 0
+#define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0
// Version of this file
-#define VK_HEADER_VERSION 170
+#define VK_HEADER_VERSION 176
// Complete version of this file
-#define VK_HEADER_VERSION_COMPLETE VK_MAKE_VERSION(1, 2, VK_HEADER_VERSION)
+#define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 2, VK_HEADER_VERSION)
+// DEPRECATED: This define is deprecated. VK_API_VERSION_MAJOR should be used instead.
#define VK_VERSION_MAJOR(version) ((deUint32)(version) >> 22)
-#define VK_VERSION_MINOR(version) (((deUint32)(version) >> 12) & 0x3ff)
-#define VK_VERSION_PATCH(version) ((deUint32)(version) & 0xfff)
-#define VK_NULL_HANDLE 0
+// DEPRECATED: This define is deprecated. VK_API_VERSION_MINOR should be used instead.
+#define VK_VERSION_MINOR(version) (((deUint32)(version) >> 12) & 0x3FFU)
+// DEPRECATED: This define is deprecated. VK_API_VERSION_PATCH should be used instead.
+#define VK_VERSION_PATCH(version) ((deUint32)(version) & 0xFFFU)
+
+#define VK_API_VERSION_VARIANT(version) ((deUint32)(version) >> 29)
+#define VK_API_VERSION_MAJOR(version) (((deUint32)(version) >> 22) & 0x7FU)
+#define VK_API_VERSION_MINOR(version) (((deUint32)(version) >> 12) & 0x3FFU)
+#define VK_API_VERSION_PATCH(version) ((deUint32)(version) & 0xFFFU)
typedef deUint32 VkBool32;
typedef deUint64 VkDeviceAddress;
typedef deUint64 VkDeviceSize;
@@ -88,20 +1025,20 @@
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool)
#define VK_ATTACHMENT_UNUSED (~0U)
-#define VK_FALSE 0
-#define VK_LOD_CLAMP_NONE 1000.0f
+#define VK_FALSE 0U
+#define VK_LOD_CLAMP_NONE 1000.0F
#define VK_QUEUE_FAMILY_IGNORED (~0U)
#define VK_REMAINING_ARRAY_LAYERS (~0U)
#define VK_REMAINING_MIP_LEVELS (~0U)
#define VK_SUBPASS_EXTERNAL (~0U)
-#define VK_TRUE 1
+#define VK_TRUE 1U
#define VK_WHOLE_SIZE (~0ULL)
-#define VK_MAX_MEMORY_TYPES 32
-#define VK_MAX_MEMORY_HEAPS 16
-#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256
-#define VK_UUID_SIZE 16
-#define VK_MAX_EXTENSION_NAME_SIZE 256
-#define VK_MAX_DESCRIPTION_SIZE 256
+#define VK_MAX_MEMORY_TYPES 32U
+#define VK_MAX_MEMORY_HEAPS 16U
+#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256U
+#define VK_UUID_SIZE 16U
+#define VK_MAX_EXTENSION_NAME_SIZE 256U
+#define VK_MAX_DESCRIPTION_SIZE 256U
typedef enum VkResult {
VK_SUCCESS = 0,
@@ -337,6 +1274,63 @@
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000,
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001,
VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR = 1000023000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR = 1000023002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR = 1000023003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR = 1000023004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR = 1000023008,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR = 1000023009,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR = 1000023011,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR = 1000023012,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR = 1000023013,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR = 1000299000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR = 1000299001,
+#endif
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002,
@@ -345,6 +1339,57 @@
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002,
VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000,
VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT = 1000038000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT = 1000038001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000038002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000038003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT = 1000038004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT = 1000038005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT = 1000038006,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT = 1000038007,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT = 1000038008,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT = 1000040001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT = 1000040003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT = 1000040004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040006,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040007,
+#endif
VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,
VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000,
@@ -471,8 +1516,12 @@
VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158005,
VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000,
VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR = 1000163000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR = 1000163001,
+#endif
VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV = 1000164000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV = 1000164001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV = 1000164002,
@@ -500,6 +1549,27 @@
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT = 1000187001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT = 1000187004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187006,
+#endif
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
@@ -584,6 +1654,8 @@
VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV = 1000277005,
VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000,
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = 1000281001,
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000,
@@ -617,6 +1689,7 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001,
VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV = 1000326002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001,
VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000,
@@ -637,6 +1710,18 @@
VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = 1000351000,
VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = 1000351002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000,
+ VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001,
+ VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002,
+ VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000,
+ VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001,
+ VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002,
+ VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365000,
+ VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000,
+ VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000,
+ VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,
VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
@@ -771,6 +1856,24 @@
VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002,
VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002,
+#endif
VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = 1000164003,
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
@@ -820,6 +1923,12 @@
VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000,
VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001,
VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001,
+#endif
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000,
VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,
@@ -1104,6 +2213,10 @@
VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = 1000066011,
VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = 1000066012,
VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = 1000066013,
+ VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT = 1000330000,
+ VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT = 1000330001,
+ VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT = 1000330002,
+ VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT = 1000330003,
VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = 1000340000,
VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = 1000340001,
VK_FORMAT_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM,
@@ -1170,6 +2283,12 @@
VK_QUERY_TYPE_OCCLUSION = 0,
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
VK_QUERY_TYPE_TIMESTAMP = 2,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR = 1000299000,
+#endif
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000,
@@ -1328,6 +2447,13 @@
VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT = 1000267009,
VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT = 1000267010,
VK_DYNAMIC_STATE_STENCIL_OP_EXT = 1000267011,
+ VK_DYNAMIC_STATE_VERTEX_INPUT_EXT = 1000352000,
+ VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT = 1000377000,
+ VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT = 1000377001,
+ VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT = 1000377002,
+ VK_DYNAMIC_STATE_LOGIC_OP_EXT = 1000377003,
+ VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT = 1000377004,
+ VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT = 1000381000,
VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF
} VkDynamicState;
@@ -1577,6 +2703,18 @@
VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR = 0x08000000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000,
+#endif
VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000,
VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,
VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000,
@@ -1642,6 +2780,24 @@
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000,
+#endif
VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = 0x00000100,
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV,
@@ -1677,6 +2833,12 @@
VK_QUEUE_TRANSFER_BIT = 0x00000004,
VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,
VK_QUEUE_PROTECTED_BIT = 0x00000010,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040,
+#endif
VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkQueueFlagBits;
typedef VkFlags VkQueueFlags;
@@ -1773,6 +2935,9 @@
VK_QUERY_RESULT_WAIT_BIT = 0x00000002,
VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004,
VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0x00000010,
+#endif
VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkQueryResultFlagBits;
typedef VkFlags VkQueryResultFlags;
@@ -1800,6 +2965,18 @@
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000,
+#endif
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
@@ -4082,13 +5259,13 @@
#define VK_VERSION_1_1 1
// Vulkan 1.1 version number
-#define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)// Patch version should always be set to 0
+#define VK_API_VERSION_1_1 VK_MAKE_API_VERSION(0, 1, 1, 0)// Patch version should always be set to 0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorUpdateTemplate)
-#define VK_MAX_DEVICE_GROUP_SIZE 32
-#define VK_LUID_SIZE 8
-#define VK_QUEUE_FAMILY_EXTERNAL (~0U-1)
+#define VK_MAX_DEVICE_GROUP_SIZE 32U
+#define VK_LUID_SIZE 8U
+#define VK_QUEUE_FAMILY_EXTERNAL (~1U)
typedef enum VkPointClippingBehavior {
VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES = 0,
@@ -4195,6 +5372,7 @@
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000400,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100,
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA = 0x00000800,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
@@ -4259,6 +5437,7 @@
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT = 0x00000008,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000010,
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA = 0x00000080,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,
@@ -4944,10 +6123,10 @@
#define VK_VERSION_1_2 1
// Vulkan 1.2 version number
-#define VK_API_VERSION_1_2 VK_MAKE_VERSION(1, 2, 0)// Patch version should always be set to 0
+#define VK_API_VERSION_1_2 VK_MAKE_API_VERSION(0, 1, 2, 0)// Patch version should always be set to 0
-#define VK_MAX_DRIVER_NAME_SIZE 256
-#define VK_MAX_DRIVER_INFO_SIZE 256
+#define VK_MAX_DRIVER_NAME_SIZE 256U
+#define VK_MAX_DRIVER_INFO_SIZE 256U
typedef enum VkDriverId {
VK_DRIVER_ID_AMD_PROPRIETARY = 1,
@@ -4964,6 +6143,7 @@
VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,
VK_DRIVER_ID_MESA_LLVMPIPE = 13,
VK_DRIVER_ID_MOLTENVK = 14,
+ VK_DRIVER_ID_COREAVI_PROPRIETARY = 15,
VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY,
VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE,
VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV,
@@ -6480,7 +7660,7 @@
#define VK_KHR_incremental_present 1
-#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 1
+#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 2
#define VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME "VK_KHR_incremental_present"
typedef struct VkRectLayerKHR {
VkOffset2D offset;
@@ -7549,84 +8729,106 @@
#define VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME "VK_KHR_synchronization2"
typedef VkFlags64 VkPipelineStageFlags2KHR;
-// Flag bits for VkPipelineStageFlags2KHR
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_NONE_KHR = 0;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000;
+// Flag bits for VkPipelineStageFlagBits2KHR
+typedef VkFlags64 VkPipelineStageFlagBits2KHR;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_NONE_KHR = 0ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL;
+#endif
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_FLAG_BITS_2KHR_MAX_ENUM_KHR = 0x7FFFFFFFFFFFFFFFULL;
typedef VkFlags64 VkAccessFlags2KHR;
-// Flag bits for VkAccessFlags2KHR
-static const VkAccessFlags2KHR VK_ACCESS_2_NONE_KHR = 0;
-static const VkAccessFlags2KHR VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001;
-static const VkAccessFlags2KHR VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002;
-static const VkAccessFlags2KHR VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004;
-static const VkAccessFlags2KHR VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008;
-static const VkAccessFlags2KHR VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100;
-static const VkAccessFlags2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200;
-static const VkAccessFlags2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000;
-static const VkAccessFlags2KHR VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000;
-static const VkAccessFlags2KHR VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000;
-static const VkAccessFlags2KHR VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000;
-static const VkAccessFlags2KHR VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000;
-static const VkAccessFlags2KHR VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000;
-static const VkAccessFlags2KHR VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000;
+// Flag bits for VkAccessFlagBits2KHR
+typedef VkFlags64 VkAccessFlagBits2KHR;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_NONE_KHR = 0ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0x4000000000ULL;
+#endif
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_FLAG_BITS_2KHR_MAX_ENUM_KHR = 0x7FFFFFFFFFFFFFFFULL;
typedef enum VkSubmitFlagBitsKHR {
@@ -7959,9 +9161,10 @@
const VkResolveImageInfo2KHR* pResolveImageInfo);
#endif
+
#define VK_EXT_debug_report 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)
-#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9
+#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 10
#define VK_EXT_DEBUG_REPORT_EXTENSION_NAME "VK_EXT_debug_report"
typedef enum VkDebugReportObjectTypeEXT {
@@ -8972,7 +10175,7 @@
#define VK_EXT_queue_family_foreign 1
#define VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION 1
#define VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME "VK_EXT_queue_family_foreign"
-#define VK_QUEUE_FAMILY_FOREIGN_EXT (~0U-2)
+#define VK_QUEUE_FAMILY_FOREIGN_EXT (~2U)
#define VK_EXT_debug_utils 1
@@ -10085,7 +11288,7 @@
#define VK_EXT_calibrated_timestamps 1
-#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 1
+#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 2
#define VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME "VK_EXT_calibrated_timestamps"
typedef enum VkTimeDomainEXT {
@@ -11350,6 +12553,25 @@
#endif
+#define VK_NV_inherited_viewport_scissor 1
+#define VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION 1
+#define VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME "VK_NV_inherited_viewport_scissor"
+typedef struct VkPhysicalDeviceInheritedViewportScissorFeaturesNV {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 inheritedViewportScissor2D;
+} VkPhysicalDeviceInheritedViewportScissorFeaturesNV;
+
+typedef struct VkCommandBufferInheritanceViewportScissorInfoNV {
+ VkStructureType sType;
+ const void* pNext;
+ VkBool32 viewportScissor2D;
+ deUint32 viewportDepthCount;
+ const VkViewport* pViewportDepths;
+} VkCommandBufferInheritanceViewportScissorInfoNV;
+
+
+
#define VK_EXT_texel_buffer_alignment 1
#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION 1
#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME "VK_EXT_texel_buffer_alignment"
@@ -11371,7 +12593,7 @@
#define VK_QCOM_render_pass_transform 1
-#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 1
+#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 2
#define VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME "VK_QCOM_render_pass_transform"
typedef struct VkRenderPassTransformBeginInfoQCOM {
VkStructureType sType;
@@ -11641,6 +12863,17 @@
#endif
+#define VK_EXT_ycbcr_2plane_444_formats 1
+#define VK_EXT_YCBCR_2PLANE_444_FORMATS_SPEC_VERSION 1
+#define VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME "VK_EXT_ycbcr_2plane_444_formats"
+typedef struct VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 ycbcr2plane444Formats;
+} VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;
+
+
+
#define VK_EXT_fragment_density_map2 1
#define VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION 1
#define VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME "VK_EXT_fragment_density_map2"
@@ -11662,7 +12895,7 @@
#define VK_QCOM_rotated_copy_commands 1
-#define VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION 0
+#define VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION 1
#define VK_QCOM_ROTATED_COPY_COMMANDS_EXTENSION_NAME "VK_QCOM_rotated_copy_commands"
typedef struct VkCopyCommandTransformInfoQCOM {
VkStructureType sType;
@@ -11736,6 +12969,111 @@
+#define VK_EXT_vertex_input_dynamic_state 1
+#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION 2
+#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME "VK_EXT_vertex_input_dynamic_state"
+typedef struct VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 vertexInputDynamicState;
+} VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT;
+
+typedef struct VkVertexInputBindingDescription2EXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 binding;
+ deUint32 stride;
+ VkVertexInputRate inputRate;
+ deUint32 divisor;
+} VkVertexInputBindingDescription2EXT;
+
+typedef struct VkVertexInputAttributeDescription2EXT {
+ VkStructureType sType;
+ void* pNext;
+ deUint32 location;
+ deUint32 binding;
+ VkFormat format;
+ deUint32 offset;
+} VkVertexInputAttributeDescription2EXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetVertexInputEXT)(VkCommandBuffer commandBuffer, deUint32 vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, deUint32 vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetVertexInputEXT(
+ VkCommandBuffer commandBuffer,
+ deUint32 vertexBindingDescriptionCount,
+ const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,
+ deUint32 vertexAttributeDescriptionCount,
+ const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);
+#endif
+
+
+#define VK_EXT_extended_dynamic_state2 1
+#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION 1
+#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME "VK_EXT_extended_dynamic_state2"
+typedef struct VkPhysicalDeviceExtendedDynamicState2FeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 extendedDynamicState2;
+ VkBool32 extendedDynamicState2LogicOp;
+ VkBool32 extendedDynamicState2PatchControlPoints;
+} VkPhysicalDeviceExtendedDynamicState2FeaturesEXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetPatchControlPointsEXT)(VkCommandBuffer commandBuffer, deUint32 patchControlPoints);
+typedef void (VKAPI_PTR *PFN_vkCmdSetRasterizerDiscardEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable);
+typedef void (VKAPI_PTR *PFN_vkCmdSetDepthBiasEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable);
+typedef void (VKAPI_PTR *PFN_vkCmdSetLogicOpEXT)(VkCommandBuffer commandBuffer, VkLogicOp logicOp);
+typedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveRestartEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetPatchControlPointsEXT(
+ VkCommandBuffer commandBuffer,
+ deUint32 patchControlPoints);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizerDiscardEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 rasterizerDiscardEnable);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBiasEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBiasEnable);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetLogicOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkLogicOp logicOp);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 primitiveRestartEnable);
+#endif
+
+
+#define VK_EXT_color_write_enable 1
+#define VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION 1
+#define VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME "VK_EXT_color_write_enable"
+typedef struct VkPhysicalDeviceColorWriteEnableFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 colorWriteEnable;
+} VkPhysicalDeviceColorWriteEnableFeaturesEXT;
+
+typedef struct VkPipelineColorWriteCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ deUint32 attachmentCount;
+ const VkBool32* pColorWriteEnables;
+} VkPipelineColorWriteCreateInfoEXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetColorWriteEnableEXT)(VkCommandBuffer commandBuffer, deUint32 attachmentCount, const VkBool32* pColorWriteEnables);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetColorWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ deUint32 attachmentCount,
+ const VkBool32* pColorWriteEnables);
+#endif
+
+
#define VK_KHR_acceleration_structure 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR)
#define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 11
diff --git a/external/vulkancts/framework/vulkan/vkWsiUtil.cpp b/external/vulkancts/framework/vulkan/vkWsiUtil.cpp
index 097af2d..0f3b966 100644
--- a/external/vulkancts/framework/vulkan/vkWsiUtil.cpp
+++ b/external/vulkancts/framework/vulkan/vkWsiUtil.cpp
@@ -71,6 +71,7 @@
"android",
"win32",
"macos",
+ "headless"
};
return de::getSizedArrayElement<TYPE_LAST>(s_names, wsiType);
}
@@ -84,7 +85,8 @@
"VK_KHR_wayland_surface",
"VK_KHR_android_surface",
"VK_KHR_win32_surface",
- "VK_MVK_macos_surface"
+ "VK_MVK_macos_surface",
+ "VK_EXT_headless_surface"
};
return de::getSizedArrayElement<TYPE_LAST>(s_extNames, wsiType);
}
@@ -143,6 +145,13 @@
noDisplayLimit,
noWindowLimit,
},
+ // VK_EXT_headless_surface
+ {
+ 0u,
+ PlatformProperties::SWAPCHAIN_EXTENT_SETS_WINDOW_SIZE,
+ noDisplayLimit,
+ noWindowLimit,
+ },
};
return de::getSizedArrayElement<TYPE_LAST>(s_properties, wsiType);
@@ -157,7 +166,7 @@
VkSurfaceKHR* pSurface)
{
// Update this function if you add more WSI implementations
- DE_STATIC_ASSERT(TYPE_LAST == 6);
+ DE_STATIC_ASSERT(TYPE_LAST == 7);
switch (wsiType)
{
@@ -253,6 +262,18 @@
return vki.createMacOSSurfaceMVK(instance, &createInfo, pAllocator, pSurface);
}
+ case TYPE_HEADLESS:
+ {
+ const VkHeadlessSurfaceCreateInfoEXT createInfo =
+ {
+ VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT,
+ DE_NULL,
+ (VkHeadlessSurfaceCreateFlagsEXT)0
+ };
+
+ return vki.createHeadlessSurfaceEXT(instance, &createInfo, pAllocator, pSurface);
+ }
+
default:
DE_FATAL("Unknown WSI type");
return VK_ERROR_SURFACE_LOST_KHR;
@@ -321,6 +342,7 @@
{
return vki.getPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
}
+ case TYPE_HEADLESS:
case TYPE_ANDROID:
case TYPE_MACOS:
{
diff --git a/external/vulkancts/framework/vulkan/vkYCbCrImageWithMemory.cpp b/external/vulkancts/framework/vulkan/vkYCbCrImageWithMemory.cpp
index a9f50a2..007c838 100644
--- a/external/vulkancts/framework/vulkan/vkYCbCrImageWithMemory.cpp
+++ b/external/vulkancts/framework/vulkan/vkYCbCrImageWithMemory.cpp
@@ -38,7 +38,7 @@
const vk::MemoryRequirement requirement)
: m_image (createImage(vk, device, &imageCreateInfo))
{
- if ((imageCreateInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT_KHR) != 0)
+ if ((imageCreateInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0)
{
const deUint32 numPlanes = getPlaneCount(imageCreateInfo.format);
diff --git a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp
index f4eb914..233bb63 100644
--- a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp
+++ b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.cpp
@@ -185,6 +185,13 @@
TCU_THROW(NotSupportedError, "Buffer format doesn't support required feature flags");
}
}
+
+ if (m_name == "triangle_fan" &&
+ ctx.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !ctx.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
}
class Delegate : public amber::Delegate
@@ -294,6 +301,19 @@
{
const amber::ShaderInfo& shader = shaders[i];
+ vk::SpirvVersion spirvVersion = vk::SPIRV_VERSION_1_0;
+ DE_STATIC_ASSERT(vk::SPIRV_VERSION_LAST == vk::SPIRV_VERSION_1_5 + 1);
+ if (shader.target_env == "spv1.5")
+ spirvVersion = vk::SPIRV_VERSION_1_5;
+ else if (shader.target_env == "spv1.4")
+ spirvVersion = vk::SPIRV_VERSION_1_4;
+ else if (shader.target_env == "spv1.3")
+ spirvVersion = vk::SPIRV_VERSION_1_3;
+ else if (shader.target_env == "spv1.2")
+ spirvVersion = vk::SPIRV_VERSION_1_2;
+ else if (shader.target_env == "spv1.1")
+ spirvVersion = vk::SPIRV_VERSION_1_1;
+
/* Hex encoded shaders do not need to be pre-compiled */
if (shader.format == amber::kShaderFormatSpirvHex)
continue;
@@ -309,32 +329,32 @@
case amber::kShaderTypeCompute:
programCollection.glslSources.add(shader.shader_name)
<< glu::ComputeSource(shader.shader_source)
- << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_0, 0u);
+ << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, spirvVersion, 0u);
break;
case amber::kShaderTypeGeometry:
programCollection.glslSources.add(shader.shader_name)
<< glu::GeometrySource(shader.shader_source)
- << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_0, 0u);
+ << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, spirvVersion, 0u);
break;
case amber::kShaderTypeFragment:
programCollection.glslSources.add(shader.shader_name)
<< glu::FragmentSource(shader.shader_source)
- << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_0, 0u);
+ << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, spirvVersion, 0u);
break;
case amber::kShaderTypeVertex:
programCollection.glslSources.add(shader.shader_name)
<< glu::VertexSource(shader.shader_source)
- << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_0, 0u);
+ << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, spirvVersion, 0u);
break;
case amber::kShaderTypeTessellationControl:
programCollection.glslSources.add(shader.shader_name)
<< glu::TessellationControlSource(shader.shader_source)
- << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_0, 0u);
+ << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, spirvVersion, 0u);
break;
case amber::kShaderTypeTessellationEvaluation:
programCollection.glslSources.add(shader.shader_name)
<< glu::TessellationEvaluationSource(shader.shader_source)
- << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_0, 0u);
+ << vk::ShaderBuildOptions(programCollection.usedVulkanVersion, spirvVersion, 0u);
break;
case amber::kShaderTypeMulti:
DE_ASSERT(false && "Multi shaders not supported");
diff --git a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp
index ef8bd02..55d7a88 100644
--- a/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp
+++ b/external/vulkancts/modules/vulkan/amber/vktAmberTestCase.hpp
@@ -69,7 +69,7 @@
virtual ~AmberTestCase (void);
- virtual TestInstance* createInstance (Context& ctx) const;
+ TestInstance* createInstance (Context& ctx) const override;
// Check that the Vulkan implementation supports this test.
// We have the principle that client code in dEQP should independently
@@ -79,13 +79,13 @@
// - Otherwise, we do a secondary sanity check depending on code inside
// Amber itself: if the Amber test says it is not supported, then
// throw an internal error exception.
- virtual void checkSupport (Context& ctx) const; // override
+ void checkSupport (Context& ctx) const override;
// If the test case uses SPIR-V Assembly, use these build options.
// Otherwise, defaults to target Vulkan 1.0, SPIR-V 1.0.
void setSpirVAsmBuildOptions(const vk::SpirVAsmBuildOptions& asm_options);
- virtual void delayedInit (void);
- virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ void delayedInit (void) override;
+ void initPrograms (vk::SourceCollections& programCollection) const override;
// Add a required instance extension, device extension, or feature bit.
// A feature bit is represented by a string of form "<structure>.<feature>", where
@@ -97,6 +97,8 @@
void addImageRequirement(vk::VkImageCreateInfo info);
void addBufferRequirement(BufferRequirement req);
+ tcu::TestRunnerType getRunnerType (void) const override { return tcu::RUNNERTYPE_AMBER; }
+
private:
bool parse (const std::string& readFilename);
diff --git a/external/vulkancts/modules/vulkan/api/vktApiBufferMarkerTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiBufferMarkerTests.cpp
index 69d6466..7ffd2fa 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiBufferMarkerTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiBufferMarkerTests.cpp
@@ -27,6 +27,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
#include "vktExternalMemoryUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkPlatform.hpp"
#include "vkCmdUtil.hpp"
#include "vkObjUtil.hpp"
@@ -34,6 +35,7 @@
#include "vkQueryUtil.hpp"
#include "vkRefUtil.hpp"
#include "vkBuilderUtil.hpp"
+#include "tcuCommandLine.hpp"
#include "deUniquePtr.hpp"
#include "deSharedPtr.hpp"
#include "deRandom.hpp"
@@ -106,6 +108,7 @@
const VkInstance instance = context.getInstance();
const InstanceInterface& instanceDriver = context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const auto useValidation = context.getTestContext().getCommandLine().isValidationEnabled();
// Create a device with extension enabled and a queue with a family which supports the buffer marker extension
const std::vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(instanceDriver, physicalDevice);
@@ -154,7 +157,7 @@
&context.getDeviceFeatures(), // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- wd.logicalDevice = createDevice(vkp, instance, instanceDriver, physicalDevice, &deviceInfo);
+ wd.logicalDevice = createCustomDevice(useValidation, vkp, instance, instanceDriver, physicalDevice, &deviceInfo);
wd.deviceDriver = MovePtr<DeviceDriver>(new DeviceDriver(vkp, instance, *wd.logicalDevice));
wd.allocator = MovePtr<Allocator>(new SimpleAllocator(*wd.deviceDriver, *wd.logicalDevice, getPhysicalDeviceMemoryProperties(instanceDriver, physicalDevice)));
wd.queueFamilyIdx = queueCreateInfo.queueFamilyIndex;
diff --git a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
index afc76b1..c0dc424 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiCommandBuffersTests.cpp
@@ -36,12 +36,16 @@
#include "vkTypeUtil.hpp"
#include "vkAllocationCallbackUtil.hpp"
#include "vkCmdUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
#include "vktApiCommandBuffersTests.hpp"
#include "vktApiBufferComputeInstance.hpp"
#include "vktApiComputeInstanceResultBuffer.hpp"
#include "deSharedPtr.hpp"
#include "deRandom.hpp"
#include <sstream>
+#include <limits>
namespace vkt
{
@@ -4139,12 +4143,612 @@
programCollection.glslSources.add("compute_increment") << glu::ComputeSource(bufIncrement.str());
}
-void genComputeIncrementSourceBadInheritance (SourceCollections& programCollection, BadInheritanceInfoCase testCase)
+void genComputeIncrementSourceBadInheritance(SourceCollections& programCollection, BadInheritanceInfoCase testCase)
{
DE_UNREF(testCase);
return genComputeIncrementSource(programCollection);
}
+void checkEventSupport (Context& context)
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
+}
+
+void checkEventSupport (Context& context, const VkCommandBufferLevel)
+{
+ checkEventSupport(context);
+}
+
+struct ManyDrawsParams
+{
+ VkCommandBufferLevel level;
+ VkExtent3D imageExtent;
+ deUint32 seed;
+
+ ManyDrawsParams(VkCommandBufferLevel level_, const VkExtent3D& extent_, deUint32 seed_)
+ : level (level_)
+ , imageExtent (extent_)
+ , seed (seed_)
+ {}
+};
+
+struct ManyDrawsVertex
+{
+ using Color = tcu::Vector<deUint8, 4>;
+
+ tcu::Vec2 coords;
+ Color color;
+
+ ManyDrawsVertex (const tcu::Vec2& coords_, const Color& color_) : coords(coords_), color(color_) {}
+};
+
+VkFormat getSupportedDepthStencilFormat (const InstanceInterface& vki, VkPhysicalDevice physDev)
+{
+ const VkFormat formatList[] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT };
+ const VkFormatFeatureFlags requirements = (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
+
+ for (int i = 0; i < DE_LENGTH_OF_ARRAY(formatList); ++i)
+ {
+ const auto properties = getPhysicalDeviceFormatProperties(vki, physDev, formatList[i]);
+ if ((properties.optimalTilingFeatures & requirements) == requirements)
+ return formatList[i];
+ }
+
+ TCU_THROW(NotSupportedError, "No suitable depth/stencil format support");
+ return VK_FORMAT_UNDEFINED;
+}
+
+class ManyDrawsCase : public TestCase
+{
+public:
+ ManyDrawsCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const ManyDrawsParams& params);
+ virtual ~ManyDrawsCase (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+ static VkFormat getColorFormat (void) { return VK_FORMAT_R8G8B8A8_UINT; }
+
+protected:
+ ManyDrawsParams m_params;
+};
+
+class ManyDrawsInstance : public TestInstance
+{
+public:
+ ManyDrawsInstance (Context& context, const ManyDrawsParams& params);
+ virtual ~ManyDrawsInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ ManyDrawsParams m_params;
+};
+
+using BufferPtr = de::MovePtr<BufferWithMemory>;
+using ImagePtr = de::MovePtr<ImageWithMemory>;
+
+struct ManyDrawsVertexBuffers
+{
+ BufferPtr stagingBuffer;
+ BufferPtr vertexBuffer;
+};
+
+struct ManyDrawsAllocatedData
+{
+ ManyDrawsVertexBuffers frontBuffers;
+ ManyDrawsVertexBuffers backBuffers;
+ ImagePtr colorAttachment;
+ ImagePtr dsAttachment;
+ BufferPtr colorCheckBuffer;
+ BufferPtr stencilCheckBuffer;
+
+ static deUint32 calcNumPixels (const VkExtent3D& extent)
+ {
+ DE_ASSERT(extent.depth == 1u);
+ return (extent.width * extent.height);
+ }
+ static deUint32 calcNumVertices (const VkExtent3D& extent)
+ {
+ // One triangle (3 vertices) per output image pixel.
+ return (calcNumPixels(extent) * 3u);
+ }
+
+ static VkDeviceSize calcVertexBufferSize (const VkExtent3D& extent)
+ {
+ return calcNumVertices(extent) * sizeof(ManyDrawsVertex);
+ }
+
+ static void makeVertexBuffers (const DeviceInterface& vkd, VkDevice device, Allocator& alloc, VkDeviceSize size, ManyDrawsVertexBuffers& buffers)
+ {
+ const auto stagingBufferInfo = makeBufferCreateInfo(size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+ const auto vertexBufferInfo = makeBufferCreateInfo(size, (VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+
+ buffers.stagingBuffer = BufferPtr(new BufferWithMemory(vkd, device, alloc, stagingBufferInfo, MemoryRequirement::HostVisible));
+ buffers.vertexBuffer = BufferPtr(new BufferWithMemory(vkd, device, alloc, vertexBufferInfo, MemoryRequirement::Any));
+ }
+
+ ManyDrawsAllocatedData (const DeviceInterface &vkd, VkDevice device, Allocator &alloc, const VkExtent3D& imageExtent, VkFormat colorFormat, VkFormat dsFormat)
+ {
+ const auto numPixels = calcNumPixels(imageExtent);
+ const auto vertexBufferSize = calcVertexBufferSize(imageExtent);
+
+ makeVertexBuffers(vkd, device, alloc, vertexBufferSize, frontBuffers);
+ makeVertexBuffers(vkd, device, alloc, vertexBufferSize, backBuffers);
+
+ const auto colorUsage = (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ const auto dsUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+
+ const VkImageCreateInfo colorAttachmentInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ colorFormat, // VkFormat format;
+ imageExtent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ colorUsage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0u, // deUint32 queueFamilyIndexCount;
+ nullptr, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+ colorAttachment = ImagePtr(new ImageWithMemory(vkd, device, alloc, colorAttachmentInfo, MemoryRequirement::Any));
+
+ const VkImageCreateInfo dsAttachmentInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ dsFormat, // VkFormat format;
+ imageExtent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ dsUsage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0u, // deUint32 queueFamilyIndexCount;
+ nullptr, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+ dsAttachment = ImagePtr(new ImageWithMemory(vkd, device, alloc, dsAttachmentInfo, MemoryRequirement::Any));
+
+ const auto colorCheckBufferSize = static_cast<VkDeviceSize>(numPixels * tcu::getPixelSize(mapVkFormat(colorFormat)));
+ const auto colorCheckBufferInfo = makeBufferCreateInfo(colorCheckBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+
+ colorCheckBuffer = BufferPtr(new BufferWithMemory(vkd, device, alloc, colorCheckBufferInfo, MemoryRequirement::HostVisible));
+
+ const auto stencilFormat = tcu::TextureFormat(tcu::TextureFormat::S, tcu::TextureFormat::UNSIGNED_INT8);
+ const auto stencilCheckBufferSize = static_cast<VkDeviceSize>(numPixels * tcu::getPixelSize(stencilFormat));
+ const auto stencilCheckBufferInfo = makeBufferCreateInfo(stencilCheckBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+
+ stencilCheckBuffer = BufferPtr(new BufferWithMemory(vkd, device, alloc, stencilCheckBufferInfo, MemoryRequirement::HostVisible));
+ }
+};
+
+ManyDrawsCase::ManyDrawsCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const ManyDrawsParams& params)
+ : TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+void ManyDrawsCase::checkSupport (Context& context) const
+{
+ const auto& vki = context.getInstanceInterface();
+ const auto physDev = context.getPhysicalDevice();
+ const auto& vkd = context.getDeviceInterface();
+ const auto device = context.getDevice();
+ auto& alloc = context.getDefaultAllocator();
+ const auto dsFormat = getSupportedDepthStencilFormat(vki, physDev);
+
+ try
+ {
+ ManyDrawsAllocatedData allocatedData(vkd, device, alloc, m_params.imageExtent, getColorFormat(), dsFormat);
+ }
+ catch (const vk::Error& err)
+ {
+ const auto result = err.getError();
+ if (result == VK_ERROR_OUT_OF_HOST_MEMORY || result == VK_ERROR_OUT_OF_DEVICE_MEMORY)
+ TCU_THROW(NotSupportedError, "Not enough memory to run this test");
+ throw;
+ }
+}
+
+void ManyDrawsCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ std::ostringstream vert;
+ vert
+ << "#version 450\n"
+ << "\n"
+ << "layout(location=0) in vec2 inCoords;\n"
+ << "layout(location=1) in uvec4 inColor;\n"
+ << "\n"
+ << "layout(location=0) out flat uvec4 outColor;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " gl_Position = vec4(inCoords, 0.0, 1.0);\n"
+ << " outColor = inColor;\n"
+ << "}\n"
+ ;
+
+ std::ostringstream frag;
+ frag
+ << "#version 450\n"
+ << "\n"
+ << "layout(location=0) in flat uvec4 inColor;\n"
+ << "layout(location=0) out uvec4 outColor;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " outColor = inColor;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vert.str());
+ programCollection.glslSources.add("frag") << glu::FragmentSource(frag.str());
+}
+
+TestInstance* ManyDrawsCase::createInstance (Context& context) const
+{
+ return new ManyDrawsInstance(context, m_params);
+}
+
+ManyDrawsInstance::ManyDrawsInstance (Context& context, const ManyDrawsParams& params)
+ : TestInstance (context)
+ , m_params (params)
+{}
+
+void copyAndFlush (const DeviceInterface& vkd, VkDevice device, BufferWithMemory& buffer, const std::vector<ManyDrawsVertex>& vertices)
+{
+ auto& alloc = buffer.getAllocation();
+ void* hostPtr = alloc.getHostPtr();
+
+ deMemcpy(hostPtr, vertices.data(), de::dataSize(vertices));
+ flushAlloc(vkd, device, alloc);
+}
+
+tcu::TestStatus ManyDrawsInstance::iterate (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto physDev = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+
+ const auto colorFormat = ManyDrawsCase::getColorFormat();
+ const auto dsFormat = getSupportedDepthStencilFormat(vki, physDev);
+ const auto vertexBufferSize = ManyDrawsAllocatedData::calcVertexBufferSize(m_params.imageExtent);
+ const auto vertexBufferOffset = static_cast<VkDeviceSize>(0);
+ const auto numPixels = ManyDrawsAllocatedData::calcNumPixels(m_params.imageExtent);
+ const auto numVertices = ManyDrawsAllocatedData::calcNumVertices(m_params.imageExtent);
+ const auto alphaValue = std::numeric_limits<deUint8>::max();
+ const auto pixelWidth = 2.0f / static_cast<float>(m_params.imageExtent.width); // Normalized size.
+ const auto pixelWidthHalf = pixelWidth / 2.0f; // Normalized size.
+ const auto pixelHeight = 2.0f / static_cast<float>(m_params.imageExtent.height); // Normalized size.
+ const auto useSecondary = (m_params.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY);
+
+ // Allocate all needed data up front.
+ ManyDrawsAllocatedData testData(vkd, device, alloc, m_params.imageExtent, colorFormat, dsFormat);
+
+ // Generate random colors.
+ de::Random rnd(m_params.seed);
+ std::vector<ManyDrawsVertex::Color> colors;
+
+ colors.reserve(numPixels);
+ for (deUint32 i = 0; i < numPixels; ++i)
+ {
+#if 0
+ const deUint8 red = ((i ) & 0xFFu);
+ const deUint8 green = ((i >> 8) & 0xFFu);
+ const deUint8 blue = ((i >> 16) & 0xFFu);
+ colors.push_back(ManyDrawsVertex::Color(red, green, blue, alphaValue));
+#else
+ colors.push_back(ManyDrawsVertex::Color(rnd.getUint8(), rnd.getUint8(), rnd.getUint8(), alphaValue));
+#endif
+ }
+
+ // Fill vertex data. One triangle per pixel, front and back.
+ std::vector<ManyDrawsVertex> frontVector;
+ std::vector<ManyDrawsVertex> backVector;
+ frontVector.reserve(numVertices);
+ backVector.reserve(numVertices);
+
+ for (deUint32 y = 0; y < m_params.imageExtent.height; ++y)
+ for (deUint32 x = 0; x < m_params.imageExtent.width; ++x)
+ {
+ float x_left = static_cast<float>(x) * pixelWidth - 1.0f;
+ float x_mid = x_left + pixelWidthHalf;
+ float x_right = x_left + pixelWidth;
+ float y_top = static_cast<float>(y) * pixelHeight - 1.0f;
+ float y_bottom = y_top + pixelHeight;
+
+ // Triangles in the "back" mesh will have different colors.
+ const auto colorIdx = y * m_params.imageExtent.width + x;
+ const auto& frontColor = colors[colorIdx];
+ const auto& backColor = colors[colors.size() - 1u - colorIdx];
+
+ const tcu::Vec2 triangle[3u] =
+ {
+ tcu::Vec2(x_left, y_top),
+ tcu::Vec2(x_right, y_top),
+ tcu::Vec2(x_mid, y_bottom),
+ };
+
+ frontVector.emplace_back(triangle[0], frontColor);
+ frontVector.emplace_back(triangle[1], frontColor);
+ frontVector.emplace_back(triangle[2], frontColor);
+
+ backVector.emplace_back(triangle[0], backColor);
+ backVector.emplace_back(triangle[1], backColor);
+ backVector.emplace_back(triangle[2], backColor);
+ }
+
+ // Copy vertex data to staging buffers.
+ copyAndFlush(vkd, device, *testData.frontBuffers.stagingBuffer, frontVector);
+ copyAndFlush(vkd, device, *testData.backBuffers.stagingBuffer, backVector);
+
+ // Color attachment view.
+ const auto colorResourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ const auto colorAttachmentView = makeImageView(vkd, device, testData.colorAttachment->get(), VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorResourceRange);
+
+ // Depth/stencil attachment view.
+ const auto dsResourceRange = makeImageSubresourceRange((VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT), 0u, 1u, 0u, 1u);
+ const auto dsAttachmentView = makeImageView(vkd, device, testData.dsAttachment->get(), VK_IMAGE_VIEW_TYPE_2D, dsFormat, dsResourceRange);
+
+ const VkImageView attachmentArray[] = { colorAttachmentView.get(), dsAttachmentView.get() };
+ const auto numAttachments = static_cast<deUint32>(DE_LENGTH_OF_ARRAY(attachmentArray));
+
+ const auto renderPass = makeRenderPass(vkd, device, colorFormat, dsFormat);
+ const auto framebuffer = makeFramebuffer(vkd, device, renderPass.get(), numAttachments, attachmentArray, m_params.imageExtent.width, m_params.imageExtent.height);
+
+ const auto vertModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0u);
+ const auto fragModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0u);
+
+ const std::vector<VkViewport> viewports (1u, makeViewport(m_params.imageExtent));
+ const std::vector<VkRect2D> scissors (1u, makeRect2D(m_params.imageExtent));
+
+ const auto descriptorSetLayout = DescriptorSetLayoutBuilder().build(vkd, device);
+ const auto pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+
+ const VkVertexInputBindingDescription bindings[] =
+ {
+ makeVertexInputBindingDescription(0u, static_cast<deUint32>(sizeof(ManyDrawsVertex)), VK_VERTEX_INPUT_RATE_VERTEX),
+ };
+
+ const VkVertexInputAttributeDescription attributes[] =
+ {
+ makeVertexInputAttributeDescription(0u, 0u, VK_FORMAT_R32G32_SFLOAT, static_cast<deUint32>(offsetof(ManyDrawsVertex, coords))),
+ makeVertexInputAttributeDescription(1u, 0u, VK_FORMAT_R8G8B8A8_UINT, static_cast<deUint32>(offsetof(ManyDrawsVertex, color))),
+ };
+
+ const VkPipelineVertexInputStateCreateInfo inputState =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineVertexInputStateCreateFlags flags;
+ static_cast<deUint32>(DE_LENGTH_OF_ARRAY(bindings)), // deUint32 vertexBindingDescriptionCount;
+ bindings, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
+ static_cast<deUint32>(DE_LENGTH_OF_ARRAY(attributes)), // deUint32 vertexAttributeDescriptionCount;
+ attributes, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
+ };
+
+ // Stencil state: this is key for checking and obtaining the right results. The stencil buffer will be cleared to 0. The first
+ // set of draws ("front" set of triangles) will pass the test and increment the stencil value to 1. The second set of draws
+ // ("back" set of triangles, not really in the back because all of them have depth 0.0) will not pass the stencil test then, but
+ // still increment the stencil value to 2.
+ //
+ // At the end of the test, if every draw command was executed correctly in the expected order, the color buffer will have the
+ // colors of the front set, and the stencil buffer will be full of 2s.
+ const auto stencilOpState = makeStencilOpState(VK_STENCIL_OP_INCREMENT_AND_CLAMP, VK_STENCIL_OP_INCREMENT_AND_CLAMP, VK_STENCIL_OP_KEEP,
+ VK_COMPARE_OP_EQUAL, 0xFFu, 0xFFu, 0u);
+
+ const VkPipelineDepthStencilStateCreateInfo dsState =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType
+ nullptr, // const void* pNext
+ 0u, // VkPipelineDepthStencilStateCreateFlags flags
+ VK_FALSE, // VkBool32 depthTestEnable
+ VK_FALSE, // VkBool32 depthWriteEnable
+ VK_COMPARE_OP_NEVER, // VkCompareOp depthCompareOp
+ VK_FALSE, // VkBool32 depthBoundsTestEnable
+ VK_TRUE, // VkBool32 stencilTestEnable
+ stencilOpState, // VkStencilOpState front
+ stencilOpState, // VkStencilOpState back
+ 0.0f, // float minDepthBounds
+ 1.0f, // float maxDepthBounds
+ };
+
+ const auto pipeline = makeGraphicsPipeline(vkd, device, pipelineLayout.get(),
+ vertModule.get(), DE_NULL, DE_NULL, DE_NULL, fragModule.get(),
+ renderPass.get(), viewports, scissors, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0u, 0u,
+ &inputState, nullptr, nullptr, &dsState);
+
+ // Command pool and buffers.
+ using CmdBufferPtr = Move<VkCommandBuffer>;
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+
+ CmdBufferPtr primaryCmdBufferPtr;
+ CmdBufferPtr secondaryCmdBufferPtr;
+ VkCommandBuffer primaryCmdBuffer;
+ VkCommandBuffer secondaryCmdBuffer;
+ VkCommandBuffer drawsCmdBuffer;
+
+ primaryCmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ primaryCmdBuffer = primaryCmdBufferPtr.get();
+ drawsCmdBuffer = primaryCmdBuffer;
+ beginCommandBuffer(vkd, primaryCmdBuffer);
+
+ // Clear values.
+ std::vector<VkClearValue> clearValues(2u);
+ clearValues[0] = makeClearValueColorU32(0u, 0u, 0u, 0u);
+ clearValues[1] = makeClearValueDepthStencil(1.0f, 0u);
+
+ // Copy staging buffers to vertex buffers.
+ const auto copyRegion = makeBufferCopy(0ull, 0ull, vertexBufferSize);
+ vkd.cmdCopyBuffer(primaryCmdBuffer, testData.frontBuffers.stagingBuffer->get(), testData.frontBuffers.vertexBuffer->get(), 1u, ©Region);
+ vkd.cmdCopyBuffer(primaryCmdBuffer, testData.backBuffers.stagingBuffer->get(), testData.backBuffers.vertexBuffer->get(), 1u, ©Region);
+
+ // Use barrier for vertex reads.
+ const auto vertexBarier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT);
+ vkd.cmdPipelineBarrier(primaryCmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0u, 1u, &vertexBarier, 0u, nullptr, 0u, nullptr);
+
+ // Change depth/stencil attachment layout.
+ const auto dsBarrier = makeImageMemoryBarrier(0, (VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, testData.dsAttachment->get(), dsResourceRange);
+ vkd.cmdPipelineBarrier(primaryCmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT), 0u, 0u, nullptr, 0u, nullptr, 1u, &dsBarrier);
+
+ beginRenderPass(vkd, primaryCmdBuffer, renderPass.get(), framebuffer.get(),
+ scissors[0], static_cast<deUint32>(clearValues.size()), clearValues.data(),
+ (useSecondary ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE));
+
+ if (useSecondary)
+ {
+ secondaryCmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_SECONDARY);
+ secondaryCmdBuffer = secondaryCmdBufferPtr.get();
+ drawsCmdBuffer = secondaryCmdBuffer;
+
+ const VkCommandBufferInheritanceInfo inheritanceInfo =
+ {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ renderPass.get(), // VkRenderPass renderPass;
+ 0u, // deUint32 subpass;
+ framebuffer.get(), // VkFramebuffer framebuffer;
+ 0u, // VkBool32 occlusionQueryEnable;
+ 0u, // VkQueryControlFlags queryFlags;
+ 0u, // VkQueryPipelineStatisticFlags pipelineStatistics;
+ };
+
+ const VkCommandBufferUsageFlags usageFlags = (VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
+ const VkCommandBufferBeginInfo beginInfo =
+ {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+ nullptr,
+ usageFlags, // VkCommandBufferUsageFlags flags;
+ &inheritanceInfo, // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
+ };
+
+ VK_CHECK(vkd.beginCommandBuffer(secondaryCmdBuffer, &beginInfo));
+ }
+
+ // Bind pipeline.
+ vkd.cmdBindPipeline(drawsCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.get());
+
+ // Draw triangles in front.
+ vkd.cmdBindVertexBuffers(drawsCmdBuffer, 0u, 1u, &testData.frontBuffers.vertexBuffer->get(), &vertexBufferOffset);
+ for (deUint32 i = 0; i < numPixels; ++i)
+ vkd.cmdDraw(drawsCmdBuffer, 3u, 1u, i*3u, 0u);
+
+ // Draw triangles in the "back". This should have no effect due to the stencil test.
+ vkd.cmdBindVertexBuffers(drawsCmdBuffer, 0u, 1u, &testData.backBuffers.vertexBuffer->get(), &vertexBufferOffset);
+ for (deUint32 i = 0; i < numPixels; ++i)
+ vkd.cmdDraw(drawsCmdBuffer, 3u, 1u, i*3u, 0u);
+
+ if (useSecondary)
+ {
+ endCommandBuffer(vkd, secondaryCmdBuffer);
+ vkd.cmdExecuteCommands(primaryCmdBuffer, 1u, &secondaryCmdBuffer);
+ }
+
+ endRenderPass(vkd, primaryCmdBuffer);
+
+ // Copy color and depth/stencil attachments to verification buffers.
+ const auto colorAttachmentBarrier = makeImageMemoryBarrier(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, testData.colorAttachment->get(), colorResourceRange);
+ vkd.cmdPipelineBarrier(primaryCmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &colorAttachmentBarrier);
+
+ const auto colorResourceLayers = makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u);
+ const auto colorCopyRegion = makeBufferImageCopy(m_params.imageExtent, colorResourceLayers);
+ vkd.cmdCopyImageToBuffer(primaryCmdBuffer, testData.colorAttachment->get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, testData.colorCheckBuffer->get(), 1u, &colorCopyRegion);
+
+ const auto stencilAttachmentBarrier = makeImageMemoryBarrier(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, testData.dsAttachment->get(), dsResourceRange);
+ vkd.cmdPipelineBarrier(primaryCmdBuffer, (VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT), VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &stencilAttachmentBarrier);
+
+ const auto stencilResourceLayers = makeImageSubresourceLayers(VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 0u, 1u);
+ const auto stencilCopyRegion = makeBufferImageCopy(m_params.imageExtent, stencilResourceLayers);
+ vkd.cmdCopyImageToBuffer(primaryCmdBuffer, testData.dsAttachment->get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, testData.stencilCheckBuffer->get(), 1u, &stencilCopyRegion);
+
+ const auto verificationBuffersBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(primaryCmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &verificationBuffersBarrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, primaryCmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, primaryCmdBuffer);
+
+ // Check buffer contents.
+ auto& colorCheckBufferAlloc = testData.colorCheckBuffer->getAllocation();
+ void* colorCheckBufferData = colorCheckBufferAlloc.getHostPtr();
+ invalidateAlloc(vkd, device, colorCheckBufferAlloc);
+
+ auto& stencilCheckBufferAlloc = testData.stencilCheckBuffer->getAllocation();
+ void* stencilCheckBufferData = stencilCheckBufferAlloc.getHostPtr();
+ invalidateAlloc(vkd, device, stencilCheckBufferAlloc);
+
+ const auto iWidth = static_cast<int>(m_params.imageExtent.width);
+ const auto iHeight = static_cast<int>(m_params.imageExtent.height);
+ const auto colorTcuFormat = mapVkFormat(colorFormat);
+ const auto stencilTcuFormat = tcu::TextureFormat(tcu::TextureFormat::S, tcu::TextureFormat::UNSIGNED_INT8);
+
+ tcu::TextureLevel referenceLevel (colorTcuFormat, iWidth, iHeight);
+ tcu::PixelBufferAccess referenceAccess = referenceLevel.getAccess();
+ tcu::TextureLevel colorErrorLevel (mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM), iWidth, iHeight);
+ tcu::PixelBufferAccess colorErrorAccess = colorErrorLevel.getAccess();
+ tcu::TextureLevel stencilErrorLevel (mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM), iWidth, iHeight);
+ tcu::PixelBufferAccess stencilErrorAccess = stencilErrorLevel.getAccess();
+ tcu::ConstPixelBufferAccess colorAccess (colorTcuFormat, iWidth, iHeight, 1, colorCheckBufferData);
+ tcu::ConstPixelBufferAccess stencilAccess (stencilTcuFormat, iWidth, iHeight, 1, stencilCheckBufferData);
+ const tcu::Vec4 green (0.0f, 1.0f, 0.0f, 1.0f);
+ const tcu::Vec4 red (1.0f, 0.0f, 0.0f, 1.0f);
+ const int expectedStencil = 2;
+ bool colorFail = false;
+ bool stencilFail = false;
+
+ for (int y = 0; y < iHeight; ++y)
+ for (int x = 0; x < iWidth; ++x)
+ {
+ const tcu::UVec4 colorValue = colorAccess.getPixelUint(x, y);
+ const auto expectedPixel = colors[y * iWidth + x];
+ const tcu::UVec4 expectedValue (expectedPixel.x(), expectedPixel.y(), expectedPixel.z(), expectedPixel.w());
+ const bool colorMismatch = (colorValue != expectedValue);
+
+ const auto stencilValue = stencilAccess.getPixStencil(x, y);
+ const bool stencilMismatch = (stencilValue != expectedStencil);
+
+ referenceAccess.setPixel(expectedValue, x, y);
+ colorErrorAccess.setPixel((colorMismatch ? red : green), x, y);
+ stencilErrorAccess.setPixel((stencilMismatch ? red : green), x, y);
+
+ if (stencilMismatch)
+ stencilFail = true;
+
+ if (colorMismatch)
+ colorFail = true;
+ }
+
+ if (colorFail || stencilFail)
+ {
+ auto& log = m_context.getTestContext().getLog();
+ log
+ << tcu::TestLog::ImageSet("Result", "")
+ << tcu::TestLog::Image("ColorOutput", "", colorAccess)
+ << tcu::TestLog::Image("ColorReference", "", referenceAccess)
+ << tcu::TestLog::Image("ColorError", "", colorErrorAccess)
+ << tcu::TestLog::Image("StencilError", "", stencilErrorAccess)
+ << tcu::TestLog::EndImageSet
+ ;
+ TCU_FAIL("Mismatched output and reference color or stencil; please check test log --");
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
} // anonymous
tcu::TestCaseGroup* createCommandBuffersTests (tcu::TestContext& testCtx)
@@ -4158,30 +4762,40 @@
addFunctionCase (commandBuffersTests.get(), "pool_create_reset_bit", "", createPoolResetBitTest);
addFunctionCase (commandBuffersTests.get(), "pool_reset_release_res", "", resetPoolReleaseResourcesBitTest);
addFunctionCase (commandBuffersTests.get(), "pool_reset_no_flags_res", "", resetPoolNoFlagsTest);
- addFunctionCase (commandBuffersTests.get(), "pool_reset_reuse", "", resetPoolReuseTest);
+ addFunctionCase (commandBuffersTests.get(), "pool_reset_reuse", "", checkEventSupport, resetPoolReuseTest);
/* 19.2. Command Buffer Lifetime (5.2 in VK 1.0 Spec) */
addFunctionCase (commandBuffersTests.get(), "allocate_single_primary", "", allocatePrimaryBufferTest);
addFunctionCase (commandBuffersTests.get(), "allocate_many_primary", "", allocateManyPrimaryBuffersTest);
addFunctionCase (commandBuffersTests.get(), "allocate_single_secondary", "", allocateSecondaryBufferTest);
addFunctionCase (commandBuffersTests.get(), "allocate_many_secondary", "", allocateManySecondaryBuffersTest);
- addFunctionCase (commandBuffersTests.get(), "execute_small_primary", "", executePrimaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "execute_large_primary", "", executeLargePrimaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "reset_implicit", "", resetBufferImplicitlyTest);
- addFunctionCase (commandBuffersTests.get(), "trim_command_pool", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
- addFunctionCase (commandBuffersTests.get(), "trim_command_pool_secondary", "", trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
+ addFunctionCase (commandBuffersTests.get(), "execute_small_primary", "", checkEventSupport, executePrimaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "execute_large_primary", "", checkEventSupport, executeLargePrimaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "reset_implicit", "", checkEventSupport, resetBufferImplicitlyTest);
+ addFunctionCase (commandBuffersTests.get(), "trim_command_pool", "", checkEventSupport, trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ addFunctionCase (commandBuffersTests.get(), "trim_command_pool_secondary", "", checkEventSupport, trimCommandPoolTest, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
/* 19.3. Command Buffer Recording (5.3 in VK 1.0 Spec) */
- addFunctionCase (commandBuffersTests.get(), "record_single_primary", "", recordSinglePrimaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "record_many_primary", "", recordLargePrimaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "record_single_secondary", "", recordSingleSecondaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "record_many_secondary", "", recordLargeSecondaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "submit_twice_primary", "", submitPrimaryBufferTwiceTest);
- addFunctionCase (commandBuffersTests.get(), "submit_twice_secondary", "", submitSecondaryBufferTwiceTest);
- addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_primary", "", oneTimeSubmitFlagPrimaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_secondary", "", oneTimeSubmitFlagSecondaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "record_single_primary", "", checkEventSupport, recordSinglePrimaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "record_many_primary", "", checkEventSupport, recordLargePrimaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "record_single_secondary", "", checkEventSupport, recordSingleSecondaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "record_many_secondary", "", checkEventSupport, recordLargeSecondaryBufferTest);
+ {
+ deUint32 seed = 1614182419u;
+ const auto smallExtent = makeExtent3D(128u, 128u, 1u);
+ const auto largeExtent = makeExtent3D(512u, 512u, 1u);
+
+ commandBuffersTests->addChild(new ManyDrawsCase(testCtx, "record_many_draws_primary_1", "", ManyDrawsParams(VK_COMMAND_BUFFER_LEVEL_PRIMARY, smallExtent, seed++)));
+ commandBuffersTests->addChild(new ManyDrawsCase(testCtx, "record_many_draws_primary_2", "", ManyDrawsParams(VK_COMMAND_BUFFER_LEVEL_PRIMARY, largeExtent, seed++)));
+ commandBuffersTests->addChild(new ManyDrawsCase(testCtx, "record_many_draws_secondary_1", "", ManyDrawsParams(VK_COMMAND_BUFFER_LEVEL_SECONDARY, smallExtent, seed++)));
+ commandBuffersTests->addChild(new ManyDrawsCase(testCtx, "record_many_draws_secondary_2", "", ManyDrawsParams(VK_COMMAND_BUFFER_LEVEL_SECONDARY, largeExtent, seed++)));
+ }
+ addFunctionCase (commandBuffersTests.get(), "submit_twice_primary", "", checkEventSupport, submitPrimaryBufferTwiceTest);
+ addFunctionCase (commandBuffersTests.get(), "submit_twice_secondary", "", checkEventSupport, submitSecondaryBufferTwiceTest);
+ addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_primary", "", checkEventSupport, oneTimeSubmitFlagPrimaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "record_one_time_submit_secondary", "", checkEventSupport, oneTimeSubmitFlagSecondaryBufferTest);
addFunctionCase (commandBuffersTests.get(), "render_pass_continue", "", renderPassContinueTest, true);
addFunctionCase (commandBuffersTests.get(), "render_pass_continue_no_fb", "", renderPassContinueTest, false);
- addFunctionCase (commandBuffersTests.get(), "record_simul_use_primary", "", simultaneousUsePrimaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "record_simul_use_secondary", "", simultaneousUseSecondaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "record_simul_use_primary", "", checkEventSupport, simultaneousUsePrimaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "record_simul_use_secondary", "", checkEventSupport, simultaneousUseSecondaryBufferTest);
addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_one_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferOnePrimaryBufferTest);
addFunctionCaseWithPrograms (commandBuffersTests.get(), "record_simul_use_secondary_two_primary", "", genComputeIncrementSource, simultaneousUseSecondaryBufferTwoPrimaryBuffersTest);
addFunctionCase (commandBuffersTests.get(), "record_query_precise_w_flag", "", recordBufferQueryPreciseWithFlagTest);
@@ -4193,15 +4807,15 @@
addFunctionCaseWithPrograms (commandBuffersTests.get(), "bad_inheritance_info_invalid_type", "", genComputeIncrementSourceBadInheritance, badInheritanceInfoTest, BadInheritanceInfoCase::INVALID_STRUCTURE_TYPE);
addFunctionCaseWithPrograms (commandBuffersTests.get(), "bad_inheritance_info_valid_nonsense_type", "", genComputeIncrementSourceBadInheritance, badInheritanceInfoTest, BadInheritanceInfoCase::VALID_NONSENSE_TYPE);
/* 19.4. Command Buffer Submission (5.4 in VK 1.0 Spec) */
- addFunctionCase (commandBuffersTests.get(), "submit_count_non_zero", "", submitBufferCountNonZero);
- addFunctionCase (commandBuffersTests.get(), "submit_count_equal_zero", "", submitBufferCountEqualZero);
- addFunctionCase (commandBuffersTests.get(), "submit_wait_single_semaphore", "", submitBufferWaitSingleSemaphore);
- addFunctionCase (commandBuffersTests.get(), "submit_wait_many_semaphores", "", submitBufferWaitManySemaphores);
- addFunctionCase (commandBuffersTests.get(), "submit_null_fence", "", submitBufferNullFence);
- addFunctionCase (commandBuffersTests.get(), "submit_two_buffers_one_buffer_null_with_fence", "", submitTwoBuffersOneBufferNullWithFence);
+ addFunctionCase (commandBuffersTests.get(), "submit_count_non_zero", "", checkEventSupport, submitBufferCountNonZero);
+ addFunctionCase (commandBuffersTests.get(), "submit_count_equal_zero", "", checkEventSupport, submitBufferCountEqualZero);
+ addFunctionCase (commandBuffersTests.get(), "submit_wait_single_semaphore", "", checkEventSupport, submitBufferWaitSingleSemaphore);
+ addFunctionCase (commandBuffersTests.get(), "submit_wait_many_semaphores", "", checkEventSupport, submitBufferWaitManySemaphores);
+ addFunctionCase (commandBuffersTests.get(), "submit_null_fence", "", checkEventSupport, submitBufferNullFence);
+ addFunctionCase (commandBuffersTests.get(), "submit_two_buffers_one_buffer_null_with_fence", "", checkEventSupport, submitTwoBuffersOneBufferNullWithFence);
/* 19.5. Secondary Command Buffer Execution (5.6 in VK 1.0 Spec) */
- addFunctionCase (commandBuffersTests.get(), "secondary_execute", "", executeSecondaryBufferTest);
- addFunctionCase (commandBuffersTests.get(), "secondary_execute_twice", "", executeSecondaryBufferTwiceTest);
+ addFunctionCase (commandBuffersTests.get(), "secondary_execute", "", checkEventSupport, executeSecondaryBufferTest);
+ addFunctionCase (commandBuffersTests.get(), "secondary_execute_twice", "", checkEventSupport, executeSecondaryBufferTwiceTest);
/* 19.6. Commands Allowed Inside Command Buffers (? in VK 1.0 Spec) */
addFunctionCaseWithPrograms (commandBuffersTests.get(), "order_bind_pipeline", "", genComputeSource, orderBindPipelineTest);
/* Verify untested transitions between command buffer states */
diff --git a/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
index 25540a9..6fc04a1 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
@@ -66,6 +66,19 @@
namespace
{
+enum FillMode
+{
+ FILL_MODE_GRADIENT = 0,
+ FILL_MODE_WHITE,
+ FILL_MODE_RED,
+ FILL_MODE_MULTISAMPLE,
+ FILL_MODE_BLUE_RED_X,
+ FILL_MODE_BLUE_RED_Y,
+ FILL_MODE_BLUE_RED_Z,
+
+ FILL_MODE_LAST
+};
+
enum MirrorModeBits
{
MIRROR_MODE_X = (1<<0),
@@ -254,6 +267,7 @@
VkImageTiling tiling;
VkImageLayout operationLayout;
VkImageCreateFlags createFlags;
+ FillMode fillMode;
};
struct TestParams
@@ -282,6 +296,7 @@
deBool singleCommand;
deUint32 barrierCount;
deBool separateDepthStencilLayouts;
+ deBool clearDestination;
TestParams (void)
{
@@ -291,6 +306,9 @@
separateDepthStencilLayouts = DE_FALSE;
src.image.createFlags = VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM;
dst.image.createFlags = VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM;
+ src.image.fillMode = FILL_MODE_GRADIENT;
+ dst.image.fillMode = FILL_MODE_WHITE;
+ clearDestination = DE_FALSE;
}
};
@@ -416,16 +434,6 @@
TestParams testParams);
virtual tcu::TestStatus iterate (void) = 0;
- enum FillMode
- {
- FILL_MODE_GRADIENT = 0,
- FILL_MODE_WHITE,
- FILL_MODE_RED,
- FILL_MODE_MULTISAMPLE,
-
- FILL_MODE_LAST
- };
-
protected:
const TestParams m_params;
@@ -549,6 +557,27 @@
buffer.setPixel(redColor, x, y, z);
break;
+ case FILL_MODE_BLUE_RED_X:
+ case FILL_MODE_BLUE_RED_Y:
+ case FILL_MODE_BLUE_RED_Z:
+ bool useBlue;
+ switch (mode)
+ {
+ case FILL_MODE_BLUE_RED_X: useBlue = (x & 1); break;
+ case FILL_MODE_BLUE_RED_Y: useBlue = (y & 1); break;
+ case FILL_MODE_BLUE_RED_Z: useBlue = (z & 1); break;
+ default: DE_ASSERT(false); break;
+ }
+ if (tcu::isCombinedDepthStencilType(buffer.getFormat().type))
+ {
+ buffer.setPixDepth((useBlue ? blueColor[0] : redColor[0]), x, y, z);
+ if (tcu::hasStencilComponent(buffer.getFormat().order))
+ buffer.setPixStencil((useBlue ? (int) blueColor[3] : (int)redColor[3]), x, y, z);
+ }
+ else
+ buffer.setPixel((useBlue ? blueColor : redColor), x, y, z);
+ break;
+
case FILL_MODE_MULTISAMPLE:
{
float xScaled = static_cast<float>(x) / static_cast<float>(width);
@@ -1040,7 +1069,7 @@
(int)m_params.dst.image.extent.width,
(int)m_params.dst.image.extent.height,
(int)m_params.dst.image.extent.depth));
- generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, FILL_MODE_GRADIENT);
+ generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, m_params.clearDestination ? FILL_MODE_WHITE : FILL_MODE_GRADIENT);
generateExpectedResult();
uploadImage(m_sourceTextureLevel->getAccess(), m_source.get(), m_params.src.image);
@@ -1134,6 +1163,19 @@
beginCommandBuffer(vk, *m_cmdBuffer);
vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, DE_LENGTH_OF_ARRAY(imageBarriers), imageBarriers);
+ if (m_params.clearDestination)
+ {
+ VkImageSubresourceRange range = { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u };
+ VkClearColorValue clearColor;
+
+ clearColor.float32[0] = 1.0f;
+ clearColor.float32[1] = 1.0f;
+ clearColor.float32[2] = 1.0f;
+ clearColor.float32[3] = 1.0f;
+ vk.cmdClearColorImage(*m_cmdBuffer, m_destination.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1u, &range);
+ vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, DE_LENGTH_OF_ARRAY(imageBarriers), imageBarriers);
+ }
+
if (m_params.extensionUse == EXTENSION_USE_NONE)
{
vk.cmdCopyImage(*m_cmdBuffer, m_source.get(), m_params.src.image.operationLayout, m_destination.get(), m_params.dst.image.operationLayout, (deUint32)imageCopies.size(), imageCopies.data());
@@ -2568,12 +2610,12 @@
m_params.src.image.extent.width,
m_params.src.image.extent.height,
m_params.src.image.extent.depth));
- generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth, FILL_MODE_GRADIENT);
+ generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth, m_params.src.image.fillMode);
m_destinationTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(dstTcuFormat,
(int)m_params.dst.image.extent.width,
(int)m_params.dst.image.extent.height,
(int)m_params.dst.image.extent.depth));
- generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, FILL_MODE_WHITE);
+ generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, m_params.dst.image.fillMode);
generateExpectedResult();
uploadImage(m_sourceTextureLevel->getAccess(), m_source.get(), m_params.src.image);
@@ -2660,7 +2702,7 @@
m_params.dst.image.operationLayout, // VkImageLayout dstImageLayout;
(deUint32)m_params.regions.size(), // uint32_t regionCount;
®ions2KHR[0], // const VkImageBlit2KHR* pRegions;
- m_params.filter // VkFilter filter;
+ m_params.filter, // VkFilter filter;
};
vk.cmdBlitImage2KHR(*m_cmdBuffer, &BlitImageInfo2KHR);
}
@@ -3526,12 +3568,12 @@
m_params.src.image.extent.width,
m_params.src.image.extent.height,
m_params.src.image.extent.depth));
- generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth, FILL_MODE_GRADIENT);
+ generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth, m_params.src.image.fillMode);
m_destinationTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(dstTcuFormat,
(int)m_params.dst.image.extent.width,
(int)m_params.dst.image.extent.height,
(int)m_params.dst.image.extent.depth));
- generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, FILL_MODE_WHITE);
+ generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, m_params.dst.image.fillMode);
generateExpectedResult();
uploadImage(m_sourceTextureLevel->getAccess(), m_source.get(), m_params.src.image);
@@ -5465,6 +5507,43 @@
}
{
+ VkExtent3D extent = { 65u, 63u, 1u };
+
+ TestParams params;
+ params.src.image.imageType = VK_IMAGE_TYPE_2D;
+ params.src.image.format = VK_FORMAT_R32_UINT;
+ params.src.image.extent = extent;
+ params.src.image.tiling = VK_IMAGE_TILING_OPTIMAL;
+ params.src.image.operationLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+ params.dst.image.imageType = VK_IMAGE_TYPE_2D;
+ params.dst.image.format = VK_FORMAT_R8G8B8A8_UNORM;
+ params.dst.image.extent = extent;
+ params.dst.image.tiling = VK_IMAGE_TILING_OPTIMAL;
+ params.dst.image.operationLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+ params.allocationKind = allocationKind;
+ params.extensionUse = extensionUse;
+ params.clearDestination = VK_TRUE;
+
+ {
+ const VkImageCopy testCopy =
+ {
+ defaultSourceLayer, // VkImageSubresourceLayers srcSubresource;
+ {34, 34, 0}, // VkOffset3D srcOffset;
+ defaultSourceLayer, // VkImageSubresourceLayers dstSubresource;
+ {0, 0, 0}, // VkOffset3D dstOffset;
+ {31, 29, 1} // VkExtent3D extent;
+ };
+
+ CopyRegion imageCopy;
+
+ imageCopy.imageCopy = testCopy;
+ params.regions.push_back(imageCopy);
+ }
+
+ group->addChild(new CopyImageToImageTestCase(testCtx, "partial_image_npot_diff_format_clear", "Partial image with npot dimensions, different format, and clearing of the destination image", params));
+ }
+
+ {
TestParams params;
params.src.image.imageType = VK_IMAGE_TYPE_2D;
params.src.image.format = VK_FORMAT_D32_SFLOAT;
@@ -8804,6 +8883,34 @@
testParams.params.filter = VK_FILTER_CUBIC_EXT;
group->addChild(new BlitImageTestCase(testCtx, testName + "_cubic", description, testParams.params));
}
+
+ if (testParams.params.src.image.imageType == VK_IMAGE_TYPE_3D)
+ {
+ const struct
+ {
+ FillMode mode;
+ const char* name;
+ } modeList[] =
+ {
+ { FILL_MODE_BLUE_RED_X, "x" },
+ { FILL_MODE_BLUE_RED_Y, "y" },
+ { FILL_MODE_BLUE_RED_Z, "z" },
+ };
+
+ auto otherParams = testParams;
+ otherParams.params.dst.image.fillMode = FILL_MODE_WHITE;
+
+ for (int i = 0; i < DE_LENGTH_OF_ARRAY(modeList); ++i)
+ {
+ otherParams.params.src.image.fillMode = modeList[i].mode;
+
+ otherParams.params.filter = VK_FILTER_LINEAR;
+ group->addChild(new BlitImageTestCase(testCtx, testName + "_linear_stripes_" + modeList[i].name, description, otherParams.params));
+
+ otherParams.params.filter = VK_FILTER_NEAREST;
+ group->addChild(new BlitImageTestCase(testCtx, testName + "_nearest_stripes_" + modeList[i].name, description, otherParams.params));
+ }
+ }
}
}
}
diff --git a/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp
index 14c4ab8..ab9b977 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiDescriptorSetTests.cpp
@@ -21,12 +21,15 @@
* \brief Descriptor set tests
*//*--------------------------------------------------------------------*/
+#include "amber/vktAmberTestCase.hpp"
#include "vktApiDescriptorSetTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vkCmdUtil.hpp"
#include "vkMemUtil.hpp"
#include "vktApiBufferComputeInstance.hpp"
#include "vktApiComputeInstanceResultBuffer.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkObjUtil.hpp"
#include "vkQueryUtil.hpp"
#include "vkRefUtil.hpp"
@@ -353,6 +356,246 @@
return tcu::TestStatus::pass("Pass");
}
+tcu::TestStatus descriptorSetLayoutBindingOrderingTest (Context& context)
+{
+ /*
+ This test tests that if dstBinding has fewer than
+ descriptorCount array elements remaining starting from dstArrayElement,
+ then the remainder will be used to update the subsequent binding.
+ */
+
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice device = context.getDevice();
+ deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ const VkQueue queue = context.getUniversalQueue();
+
+ const Unique<VkShaderModule> computeShaderModule (createShaderModule(vk, device, context.getBinaryCollection().get("compute"), 0));
+
+ de::MovePtr<BufferWithMemory> buffer;
+ buffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vk,
+ device,
+ context.getDefaultAllocator(),
+ makeBufferCreateInfo(4u, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT),
+ MemoryRequirement::HostVisible));
+ deUint32 *bufferPtr = (deUint32 *)buffer->getAllocation().getHostPtr();
+ *bufferPtr = 5;
+
+ de::MovePtr<BufferWithMemory> resultBuffer;
+ resultBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vk,
+ device,
+ context.getDefaultAllocator(),
+ makeBufferCreateInfo(4u * 3, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT),
+ MemoryRequirement::HostVisible));
+
+ const VkDescriptorBufferInfo descriptorBufferInfos[] =
+ {
+ {
+ buffer->get(), // VkBuffer buffer
+ 0u, // VkDeviceSize offset
+ VK_WHOLE_SIZE // VkDeviceSize range
+ },
+ {
+ buffer->get(), // VkBuffer buffer
+ 0u, // VkDeviceSize offset
+ VK_WHOLE_SIZE // VkDeviceSize range
+ },
+ {
+ buffer->get(), // VkBuffer buffer
+ 0u, // VkDeviceSize offset
+ VK_WHOLE_SIZE // VkDeviceSize range
+ },
+ };
+
+ const VkDescriptorBufferInfo descriptorBufferInfoResult =
+ {
+ resultBuffer->get(), // VkBuffer buffer
+ 0u, // VkDeviceSize offset
+ VK_WHOLE_SIZE // VkDeviceSize range
+ };
+
+ const VkDescriptorSetLayoutBinding layoutBindings[] =
+ {
+ {
+ 0u, // deUint32 binding;
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // VkDescriptorType descriptorType;
+ 2u, // deUint32 descriptorCount;
+ VK_SHADER_STAGE_ALL, // VkShaderStageFlags stageFlags;
+ DE_NULL // const VkSampler* pImmutableSamplers;
+ },
+ {
+ 1u, // deUint32 binding;
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // VkDescriptorType descriptorType;
+ 1u, // deUint32 descriptorCount;
+ VK_SHADER_STAGE_ALL, // VkShaderStageFlags stageFlags;
+ DE_NULL // const VkSampler* pImmutableSamplers;
+ },
+ {
+ 2u, // deUint32 binding;
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // VkDescriptorType descriptorType;
+ 1u, // deUint32 descriptorCount;
+ VK_SHADER_STAGE_ALL, // VkShaderStageFlags stageFlags;
+ DE_NULL // const VkSampler* pImmutableSamplers;
+ }
+ };
+
+ const VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkDescriptorSetLayoutCreateFlags flags;
+ DE_LENGTH_OF_ARRAY(layoutBindings), // deUint32 bindingCount;
+ layoutBindings // const VkDescriptorSetLayoutBinding* pBindings;
+ };
+
+ Move<VkDescriptorSetLayout> descriptorSetLayout(createDescriptorSetLayout(vk, device, &descriptorSetLayoutCreateInfo));
+
+ const VkDescriptorPoolSize poolSize[] =
+ {
+ {
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // VkDescriptorType type
+ 3u // uint32_t descriptorCount
+ },
+ {
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // VkDescriptorType type
+ 1u // uint32_t descriptorCount
+ }
+ };
+
+ const VkDescriptorPoolCreateInfo descriptorPoolCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkDescriptorPoolCreateFlags flags
+ 1u, // uint32_t maxSets
+ 2u, // uint32_t poolSizeCount
+ poolSize // const VkDescriptorPoolSize* pPoolSizes
+ };
+
+ Move<VkDescriptorPool> descriptorPool(createDescriptorPool(vk, device, &descriptorPoolCreateInfo));
+
+ VkDescriptorSet descriptorSet;
+ {
+ const VkDescriptorSetAllocateInfo allocInfo =
+ {
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructure sType
+ DE_NULL, // const void* pNext
+ *descriptorPool, // VkDescriptorPool descriptorPool
+ 1u, // uint32_t descriptorSetCount
+ &*descriptorSetLayout // const VkDescriptorSetLayout* pSetLayouts
+ };
+
+ VK_CHECK(vk.allocateDescriptorSets(device, &allocInfo, &descriptorSet));
+ }
+
+ const VkWriteDescriptorSet descriptorWrite =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ descriptorSet, // VkDescriptorSet dstSet
+ 0u, // deUint32 dstBinding
+ 0u, // deUint32 dstArrayElement
+ 3u, // deUint32 descriptorCount
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // VkDescriptorType descriptorType
+ DE_NULL, // const VkDescriptorImageInfo pImageInfo
+ descriptorBufferInfos, // const VkDescriptorBufferInfo* pBufferInfo
+ DE_NULL // const VkBufferView* pTexelBufferView
+ };
+
+ const VkWriteDescriptorSet descriptorWriteResult =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ descriptorSet, // VkDescriptorSet dstSet
+ 2u, // deUint32 dstBinding
+ 0u, // deUint32 dstArrayElement
+ 1u, // deUint32 descriptorCount
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // VkDescriptorType descriptorType
+ DE_NULL, // const VkDescriptorImageInfo pImageInfo
+ &descriptorBufferInfoResult, // const VkDescriptorBufferInfo* pBufferInfo
+ DE_NULL // const VkBufferView* pTexelBufferView
+ };
+
+ const VkCommandPoolCreateInfo cmdPoolInfo =
+ {
+ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType Stype
+ DE_NULL, // const void* PNext
+ DE_NULL, // VkCommandPoolCreateFlags flags
+ queueFamilyIndex, // uint32_t queuefamilyindex
+ };
+
+ const Unique<VkCommandPool> cmdPool(createCommandPool(vk, device, &cmdPoolInfo));
+
+ const VkCommandBufferAllocateInfo cmdBufParams =
+ {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ *cmdPool, // VkCommandPool pool;
+ VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
+ 1u, // uint32_t bufferCount;
+ };
+
+ const Unique<VkCommandBuffer> cmdBuf(allocateCommandBuffer(vk, device, &cmdBufParams));
+
+ const VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0, // VkPipelineLayoutCreateFlags flags
+ 1u, // uint32_t setLayoutCount
+ &*descriptorSetLayout, // const VkDescriptorSetLayout* pSetLayouts
+ 0u, // uint32_t pushConstantRangeCount
+ nullptr // const VkPushConstantRange* pPushConstantRanges
+ };
+
+ Move<VkPipelineLayout> pipelineLayout(createPipelineLayout(vk, device, &pipelineLayoutCreateInfo));
+
+ const VkPipelineShaderStageCreateInfo shaderStageCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ computeShaderModule.get(), // VkShaderModule shader;
+ "main", // const char* pName;
+ DE_NULL // const VkSpecializationInfo* pSpecializationInfo;
+ };
+
+ const VkComputePipelineCreateInfo computePipelineCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ (VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags
+ shaderStageCreateInfo, // VkPipelineShaderStageCreateInfo stage
+ *pipelineLayout, // VkPipelineLayout layout
+ DE_NULL, // VkPipeline basePipelineHandle
+ 0 // int basePipelineIndex
+ };
+
+ Unique<VkPipeline> computePipeline(createComputePipeline(vk, device, DE_NULL, &computePipelineCreateInfo));
+
+ beginCommandBuffer(vk, *cmdBuf, 0u);
+ {
+ vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *computePipeline);
+ vk.updateDescriptorSets(device, 1u, &descriptorWrite, 0u, DE_NULL);
+ vk.updateDescriptorSets(device, 1u, &descriptorWriteResult, 0u, DE_NULL);
+ vk.cmdBindDescriptorSets(*cmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, 1u, &descriptorSet, 0, nullptr);
+ flushAlloc(vk, device, buffer->getAllocation());
+ vk.cmdDispatch(*cmdBuf, 1u, 1u, 1u);
+ }
+
+ endCommandBuffer(vk, *cmdBuf);
+ submitCommandsAndWait(vk, device, queue, *cmdBuf);
+
+ const Allocation& bufferAllocationResult = resultBuffer->getAllocation();
+ invalidateAlloc(vk, device, bufferAllocationResult);
+
+ const deUint32* resultPtr = static_cast<deUint32*>(bufferAllocationResult.getHostPtr());
+
+ if (resultPtr[0] == 5 && resultPtr[1] == 5 && resultPtr[2] == 5)
+ return tcu::TestStatus::pass("Pass");
+ else
+ return tcu::TestStatus::fail("Fail");
+}
} // anonymous
void createDescriptorSetLayoutLifetimeGraphicsSource (SourceCollections& dst)
@@ -375,6 +618,31 @@
"}\n");
}
+void createDescriptorSetLayoutBindingOrderingSource (SourceCollections& dst)
+{
+ dst.glslSources.add("compute") << glu::ComputeSource(
+ "#version 310 es\n"
+ "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
+ "layout (set = 0, binding = 0) uniform UniformBuffer0 {\n"
+ " int data;\n"
+ "} uniformbufferarray[2];\n"
+ "layout (set = 0, binding = 1) uniform UniformBuffer2 {\n"
+ " int data;\n"
+ "} uniformbuffer2;\n"
+ "layout (set = 0, binding = 2) buffer StorageBuffer {\n"
+ " int result0;\n"
+ " int result1;\n"
+ " int result2;\n"
+ "} results;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ " results.result0 = uniformbufferarray[0].data;\n"
+ " results.result1 = uniformbufferarray[1].data;\n"
+ " results.result2 = uniformbuffer2.data;\n"
+ "}\n");
+}
+
tcu::TestCaseGroup* createDescriptorSetLayoutLifetimeTests (tcu::TestContext& testCtx)
{
de::MovePtr<tcu::TestCaseGroup> descriptorSetLayoutLifetimeTests(new tcu::TestCaseGroup(testCtx, "descriptor_set_layout_lifetime", "Descriptor set layout lifetime tests"));
@@ -395,6 +663,17 @@
return emptyDescriptorSetLayoutTests.release();
}
+tcu::TestCaseGroup* createDescriptorSetLayoutBindingOrderingTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> descriptorSetLayoutBindingOrderingTests(new tcu::TestCaseGroup(testCtx, "descriptor_set_layout_binding", "Create descriptor set layout ordering tests"));
+ addFunctionCaseWithPrograms(descriptorSetLayoutBindingOrderingTests.get(), "update_subsequent_binding", "Test subsequent binding update with remaining elements", createDescriptorSetLayoutBindingOrderingSource, descriptorSetLayoutBindingOrderingTest);
+
+ static const char dataDir[] = "api/descriptor_set/descriptor_set_layout_binding";
+ descriptorSetLayoutBindingOrderingTests->addChild(cts_amber::createAmberTestCase(testCtx, "layout_binding_order", "Test descriptor set layout binding order", dataDir, "layout_binding_order.amber"));
+
+ return descriptorSetLayoutBindingOrderingTests.release();
+}
+
tcu::TestCaseGroup* createDescriptorSetLayoutTests (tcu::TestContext& testCtx)
{
de::MovePtr<tcu::TestCaseGroup> descriptorSetLayoutTests(new tcu::TestCaseGroup(testCtx, "descriptor_set_layout", "Descriptor set layout tests"));
@@ -410,6 +689,7 @@
descriptorSetTests->addChild(createDescriptorSetLayoutLifetimeTests(testCtx));
descriptorSetTests->addChild(createDescriptorSetLayoutTests(testCtx));
+ descriptorSetTests->addChild(createDescriptorSetLayoutBindingOrderingTests(testCtx));
return descriptorSetTests.release();
}
diff --git a/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
index 0149a22..c180ed5 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiDriverPropertiesTests.cpp
@@ -49,6 +49,9 @@
static const VkConformanceVersionKHR knownConformanceVersions[] =
{
+ makeConformanceVersion(1, 2, 6, 2),
+ makeConformanceVersion(1, 2, 6, 1),
+ makeConformanceVersion(1, 2, 6, 0),
makeConformanceVersion(1, 2, 5, 2),
makeConformanceVersion(1, 2, 5, 1),
makeConformanceVersion(1, 2, 5, 0),
@@ -134,8 +137,8 @@
void testVersion (const VkPhysicalDeviceDriverPropertiesKHR& deviceDriverProperties, deUint32 usedApiVersion)
{
- const deUint32 apiMajorVersion = VK_VERSION_MAJOR(usedApiVersion);
- const deUint32 apiMinorVersion = VK_VERSION_MINOR(usedApiVersion);
+ const deUint32 apiMajorVersion = VK_API_VERSION_MAJOR(usedApiVersion);
+ const deUint32 apiMinorVersion = VK_API_VERSION_MINOR(usedApiVersion);
if (deviceDriverProperties.conformanceVersion.major < apiMajorVersion ||
(deviceDriverProperties.conformanceVersion.major == apiMajorVersion &&
diff --git a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
index 3bd915a..77b076a 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiExternalMemoryTests.cpp
@@ -3926,6 +3926,20 @@
return tcu::TestStatus::pass("Pass");
}
+
+template<class TestConfig> void checkEvent (Context& context, const TestConfig)
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
+}
+
+template<class TestConfig> void checkSupport (Context& context, const TestConfig config)
+{
+ const Transference transference (getHandelTypeTransferences(config.externalType));
+ if (transference == TRANSFERENCE_COPY)
+ checkEvent(context, config);
+}
+
de::MovePtr<tcu::TestCaseGroup> createFenceTests (tcu::TestContext& testCtx, vk::VkExternalFenceHandleTypeFlagBits externalType)
{
const struct
@@ -3957,13 +3971,13 @@
addFunctionCase(fenceGroup.get(), std::string("create_win32_") + permanenceName, "Test creating fence with win32 properties.", testFenceWin32Create, config);
}
- addFunctionCase(fenceGroup.get(), std::string("import_twice_") + permanenceName, "Test importing fence twice.", testFenceImportTwice, config);
- addFunctionCase(fenceGroup.get(), std::string("reimport_") + permanenceName, "Test importing again over previously imported fence.", testFenceImportReimport, config);
- addFunctionCase(fenceGroup.get(), std::string("import_multiple_times_") + permanenceName, "Test importing fence multiple times.", testFenceMultipleImports, config);
- addFunctionCase(fenceGroup.get(), std::string("signal_export_import_wait_") + permanenceName, "Test signaling, exporting, importing and waiting for the sempahore.", testFenceSignalExportImportWait, config);
- addFunctionCase(fenceGroup.get(), std::string("signal_import_") + permanenceName, "Test signaling and importing the fence.", testFenceSignalImport, config);
- addFunctionCase(fenceGroup.get(), std::string("reset_") + permanenceName, "Test resetting the fence.", testFenceReset, config);
- addFunctionCase(fenceGroup.get(), std::string("transference_") + permanenceName, "Test fences transference.", testFenceTransference, config);
+ addFunctionCase(fenceGroup.get(), std::string("import_twice_") + permanenceName, "Test importing fence twice.", checkSupport, testFenceImportTwice, config);
+ addFunctionCase(fenceGroup.get(), std::string("reimport_") + permanenceName, "Test importing again over previously imported fence.", checkSupport, testFenceImportReimport, config);
+ addFunctionCase(fenceGroup.get(), std::string("import_multiple_times_") + permanenceName, "Test importing fence multiple times.", checkSupport, testFenceMultipleImports, config);
+ addFunctionCase(fenceGroup.get(), std::string("signal_export_import_wait_") + permanenceName, "Test signaling, exporting, importing and waiting for the sempahore.", checkEvent, testFenceSignalExportImportWait, config);
+ addFunctionCase(fenceGroup.get(), std::string("signal_import_") + permanenceName, "Test signaling and importing the fence.", checkSupport, testFenceSignalImport, config);
+ addFunctionCase(fenceGroup.get(), std::string("reset_") + permanenceName, "Test resetting the fence.", checkEvent, testFenceReset, config);
+ addFunctionCase(fenceGroup.get(), std::string("transference_") + permanenceName, "Test fences transference.", checkEvent, testFenceTransference, config);
if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT)
{
@@ -3974,12 +3988,12 @@
|| externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
{
// \note Not supported on WIN32 handles
- addFunctionCase(fenceGroup.get(), std::string("export_multiple_times_") + permanenceName, "Test exporting fence multiple times.", testFenceMultipleExports, config);
+ addFunctionCase(fenceGroup.get(), std::string("export_multiple_times_") + permanenceName, "Test exporting fence multiple times.", checkSupport, testFenceMultipleExports, config);
- addFunctionCase(fenceGroup.get(), std::string("dup_") + permanenceName, "Test calling dup() on exported fence.", testFenceFdDup, config);
- addFunctionCase(fenceGroup.get(), std::string("dup2_") + permanenceName, "Test calling dup2() on exported fence.", testFenceFdDup2, config);
- addFunctionCase(fenceGroup.get(), std::string("dup3_") + permanenceName, "Test calling dup3() on exported fence.", testFenceFdDup3, config);
- addFunctionCase(fenceGroup.get(), std::string("send_over_socket_") + permanenceName, "Test sending fence fd over socket.", testFenceFdSendOverSocket, config);
+ addFunctionCase(fenceGroup.get(), std::string("dup_") + permanenceName, "Test calling dup() on exported fence.", checkSupport, testFenceFdDup, config);
+ addFunctionCase(fenceGroup.get(), std::string("dup2_") + permanenceName, "Test calling dup2() on exported fence.", checkSupport, testFenceFdDup2, config);
+ addFunctionCase(fenceGroup.get(), std::string("dup3_") + permanenceName, "Test calling dup3() on exported fence.", checkSupport, testFenceFdDup3, config);
+ addFunctionCase(fenceGroup.get(), std::string("send_over_socket_") + permanenceName, "Test sending fence fd over socket.", checkSupport, testFenceFdSendOverSocket, config);
}
if (getHandelTypeTransferences(externalType) == TRANSFERENCE_REFERENCE)
@@ -4327,12 +4341,12 @@
addFunctionCase(semaphoreGroup.get(), std::string("create_win32_") + permanenceName, "Test creating semaphore with win32 properties.", testSemaphoreWin32Create, config);
}
- addFunctionCase(semaphoreGroup.get(), std::string("import_twice_") + permanenceName, "Test importing semaphore twice.", testSemaphoreImportTwice, config);
- addFunctionCase(semaphoreGroup.get(), std::string("reimport_") + permanenceName, "Test importing again over previously imported semaphore.", testSemaphoreImportReimport, config);
- addFunctionCase(semaphoreGroup.get(), std::string("import_multiple_times_") + permanenceName, "Test importing semaphore multiple times.", testSemaphoreMultipleImports, config);
- addFunctionCase(semaphoreGroup.get(), std::string("signal_export_import_wait_") + permanenceName, "Test signaling, exporting, importing and waiting for the sempahore.", testSemaphoreSignalExportImportWait, config);
- addFunctionCase(semaphoreGroup.get(), std::string("signal_import_") + permanenceName, "Test signaling and importing the semaphore.", testSemaphoreSignalImport, config);
- addFunctionCase(semaphoreGroup.get(), std::string("transference_") + permanenceName, "Test semaphores transference.", testSemaphoreTransference, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("import_twice_") + permanenceName, "Test importing semaphore twice.", checkSupport, testSemaphoreImportTwice, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("reimport_") + permanenceName, "Test importing again over previously imported semaphore.", checkSupport, testSemaphoreImportReimport, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("import_multiple_times_") + permanenceName, "Test importing semaphore multiple times.", checkSupport, testSemaphoreMultipleImports, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("signal_export_import_wait_") + permanenceName, "Test signaling, exporting, importing and waiting for the sempahore.", checkEvent, testSemaphoreSignalExportImportWait, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("signal_import_") + permanenceName, "Test signaling and importing the semaphore.", checkSupport, testSemaphoreSignalImport, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("transference_") + permanenceName, "Test semaphores transference.", checkEvent, testSemaphoreTransference, config);
if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT)
{
@@ -4344,19 +4358,19 @@
|| externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
{
// \note Not supported on WIN32 handles
- addFunctionCase(semaphoreGroup.get(), std::string("export_multiple_times_") + permanenceName, "Test exporting semaphore multiple times.", testSemaphoreMultipleExports, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("export_multiple_times_") + permanenceName, "Test exporting semaphore multiple times.", checkSupport, testSemaphoreMultipleExports, config);
- addFunctionCase(semaphoreGroup.get(), std::string("dup_") + permanenceName, "Test calling dup() on exported semaphore.", testSemaphoreFdDup, config);
- addFunctionCase(semaphoreGroup.get(), std::string("dup2_") + permanenceName, "Test calling dup2() on exported semaphore.", testSemaphoreFdDup2, config);
- addFunctionCase(semaphoreGroup.get(), std::string("dup3_") + permanenceName, "Test calling dup3() on exported semaphore.", testSemaphoreFdDup3, config);
- addFunctionCase(semaphoreGroup.get(), std::string("send_over_socket_") + permanenceName, "Test sending semaphore fd over socket.", testSemaphoreFdSendOverSocket, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("dup_") + permanenceName, "Test calling dup() on exported semaphore.", checkSupport, testSemaphoreFdDup, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("dup2_") + permanenceName, "Test calling dup2() on exported semaphore.", checkSupport, testSemaphoreFdDup2, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("dup3_") + permanenceName, "Test calling dup3() on exported semaphore.", checkSupport, testSemaphoreFdDup3, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("send_over_socket_") + permanenceName, "Test sending semaphore fd over socket.", checkSupport, testSemaphoreFdSendOverSocket, config);
}
if (getHandelTypeTransferences(externalType) == TRANSFERENCE_REFERENCE)
{
addFunctionCase(semaphoreGroup.get(), std::string("signal_wait_import_") + permanenceName, "Test signaling and then waiting for the the sepmahore.", testSemaphoreSignalWaitImport, config);
addFunctionCase(semaphoreGroup.get(), std::string("export_signal_import_wait_") + permanenceName, "Test exporting, signaling, importing and waiting for the semaphore.", testSemaphoreExportSignalImportWait, config);
- addFunctionCase(semaphoreGroup.get(), std::string("export_import_signal_wait_") + permanenceName, "Test exporting, importing, signaling and waiting for the semaphore.", testSemaphoreExportImportSignalWait, config);
+ addFunctionCase(semaphoreGroup.get(), std::string("export_import_signal_wait_") + permanenceName, "Test exporting, importing, signaling and waiting for the semaphore.", checkEvent, testSemaphoreExportImportSignalWait, config);
}
}
diff --git a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
index e0ba531..d3f5c1f 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
@@ -1510,9 +1510,10 @@
TCU_THROW(NotSupportedError, "At least Vulkan 1.2 required to run test");
}
-void createDevice (Context& context, void* pNext, const char* const* ppEnabledExtensionNames, deUint32 enabledExtensionCount)
+void createTestDevice (Context& context, void* pNext, const char* const* ppEnabledExtensionNames, deUint32 enabledExtensionCount)
{
const PlatformInterface& platformInterface = context.getPlatformInterface();
+ const auto validationEnabled = context.getTestContext().getCommandLine().isValidationEnabled();
const Unique<VkInstance> instance (createDefaultInstance(platformInterface, context.getUsedApiVersion()));
const InstanceDriver instanceDriver (platformInterface, instance.get());
const VkPhysicalDevice physicalDevice = chooseDevice(instanceDriver, instance.get(), context.getTestContext().getCommandLine());
@@ -1543,7 +1544,7 @@
ppEnabledExtensionNames, // const char* const* ppEnabledExtensionNames;
DE_NULL, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
};
- const Unique<VkDevice> device (createDevice(platformInterface, *instance, instanceDriver, physicalDevice, &deviceCreateInfo));
+ const Unique<VkDevice> device (createCustomDevice(validationEnabled, platformInterface, *instance, instanceDriver, physicalDevice, &deviceCreateInfo));
const DeviceDriver deviceDriver (platformInterface, instance.get(), device.get());
const VkQueue queue = getDeviceQueue(deviceDriver, *device, queueFamilyIndex, queueIndex);
@@ -1747,7 +1748,7 @@
if (featureDependencyTable[featureDependencyTableNdx].featurePtr == featurePtr)
featureDependencyTable[featureDependencyTableNdx].dependOnPtr[0] = DE_TRUE;
- createDevice(context, &features2, DE_NULL, 0u);
+ createTestDevice(context, &features2, DE_NULL, 0u);
}
}
@@ -1782,7 +1783,7 @@
if (featureDependencyTable[featureDependencyTableNdx].featurePtr == featurePtr)
featureDependencyTable[featureDependencyTableNdx].dependOnPtr[0] = DE_TRUE;
- createDevice(context, &features2, &extStringPtr, (extStringPtr == DE_NULL) ? 0u : 1u );
+ createTestDevice(context, &features2, &extStringPtr, (extStringPtr == DE_NULL) ? 0u : 1u );
}
}
}
@@ -3555,10 +3556,13 @@
} s_formatRanges[] =
{
// core formats
- { (VkFormat)(VK_FORMAT_UNDEFINED+1), VK_CORE_FORMAT_LAST },
+ { (VkFormat)(VK_FORMAT_UNDEFINED+1), VK_CORE_FORMAT_LAST },
// YCbCr formats
- { VK_FORMAT_G8B8G8R8_422_UNORM, (VkFormat)(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM+1) },
+ { VK_FORMAT_G8B8G8R8_422_UNORM, (VkFormat)(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM+1) },
+
+ // YCbCr extended formats
+ { VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT, (VkFormat)(VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT+1) },
};
for (int rangeNdx = 0; rangeNdx < DE_LENGTH_OF_ARRAY(s_formatRanges); ++rangeNdx)
@@ -5450,10 +5454,13 @@
} s_formatRanges[] =
{
// core formats
- { (VkFormat)(VK_FORMAT_UNDEFINED + 1), VK_CORE_FORMAT_LAST, params },
+ { (VkFormat)(VK_FORMAT_UNDEFINED + 1), VK_CORE_FORMAT_LAST, params },
// YCbCr formats
- { VK_FORMAT_G8B8G8R8_422_UNORM_KHR, (VkFormat)(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR + 1), params }
+ { VK_FORMAT_G8B8G8R8_422_UNORM_KHR, (VkFormat)(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR + 1), params },
+
+ // YCbCr extended formats
+ { VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT, (VkFormat)(VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT+1), params },
};
for (int rangeNdx = 0; rangeNdx < DE_LENGTH_OF_ARRAY(s_formatRanges); ++rangeNdx)
diff --git a/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
index 68ffb95..4a0c82e 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiImageClearingTests.cpp
@@ -1548,8 +1548,16 @@
m_vkd.cmdClearDepthStencilImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[0].depthStencil, 1, &subresourceRange);
- if (m_twoStep)
+ if (m_twoStep) {
+ pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
+ VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
+ VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
+ VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); // VkImageLayout newLayout;
+
m_vkd.cmdClearDepthStencilImage(*m_commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &m_params.clearValue[0].depthStencil, 1, &steptwoRange);
+ }
pipelineImageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask
diff --git a/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp
index 36c3fff..479e28a 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp
@@ -256,6 +256,7 @@
bool success = true;
const deBool isDedicatedAllocationSupported = m_context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation");
const deBool isYcbcrSupported = m_context.isDeviceFunctionalitySupported("VK_KHR_sampler_ycbcr_conversion");
+ const deBool isYcbcrExtensionSupported = m_context.isDeviceFunctionalitySupported("VK_EXT_ycbcr_2plane_444_formats");
std::vector<int> optimalFormats;
std::vector<int> linearFormats;
std::vector<int> memoryTypes;
@@ -492,16 +493,22 @@
VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,
VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,
VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,
+ VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT,
+ VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT,
+ VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT,
+ VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT,
};
int formatCount = (int)(sizeof(formatlist) / sizeof(unsigned int));
- // If ycbcr is not supported, only use the standard texture formats
- if (!isYcbcrSupported)
- formatCount = 184;
-
// Find supported image formats
for (int i = 0; i < formatCount; i++)
{
+ if (isYCbCrFormat((VkFormat)formatlist[i]) && !isYcbcrSupported)
+ continue;
+
+ if (isYCbCrExtensionFormat((VkFormat)formatlist[i]) && !isYcbcrExtensionSupported)
+ continue;
+
vk::VkImageFormatProperties imageformatprops;
// Check for support in linear tiling mode
diff --git a/external/vulkancts/modules/vulkan/api/vktApiNullHandleTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiNullHandleTests.cpp
index 609106e..99d5b7d 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiNullHandleTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiNullHandleTests.cpp
@@ -265,6 +265,12 @@
}
}
+void checkEventSupport (Context& context)
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
+}
+
void addTestsToGroup (tcu::TestCaseGroup* group)
{
addFunctionCase(group, "destroy_buffer", "", test<VkBuffer>);
@@ -273,7 +279,7 @@
addFunctionCase(group, "destroy_descriptor_pool", "", test<VkDescriptorPool>);
addFunctionCase(group, "destroy_descriptor_set_layout", "", test<VkDescriptorSetLayout>);
addFunctionCase(group, "destroy_device", "", test<VkDevice>);
- addFunctionCase(group, "destroy_event", "", test<VkEvent>);
+ addFunctionCase(group, "destroy_event", "", checkEventSupport, test<VkEvent>);
addFunctionCase(group, "destroy_fence", "", test<VkFence>);
addFunctionCase(group, "destroy_framebuffer", "", test<VkFramebuffer>);
addFunctionCase(group, "destroy_image", "", test<VkImage>);
diff --git a/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
index fdd6bb8..0f5a6d7 100644
--- a/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
+++ b/external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp
@@ -3090,6 +3090,20 @@
addFunctionCase(group, cur->name, "", cases.function, cur->parameters);
}
+void checkEventSupport (Context& context, const Event::Parameters)
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
+}
+
+// specialization for Event
+template<>
+void addCases (tcu::TestCaseGroup* group, const CaseDescription<Event>& cases)
+{
+ for (const NamedParameters<Event>* cur = cases.paramsBegin; cur != cases.paramsEnd; ++cur)
+ addFunctionCase(group, cur->name, "", checkEventSupport, cases.function, cur->parameters);
+}
+
template<typename Object>
void addCasesWithProgs (tcu::TestCaseGroup *group, const CaseDescription<Object>& cases)
{
diff --git a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
index f51c575..8d02b95 100644
--- a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
+++ b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorSetRandomTests.cpp
@@ -397,12 +397,16 @@
void chooseWritesRandomly(vk::VkDescriptorType type, RandomLayout& randomLayout, deRandom& rnd, deUint32 set, deUint32 binding, deUint32 count)
{
+ // Make sure the type supports writes.
switch (type)
{
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
- // Disable writes for these descriptor types.
- return;
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ break;
default:
+ DE_ASSERT(false);
break;
}
@@ -894,16 +898,9 @@
break;
default: DE_ASSERT(0);
}
- if (m_data.indexType == INDEX_TYPE_DEPENDENT || m_data.indexType == INDEX_TYPE_RUNTIME_SIZE)
- {
- // Set accum to zero, it is added to the next index.
- checks << " accum = temp - " << descriptor << ";\n";
- }
- else
- {
- // Accumulate any incorrect values.
- checks << " accum |= temp - " << descriptor << ";\n";
- }
+
+ // Accumulate any incorrect values.
+ checks << " accum |= temp - " << descriptor << ";\n";
}
else
{
@@ -1777,7 +1774,7 @@
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, &preStorageImageBarrier);
vk.cmdClearColorImage(*cmdBuffer, img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue, 1, &clearRange);
- vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, m_data.allShaderStages, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postStorageImageBarrier);
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, m_data.allPipelineStages, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postStorageImageBarrier);
++storageImgIndex;
}
@@ -2449,9 +2446,9 @@
VK_SUBPASS_EXTERNAL, // deUint32 srcSubpass
0, // deUint32 dstSubpass
VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags srcStageMask
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // dstStageMask
VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
- VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT, // dstAccessMask
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
VK_DEPENDENCY_BY_REGION_BIT // VkDependencyFlags dependencyFlags
};
diff --git a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorUpdateTests.cpp b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorUpdateTests.cpp
index e74eda3..b470490 100644
--- a/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorUpdateTests.cpp
+++ b/external/vulkancts/modules/vulkan/binding_model/vktBindingDescriptorUpdateTests.cpp
@@ -41,9 +41,13 @@
#include "tcuTexture.hpp"
#include "tcuTestLog.hpp"
+#include "deRandom.hpp"
+
#include <string>
#include <vector>
#include <utility>
+#include <memory>
+#include <math.h>
namespace vkt
{
@@ -151,6 +155,7 @@
{
vk::VkDescriptorType type;
PointerCase pointer;
+ deUint32 descriptorSet;
};
class SamplerlessDescriptorWriteTestCase : public vkt::TestCase
@@ -218,15 +223,15 @@
{
case vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
extensions = "#extension GL_EXT_samplerless_texture_functions : require\n";
- descriptorDecl = "layout(set=0, binding=0) uniform texture2D img;";
+ descriptorDecl = "layout(set=" + std::to_string(m_params.descriptorSet) + ", binding=0) uniform texture2D img;";
readOp = "texelFetch(img, ivec2(0, 0), 0)";
break;
case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
- descriptorDecl = "layout(rgba8, set=0, binding=0) uniform image2D img;";
+ descriptorDecl = "layout(rgba8, set=" + std::to_string(m_params.descriptorSet) + ", binding=0) uniform image2D img;";
readOp = "imageLoad(img, ivec2(0, 0))";
break;
case vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
- descriptorDecl = "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput img;";
+ descriptorDecl = "layout(input_attachment_index=0, set=" + std::to_string(m_params.descriptorSet) + ", binding=0) uniform subpassInput img;";
readOp = "subpassLoad(img)";
break;
default:
@@ -473,24 +478,36 @@
deMemcpy(vertexDataPtr, fullScreenQuad.data(), static_cast<size_t>(vertexBufferSize));
vk::flushAlloc(vkd, device, vertexAlloc);
- // Descriptor set layout.
+ // Descriptor set layouts.
vk::DescriptorSetLayoutBuilder layoutBuilder;
- layoutBuilder.addSingleBinding(m_params.type, vk::VK_SHADER_STAGE_ALL_GRAPHICS);
- const auto descriptorSetLayout = layoutBuilder.build(vkd, device);
+ std::vector<vk::Move<vk::VkDescriptorSetLayout>> descriptorSetLayouts;
+ // Create layouts for required amount of empty descriptor sets before the one that is actually used.
+ for (deUint32 descIdx = 0u; descIdx < m_params.descriptorSet; descIdx++)
+ {
+ descriptorSetLayouts.push_back(layoutBuilder.build(vkd, device));
+ }
+ // Create a layout for the descriptor set that is actually used.
+ layoutBuilder.addSingleBinding(m_params.type, vk::VK_SHADER_STAGE_FRAGMENT_BIT);
+ descriptorSetLayouts.push_back(layoutBuilder.build(vkd, device));
// Descriptor pool.
vk::DescriptorPoolBuilder poolBuilder;
poolBuilder.addType(m_params.type);
- const auto descriptorPool = poolBuilder.build(vkd, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorPool = poolBuilder.build(vkd, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, m_params.descriptorSet + 1);
- // Descriptor set.
- const auto descriptorSet = vk::makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayout.get());
+ // Descriptor sets.
+ std::vector<vk::Move<vk::VkDescriptorSet>> descriptorSets;
+ for (deUint32 descIdx = 0u; descIdx < m_params.descriptorSet; descIdx++)
+ {
+ descriptorSets.push_back(vk::makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayouts[descIdx].get()));
+ }
+ descriptorSets.push_back(vk::makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayouts[m_params.descriptorSet].get()));
// Update descriptor set with the descriptor.
// IMPORTANT: the chosen sampler handle is used here.
vk::DescriptorSetUpdateBuilder updateBuilder;
const auto descriptorImageInfo = vk::makeDescriptorImageInfo(getSamplerHandle(), mainView.get(), getMainImageShaderLayout());
- updateBuilder.writeSingle(descriptorSet.get(), vk::DescriptorSetUpdateBuilder::Location::binding(0u), m_params.type, &descriptorImageInfo);
+ updateBuilder.writeSingle(descriptorSets[m_params.descriptorSet].get(), vk::DescriptorSetUpdateBuilder::Location::binding(0u), m_params.type, &descriptorImageInfo);
updateBuilder.update(vkd, device);
// Shader modules.
@@ -589,7 +606,7 @@
const auto framebuffer = vk::makeFramebuffer(vkd, device, renderPass.get(), static_cast<deUint32>(attachments.size()), attachments.data(), kFramebufferExtent.width, kFramebufferExtent.height, kFramebufferExtent.depth);
// Pipeline layout.
- const auto pipelineLayout = vk::makePipelineLayout(vkd, device, descriptorSetLayout.get());
+ const auto pipelineLayout = vk::makePipelineLayout(vkd, device, descriptorSetLayouts);
// Graphics pipeline.
const std::vector<vk::VkViewport> viewports(1u, vk::makeViewport(kFramebufferExtent));
@@ -612,7 +629,8 @@
const auto vtxBufferBarrier = vk::makeBufferMemoryBarrier(vk::VK_ACCESS_HOST_WRITE_BIT, vk::VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, vertexBuffer.get(), 0ull, vertexBufferSize);
const auto preClearBarrier = vk::makeImageMemoryBarrier(0u, vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_IMAGE_LAYOUT_UNDEFINED, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, mainImage.get(), colorSubresourceRange);
- const auto postClearBarrier = vk::makeImageMemoryBarrier(vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_ACCESS_SHADER_READ_BIT, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, getMainImageShaderLayout(), mainImage.get(), colorSubresourceRange);
+ const auto postClearBarrier = vk::makeImageMemoryBarrier(vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_ACCESS_SHADER_READ_BIT | vk::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
+ vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, getMainImageShaderLayout(), mainImage.get(), colorSubresourceRange);
const auto clearDescColor = vk::makeClearValueColor(kDescriptorColor);
vk::beginCommandBuffer(vkd, cmdBuffer);
@@ -620,11 +638,11 @@
vkd.cmdPipelineBarrier(cmdBuffer, vk::VK_PIPELINE_STAGE_HOST_BIT, vk::VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0u, 0u, nullptr, 1u, &vtxBufferBarrier, 0u, nullptr);
vkd.cmdPipelineBarrier(cmdBuffer, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &preClearBarrier);
vkd.cmdClearColorImage(cmdBuffer, mainImage.get(), vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearDescColor.color, 1u, &colorSubresourceRange);
- vkd.cmdPipelineBarrier(cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &postClearBarrier);
+ vkd.cmdPipelineBarrier(cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &postClearBarrier);
vk::beginRenderPass(vkd, cmdBuffer, renderPass.get(), framebuffer.get(), renderArea, clearFbColor);
vkd.cmdBindPipeline(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.get());
- vkd.cmdBindDescriptorSets(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdBindDescriptorSets(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout.get(), m_params.descriptorSet, 1u, &descriptorSets[m_params.descriptorSet].get(), 0u, nullptr);
vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, &vertexBuffer.get(), &vertexBufferOffset);
vkd.cmdDraw(cmdBuffer, static_cast<deUint32>(fullScreenQuad.size()), 1u, 0u, 0u);
vk::endRenderPass(vkd, cmdBuffer);
@@ -682,9 +700,14 @@
for (const auto& typeCase : descriptorTypes)
for (const auto& pointerCase : pointerCases)
+ for (deUint32 descriptorSet = 0u; descriptorSet < 2u; descriptorSet++)
{
- const std::string caseName = typeCase.second + "_" + pointerCase.second;
- const SamplerlessParams params {typeCase.first, pointerCase.first};
+ std::string caseName = typeCase.second + "_" + pointerCase.second;
+ SamplerlessParams params {typeCase.first, pointerCase.first, descriptorSet};
+ if (descriptorSet > 0u)
+ {
+ caseName += "_set_" + std::to_string(descriptorSet);
+ }
group->addChild(new SamplerlessDescriptorWriteTestCase(testCtx, caseName, "", params));
}
@@ -692,8 +715,585 @@
return group.release();
}
-} // anonymous
+class RandomDescriptorUpdateTestCase : public vkt::TestCase
+{
+public:
+ RandomDescriptorUpdateTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description);
+ virtual ~RandomDescriptorUpdateTestCase (void) {}
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual vkt::TestInstance* createInstance (Context& context) const;
+
+private:
+};
+
+class RandomDescriptorUpdateTestInstance : public vkt::TestInstance
+{
+public:
+ RandomDescriptorUpdateTestInstance (Context& context);
+ virtual ~RandomDescriptorUpdateTestInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+ static const vk::VkExtent3D kFramebufferExtent;
+ static const vk::VkFormat kImageFormat;
+ static const deUint32 kNumBuffers;
+ static const deUint32 kNumOffsets;
+ static const deUint32 kNumIterations;
+
+private:
+ deRandom m_random;
+};
+
+const vk::VkExtent3D RandomDescriptorUpdateTestInstance::kFramebufferExtent = vk::makeExtent3D(64u, 64u, 1u);
+const vk::VkFormat RandomDescriptorUpdateTestInstance::kImageFormat = vk::VK_FORMAT_R16G16B16A16_SFLOAT;
+const deUint32 RandomDescriptorUpdateTestInstance::kNumBuffers = 3u;
+const deUint32 RandomDescriptorUpdateTestInstance::kNumOffsets = 5u;
+const deUint32 RandomDescriptorUpdateTestInstance::kNumIterations = 1000u;
+
+RandomDescriptorUpdateTestCase::RandomDescriptorUpdateTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description)
+: vkt::TestCase(testCtx, name, description)
+{
+}
+
+void RandomDescriptorUpdateTestCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const std::string vertexShader =
+ "#version 450\n"
+ "layout(location=0) in vec4 position;\n"
+ "void main() { gl_Position = position; }\n";
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vertexShader);
+
+ std::ostringstream fragmentShader;
+
+ fragmentShader
+ << "#version 450\n"
+ << "layout(location = 0) out vec4 color_out;\n"
+ << "layout(set = 0, binding = 0) uniform buf\n"
+ << "{\n"
+ << " vec4 data0;\n"
+ << " vec4 data1;\n"
+ << "};\n"
+ << "void main()\n"
+ << "{\n"
+ << " color_out = data0 + data1;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("frag") << glu::FragmentSource(fragmentShader.str());
+}
+
+vkt::TestInstance* RandomDescriptorUpdateTestCase::createInstance (Context& context) const
+{
+ return new RandomDescriptorUpdateTestInstance(context);
+}
+
+RandomDescriptorUpdateTestInstance::RandomDescriptorUpdateTestInstance(Context &context)
+: vkt::TestInstance(context)
+{
+ deRandom_init(&m_random, 0);
+}
+
+tcu::TestStatus RandomDescriptorUpdateTestInstance::iterate()
+{
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& allocator = m_context.getDefaultAllocator();
+ const auto queue = m_context.getUniversalQueue();
+ const auto queueIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto tcuFormat = vk::mapVkFormat(kImageFormat);
+ vk::DescriptorSetLayoutBuilder builder;
+
+ builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, vk::VK_SHADER_STAGE_FRAGMENT_BIT);
+
+ vk::Unique<vk::VkDescriptorSetLayout> layout (builder.build(vkd, device, (vk::VkDescriptorSetLayoutCreateFlags)0));
+
+ // Create descriptor pool
+ vk::Unique<vk::VkDescriptorPool> descriptorPool (vk::DescriptorPoolBuilder().addType(vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1).build(vkd, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1));
+
+ // Create descriptor set
+ const vk::VkDescriptorSetAllocateInfo setAllocateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ *descriptorPool, // VkDescriptorPool descriptorPool
+ 1u, // deUint32 descriptorSetCount
+ &layout.get() // const VkDescriptorSetLayout* pSetLayouts
+ };
+
+ vk::Unique<vk::VkDescriptorSet> descriptorSet (allocateDescriptorSet(vkd, device, &setAllocateInfo));
+
+ // The maximum allowed buffer offset alignment is 256 bytes. Meaningful data is placed at these offsets.
+ const deUint32 bufferSize = 256u * kNumOffsets;
+
+ float bufferContents[kNumBuffers][bufferSize / 4];
+ float counter = 1.0f;
+ float sign = 1.0f;
+ deUint32 offset = 0;
+ deUint32 channelSelector = 0;
+
+ // The buffers are filled with a running counter in one of the channels.
+ // Both signed and unsigned values are used for each counter. Two vec4s
+ // are initialized at offsets of 256 bytes (the maximum allowed alignment).
+ // Everythin else is left as zero.
+ for (deUint32 b = 0; b < kNumBuffers; b++)
+ {
+ deMemset(bufferContents[b], 0, bufferSize);
+
+ for (deUint32 o = 0; o < kNumOffsets; o++)
+ {
+ offset = o * 64;
+
+ // Two vectors at every offset.
+ for (deUint32 v = 0; v < 2; v++)
+ {
+ // Only RGB channels are being tested.
+ for (deUint32 c = 0; c < 3; c++)
+ {
+ if (c == channelSelector)
+ {
+ bufferContents[b][offset++] = sign * counter;
+ }
+ else
+ {
+ bufferContents[b][offset++] = 0.0f;
+ }
+ }
+ // Keep alpha at one.
+ bufferContents[b][offset++] = 1.0f;
+
+ channelSelector = channelSelector + 1;
+
+ // All three channels have been filled in. Switch a sign or increase the counter.
+ if (channelSelector == 3)
+ {
+ channelSelector = 0;
+ if (sign == 1.0f)
+ {
+ sign = -1.0f;
+ }
+ else
+ {
+ sign = 1.0f;
+ counter += 1.0f;
+ }
+ }
+ }
+ }
+ }
+
+ const auto bufferInfo = vk::makeBufferCreateInfo(bufferSize, vk::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
+ std::vector<std::shared_ptr<vk::BufferWithMemory>> buffers;
+
+ for (const auto& contents : bufferContents)
+ {
+ buffers.emplace_back(std::make_shared<vk::BufferWithMemory>(vkd, device, allocator, bufferInfo, vk::MemoryRequirement::HostVisible));
+ const auto& bufferAlloc = buffers.back()->getAllocation();
+ const auto bufferPtr = reinterpret_cast<char*>(bufferAlloc.getHostPtr()) + bufferAlloc.getOffset();
+ deMemcpy(bufferPtr, contents, bufferSize);
+ vk::flushAlloc(vkd, device, bufferAlloc);
+ }
+
+ // Create framebuffer image and view.
+ const vk::VkImageCreateInfo fbImgCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkImageCreateFlags flags
+ vk::VK_IMAGE_TYPE_2D, // VkImageType imageType
+ kImageFormat, // VkFormat format
+ kFramebufferExtent, // VkExtent3D extent
+ 1u, // deUint32 mipLevels
+ 1u, // deUint32 arrayLayers
+ vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
+ vk::VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling
+ (vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | // VkImageUsageFlags usage
+ vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT),
+ vk::VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode
+ 1u, // deUint32 queueFamilyIndexCount
+ &queueIndex, // const deUint32* pQueueFamilyIndices
+ vk::VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout
+ };
+
+ const vk::ImageWithMemory fbImage (vkd, device, allocator, fbImgCreateInfo, vk::MemoryRequirement::Any);
+ const auto colorSubresourceRange = vk::makeImageSubresourceRange(vk::VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ const auto fbView = vk::makeImageView(vkd, device, fbImage.get(), vk::VK_IMAGE_VIEW_TYPE_2D, kImageFormat, colorSubresourceRange);
+
+ // Buffer to copy rendering result to.
+ const vk::VkDeviceSize resultsBufferSize = static_cast<vk::VkDeviceSize>(static_cast<deUint32>(tcu::getPixelSize(tcuFormat)) * kFramebufferExtent.width * kFramebufferExtent.height * kFramebufferExtent.depth);
+ const auto resultsBufferInfo = vk::makeBufferCreateInfo(resultsBufferSize, vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ const vk::BufferWithMemory resultsBuffer (vkd, device, allocator, resultsBufferInfo, vk::MemoryRequirement::HostVisible);
+
+ const std::vector<tcu::Vec4> fullScreenQuad =
+ {
+ { -1.f, -1.f, 0.f, 1.f },
+ { 1.f, -1.f, 0.f, 1.f },
+ { -1.f, 1.f, 0.f, 1.f },
+ { -1.f, 1.f, 0.f, 1.f },
+ { 1.f, -1.f, 0.f, 1.f },
+ { 1.f, 1.f, 0.f, 1.f }
+ };
+
+ // Vertex buffer.
+ const vk::VkDeviceSize vertexBufferSize = static_cast<vk::VkDeviceSize>(fullScreenQuad.size() * sizeof(decltype(fullScreenQuad)::value_type));
+ const auto vertexBufferInfo = vk::makeBufferCreateInfo(vertexBufferSize, vk::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ const vk::BufferWithMemory vertexBuffer (vkd, device, allocator, vertexBufferInfo, vk::MemoryRequirement::HostVisible | vk::MemoryRequirement::Coherent);
+
+ // Copy data to vertex buffer.
+ const auto& vertexAlloc = vertexBuffer.getAllocation();
+ const auto vertexDataPtr = reinterpret_cast<char*>(vertexAlloc.getHostPtr()) + vertexAlloc.getOffset();
+ deMemcpy(vertexDataPtr, fullScreenQuad.data(), static_cast<size_t>(vertexBufferSize));
+ vk::flushAlloc(vkd, device, vertexAlloc);
+
+ // Shader modules.
+ const auto vertexModule = vk::createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0u);
+ const auto fragModule = vk::createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0u);
+
+ // Render pass.
+ const vk::VkAttachmentDescription fbAttachment =
+ {
+ 0u, // VkAttachmentDescriptionFlags flags
+ kImageFormat, // VkFormat format
+ vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples
+ vk::VK_ATTACHMENT_LOAD_OP_LOAD, // VkAttachmentLoadOp loadOp
+ vk::VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp
+ vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp
+ vk::VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp
+ vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout
+ vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout finalLayout
+ };
+
+ std::vector<vk::VkAttachmentDescription> attachmentDescs;
+ attachmentDescs.push_back(fbAttachment);
+
+ const vk::VkAttachmentReference colorRef =
+ {
+ 0u, // deUint32 attachment
+ vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout
+ };
+ const std::vector<vk::VkAttachmentReference> colorAttachments(1u, colorRef);
+
+ const vk::VkSubpassDescription subpass =
+ {
+ 0u, // VkSubpassDescriptionFlags flags
+ vk::VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint
+ 0u, // deUint32 inputAttachmentCount
+ DE_NULL, // const VkAttachmentReference* pInputAttachments
+ static_cast<deUint32>(colorAttachments.size()), // deUint32 colorAttachmentCount
+ colorAttachments.data(), // const VkAttachmentReference* pColorAttachments
+ 0u, // const VkAttachmentReference* pResolveAttachments
+ DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment
+ 0u, // deUint32 preserveAttachmentCount
+ DE_NULL // const deUint32* pPreserveAttachments
+ };
+ const std::vector<vk::VkSubpassDescription> subpasses (1u, subpass);
+
+ const vk::VkRenderPassCreateInfo renderPassInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkRenderPassCreateFlags flags
+ static_cast<deUint32>(attachmentDescs.size()), // deUint32 attachmentCount
+ attachmentDescs.data(), // const VkAttachmentDescription* pAttachments
+ static_cast<deUint32>(subpasses.size()), // deUint32 subpassCount
+ subpasses.data(), // const VkSubpassDescription* pSubpasses
+ 0u, // deUint32 dependencyCount
+ DE_NULL, // const VkSubpassDependency* pDependencies
+ };
+ const auto renderPass = vk::createRenderPass(vkd, device, &renderPassInfo);
+
+ // Framebuffer.
+ std::vector<vk::VkImageView> attachments;
+ attachments.push_back(fbView.get());
+ const auto framebuffer = vk::makeFramebuffer(vkd, device, renderPass.get(), static_cast<deUint32>(attachments.size()), attachments.data(), kFramebufferExtent.width, kFramebufferExtent.height, kFramebufferExtent.depth);
+
+ // Pipeline layout.
+ const auto pipelineLayout = vk::makePipelineLayout(vkd, device, layout.get());
+
+ // Graphics pipeline.
+ const std::vector<vk::VkViewport> viewports (1u, vk::makeViewport(kFramebufferExtent));
+ const std::vector<vk::VkRect2D> scissors (1u, vk::makeRect2D(kFramebufferExtent));
+
+ // Use additive alpha blending to accumulate results from all iterations.
+ const vk::VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
+ {
+ VK_TRUE, // VkBool32 blendEnable
+ vk::VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor
+ vk::VK_BLEND_FACTOR_ONE, // VkBlendFactor dstColorBlendFactor
+ vk::VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp
+ vk::VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor
+ vk::VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor
+ vk::VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp
+ vk::VK_COLOR_COMPONENT_R_BIT // VkColorComponentFlags colorWriteMask
+ | vk::VK_COLOR_COMPONENT_G_BIT
+ | vk::VK_COLOR_COMPONENT_B_BIT
+ | vk::VK_COLOR_COMPONENT_A_BIT
+ };
+
+ const vk::VkPipelineColorBlendStateCreateInfo colorBlendState =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkPipelineColorBlendStateCreateFlags flags
+ VK_FALSE, // VkBool32 logicOpEnable
+ vk::VK_LOGIC_OP_CLEAR, // VkLogicOp logicOp
+ 1u, // deUint32 attachmentCount
+ &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments
+ { 1.0f, 1.0f, 1.0f, 1.0f } // float blendConstants[4]
+ };
+
+ const auto pipeline = vk::makeGraphicsPipeline(vkd, device, pipelineLayout.get(),
+ vertexModule.get(), DE_NULL, DE_NULL, DE_NULL, fragModule.get(),
+ renderPass.get(), viewports, scissors, vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
+ 0u, 0u, DE_NULL, DE_NULL, DE_NULL, DE_NULL, &colorBlendState);
+
+ // Command pool and command buffer.
+ const auto cmdPool = vk::createCommandPool(vkd, device, vk::VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueIndex);
+ const auto cmdBufferPtr = vk::allocateCommandBuffer(vkd, device, cmdPool.get(), vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ const vk::VkRect2D renderArea = vk::makeRect2D(kFramebufferExtent);
+ const vk::VkDeviceSize vertexBufferOffset = 0ull;
+
+ const auto vtxBufferBarrier = vk::makeBufferMemoryBarrier(vk::VK_ACCESS_HOST_WRITE_BIT, vk::VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, vertexBuffer.get(), 0ull, vertexBufferSize);
+ const auto fbBarrier = vk::makeImageMemoryBarrier(0u, vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, vk::VK_IMAGE_LAYOUT_UNDEFINED, vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, fbImage.get(), colorSubresourceRange);
+
+ vk::VkClearValue clearValue;
+ clearValue.color.float32[0] = 0.0f;
+ clearValue.color.float32[1] = 0.0f;
+ clearValue.color.float32[2] = 0.0f;
+ clearValue.color.float32[3] = 1.0f;
+
+ const vk::VkClearAttachment clearAttachment =
+ {
+ vk::VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask
+ 0u, // uint32_t colorAttachment
+ clearValue // VkClearValue clearValue
+ };
+
+ const vk::VkClearRect clearRect =
+ {
+ vk::makeRect2D(kFramebufferExtent), // VkRect2D rect
+ 0u, // uint32_t baseArrayLayer
+ 1u // uint32_t layerCount
+ };
+
+ vk::beginCommandBuffer(vkd, cmdBuffer);
+ vkd.cmdPipelineBarrier(cmdBuffer, vk::VK_PIPELINE_STAGE_HOST_BIT, vk::VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0u,
+ 0u, DE_NULL, 1u, &vtxBufferBarrier, 0u, DE_NULL);
+ vkd.cmdPipelineBarrier(cmdBuffer, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0u,
+ 0u, DE_NULL, 0u, DE_NULL, 1u, &fbBarrier);
+ vk::endCommandBuffer(vkd, cmdBuffer);
+ vk::submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ struct DescriptorWrite
+ {
+ deUint32 bufferId; // Which buffer to use for the descriptor update.
+ vk::VkDeviceSize offset; // The offset for the descriptor update.
+ vk::VkDeviceSize range; // The range for the descriptor update.
+ };
+
+ // Each iteration operates on a descriptor mutation which decides the source of the descriptor update.
+ struct DescriptorMutation
+ {
+ deBool update; // Determines if a descriptor update is performed.
+ deUint32 numDraws; // The number of consecutive draw calls in a loop.
+ std::vector<DescriptorWrite> writes; // Multiple redundant writes can be performed.
+ // Other ideas to implement:
+ // - Sometimes also update the buffer contents.
+ // - Multiple descriptor sets.
+ };
+
+ std::vector<DescriptorMutation> descriptorMutations;
+
+ // Keep track of the expected result while generating the mutations.
+ tcu::Vec4 uboValue0;
+ tcu::Vec4 uboValue1;
+ tcu::Vec4 expectedColor (0.0f, 0.0f, 0.0f, 1.0f);
+ DescriptorWrite descWrite = { 0u, 0u, 32u };
+
+ for (deUint32 i = 0; i < kNumIterations; i++)
+ {
+ while (true)
+ {
+ tcu::Vec4 val0 = uboValue0;
+ tcu::Vec4 val1 = uboValue1;
+
+ deUint32 numWrites = 1u;
+
+ // Sometimes do redundant descriptor writes.
+ if (deRandom_getUint32(&m_random) % 10 == 0)
+ numWrites = deRandom_getUint32(&m_random) % 20 + 1;
+
+ std::vector<DescriptorWrite> writes;
+
+ for (deUint32 w = 0; w < numWrites; w++)
+ {
+ // The first half: Most of the times change the offset but sometimes the buffer.
+ // The second half: Most of the times change the buffer but sometimes change the offset.
+ bool firstHalf = i < kNumIterations / 2;
+ bool rare = (deRandom_getUint32(&m_random) % 100u >= (firstHalf ? 98u : 80u));
+
+ // firstHalf rare change
+ // --------------------------------
+ // 1 0 Offset
+ // 1 1 Buffer
+ // 0 0 Buffer
+ // 0 1 Offset
+ //
+ // This has a XOR pattern
+
+ if (firstHalf ^ rare)
+ descWrite.offset = (deRandom_getUint32(&m_random) % kNumOffsets) * 256u;
+ else
+ descWrite.bufferId = deRandom_getUint32(&m_random) % kNumBuffers;
+
+ writes.push_back(descWrite);
+ }
+
+ DescriptorMutation mutation = {i == 0 ? true : deRandom_getBool(&m_random),
+ deRandom_getUint32(&m_random) % 10u, writes};
+
+ const auto& lastWrite = mutation.writes.back();
+ if (mutation.update)
+ {
+ for (int c = 0; c < 3; c++)
+ {
+ val0[c] = bufferContents[lastWrite.bufferId][lastWrite.offset / 4 + c];
+ val1[c] = bufferContents[lastWrite.bufferId][lastWrite.offset / 4 + 4 + c];
+
+ // Sanity check we are reading expected values.
+ DE_ASSERT(val0[c] >= -counter && val0[c] <= counter);
+ DE_ASSERT(val1[c] >= -counter && val1[c] <= counter);
+ }
+ }
+
+ tcu::Vec4 color = expectedColor + (val0 + val1) * tcu::Vec4(static_cast<float>(mutation.numDraws));
+
+ // 16-bit float can precisely present integers from -2048..2048. Continue randomizing the mutation
+ // until we stay in this range.
+ if (color[0] >= -2048.0f && color[0] <= 2048.0f && color[1] >= -2048.0f && color[1] <= 2048.0f
+ && color[2] >= -2048.0f && color[2] <= 2048.0f)
+ {
+ descriptorMutations.push_back(mutation);
+ uboValue0 = val0;
+ uboValue1 = val1;
+ expectedColor = color;
+ break;
+ }
+ else
+ {
+ // Randomize both buffer and offset for a better chance to hit a
+ // mutation that pushes the values back to the desired range.
+ descWrite.offset = (deRandom_getUint32(&m_random) % kNumOffsets) * 256u;
+ descWrite.bufferId = deRandom_getUint32(&m_random) % kNumBuffers;
+ }
+ }
+ }
+
+ bool first = true;
+
+ for (auto mutation : descriptorMutations)
+ {
+ if (mutation.update)
+ {
+ for (const auto &write : mutation.writes)
+ {
+ const vk::VkDescriptorBufferInfo descriptorInfo =
+ {
+ buffers[write.bufferId]->get(), // VkBuffer buffer
+ write.offset, // VkDeviceSize offset
+ write.range // VkDeviceSize range
+ };
+
+ const vk::VkWriteDescriptorSet descriptorWrite =
+ {
+ vk::VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, // VkStructureTypes Type
+ DE_NULL, // const void* pNext
+ *descriptorSet, // VkDescriptorSet dstSet
+ 0, // deUint32 dstBinding
+ 0, // deUint32 dstArrayElement
+ 1u, // deUint32 descriptorCount
+ vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, // VkDescriptorType descriptorType
+ DE_NULL, // const VkDescriptorImageInfo* pImageInfo
+ &descriptorInfo, // const VkDescriptorBufferInfo* pBufferInfo
+ DE_NULL // const VkBufferView* pTexelBufferView
+ };
+
+ vkd.updateDescriptorSets(device, 1, &descriptorWrite, 0, DE_NULL);
+ }
+ }
+
+ vk::beginCommandBuffer(vkd, cmdBuffer);
+
+ vk::beginRenderPass(vkd, cmdBuffer, renderPass.get(), framebuffer.get(), renderArea);
+ vkd.cmdBindPipeline(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.get());
+ // Clear the frame buffer during the first iteration.
+ if (first)
+ {
+ vkd.cmdClearAttachments(cmdBuffer, 1u, &clearAttachment, 1u, &clearRect);
+ first = false;
+ }
+ vkd.cmdBindDescriptorSets(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout.get(), 0u, 1u,
+ &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, &vertexBuffer.get(), &vertexBufferOffset);
+
+ for (deUint32 i = 0u; i < mutation.numDraws; i++)
+ vkd.cmdDraw(cmdBuffer, static_cast<deUint32>(fullScreenQuad.size()), 1u, 0u, 0u);
+
+ vk::endRenderPass(vkd, cmdBuffer);
+ vk::endCommandBuffer(vkd, cmdBuffer);
+ vk::submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+ }
+
+ vk::beginCommandBuffer(vkd, cmdBuffer);
+ const tcu::IVec2 copySize{static_cast<int>(kFramebufferExtent.width),
+ static_cast<int>(kFramebufferExtent.height)};
+ vk::copyImageToBuffer(vkd, cmdBuffer, fbImage.get(), resultsBuffer.get(), copySize);
+ vk::endCommandBuffer(vkd, cmdBuffer);
+ vk::submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Check results.
+ const auto& resultsBufferAlloc = resultsBuffer.getAllocation();
+ vk::invalidateAlloc(vkd, device, resultsBufferAlloc);
+
+ const auto resultsBufferPtr = reinterpret_cast<const char*>(resultsBufferAlloc.getHostPtr()) + resultsBufferAlloc.getOffset();
+ const tcu::ConstPixelBufferAccess resultPixels {tcuFormat, copySize[0], copySize[1], 1, resultsBufferPtr};
+
+ // The test only operates on integers, so a tolerance of 0.5 should work.
+ const float tolerance = 0.5f;
+
+ bool pass = true;
+ for (int x = 0; pass && x < resultPixels.getWidth(); ++x)
+ for (int y = 0; pass && y < resultPixels.getHeight(); ++y)
+ for (int z = 0; pass && z < resultPixels.getDepth(); ++z)
+ {
+ const auto pixel = resultPixels.getPixel(x, y, z);
+ for (int c = 0; c < 3; c++)
+ if (fabs(pixel[c] - expectedColor[c]) > tolerance)
+ pass = false;
+ }
+
+ tcu::TestStatus status = tcu::TestStatus::pass("Pass");
+ if (!pass)
+ {
+ m_context.getTestContext().getLog() << tcu::TestLog::Image("color", "Rendered image", resultPixels);
+ status = tcu::TestStatus::fail("Pixel mismatch; please check the rendered image");
+ }
+
+ return status;
+}
+
+tcu::TestCaseGroup* createRandomDescriptorUpdateTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "random", "Update descriptors randomly between draws"));
+
+ group->addChild(new RandomDescriptorUpdateTestCase(testCtx, "uniform_buffer", ""));
+ return group.release();
+}
+
+} // anonymous
tcu::TestCaseGroup* createDescriptorUpdateTests (tcu::TestContext& testCtx)
{
@@ -701,6 +1301,7 @@
group->addChild(createEmptyDescriptorUpdateTests(testCtx));
group->addChild(createSamplerlessWriteTests(testCtx));
+ group->addChild(createRandomDescriptorUpdateTests(testCtx));
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp b/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp
index 178b699..7d61b11 100644
--- a/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp
+++ b/external/vulkancts/modules/vulkan/clipping/vktClippingTests.cpp
@@ -1473,6 +1473,16 @@
} // ClipDistanceComplementarity ns
+void checkTopologySupport(Context& context, const VkPrimitiveTopology topology)
+{
+ if (topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
+}
+
void addClippingTests (tcu::TestCaseGroup* clippingTestsGroup)
{
tcu::TestContext& testCtx = clippingTestsGroup->getTestContext();
@@ -1503,7 +1513,7 @@
for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
addFunctionCaseWithPrograms<VkPrimitiveTopology>(
- group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", initPrograms, testPrimitivesInside, cases[caseNdx]);
+ group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", checkTopologySupport, initPrograms, testPrimitivesInside, cases[caseNdx]);
clipVolumeGroup->addChild(group.release());
}
@@ -1514,7 +1524,7 @@
for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
addFunctionCaseWithPrograms<VkPrimitiveTopology>(
- group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", initPrograms, testPrimitivesOutside, cases[caseNdx]);
+ group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", checkTopologySupport, initPrograms, testPrimitivesOutside, cases[caseNdx]);
clipVolumeGroup->addChild(group.release());
}
@@ -1525,7 +1535,7 @@
for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
addFunctionCaseWithPrograms<VkPrimitiveTopology>(
- group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", initPrograms, testPrimitivesDepthClamp, cases[caseNdx]);
+ group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", checkTopologySupport, initPrograms, testPrimitivesDepthClamp, cases[caseNdx]);
clipVolumeGroup->addChild(group.release());
}
@@ -1536,7 +1546,7 @@
for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); ++caseNdx)
addFunctionCaseWithPrograms<VkPrimitiveTopology>(
- group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", initPrograms, testPrimitivesDepthClip, cases[caseNdx]);
+ group.get(), getPrimitiveTopologyShortName(cases[caseNdx]), "", checkTopologySupport, initPrograms, testPrimitivesDepthClip, cases[caseNdx]);
clipVolumeGroup->addChild(group.release());
}
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp
index 0a594af..4287075 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDispatchTests.cpp
@@ -73,13 +73,14 @@
class ConditionalDispatchTest : public vkt::TestCase
{
public:
- ConditionalDispatchTest (tcu::TestContext& testCtx,
- const std::string& name,
- const std::string& description,
- const ConditionalTestSpec& testSpec);
+ ConditionalDispatchTest (tcu::TestContext& testCtx,
+ const std::string& name,
+ const std::string& description,
+ const ConditionalTestSpec& testSpec);
- void initPrograms (vk::SourceCollections& sourceCollections) const;
- TestInstance* createInstance (Context& context) const;
+ void initPrograms (vk::SourceCollections& sourceCollections) const;
+ void checkSupport (Context& context) const;
+ TestInstance* createInstance (Context& context) const;
private:
const ConditionalTestSpec m_testSpec;
@@ -90,7 +91,7 @@
public:
ConditionalDispatchTestInstance (Context &context, ConditionalTestSpec testSpec);
- virtual tcu::TestStatus iterate (void);
+ virtual tcu::TestStatus iterate (void);
void recordDispatch (const vk::DeviceInterface& vk,
vk::VkCommandBuffer cmdBuffer,
compute::Buffer& indirectBuffer);
@@ -101,10 +102,10 @@
const ConditionalData m_conditionalData;
};
-ConditionalDispatchTest::ConditionalDispatchTest(tcu::TestContext& testCtx,
- const std::string& name,
- const std::string& description,
- const ConditionalTestSpec& testSpec)
+ConditionalDispatchTest::ConditionalDispatchTest(tcu::TestContext& testCtx,
+ const std::string& name,
+ const std::string& description,
+ const ConditionalTestSpec& testSpec)
: TestCase (testCtx, name, description)
, m_testSpec (testSpec)
{
@@ -127,6 +128,14 @@
sourceCollections.glslSources.add("comp") << glu::ComputeSource(src.str());
}
+void ConditionalDispatchTest::checkSupport(Context& context) const
+{
+ checkConditionalRenderingCapabilities(context, m_testSpec.conditionalData);
+
+ if (m_testSpec.command == DISPATCH_COMMAND_TYPE_DISPATCH_BASE)
+ context.requireDeviceFunctionality("VK_KHR_device_group");
+}
+
TestInstance* ConditionalDispatchTest::createInstance (Context& context) const
{
return new ConditionalDispatchTestInstance(context, m_testSpec);
@@ -138,7 +147,6 @@
, m_numCalls(testSpec.numCalls)
, m_conditionalData(testSpec.conditionalData)
{
- checkConditionalRenderingCapabilities(context, m_conditionalData);
};
void ConditionalDispatchTestInstance::recordDispatch (const vk::DeviceInterface& vk,
@@ -364,7 +372,7 @@
{
const ConditionalData& conditionData = conditional::s_testsData[conditionNdx];
- tcu::TestCaseGroup* conditionalDrawRootGroup = new tcu::TestCaseGroup(m_testCtx, de::toString(conditionData).c_str(), "Conditionaly execute dispatch calls");
+ de::MovePtr<tcu::TestCaseGroup> conditionalDrawRootGroup(new tcu::TestCaseGroup(m_testCtx, de::toString(conditionData).c_str(), "Conditionaly execute dispatch calls"));
for (deUint32 commandTypeIdx = 0; commandTypeIdx < DISPATCH_COMMAND_TYPE_DISPATCH_LAST; ++commandTypeIdx)
{
@@ -378,7 +386,112 @@
conditionalDrawRootGroup->addChild(new ConditionalDispatchTest(m_testCtx, getDispatchCommandTypeName(command), "", testSpec));
}
- addChild(conditionalDrawRootGroup);
+ addChild(conditionalDrawRootGroup.release());
+ }
+
+ // Tests verifying the condition is interpreted as a 32-bit value.
+ {
+ de::MovePtr<tcu::TestCaseGroup> conditionSizeGroup(new tcu::TestCaseGroup(m_testCtx, "condition_size", "Tests verifying the condition is being read as a 32-bit value"));
+
+ struct ValuePaddingExecution
+ {
+ deUint32 value;
+ bool padding;
+ bool execution;
+ const char* name;
+ };
+
+ const ValuePaddingExecution kConditionValueResults[] =
+ {
+ { 0x00000001u, false, true, "first_byte" },
+ { 0x00000100u, false, true, "second_byte" },
+ { 0x00010000u, false, true, "third_byte" },
+ { 0x01000000u, false, true, "fourth_byte" },
+ { 0u, true, false, "padded_zero" },
+ };
+
+ enum class ConditionSizeSubcaseType
+ {
+ PRIMARY_FLAT = 0,
+ PRIMARY_WITH_SECONDARY,
+ SECONDARY_NORMAL,
+ SECONDARY_INHERITED,
+ };
+
+ struct ConditionSizeSubcase
+ {
+ ConditionSizeSubcaseType type;
+ const char* name;
+ };
+
+ const ConditionSizeSubcase kConditionSizeSubcase[] =
+ {
+ { ConditionSizeSubcaseType::PRIMARY_FLAT, "primary" },
+ { ConditionSizeSubcaseType::PRIMARY_WITH_SECONDARY, "inherited" },
+ { ConditionSizeSubcaseType::SECONDARY_NORMAL, "secondary" },
+ { ConditionSizeSubcaseType::SECONDARY_INHERITED, "secondary_inherited" },
+ };
+
+ for (int subcaseNdx = 0; subcaseNdx < DE_LENGTH_OF_ARRAY(kConditionSizeSubcase); ++subcaseNdx)
+ {
+ const auto& subcase = kConditionSizeSubcase[subcaseNdx];
+
+ de::MovePtr<tcu::TestCaseGroup> subcaseGroup(new tcu::TestCaseGroup(m_testCtx, subcase.name, ""));
+
+ ConditionalData conditionalData = {};
+ conditionalData.conditionInverted = false;
+
+ switch (subcase.type)
+ {
+ case ConditionSizeSubcaseType::PRIMARY_FLAT:
+ conditionalData.conditionInPrimaryCommandBuffer = true;
+ conditionalData.conditionInSecondaryCommandBuffer = false;
+ conditionalData.conditionInherited = false;
+ break;
+
+ case ConditionSizeSubcaseType::PRIMARY_WITH_SECONDARY:
+ conditionalData.conditionInPrimaryCommandBuffer = true;
+ conditionalData.conditionInSecondaryCommandBuffer = false;
+ conditionalData.conditionInherited = true;
+ break;
+
+ case ConditionSizeSubcaseType::SECONDARY_NORMAL:
+ conditionalData.conditionInPrimaryCommandBuffer = false;
+ conditionalData.conditionInSecondaryCommandBuffer = true;
+ conditionalData.conditionInherited = false;
+ break;
+
+ case ConditionSizeSubcaseType::SECONDARY_INHERITED:
+ conditionalData.conditionInPrimaryCommandBuffer = false;
+ conditionalData.conditionInSecondaryCommandBuffer = true;
+ conditionalData.conditionInherited = true;
+ break;
+
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+
+ for (int valueNdx = 0; valueNdx < DE_LENGTH_OF_ARRAY(kConditionValueResults); ++valueNdx)
+ {
+ const auto& valueResults = kConditionValueResults[valueNdx];
+
+ conditionalData.conditionValue = valueResults.value;
+ conditionalData.padConditionValue = valueResults.padding;
+ conditionalData.expectCommandExecution = valueResults.execution;
+
+ ConditionalTestSpec spec;
+ spec.command = DISPATCH_COMMAND_TYPE_DISPATCH;
+ spec.numCalls = 1;
+ spec.conditionalData = conditionalData;
+
+ subcaseGroup->addChild(new ConditionalDispatchTest(m_testCtx, valueResults.name, "", spec));
+ }
+
+ conditionSizeGroup->addChild(subcaseGroup.release());
+ }
+
+ addChild(conditionSizeGroup.release());
}
}
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp
index 40124dd..9113482 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalDrawAndClearTests.cpp
@@ -726,7 +726,8 @@
imageMemoryBarrier(m_testParams.m_testDepth ? m_depthTargetImage->object() : m_colorTargetImage->object(), //VkImage image
VK_ACCESS_TRANSFER_WRITE_BIT, //VkAccessFlags srcAccessMask
- m_testParams.m_testDepth ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags dstAccessMask
+ m_testParams.m_testDepth ? (VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
+ : (VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT), //VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, //VkImageLayout oldLayout
m_testParams.m_testDepth ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, //VkImageLayout newLayout
VK_PIPELINE_STAGE_TRANSFER_BIT, //VkPipelineStageFlags srcStageMask
@@ -763,7 +764,8 @@
}
imageMemoryBarrier(m_testParams.m_testDepth ? m_depthTargetImage->object() : m_colorTargetImage->object(), //VkImage image
- m_testParams.m_testDepth ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT : VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags srcAccessMask
+ m_testParams.m_testDepth ? (VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)
+ : (VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT), //VkAccessFlags dstAccessMask
VK_ACCESS_TRANSFER_READ_BIT, //VkAccessFlags dstAccessMask
m_testParams.m_testDepth ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, //VkImageLayout oldLayout
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, //VkImageLayout newLayout
@@ -792,6 +794,8 @@
submitCommandsAndWait(m_vkd, m_device, m_queue, *m_cmdBufferPrimary);
+ invalidateMappedMemoryRange(m_vkd, m_device, m_resultBuffer->getBoundMemory().getMemory(), m_resultBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
+
tcu::ConstPixelBufferAccess result(mapVkFormat(m_testParams.m_testDepth ? VK_FORMAT_D32_SFLOAT : VK_FORMAT_R8G8B8A8_UNORM), tcu::IVec3(WIDTH, HEIGHT, 1), m_resultBuffer->getBoundMemory().getHostPtr());
std::vector<float> referenceData((m_testParams.m_testDepth ? 1 : 4) * WIDTH * HEIGHT, 0);
@@ -891,7 +895,7 @@
imageMemoryBarrier(m_colorTargetImage->object(), //VkImage image
VK_ACCESS_TRANSFER_WRITE_BIT, //VkAccessFlags srcAccessMask
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags dstAccessMask
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, //VkImageLayout oldLayout
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, //VkImageLayout newLayout
VK_PIPELINE_STAGE_TRANSFER_BIT, //VkPipelineStageFlags srcStageMask
@@ -976,6 +980,8 @@
submitCommandsAndWait(m_vkd, m_device, m_queue, *m_cmdBufferPrimary);
+ invalidateMappedMemoryRange(m_vkd, m_device, m_resultBuffer->getBoundMemory().getMemory(), m_resultBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
+
tcu::ConstPixelBufferAccess result(mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM), tcu::IVec3(WIDTH, HEIGHT, 1), m_resultBuffer->getBoundMemory().getHostPtr());
std::vector<float> referenceData(4 * WIDTH * HEIGHT, 0.5f);
@@ -1214,7 +1220,7 @@
imageMemoryBarrier(m_colorTargetImage->object(), //VkImage image
VK_ACCESS_TRANSFER_WRITE_BIT, //VkAccessFlags srcAccessMask
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags dstAccessMask
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, //VkImageLayout oldLayout
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, //VkImageLayout newLayout
VK_PIPELINE_STAGE_TRANSFER_BIT, //VkPipelineStageFlags srcStageMask
@@ -1228,9 +1234,13 @@
draw();
+ endRenderPass(m_vkd, *m_cmdBufferPrimary);
+
bufferMemoryBarrier(m_conditionalRenderingBuffer->object(), m_conditionalRenderingBufferOffset, sizeof(deUint32), VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT,
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT);
+ beginRenderPass(m_vkd, *m_cmdBufferPrimary, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, WIDTH, HEIGHT));
+
m_vkd.cmdBindPipeline(*m_cmdBufferPrimary, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineDraw);
m_vkd.cmdBindDescriptorSets(*m_cmdBufferPrimary, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0, 1, &(*m_descriptorSet), 0, DE_NULL);
@@ -1241,7 +1251,7 @@
endRenderPass(m_vkd, *m_cmdBufferPrimary);
imageMemoryBarrier(m_colorTargetImage->object(), //VkImage image
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags srcAccessMask
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, //VkAccessFlags srcAccessMask
VK_ACCESS_TRANSFER_READ_BIT, //VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, //VkImageLayout oldLayout
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, //VkImageLayout newLayout
@@ -1259,7 +1269,7 @@
vk::VK_ACCESS_HOST_READ_BIT,
VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_IGNORED,
- m_conditionalRenderingBuffer->object(),
+ m_resultBuffer->object(),
0u,
VK_WHOLE_SIZE
};
@@ -1270,6 +1280,8 @@
submitCommandsAndWait(m_vkd, m_device, m_queue, *m_cmdBufferPrimary);
+ invalidateMappedMemoryRange(m_vkd, m_device, m_resultBuffer->getBoundMemory().getMemory(), m_resultBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
+
tcu::ConstPixelBufferAccess result(mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM), tcu::IVec3(WIDTH, HEIGHT, 1), m_resultBuffer->getBoundMemory().getHostPtr());
std::vector<float> referenceData(4 * WIDTH * HEIGHT, 0.0f);
@@ -1277,8 +1289,6 @@
m_testParams ? prepareReferenceImageOneColor(reference, tcu::Vec4(0,1,0,1)) : prepareReferenceImageOneColor(reference, clearColorInitial);
- invalidateMappedMemoryRange(m_vkd, m_device, m_conditionalRenderingBuffer->getBoundMemory().getMemory(), m_conditionalRenderingBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
-
if (!tcu::floatThresholdCompare(m_context.getTestContext().getLog(), "Comparison", "Comparison", reference, result, tcu::Vec4(0.01f), tcu::COMPARE_LOG_ON_ERROR))
return tcu::TestStatus::fail("Fail");
@@ -1400,6 +1410,26 @@
context.requireDeviceFunctionality("VK_EXT_conditional_rendering");
}
+void checkFan (Context& context)
+{
+ checkSupport(context);
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
+}
+
+void checkFanAndVertexStores (Context& context)
+{
+ checkFan(context);
+
+ const auto& features = context.getDeviceFeatures();
+ if (!features.vertexPipelineStoresAndAtomics)
+ TCU_THROW(NotSupportedError, "Vertex pipeline stores and atomics not supported");
+}
+
} // unnamed namespace
ConditionalRenderingDrawAndClearTests::ConditionalRenderingDrawAndClearTests (tcu::TestContext &testCtx)
@@ -1428,10 +1458,10 @@
depth->addChild(new InstanceFactory1WithSupport<ConditionalRenderingClearAttachmentsTestInstance, ClearTestParams, FunctionSupport0>(m_testCtx, tcu::NODETYPE_SELF_VALIDATE, "clear_attachment_twice_" + generateClearTestName(clearDepthTwiceGrid[testNdx]), "Depth clear test.", clearDepthTwiceGrid[testNdx], checkSupport));
for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(drawTestGrid); testNdx++)
- draw->addChild(new InstanceFactory1WithSupport<ConditionalRenderingDrawTestInstance, DrawTestParams, FunctionSupport0, AddProgramsDraw>(m_testCtx, tcu::NODETYPE_SELF_VALIDATE, "case_" + de::toString(testNdx), "Draw test.", AddProgramsDraw(), drawTestGrid[testNdx], checkSupport));
+ draw->addChild(new InstanceFactory1WithSupport<ConditionalRenderingDrawTestInstance, DrawTestParams, FunctionSupport0, AddProgramsDraw>(m_testCtx, tcu::NODETYPE_SELF_VALIDATE, "case_" + de::toString(testNdx), "Draw test.", AddProgramsDraw(), drawTestGrid[testNdx], checkFan));
- draw->addChild(new InstanceFactory1WithSupport<ConditionalRenderingUpdateBufferWithDrawTestInstance, bool, FunctionSupport0, AddProgramsUpdateBufferUsingRendering>(m_testCtx, tcu::NODETYPE_SELF_VALIDATE, "update_with_rendering_no_discard", "Draw test.", AddProgramsUpdateBufferUsingRendering(), true, checkSupport));
- draw->addChild(new InstanceFactory1WithSupport<ConditionalRenderingUpdateBufferWithDrawTestInstance, bool, FunctionSupport0, AddProgramsUpdateBufferUsingRendering>(m_testCtx, tcu::NODETYPE_SELF_VALIDATE, "update_with_rendering_discard", "Draw test.", AddProgramsUpdateBufferUsingRendering(), false, checkSupport));
+ draw->addChild(new InstanceFactory1WithSupport<ConditionalRenderingUpdateBufferWithDrawTestInstance, bool, FunctionSupport0, AddProgramsUpdateBufferUsingRendering>(m_testCtx, tcu::NODETYPE_SELF_VALIDATE, "update_with_rendering_no_discard", "Draw test.", AddProgramsUpdateBufferUsingRendering(), true, checkFanAndVertexStores));
+ draw->addChild(new InstanceFactory1WithSupport<ConditionalRenderingUpdateBufferWithDrawTestInstance, bool, FunctionSupport0, AddProgramsUpdateBufferUsingRendering>(m_testCtx, tcu::NODETYPE_SELF_VALIDATE, "update_with_rendering_discard", "Draw test.", AddProgramsUpdateBufferUsingRendering(), false, checkFanAndVertexStores));
clear->addChild(color);
clear->addChild(depth);
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp
index 4afc648..8f8d8c6 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.cpp
@@ -33,30 +33,32 @@
void checkConditionalRenderingCapabilities (vkt::Context& context, const ConditionalData& data)
{
- if (!context.isDeviceFunctionalitySupported("VK_EXT_conditional_rendering"))
- TCU_THROW(NotSupportedError, "Missing extension: VK_EXT_conditional_rendering");
+ context.requireDeviceFunctionality("VK_EXT_conditional_rendering");
- if (data.conditionInherited)
- {
- const vk::VkPhysicalDeviceConditionalRenderingFeaturesEXT& conditionalRenderingFeatures = context.getConditionalRenderingFeaturesEXT();
- if (!conditionalRenderingFeatures.inheritedConditionalRendering)
- {
- TCU_THROW(NotSupportedError, "Device does not support inherited conditional rendering");
- }
- }
+ const auto& conditionalRenderingFeatures = context.getConditionalRenderingFeaturesEXT();
+
+ if (conditionalRenderingFeatures.conditionalRendering == VK_FALSE)
+ TCU_FAIL("conditionalRendering feature not supported but VK_EXT_conditional_rendering present");
+
+ if (data.conditionInherited && !conditionalRenderingFeatures.inheritedConditionalRendering)
+ TCU_THROW(NotSupportedError, "Device does not support inherited conditional rendering");
}
de::SharedPtr<Draw::Buffer> createConditionalRenderingBuffer (vkt::Context& context, const ConditionalData& data)
{
- const vk::DeviceInterface& vk = context.getDeviceInterface();
- de::SharedPtr<Draw::Buffer> buffer = Draw::Buffer::createAndAlloc(vk, context.getDevice(),
- Draw::BufferCreateInfo(sizeof(deUint32),
- vk::VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT),
- context.getDefaultAllocator(),
- vk::MemoryRequirement::HostVisible);
+ // When padding the condition value, it will be surounded by two additional values with nonzero bytes in them.
+ const auto bufferSize = static_cast<vk::VkDeviceSize>(sizeof(data.conditionValue)) * (data.padConditionValue ? 3ull : 1ull);
+ const auto dataOffset = static_cast<vk::VkDeviceSize>(data.padConditionValue ? sizeof(data.conditionValue) : 0);
+ const vk::DeviceInterface& vk = context.getDeviceInterface();
+ de::SharedPtr<Draw::Buffer> buffer = Draw::Buffer::createAndAlloc(vk, context.getDevice(),
+ Draw::BufferCreateInfo(bufferSize,
+ vk::VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT),
+ context.getDefaultAllocator(),
+ vk::MemoryRequirement::HostVisible);
- deUint8* conditionBufferPtr = reinterpret_cast<deUint8*>(buffer->getBoundMemory().getHostPtr());
- *(deUint32*)(conditionBufferPtr) = data.conditionValue;
+ deUint8* conditionBufferPtr = reinterpret_cast<deUint8*>(buffer->getBoundMemory().getHostPtr()) + buffer->getBoundMemory().getOffset();
+ deMemset(conditionBufferPtr, 1, static_cast<size_t>(bufferSize));
+ deMemcpy(conditionBufferPtr + dataOffset, &data.conditionValue, sizeof(data.conditionValue));
vk::flushMappedMemoryRange( vk,
context.getDevice(),
@@ -69,11 +71,11 @@
void beginConditionalRendering (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, Draw::Buffer& buffer, const ConditionalData& data)
{
vk::VkConditionalRenderingBeginInfoEXT conditionalRenderingBeginInfo;
- conditionalRenderingBeginInfo.sType = vk::VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT;
- conditionalRenderingBeginInfo.pNext = DE_NULL;
- conditionalRenderingBeginInfo.buffer = buffer.object();
- conditionalRenderingBeginInfo.offset = 0;
- conditionalRenderingBeginInfo.flags = data.conditionInverted ? vk::VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT : 0;
+ conditionalRenderingBeginInfo.sType = vk::VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT;
+ conditionalRenderingBeginInfo.pNext = nullptr;
+ conditionalRenderingBeginInfo.buffer = buffer.object();
+ conditionalRenderingBeginInfo.offset = static_cast<vk::VkDeviceSize>(data.padConditionValue ? sizeof(data.conditionValue) : 0u);
+ conditionalRenderingBeginInfo.flags = data.conditionInverted ? vk::VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT : 0;
vk.cmdBeginConditionalRenderingEXT(cmdBuffer, &conditionalRenderingBeginInfo);
}
@@ -87,7 +89,8 @@
{
str << "_secondary_buffer";
}
- else if (c.conditionInherited)
+
+ if (c.conditionInherited)
{
str << "_inherited";
}
@@ -99,8 +102,13 @@
str << "_inverted";
}
+ if (c.padConditionValue)
+ {
+ str << "_padded";
+ }
+
return str;
}
} // conditional
-} // vkt
\ No newline at end of file
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.hpp b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.hpp
index 45e3739..da159aa 100644
--- a/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.hpp
+++ b/external/vulkancts/modules/vulkan/conditional_rendering/vktConditionalRenderingTestUtil.hpp
@@ -42,32 +42,35 @@
bool conditionInverted;
bool conditionInherited;
deUint32 conditionValue;
+ bool padConditionValue;
bool expectCommandExecution;
};
static const ConditionalData s_testsData[] =
{
-// Primary Secondary Inverted Inherited Val Result
- { true, false, false, false, 1, true },
- { true, false, false, false, 0, false },
- { true, false, true, false, 0, true},
- { true, false, true, false, 1, false },
- { true, false, false, true, 1, true },
- { true, false, false, true, 0, false },
- { true, false, true, true, 0, true },
- { true, false, true, true, 1, false },
+ // CONDPRI CONDSEC INV INH V PAD RES
+ { true, false, false, false, 1, false, true },
+ { true, false, false, false, 0, false, false },
+ { true, false, true, false, 0, false, true },
+ { true, false, true, false, 1, false, false },
+ { true, false, false, true, 1, false, true },
+ { true, false, false, true, 0, false, false },
+ { true, false, true, true, 0, false, true },
+ { true, false, true, true, 1, false, false },
- { false, true, false, false, 1, true },
- { false, true, false, false, 0, false },
- { false, true, true, false, 0, true},
- { false, true, true, false, 1, false },
+ { false, true, false, false, 1, false, true },
+ { false, true, false, false, 0, false, false },
+ { false, true, true, false, 0, false, true },
+ { false, true, true, false, 1, false, false },
- /* Test that commands are executed correctly when secondary command buffer is constructed
- * with conditional rendering enabled but conditional rendering is not enabled when
- * executing it in the primary command buffer.
- */
- { false, false, false, true, 1, true },
+ // Test that inheritance does not affect outcome of secondary command buffer with conditional rendering or not.
+ { false, false, false, true, 0, false, true },
+
+ { false, true, false, true, 1, false, true },
+ { false, true, false, true, 0, false, false },
+ { false, true, true, true, 1, false, false },
+ { false, true, true, true, 0, false, true },
};
std::ostream& operator<< (std::ostream& str, ConditionalData const& c);
diff --git a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
index edb884e..dab2c5e 100644
--- a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
+++ b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.cpp
@@ -122,6 +122,7 @@
bool updateAfterBind; // whether a test will use update after bind feature
bool calculateInLoop; // perform calculation in a loop
bool usesMipMaps; // this makes a sense and affects in image test cases only
+ bool minNonUniform; // whether a test will use the minimum nonUniform decorations
deBool fuzzyComparison; // if true then a test will use fuzzy comparison, otherwise float threshold
float thresholdValue; // a threshold that will be used for both, float and fuzzy comparisons
};
@@ -139,6 +140,7 @@
bool updateAfterBind;
bool calculateInLoop;
bool usesMipMaps;
+ bool minNonUniform;
deBool fuzzyComparison;
float thresholdValue;
@@ -161,6 +163,7 @@
, updateAfterBind (caseParams.updateAfterBind)
, calculateInLoop (caseParams.calculateInLoop)
, usesMipMaps (caseParams.usesMipMaps)
+ , minNonUniform (caseParams.minNonUniform)
, fuzzyComparison (caseParams.fuzzyComparison ? true : false)
, thresholdValue (caseParams.thresholdValue)
{
@@ -266,11 +269,16 @@
static bool performWritesInVertex (VkDescriptorType descriptorType);
static bool performWritesInVertex (VkDescriptorType descriptorType,
- const Context& context);
- static std::string getShaderSource (VkShaderStageFlagBits shaderType,
+ const Context& context);
+
+ static std::string getShaderAsm (VkShaderStageFlagBits shaderType,
const TestCaseParams& testCaseParams,
bool allowVertexStoring);
+ static std::string getShaderSource (VkShaderStageFlagBits shaderType,
+ const TestCaseParams& testCaseParams,
+ bool allowVertexStoring);
+
static std::string getColorAccess (VkDescriptorType descriptorType,
const char* indexVariableName,
bool usesMipMaps);
@@ -736,20 +744,20 @@
if (m_testParams.stageFlags & VK_SHADER_STAGE_COMPUTE_BIT)
{
++result;
- const std::string name = ut::buildShaderName(VK_SHADER_STAGE_COMPUTE_BIT, m_testParams.descriptorType, m_testParams.updateAfterBind, m_testParams.calculateInLoop, false);
+ const std::string name = ut::buildShaderName(VK_SHADER_STAGE_COMPUTE_BIT, m_testParams.descriptorType, m_testParams.updateAfterBind, m_testParams.calculateInLoop, m_testParams.minNonUniform, false);
m_computeModule = vk::createShaderModule(m_vki, m_vkd, m_context.getBinaryCollection().get(name), (VkShaderModuleCreateFlags)0);
}
if (m_testParams.stageFlags & VK_SHADER_STAGE_FRAGMENT_BIT)
{
++result;
- const std::string name = ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testParams.descriptorType, m_testParams.updateAfterBind, m_testParams.calculateInLoop, m_testParams.allowVertexStoring);
+ const std::string name = ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testParams.descriptorType, m_testParams.updateAfterBind, m_testParams.calculateInLoop, m_testParams.minNonUniform, m_testParams.allowVertexStoring);
m_fragmentModule = vk::createShaderModule(m_vki, m_vkd, m_context.getBinaryCollection().get(name), (VkShaderModuleCreateFlags)0);
log << tcu::TestLog::Message << "Finally used fragment shader: " << name << '\n' << tcu::TestLog::EndMessage;
}
if (m_testParams.stageFlags & VK_SHADER_STAGE_VERTEX_BIT)
{
++result;
- const std::string name = ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testParams.descriptorType, m_testParams.updateAfterBind, m_testParams.calculateInLoop, m_testParams.allowVertexStoring);
+ const std::string name = ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testParams.descriptorType, m_testParams.updateAfterBind, m_testParams.calculateInLoop, m_testParams.minNonUniform, m_testParams.allowVertexStoring);
m_vertexModule = vk::createShaderModule(m_vki, m_vkd, m_context.getBinaryCollection().get(name), (VkShaderModuleCreateFlags)0);
log << tcu::TestLog::Message << "Finally used vertex shader: " << name << '\n' << tcu::TestLog::EndMessage;
}
@@ -1275,7 +1283,7 @@
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType
DE_NULL, // const void* pNext
VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout
VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex
@@ -1759,6 +1767,984 @@
return result;
}
+std::string CommonDescriptorInstance::getShaderAsm (VkShaderStageFlagBits shaderType,
+ const TestCaseParams& testCaseParams,
+ bool allowVertexStoring)
+{
+ std::stringstream s;
+ switch (shaderType)
+ {
+ case VK_SHADER_STAGE_VERTEX_BIT:
+ switch (testCaseParams.descriptorType)
+ {
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ s << " OpCapability Shader\n";
+ s << " OpCapability SampledBuffer\n";
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Vertex %main \"main\" %_ %position %in_position %normalpos %in_normalpos %vIndex %gl_VertexIndex %rIndex %index %gIndex %bIndex %aIndex\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpSourceExtension \"GL_EXT_texture_buffer\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %gl_PerVertex \"gl_PerVertex\"\n";
+ s << " OpMemberName %gl_PerVertex 0 \"gl_Position\"\n";
+ s << " OpMemberName %gl_PerVertex 1 \"gl_PointSize\"\n";
+ s << " OpMemberName %gl_PerVertex 2 \"gl_ClipDistance\"\n";
+ s << " OpMemberName %gl_PerVertex 3 \"gl_CullDistance\"\n";
+ s << " OpName %_ \"\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %in_position \"in_position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %in_normalpos \"in_normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gl_VertexIndex \"gl_VertexIndex\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %index \"index\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpMemberDecorate %gl_PerVertex 0 BuiltIn Position\n";
+ s << " OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize\n";
+ s << " OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance\n";
+ s << " OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance\n";
+ s << " OpDecorate %gl_PerVertex Block\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %in_position Location 0\n";
+ s << " OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %in_normalpos Location 1\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gl_VertexIndex BuiltIn VertexIndex\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ s << " OpDecorate %index Location 2\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << " %uint = OpTypeInt 32 0\n";
+ s << " %uint_1 = OpConstant %uint 1\n";
+ s << "%_arr_float_uint_1 = OpTypeArray %float %uint_1\n";
+ s << "%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1\n";
+ s << "%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex\n";
+ s << " %_ = OpVariable %_ptr_Output_gl_PerVertex Output\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << " %int_1 = OpConstant %int 1\n";
+ s << "%float_0_200000003 = OpConstant %float 0.200000003\n";
+ s << "%_ptr_Output_float = OpTypePointer Output %float\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %position = OpVariable %_ptr_Output_v4float Output\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << "%in_position = OpVariable %_ptr_Input_v4float Input\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << "%_ptr_Output_v2float = OpTypePointer Output %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Output_v2float Output\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << "%in_normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %int_0 = OpConstant %int 0\n";
+ s << "%_ptr_Output_int = OpTypePointer Output %int\n";
+ s << " %vIndex = OpVariable %_ptr_Output_int Output\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << "%gl_VertexIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %rIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %v4int = OpTypeVector %int 4\n";
+ s << "%_ptr_Input_v4int = OpTypePointer Input %v4int\n";
+ s << " %index = OpVariable %_ptr_Input_v4int Input\n";
+ s << " %uint_0 = OpConstant %uint 0\n";
+ s << " %gIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %bIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %uint_2 = OpConstant %uint 2\n";
+ s << " %aIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %uint_3 = OpConstant %uint 3\n";
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %18 = OpAccessChain %_ptr_Output_float %_ %int_1\n";
+ s << " OpStore %18 %float_0_200000003\n";
+ s << " %23 = OpLoad %v4float %in_position\n";
+ s << " OpStore %position %23\n";
+ s << " %29 = OpLoad %v2float %in_normalpos\n";
+ s << " OpStore %normalpos %29\n";
+ s << " %31 = OpLoad %v4float %position\n";
+ s << " %32 = OpAccessChain %_ptr_Output_v4float %_ %int_0\n";
+ s << " OpStore %32 %31\n";
+ s << " %37 = OpLoad %int %gl_VertexIndex\n";
+ s << " OpStore %vIndex %37\n";
+ s << " %43 = OpAccessChain %_ptr_Input_int %index %uint_0\n";
+ s << " %44 = OpLoad %int %43\n";
+ s << " OpStore %rIndex %44\n";
+ s << " %46 = OpAccessChain %_ptr_Input_int %index %uint_1\n";
+ s << " %47 = OpLoad %int %46\n";
+ s << " OpStore %gIndex %47\n";
+ s << " %50 = OpAccessChain %_ptr_Input_int %index %uint_2\n";
+ s << " %51 = OpLoad %int %50\n";
+ s << " OpStore %bIndex %51\n";
+ s << " %54 = OpAccessChain %_ptr_Input_int %index %uint_3\n";
+ s << " %55 = OpLoad %int %54\n";
+ s << " OpStore %aIndex %55\n";
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ s << " OpCapability Shader\n";
+ s << " OpCapability ImageBuffer\n";
+ if (allowVertexStoring)
+ {
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability StorageTexelBufferArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ }
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Vertex %main \"main\" %_ %position %in_position %normalpos %in_normalpos %vIndex %gl_VertexIndex %rIndex %index %gIndex %bIndex %aIndex %data\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %gl_PerVertex \"gl_PerVertex\"\n";
+ s << " OpMemberName %gl_PerVertex 0 \"gl_Position\"\n";
+ s << " OpMemberName %gl_PerVertex 1 \"gl_PointSize\"\n";
+ s << " OpMemberName %gl_PerVertex 2 \"gl_ClipDistance\"\n";
+ s << " OpMemberName %gl_PerVertex 3 \"gl_CullDistance\"\n";
+ s << " OpName %_ \"\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %in_position \"in_position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %in_normalpos \"in_normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gl_VertexIndex \"gl_VertexIndex\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %index \"index\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpMemberDecorate %gl_PerVertex 0 BuiltIn Position\n";
+ s << " OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize\n";
+ s << " OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance\n";
+ s << " OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance\n";
+ s << " OpDecorate %gl_PerVertex Block\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %in_position Location 0\n";
+ s << " OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %in_normalpos Location 1\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gl_VertexIndex BuiltIn VertexIndex\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ s << " OpDecorate %index Location 2\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 4\n";
+ if (allowVertexStoring)
+ {
+ // s << " OpDecorate %66 NonUniform\n";
+ // s << " OpDecorate %68 NonUniform\n";
+ s << " OpDecorate %69 NonUniform\n";
+ // s << " OpDecorate %71 NonUniform\n";
+ // s << " OpDecorate %72 NonUniform\n";
+ s << " OpDecorate %73 NonUniform\n";
+ }
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << " %uint = OpTypeInt 32 0\n";
+ s << " %uint_1 = OpConstant %uint 1\n";
+ s << "%_arr_float_uint_1 = OpTypeArray %float %uint_1\n";
+ s << "%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1\n";
+ s << "%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex\n";
+ s << " %_ = OpVariable %_ptr_Output_gl_PerVertex Output\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << " %int_1 = OpConstant %int 1\n";
+ s << "%float_0_200000003 = OpConstant %float 0.200000003\n";
+ s << "%_ptr_Output_float = OpTypePointer Output %float\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %position = OpVariable %_ptr_Output_v4float Output\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << "%in_position = OpVariable %_ptr_Input_v4float Input\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << "%_ptr_Output_v2float = OpTypePointer Output %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Output_v2float Output\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << "%in_normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %int_0 = OpConstant %int 0\n";
+ s << "%_ptr_Output_int = OpTypePointer Output %int\n";
+ s << " %vIndex = OpVariable %_ptr_Output_int Output\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << "%gl_VertexIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %rIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %v4int = OpTypeVector %int 4\n";
+ s << "%_ptr_Input_v4int = OpTypePointer Input %v4int\n";
+ s << " %index = OpVariable %_ptr_Input_v4int Input\n";
+ s << " %uint_0 = OpConstant %uint 0\n";
+ s << " %gIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %bIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %uint_2 = OpConstant %uint 2\n";
+ s << " %aIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %uint_3 = OpConstant %uint 3\n";
+ if (allowVertexStoring)
+ {
+ s << " %bool = OpTypeBool\n";
+ s << " %61 = OpTypeImage %float Buffer 0 0 0 2 Rgba32f\n";
+ s << " %_runtimearr_61 = OpTypeRuntimeArray %61\n";
+ s << " %_ptr_UniformConstant__runtimearr_61 = OpTypePointer UniformConstant %_runtimearr_61\n";
+ s << " %data = OpVariable %_ptr_UniformConstant__runtimearr_61 UniformConstant\n";
+ s << " %_ptr_UniformConstant_61 = OpTypePointer UniformConstant %61\n";
+ }
+ else
+ {
+ s << " %56 = OpTypeImage %float Buffer 0 0 0 2 Rgba32f\n";
+ s << "%_arr_56_uint_1 = OpTypeArray %56 %uint_1\n";
+ s << "%_ptr_UniformConstant__arr_56_uint_1 = OpTypePointer UniformConstant %_arr_56_uint_1\n";
+ s << " %data = OpVariable %_ptr_UniformConstant__arr_56_uint_1 UniformConstant\n";
+ }
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %18 = OpAccessChain %_ptr_Output_float %_ %int_1\n";
+ s << " OpStore %18 %float_0_200000003\n";
+ s << " %23 = OpLoad %v4float %in_position\n";
+ s << " OpStore %position %23\n";
+ s << " %29 = OpLoad %v2float %in_normalpos\n";
+ s << " OpStore %normalpos %29\n";
+ s << " %31 = OpLoad %v4float %position\n";
+ s << " %32 = OpAccessChain %_ptr_Output_v4float %_ %int_0\n";
+ s << " OpStore %32 %31\n";
+ s << " %37 = OpLoad %int %gl_VertexIndex\n";
+ s << " OpStore %vIndex %37\n";
+ s << " %43 = OpAccessChain %_ptr_Input_int %index %uint_0\n";
+ s << " %44 = OpLoad %int %43\n";
+ s << " OpStore %rIndex %44\n";
+ s << " %46 = OpAccessChain %_ptr_Input_int %index %uint_1\n";
+ s << " %47 = OpLoad %int %46\n";
+ s << " OpStore %gIndex %47\n";
+ s << " %50 = OpAccessChain %_ptr_Input_int %index %uint_2\n";
+ s << " %51 = OpLoad %int %50\n";
+ s << " OpStore %bIndex %51\n";
+ s << " %54 = OpAccessChain %_ptr_Input_int %index %uint_3\n";
+ s << " %55 = OpLoad %int %54\n";
+ s << " OpStore %aIndex %55\n";
+ if (allowVertexStoring)
+ {
+ s << " %56 = OpLoad %int %gIndex\n";
+ s << " %58 = OpINotEqual %bool %56 %int_0\n";
+ s << " OpSelectionMerge %60 None\n";
+ s << " OpBranchConditional %58 %59 %60\n";
+ s << " %59 = OpLabel\n";
+ s << " %65 = OpLoad %int %gIndex\n";
+ s << " %66 = OpCopyObject %int %65\n";
+ s << " %68 = OpAccessChain %_ptr_UniformConstant_61 %data %66\n";
+ s << " %69 = OpLoad %61 %68\n";
+ s << " %70 = OpLoad %int %rIndex\n";
+ s << " %71 = OpCopyObject %int %70\n";
+ s << " %72 = OpAccessChain %_ptr_UniformConstant_61 %data %71\n";
+ s << " %73 = OpLoad %61 %72\n";
+ s << " %74 = OpImageRead %v4float %73 %int_0\n";
+ s << " OpImageWrite %69 %int_1 %74\n";
+ s << " OpBranch %60\n";
+ s << " %60 = OpLabel\n";
+ }
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ s << " OpCapability Shader\n";
+ if (allowVertexStoring)
+ {
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability StorageBufferArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ }
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Vertex %main \"main\" %_ %position %in_position %normalpos %in_normalpos %vIndex %gl_VertexIndex %rIndex %index %gIndex %bIndex %aIndex %data\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %gl_PerVertex \"gl_PerVertex\"\n";
+ s << " OpMemberName %gl_PerVertex 0 \"gl_Position\"\n";
+ s << " OpMemberName %gl_PerVertex 1 \"gl_PointSize\"\n";
+ s << " OpMemberName %gl_PerVertex 2 \"gl_ClipDistance\"\n";
+ s << " OpMemberName %gl_PerVertex 3 \"gl_CullDistance\"\n";
+ s << " OpName %_ \"\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %in_position \"in_position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %in_normalpos \"in_normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gl_VertexIndex \"gl_VertexIndex\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %index \"index\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpName %Data \"Data\"\n";
+ s << " OpMemberName %Data 0 \"cnew\"\n";
+ s << " OpMemberName %Data 1 \"cold\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpMemberDecorate %gl_PerVertex 0 BuiltIn Position\n";
+ s << " OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize\n";
+ s << " OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance\n";
+ s << " OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance\n";
+ s << " OpDecorate %gl_PerVertex Block\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %in_position Location 0\n";
+ s << " OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %in_normalpos Location 1\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gl_VertexIndex BuiltIn VertexIndex\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ s << " OpDecorate %index Location 2\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " OpMemberDecorate %Data 0 Offset 0\n";
+ s << " OpMemberDecorate %Data 1 Offset 16\n";
+ s << " OpDecorate %Data Block\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 2\n";
+ if (allowVertexStoring)
+ {
+ // s << " OpDecorate %66 NonUniform\n";
+ // s << " OpDecorate %68 NonUniform\n";
+ s << " OpDecorate %70 NonUniform\n";
+ // s << " OpDecorate %71 NonUniform\n";
+ s << " OpDecorate %72 NonUniform\n";
+ }
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << " %uint = OpTypeInt 32 0\n";
+ s << " %uint_1 = OpConstant %uint 1\n";
+ s << "%_arr_float_uint_1 = OpTypeArray %float %uint_1\n";
+ s << "%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1\n";
+ s << "%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex\n";
+ s << " %_ = OpVariable %_ptr_Output_gl_PerVertex Output\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << " %int_1 = OpConstant %int 1\n";
+ s << "%float_0_200000003 = OpConstant %float 0.200000003\n";
+ s << "%_ptr_Output_float = OpTypePointer Output %float\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %position = OpVariable %_ptr_Output_v4float Output\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << "%in_position = OpVariable %_ptr_Input_v4float Input\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << "%_ptr_Output_v2float = OpTypePointer Output %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Output_v2float Output\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << "%in_normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %int_0 = OpConstant %int 0\n";
+ s << "%_ptr_Output_int = OpTypePointer Output %int\n";
+ s << " %vIndex = OpVariable %_ptr_Output_int Output\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << "%gl_VertexIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %rIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %v4int = OpTypeVector %int 4\n";
+ s << "%_ptr_Input_v4int = OpTypePointer Input %v4int\n";
+ s << " %index = OpVariable %_ptr_Input_v4int Input\n";
+ s << " %uint_0 = OpConstant %uint 0\n";
+ s << " %gIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %bIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %uint_2 = OpConstant %uint 2\n";
+ s << " %aIndex = OpVariable %_ptr_Output_int Output\n";
+ s << " %uint_3 = OpConstant %uint 3\n";
+ s << " %Data = OpTypeStruct %v4float %v4float\n";
+ if (allowVertexStoring)
+ {
+ s << " %bool = OpTypeBool\n";
+ s << "%_runtimearr_Data = OpTypeRuntimeArray %Data\n";
+ s << "%_ptr_StorageBuffer__runtimearr_Data = OpTypePointer StorageBuffer %_runtimearr_Data\n";
+ s << " %data = OpVariable %_ptr_StorageBuffer__runtimearr_Data StorageBuffer\n";
+ s << "%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float\n";
+ }
+ else
+ {
+ s << "%_arr_Data_uint_1 = OpTypeArray %Data %uint_1\n";
+ s << "%_ptr_StorageBuffer__arr_Data_uint_1 = OpTypePointer StorageBuffer %_arr_Data_uint_1\n";
+ s << " %data = OpVariable %_ptr_StorageBuffer__arr_Data_uint_1 StorageBuffer\n";
+ }
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %18 = OpAccessChain %_ptr_Output_float %_ %int_1\n";
+ s << " OpStore %18 %float_0_200000003\n";
+ s << " %23 = OpLoad %v4float %in_position\n";
+ s << " OpStore %position %23\n";
+ s << " %29 = OpLoad %v2float %in_normalpos\n";
+ s << " OpStore %normalpos %29\n";
+ s << " %31 = OpLoad %v4float %position\n";
+ s << " %32 = OpAccessChain %_ptr_Output_v4float %_ %int_0\n";
+ s << " OpStore %32 %31\n";
+ s << " %37 = OpLoad %int %gl_VertexIndex\n";
+ s << " OpStore %vIndex %37\n";
+ s << " %43 = OpAccessChain %_ptr_Input_int %index %uint_0\n";
+ s << " %44 = OpLoad %int %43\n";
+ s << " OpStore %rIndex %44\n";
+ s << " %46 = OpAccessChain %_ptr_Input_int %index %uint_1\n";
+ s << " %47 = OpLoad %int %46\n";
+ s << " OpStore %gIndex %47\n";
+ s << " %50 = OpAccessChain %_ptr_Input_int %index %uint_2\n";
+ s << " %51 = OpLoad %int %50\n";
+ s << " OpStore %bIndex %51\n";
+ s << " %54 = OpAccessChain %_ptr_Input_int %index %uint_3\n";
+ s << " %55 = OpLoad %int %54\n";
+ s << " OpStore %aIndex %55\n";
+ if (allowVertexStoring)
+ {
+ s << " %56 = OpLoad %int %gIndex\n";
+ s << " %58 = OpINotEqual %bool %56 %int_0\n";
+ s << " OpSelectionMerge %60 None\n";
+ s << " OpBranchConditional %58 %59 %60\n";
+ s << " %59 = OpLabel\n";
+ s << " %65 = OpLoad %int %gIndex\n";
+ s << " %66 = OpCopyObject %int %65\n";
+ s << " %67 = OpLoad %int %rIndex\n";
+ s << " %68 = OpCopyObject %int %67\n";
+ s << " %70 = OpAccessChain %_ptr_StorageBuffer_v4float %data %68 %int_1\n";
+ s << " %71 = OpLoad %v4float %70\n";
+ s << " %72 = OpAccessChain %_ptr_StorageBuffer_v4float %data %66 %int_0\n";
+ s << " OpStore %72 %71\n";
+ s << " OpBranch %60\n";
+ s << " %60 = OpLabel\n";
+ }
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ default:
+ TCU_THROW(InternalError, "Unexpected descriptor type");
+ break;
+ }
+ break;
+ case VK_SHADER_STAGE_FRAGMENT_BIT:
+ switch (testCaseParams.descriptorType)
+ {
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ s << " OpCapability Shader\n";
+ if (testCaseParams.usesMipMaps)
+ {
+ s << " OpCapability ImageQuery\n";
+ }
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability SampledImageArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Fragment %main \"main\" %FragColor %data %rIndex %position %normalpos %vIndex %gIndex %bIndex %aIndex\n";
+ s << " OpExecutionMode %main OriginUpperLeft\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpSourceExtension \"GL_EXT_texture_buffer\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %FragColor \"FragColor\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpDecorate %FragColor Location 0\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 7\n";
+ s << " OpDecorate %rIndex Flat\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ // s << " OpDecorate %19 NonUniform\n";
+ // s << " OpDecorate %21 NonUniform\n";
+ s << " OpDecorate %22 NonUniform\n";
+ if (testCaseParams.usesMipMaps)
+ {
+ // s << " OpDecorate %27 NonUniform\n";
+ // s << " OpDecorate %28 NonUniform\n";
+ // s << " OpDecorate %29 NonUniform\n";
+ s << " OpDecorate %30 NonUniform\n";
+ }
+ s << " OpDecorate %position Flat\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %normalpos Flat\n";
+ s << " OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %vIndex Flat\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gIndex Flat\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Flat\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Flat\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %FragColor = OpVariable %_ptr_Output_v4float Output\n";
+ s << " %10 = OpTypeImage %float 2D 0 0 0 1 Unknown\n";
+ s << " %11 = OpTypeSampledImage %10\n";
+ s << "%_runtimearr_11 = OpTypeRuntimeArray %11\n";
+ s << "%_ptr_UniformConstant__runtimearr_11 = OpTypePointer UniformConstant %_runtimearr_11\n";
+ s << " %data = OpVariable %_ptr_UniformConstant__runtimearr_11 UniformConstant\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << " %rIndex = OpVariable %_ptr_Input_int Input\n";
+ s << "%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << " %float_0 = OpConstant %float 0\n";
+ s << " %int_1 = OpConstant %int 1\n";
+ s << " %25 = OpConstantComposite %v2float %float_0 %float_0\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << " %position = OpVariable %_ptr_Input_v4float Input\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %vIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %gIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %bIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %aIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %18 = OpLoad %int %rIndex\n";
+ s << " %19 = OpCopyObject %int %18\n";
+ s << " %21 = OpAccessChain %_ptr_UniformConstant_11 %data %19\n";
+ s << " %22 = OpLoad %11 %21\n";
+ if (testCaseParams.usesMipMaps)
+ {
+ s << " %26 = OpLoad %int %rIndex\n";
+ s << " %27 = OpCopyObject %int %26\n";
+ s << " %28 = OpAccessChain %_ptr_UniformConstant_11 %data %27\n";
+ s << " %29 = OpLoad %11 %28\n";
+ s << " %30 = OpImage %10 %29\n";
+ s << " %31 = OpImageQueryLevels %int %30\n";
+ s << " %33 = OpISub %int %31 %int_1\n";
+ s << " %34 = OpConvertSToF %float %33\n";
+ s << " %35 = OpImageSampleExplicitLod %v4float %22 %25 Lod %34\n";
+ s << " OpStore %FragColor %35\n";
+ }
+ else
+ {
+ s << " %26 = OpImageSampleImplicitLod %v4float %22 %25\n";
+ s << " OpStore %FragColor %26\n";
+ }
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ s << " OpCapability Shader\n";
+ s << " OpCapability SampledBuffer\n";
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability UniformTexelBufferArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Fragment %main \"main\" %FragColor %data %rIndex %position %normalpos %vIndex %gIndex %bIndex %aIndex\n";
+ s << " OpExecutionMode %main OriginUpperLeft\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpSourceExtension \"GL_EXT_texture_buffer\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %FragColor \"FragColor\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpDecorate %FragColor Location 0\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 3\n";
+ s << " OpDecorate %rIndex Flat\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ // s << " OpDecorate %19 NonUniform\n";
+ // s << " OpDecorate %21 NonUniform\n";
+ // s << " OpDecorate %22 NonUniform\n";
+ s << " OpDecorate %24 NonUniform\n";
+ s << " OpDecorate %position Flat\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %normalpos Flat\n";
+ s << " OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %vIndex Flat\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gIndex Flat\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Flat\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Flat\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %FragColor = OpVariable %_ptr_Output_v4float Output\n";
+ s << " %10 = OpTypeImage %float Buffer 0 0 0 1 Unknown\n";
+ s << " %11 = OpTypeSampledImage %10\n";
+ s << "%_runtimearr_11 = OpTypeRuntimeArray %11\n";
+ s << "%_ptr_UniformConstant__runtimearr_11 = OpTypePointer UniformConstant %_runtimearr_11\n";
+ s << " %data = OpVariable %_ptr_UniformConstant__runtimearr_11 UniformConstant\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << " %rIndex = OpVariable %_ptr_Input_int Input\n";
+ s << "%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11\n";
+ s << " %int_0 = OpConstant %int 0\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << " %position = OpVariable %_ptr_Input_v4float Input\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %vIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %gIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %bIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %aIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %18 = OpLoad %int %rIndex\n";
+ s << " %19 = OpCopyObject %int %18\n";
+ s << " %21 = OpAccessChain %_ptr_UniformConstant_11 %data %19\n";
+ s << " %22 = OpLoad %11 %21\n";
+ s << " %24 = OpImage %10 %22\n";
+ s << " %25 = OpImageFetch %v4float %24 %int_0\n";
+ s << " OpStore %FragColor %25\n";
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ s << " OpCapability Shader\n";
+ s << " OpCapability ImageBuffer\n";
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability StorageTexelBufferArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Fragment %main \"main\" %FragColor %data %rIndex %position %normalpos %vIndex %gIndex %bIndex %aIndex\n";
+ s << " OpExecutionMode %main OriginUpperLeft\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %FragColor \"FragColor\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpDecorate %FragColor Location 0\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 4\n";
+ s << " OpDecorate %rIndex Flat\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ // s << " OpDecorate %18 NonUniform\n";
+ // s << " OpDecorate %20 NonUniform\n";
+ s << " OpDecorate %21 NonUniform\n";
+ s << " OpDecorate %position Flat\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %normalpos Flat\n";
+ s << " OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %vIndex Flat\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gIndex Flat\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Flat\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Flat\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %FragColor = OpVariable %_ptr_Output_v4float Output\n";
+ s << " %10 = OpTypeImage %float Buffer 0 0 0 2 Rgba32f\n";
+ s << "%_runtimearr_10 = OpTypeRuntimeArray %10\n";
+ s << "%_ptr_UniformConstant__runtimearr_10 = OpTypePointer UniformConstant %_runtimearr_10\n";
+ s << " %data = OpVariable %_ptr_UniformConstant__runtimearr_10 UniformConstant\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << " %rIndex = OpVariable %_ptr_Input_int Input\n";
+ s << "%_ptr_UniformConstant_10 = OpTypePointer UniformConstant %10\n";
+ s << " %int_0 = OpConstant %int 0\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << " %position = OpVariable %_ptr_Input_v4float Input\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %vIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %gIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %bIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %aIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %17 = OpLoad %int %rIndex\n";
+ s << " %18 = OpCopyObject %int %17\n";
+ s << " %20 = OpAccessChain %_ptr_UniformConstant_10 %data %18\n";
+ s << " %21 = OpLoad %10 %20\n";
+ s << " %23 = OpImageRead %v4float %21 %int_0\n";
+ s << " OpStore %FragColor %23\n";
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+ s << " OpCapability Shader\n";
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability StorageBufferArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Fragment %main \"main\" %FragColor %data %rIndex %position %normalpos %vIndex %gIndex %bIndex %aIndex\n";
+ s << " OpExecutionMode %main OriginUpperLeft\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %FragColor \"FragColor\"\n";
+ s << " OpName %Data \"Data\"\n";
+ s << " OpMemberName %Data 0 \"cnew\"\n";
+ s << " OpMemberName %Data 1 \"cold\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpDecorate %FragColor Location 0\n";
+ s << " OpMemberDecorate %Data 0 Offset 0\n";
+ s << " OpMemberDecorate %Data 1 Offset 16\n";
+ s << " OpDecorate %Data Block\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 2\n";
+ s << " OpDecorate %rIndex Flat\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ // s << " OpDecorate %18 NonUniform\n";
+ s << " OpDecorate %21 NonUniform\n";
+ // s << " OpDecorate %22 NonUniform\n";
+ s << " OpDecorate %position Flat\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %normalpos Flat OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %vIndex Flat\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gIndex Flat\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Flat\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Flat\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %FragColor = OpVariable %_ptr_Output_v4float Output\n";
+ s << " %Data = OpTypeStruct %v4float %v4float\n";
+ s << "%_runtimearr_Data = OpTypeRuntimeArray %Data\n";
+ s << "%_ptr_StorageBuffer__runtimearr_Data = OpTypePointer StorageBuffer %_runtimearr_Data\n";
+ s << " %data = OpVariable %_ptr_StorageBuffer__runtimearr_Data StorageBuffer\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << " %rIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %int_1 = OpConstant %int 1\n";
+ s << "%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << " %position = OpVariable %_ptr_Input_v4float Input\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %vIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %gIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %bIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %aIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %17 = OpLoad %int %rIndex\n";
+ s << " %18 = OpCopyObject %int %17\n";
+ s << " %21 = OpAccessChain %_ptr_StorageBuffer_v4float %data %18 %int_1\n";
+ s << " %22 = OpLoad %v4float %21\n";
+ s << " OpStore %FragColor %22\n";
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ s << " OpCapability Shader\n";
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability UniformBufferArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint Fragment %main \"main\" %FragColor %data %rIndex %position %normalpos %vIndex %gIndex %bIndex %aIndex\n";
+ s << " OpExecutionMode %main OriginUpperLeft\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %FragColor \"FragColor\"\n";
+ s << " OpName %Data \"Data\"\n";
+ s << " OpMemberName %Data 0 \"c\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpName %rIndex \"rIndex\"\n";
+ s << " OpName %position \"position\"\n";
+ s << " OpName %normalpos \"normalpos\"\n";
+ s << " OpName %vIndex \"vIndex\"\n";
+ s << " OpName %gIndex \"gIndex\"\n";
+ s << " OpName %bIndex \"bIndex\"\n";
+ s << " OpName %aIndex \"aIndex\"\n";
+ s << " OpDecorate %FragColor Location 0\n";
+ s << " OpMemberDecorate %Data 0 Offset 0\n";
+ s << " OpDecorate %Data Block\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 1\n";
+ s << " OpDecorate %rIndex Flat\n";
+ s << " OpDecorate %rIndex Location 3\n";
+ // s << " OpDecorate %18 NonUniform\n";
+ s << " OpDecorate %21 NonUniform\n";
+ // s << " OpDecorate %22 NonUniform\n";
+ s << " OpDecorate %position Flat\n";
+ s << " OpDecorate %position Location 0\n";
+ s << " OpDecorate %normalpos Flat\n";
+ s << " OpDecorate %normalpos Location 1\n";
+ s << " OpDecorate %vIndex Flat\n";
+ s << " OpDecorate %vIndex Location 2\n";
+ s << " OpDecorate %gIndex Flat\n";
+ s << " OpDecorate %gIndex Location 4\n";
+ s << " OpDecorate %bIndex Flat\n";
+ s << " OpDecorate %bIndex Location 5\n";
+ s << " OpDecorate %aIndex Flat\n";
+ s << " OpDecorate %aIndex Location 6\n";
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %float = OpTypeFloat 32\n";
+ s << " %v4float = OpTypeVector %float 4\n";
+ s << "%_ptr_Output_v4float = OpTypePointer Output %v4float\n";
+ s << " %FragColor = OpVariable %_ptr_Output_v4float Output\n";
+ s << " %Data = OpTypeStruct %v4float\n";
+ s << "%_runtimearr_Data = OpTypeRuntimeArray %Data\n";
+ s << "%_ptr_Uniform__runtimearr_Data = OpTypePointer Uniform %_runtimearr_Data\n";
+ s << " %data = OpVariable %_ptr_Uniform__runtimearr_Data Uniform\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << "%_ptr_Input_int = OpTypePointer Input %int\n";
+ s << " %rIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %int_0 = OpConstant %int 0\n";
+ s << "%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float\n";
+ s << "%_ptr_Input_v4float = OpTypePointer Input %v4float\n";
+ s << " %position = OpVariable %_ptr_Input_v4float Input\n";
+ s << " %v2float = OpTypeVector %float 2\n";
+ s << "%_ptr_Input_v2float = OpTypePointer Input %v2float\n";
+ s << " %normalpos = OpVariable %_ptr_Input_v2float Input\n";
+ s << " %vIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %gIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %bIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %aIndex = OpVariable %_ptr_Input_int Input\n";
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %17 = OpLoad %int %rIndex\n";
+ s << " %18 = OpCopyObject %int %17\n";
+ s << " %21 = OpAccessChain %_ptr_Uniform_v4float %data %18 %int_0\n";
+ s << " %22 = OpLoad %v4float %21\n";
+ s << " OpStore %FragColor %22\n";
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ default:
+ TCU_THROW(InternalError, "Unexpected descriptor type");
+ break;
+ }
+ break;
+ case VK_SHADER_STAGE_COMPUTE_BIT:
+ switch (testCaseParams.descriptorType)
+ {
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ s << " OpCapability Shader\n";
+ s << " OpCapability ShaderNonUniform\n";
+ s << " OpCapability RuntimeDescriptorArray\n";
+ s << " OpCapability StorageImageArrayNonUniformIndexing\n";
+ s << " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ s << " %1 = OpExtInstImport \"GLSL.std.450\"\n";
+ s << " OpMemoryModel Logical GLSL450\n";
+ s << " OpEntryPoint GLCompute %main \"main\" %idxs %gl_WorkGroupID %data\n";
+ s << " OpExecutionMode %main LocalSize 1 1 1\n";
+ s << " OpSource GLSL 450\n";
+ s << " OpSourceExtension \"GL_EXT_nonuniform_qualifier\"\n";
+ s << " OpName %main \"main\"\n";
+ s << " OpName %c \"c\"\n";
+ s << " OpName %idxs \"idxs\"\n";
+ s << " OpName %gl_WorkGroupID \"gl_WorkGroupID\"\n";
+ s << " OpName %data \"data\"\n";
+ s << " OpDecorate %idxs DescriptorSet 0\n";
+ s << " OpDecorate %idxs Binding 12\n";
+ s << " OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId\n";
+ s << " OpDecorate %data DescriptorSet 0\n";
+ s << " OpDecorate %data Binding 11\n";
+ // s << " OpDecorate %36 NonUniform\n";
+ // s << " OpDecorate %37 NonUniform\n";
+ s << " OpDecorate %41 NonUniform\n";
+ s << " OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n";
+ s << " %void = OpTypeVoid\n";
+ s << " %3 = OpTypeFunction %void\n";
+ s << " %uint = OpTypeInt 32 0\n";
+ s << " %v4uint = OpTypeVector %uint 4\n";
+ s << "%_ptr_Function_v4uint = OpTypePointer Function %v4uint\n";
+ s << " %10 = OpTypeImage %uint 2D 0 0 0 2 R32ui\n";
+ s << "%_ptr_UniformConstant_10 = OpTypePointer UniformConstant %10\n";
+ s << " %idxs = OpVariable %_ptr_UniformConstant_10 UniformConstant\n";
+ s << " %v3uint = OpTypeVector %uint 3\n";
+ s << "%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n";
+ s << "%gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input\n";
+ s << " %uint_0 = OpConstant %uint 0\n";
+ s << "%_ptr_Input_uint = OpTypePointer Input %uint\n";
+ s << " %int = OpTypeInt 32 1\n";
+ s << " %uint_1 = OpConstant %uint 1\n";
+ s << " %v2int = OpTypeVector %int 2\n";
+ s << "%_runtimearr_10 = OpTypeRuntimeArray %10\n";
+ s << "%_ptr_UniformConstant__runtimearr_10 = OpTypePointer UniformConstant %_runtimearr_10\n";
+ s << " %data = OpVariable %_ptr_UniformConstant__runtimearr_10 UniformConstant\n";
+ s << "%_ptr_Function_uint = OpTypePointer Function %uint\n";
+ s << " %int_0 = OpConstant %int 0\n";
+ s << " %39 = OpConstantComposite %v2int %int_0 %int_0\n";
+ s << "%_ptr_Image_uint = OpTypePointer Image %uint\n";
+ s << "%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1\n";
+ s << " %main = OpFunction %void None %3\n";
+ s << " %5 = OpLabel\n";
+ s << " %c = OpVariable %_ptr_Function_v4uint Function\n";
+ s << " %13 = OpLoad %10 %idxs\n";
+ s << " %19 = OpAccessChain %_ptr_Input_uint %gl_WorkGroupID %uint_0\n";
+ s << " %20 = OpLoad %uint %19\n";
+ s << " %22 = OpBitcast %int %20\n";
+ s << " %24 = OpAccessChain %_ptr_Input_uint %gl_WorkGroupID %uint_1\n";
+ s << " %25 = OpLoad %uint %24\n";
+ s << " %26 = OpBitcast %int %25\n";
+ s << " %28 = OpCompositeConstruct %v2int %22 %26\n";
+ s << " %29 = OpImageRead %v4uint %13 %28 ZeroExtend\n";
+ s << " OpStore %c %29\n";
+ s << " %34 = OpAccessChain %_ptr_Function_uint %c %uint_0\n";
+ s << " %35 = OpLoad %uint %34\n";
+ s << " %36 = OpCopyObject %uint %35\n";
+ s << " %37 = OpAccessChain %_ptr_UniformConstant_10 %data %36\n";
+ s << " %41 = OpImageTexelPointer %_ptr_Image_uint %37 %39 %uint_0\n";
+ s << " %42 = OpAtomicIAdd %uint %41 %uint_1 %uint_0 %uint_1\n";
+ s << " OpReturn\n";
+ s << " OpFunctionEnd\n";
+ break;
+ default:
+ TCU_THROW(InternalError, "Unexpected descriptor type");
+ break;
+ }
+ break;
+ default:
+ TCU_THROW(InternalError, "Unexpected stage");
+ break;
+ }
+
+ return s.str();
+}
+
std::string CommonDescriptorInstance::getShaderSource (VkShaderStageFlagBits shaderType,
const TestCaseParams& testCaseParams,
bool allowVertexStoring)
@@ -3192,40 +4178,88 @@
}
}
+ void initAsmPrograms(SourceCollections& programCollection) const
+ {
+
+ std::string(*genShaderSource)(VkShaderStageFlagBits, const TestCaseParams&, bool) = &CommonDescriptorInstance::getShaderAsm;
+
+ deUint32 vulkan_version = VK_MAKE_VERSION(1, 2, 0);
+ vk::SpirvVersion spirv_version = vk::SPIRV_VERSION_1_4;
+ vk::SpirVAsmBuildOptions asm_options(vulkan_version, spirv_version);
+
+ if (VK_SHADER_STAGE_VERTEX_BIT & m_testCaseParams.stageFlags)
+ {
+ programCollection.spirvAsmSources.add(
+ ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, false), &asm_options)
+ << (*genShaderSource)(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams, false);
+
+ if (CommonDescriptorInstance::performWritesInVertex(m_testCaseParams.descriptorType))
+ {
+ programCollection.spirvAsmSources.add(
+ ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, true), &asm_options)
+ << (*genShaderSource)(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams, true);
+ }
+ }
+ if (VK_SHADER_STAGE_FRAGMENT_BIT & m_testCaseParams.stageFlags)
+ {
+ programCollection.spirvAsmSources.add(
+ ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, false), &asm_options)
+ << (*genShaderSource)(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams, false);
+
+ if (CommonDescriptorInstance::performWritesInVertex(m_testCaseParams.descriptorType))
+ {
+ programCollection.spirvAsmSources.add(
+ ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, true), &asm_options)
+ << (*genShaderSource)(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams, true);
+ }
+ }
+ if (VK_SHADER_STAGE_COMPUTE_BIT & m_testCaseParams.stageFlags)
+ {
+ programCollection.spirvAsmSources.add(
+ ut::buildShaderName(VK_SHADER_STAGE_COMPUTE_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, false), &asm_options)
+ << (*genShaderSource)(VK_SHADER_STAGE_COMPUTE_BIT, m_testCaseParams, false);
+ }
+ }
+
virtual void initPrograms (SourceCollections& programCollection) const
{
+ if (m_testCaseParams.minNonUniform) {
+ initAsmPrograms(programCollection);
+ return;
+ }
+
std::string(*genShaderSource)(VkShaderStageFlagBits, const TestCaseParams&, bool) = &CommonDescriptorInstance::getShaderSource;
if (VK_SHADER_STAGE_VERTEX_BIT & m_testCaseParams.stageFlags)
{
programCollection.glslSources.add(
- ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, false))
+ ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, false))
<< glu::VertexSource((*genShaderSource)(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams, false));
if (CommonDescriptorInstance::performWritesInVertex(m_testCaseParams.descriptorType))
{
programCollection.glslSources.add(
- ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, true))
+ ut::buildShaderName(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, true))
<< glu::VertexSource((*genShaderSource)(VK_SHADER_STAGE_VERTEX_BIT, m_testCaseParams, true));
}
}
if (VK_SHADER_STAGE_FRAGMENT_BIT & m_testCaseParams.stageFlags)
{
programCollection.glslSources.add(
- ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, false))
+ ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, false))
<< glu::FragmentSource((*genShaderSource)(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams, false));
if (CommonDescriptorInstance::performWritesInVertex(m_testCaseParams.descriptorType))
{
programCollection.glslSources.add(
- ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, true))
+ ut::buildShaderName(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, true))
<< glu::FragmentSource((*genShaderSource)(VK_SHADER_STAGE_FRAGMENT_BIT, m_testCaseParams, true));
}
}
if (VK_SHADER_STAGE_COMPUTE_BIT & m_testCaseParams.stageFlags)
{
programCollection.glslSources.add(
- ut::buildShaderName(VK_SHADER_STAGE_COMPUTE_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, false))
+ ut::buildShaderName(VK_SHADER_STAGE_COMPUTE_BIT, m_testCaseParams.descriptorType, m_testCaseParams.updateAfterBind, m_testCaseParams.calculateInLoop, m_testCaseParams.minNonUniform, false))
<< glu::ComputeSource((*genShaderSource)(VK_SHADER_STAGE_COMPUTE_BIT, m_testCaseParams, false));
}
}
@@ -3255,6 +4289,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // useMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3267,6 +4302,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // useMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3279,6 +4315,7 @@
false, // updateAfterBind,
false, // calculateInLoop
false, // usesMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3291,6 +4328,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // useMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3332,6 +4370,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // usesMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3344,6 +4383,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // usesMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3356,6 +4396,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // usesMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3403,6 +4444,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // usesMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3415,6 +4457,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // useMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3427,6 +4470,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // useMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3439,6 +4483,7 @@
false, // updateAfterBind
false, // calculateInLoop
false, // useMipMaps
+ false, // minNonUniform
FUZZY_COMPARE, CMP_THRESHOLD
}
},
@@ -3462,6 +4507,124 @@
group->addChild(new DescriptorIndexingTestCase(context, caseName.c_str(), caseDescription.c_str(), params));
}
}
+
+ // SPIR-V Asm Tests
+ // Tests that have the minimum necessary NonUniform decorations.
+ // sampler and sampled_image GLSL already have minimum NonUniform decorations.
+
+ TestCaseInfo casesMinNonUniform[] =
+ {
+ {
+ "storage_buffer", "Regular Storage Buffer Descriptors",
+ {
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+ (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT),
+ RESOLUTION,
+ false, // updateAfterBind
+ false, // calculateInLoop
+ false, // useMipMaps
+ true, // minNonUniform
+ FUZZY_COMPARE, CMP_THRESHOLD
+ }
+ },
+ {
+ "storage_texel_buffer", "Storage Texel Buffer Descriptors",
+ {
+ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
+ (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT),
+ RESOLUTION,
+ false, // updateAfterBind
+ false, // calculateInLoop
+ false, // useMipMaps
+ true, // minNonUniform
+ FUZZY_COMPARE, CMP_THRESHOLD
+ }
+ },
+ {
+ "uniform_texel_buffer", "Uniform Texel Buffer Descriptors",
+ {
+ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
+ (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT),
+ RESOLUTION,
+ false, // updateAfterBind,
+ false, // calculateInLoop
+ false, // usesMipMaps
+ true, // minNonUniform
+ FUZZY_COMPARE, CMP_THRESHOLD
+ }
+ },
+ {
+ "uniform_buffer", "Regular Uniform Buffer Descriptors",
+ {
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+ (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT),
+ RESOLUTION,
+ false, // updateAfterBind
+ false, // calculateInLoop
+ false, // usesMipMaps
+ true, // minNonUniform
+ FUZZY_COMPARE, CMP_THRESHOLD
+ }
+ },
+ {
+ "combined_image_sampler", "Combined Image Sampler Descriptors",
+ {
+ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT),
+ RESOLUTION,
+ false, // updateAfterBind
+ false, // calculateInLoop
+ false, // usesMipMaps
+ true, // minNonUniform
+ FUZZY_COMPARE, CMP_THRESHOLD
+ }
+ },
+ {
+ "combined_image_sampler", "Combined Image Sampler Descriptors",
+ {
+ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT),
+ RESOLUTION,
+ false, // updateAfterBind
+ false, // calculateInLoop
+ true, // usesMipMaps
+ true, // minNonUniform
+ FUZZY_COMPARE, CMP_THRESHOLD
+ }
+ },
+ {
+ "storage_image", "Storage Image Descriptors",
+ {
+ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+ VK_SHADER_STAGE_COMPUTE_BIT,
+ RESOLUTION,
+ false, // updateAfterBind
+ false, // calculateInLoop
+ false, // useMipMaps
+ true, // minNonUniform
+ FUZZY_COMPARE, CMP_THRESHOLD
+ }
+ },
+ };
+
+ for (deUint32 caseIdx = 0; caseIdx < DE_LENGTH_OF_ARRAY(casesMinNonUniform); ++caseIdx)
+ {
+ TestCaseInfo& info(casesMinNonUniform[caseIdx]);
+ std::string caseName(info.name);
+ std::string caseDescription(info.description);
+ TestCaseParams params(info.params);
+
+ if (params.usesMipMaps) {
+ caseName += "_with_lod";
+ }
+ caseName += "_minNonUniform";
+
+ caseDescription += " With Minimum NonUniform Decorations";
+
+ TestCase* tc = new DescriptorIndexingTestCase(context, caseName.c_str(), caseDescription.c_str(), params);
+ group->addChild(tc);
+ // group->addChild(new DescriptorIndexingTestCase(context, caseName.c_str(), caseDescription.c_str(), params));
+ }
}
} // - DescriptorIndexing
diff --git a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp
index 27b7e82..aa92e0e 100644
--- a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp
+++ b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTests.hpp
@@ -120,6 +120,7 @@
VkDescriptorType descriptorType,
deBool updateAfterBind,
bool calculateInLoop,
+ bool minNonUniform,
bool performWritesInVertex);
std::vector<deUint32> generatePrimes (deUint32 limit);
diff --git a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp
index c8c459c..1af4103 100644
--- a/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp
+++ b/external/vulkancts/modules/vulkan/descriptor_indexing/vktDescriptorSetsIndexingTestsUtils.cpp
@@ -75,6 +75,7 @@
VkDescriptorType descriptorType,
deBool updateAfterBind,
bool calculateInLoop,
+ bool minNonUniform,
bool performWritesInVertex)
{
const char* stageName = DE_NULL;
@@ -95,9 +96,10 @@
m["DESC"] = de::toString(deUint32(descriptorType));
m["ABIND"] = updateAfterBind ? "_afterBind" : "";
m["LOOP"] = calculateInLoop ? "_inLoop" : "";
+ m["MINNU"] = minNonUniform ? "_minNonUniform" : "";
m["SHWR"] = performWritesInVertex ? "_shaderWrites" : "";
- return tcu::StringTemplate("descriptorIndexing_${STAGE}${DESC}${ABIND}${LOOP}${SHWR}").specialize(m);
+ return tcu::StringTemplate("descriptorIndexing_${STAGE}${DESC}${ABIND}${LOOP}${MINNU}${SHWR}").specialize(m);
}
std::vector<deUint32> generatePrimes (deUint32 limit)
diff --git a/external/vulkancts/modules/vulkan/draw/CMakeLists.txt b/external/vulkancts/modules/vulkan/draw/CMakeLists.txt
index 7061f5c..baeda9b 100644
--- a/external/vulkancts/modules/vulkan/draw/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/draw/CMakeLists.txt
@@ -48,6 +48,10 @@
vktDrawOutputLocationTests.hpp
vktDrawDepthClampTests.cpp
vktDrawDepthClampTests.hpp
+ vktDrawAhbTests.cpp
+ vktDrawAhbTests.hpp
+ vktDrawMultipleClearsWithinRenderPass.cpp
+ vktDrawMultipleClearsWithinRenderPass.hpp
)
set(DEQP_VK_DRAW_LIBS
diff --git a/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp b/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp
index 120235d..a894ab2 100644
--- a/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktBasicDrawTests.cpp
@@ -578,6 +578,13 @@
{
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
}
+
+ if (m_data.topology == vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
}
template<typename T>
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawAhbTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawAhbTests.cpp
new file mode 100644
index 0000000..47752a3
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawAhbTests.cpp
@@ -0,0 +1,663 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Google LLC
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ *
+ * 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 Android Hardware Buffer Draw Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktDrawAhbTests.hpp"
+
+#include "vktDrawBaseClass.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vktTestGroupUtil.hpp"
+
+#include "../util/vktExternalMemoryUtil.hpp"
+
+#include "deDefs.h"
+#include "deRandom.hpp"
+
+#include "tcuTestCase.hpp"
+#include "tcuTextureUtil.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuVectorUtil.hpp"
+#include "tcuTestLog.hpp"
+
+#include "rrRenderer.hpp"
+
+#include <string>
+
+using namespace vkt::ExternalMemoryUtil;
+using namespace vk;
+using std::vector;
+
+namespace vkt
+{
+namespace Draw
+{
+namespace
+{
+
+const deUint32 SEED = 0xc2a39fu;
+
+struct DrawParams
+{
+ DrawParams (deUint32 numVertices, deUint32 numLayers)
+ : m_numVertices(numVertices), m_numLayers(numLayers) {}
+
+ deUint32 m_numVertices;
+ deUint32 m_numLayers;
+ vector<PositionColorVertex> m_vertices;
+};
+
+// Reference renderer shaders
+class PassthruVertShader : public rr::VertexShader
+{
+public:
+ PassthruVertShader (void)
+ : rr::VertexShader (2, 1)
+ {
+ m_inputs[0].type = rr::GENERICVECTYPE_FLOAT;
+ m_inputs[1].type = rr::GENERICVECTYPE_FLOAT;
+ m_outputs[0].type = rr::GENERICVECTYPE_FLOAT;
+ }
+
+ void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const
+ {
+ for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
+ {
+ packets[packetNdx]->position = rr::readVertexAttribFloat(inputs[0],
+ packets[packetNdx]->instanceNdx,
+ packets[packetNdx]->vertexNdx);
+
+ tcu::Vec4 color = rr::readVertexAttribFloat(inputs[1],
+ packets[packetNdx]->instanceNdx,
+ packets[packetNdx]->vertexNdx);
+
+ packets[packetNdx]->outputs[0] = color;
+ }
+ }
+};
+
+class PassthruFragShader : public rr::FragmentShader
+{
+public:
+ PassthruFragShader (void)
+ : rr::FragmentShader(1, 1)
+ {
+ m_inputs[0].type = rr::GENERICVECTYPE_FLOAT;
+ m_outputs[0].type = rr::GENERICVECTYPE_FLOAT;
+ }
+
+ void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const
+ {
+ for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
+ {
+ rr::FragmentPacket& packet = packets[packetNdx];
+ for (deUint32 fragNdx = 0; fragNdx < rr::NUM_FRAGMENTS_PER_PACKET; ++fragNdx)
+ {
+ tcu::Vec4 color = rr::readVarying<float>(packet, context, 0, fragNdx);
+ rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
+ }
+ }
+ }
+};
+
+class AhbTestInstance : public TestInstance
+{
+public:
+ AhbTestInstance (Context& context, DrawParams data);
+ ~AhbTestInstance (void);
+
+ tcu::TestStatus iterate (void);
+
+private:
+ void generateDrawData (void);
+ void generateRefImage (const tcu::PixelBufferAccess& access, const vector<tcu::Vec4>& vertices, const vector<tcu::Vec4>& colors) const;
+
+ DrawParams m_data;
+
+ enum
+ {
+ WIDTH = 256,
+ HEIGHT = 256
+ };
+};
+
+AhbTestInstance::AhbTestInstance (Context& context, DrawParams data)
+ : vkt::TestInstance (context)
+ , m_data (data)
+{
+ generateDrawData();
+}
+
+AhbTestInstance::~AhbTestInstance (void)
+{
+}
+
+void AhbTestInstance::generateRefImage (const tcu::PixelBufferAccess& access, const vector<tcu::Vec4>& vertices, const vector<tcu::Vec4>& colors) const
+{
+ const PassthruVertShader vertShader;
+ const PassthruFragShader fragShader;
+ const rr::Program program (&vertShader, &fragShader);
+ const rr::MultisamplePixelBufferAccess colorBuffer = rr::MultisamplePixelBufferAccess::fromSinglesampleAccess(access);
+ const rr::RenderTarget renderTarget (colorBuffer);
+ const rr::RenderState renderState ((rr::ViewportState(colorBuffer)), m_context.getDeviceProperties().limits.subPixelPrecisionBits);
+ const rr::Renderer renderer;
+
+ const rr::VertexAttrib vertexAttribs[] =
+ {
+ rr::VertexAttrib(rr::VERTEXATTRIBTYPE_FLOAT, 4, sizeof(tcu::Vec4), 0, &vertices[0]),
+ rr::VertexAttrib(rr::VERTEXATTRIBTYPE_FLOAT, 4, sizeof(tcu::Vec4), 0, &colors[0])
+ };
+
+ renderer.draw(rr::DrawCommand(renderState, renderTarget, program, DE_LENGTH_OF_ARRAY(vertexAttribs),
+ &vertexAttribs[0], rr::PrimitiveList(rr::PRIMITIVETYPE_TRIANGLES, (deUint32)vertices.size(), 0)));
+}
+
+class AhbTestCase : public TestCase
+{
+ public:
+ AhbTestCase (tcu::TestContext& context, const char* name, const char* desc, const DrawParams data);
+ ~AhbTestCase (void);
+ virtual void initPrograms (SourceCollections& programCollection) const;
+ virtual void initShaderSources (void);
+ virtual void checkSupport (Context& context) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+private:
+ DrawParams m_data;
+ std::string m_vertShaderSource;
+ std::string m_fragShaderSource;
+};
+
+AhbTestCase::AhbTestCase (tcu::TestContext& context, const char* name, const char* desc, const DrawParams data)
+ : vkt::TestCase (context, name, desc)
+ , m_data (data)
+{
+ initShaderSources();
+}
+
+AhbTestCase::~AhbTestCase (void)
+{
+}
+
+void AhbTestCase::initPrograms (SourceCollections& programCollection) const
+{
+ programCollection.glslSources.add("vert") << glu::VertexSource(m_vertShaderSource);
+ programCollection.glslSources.add("frag") << glu::FragmentSource(m_fragShaderSource);
+}
+
+void AhbTestCase::checkSupport (Context& context) const
+{
+ const InstanceInterface& vki = context.getInstanceInterface();
+ vk::VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
+ const vk::VkPhysicalDeviceProperties properties = vk::getPhysicalDeviceProperties(vki, physicalDevice);
+
+ // Each layer is exposed as its own color attachment.
+ if (m_data.m_numLayers > properties.limits.maxColorAttachments)
+ TCU_THROW(NotSupportedError, "Required number of color attachments not supported.");
+}
+
+void AhbTestCase::initShaderSources (void)
+{
+ std::stringstream vertShader;
+ vertShader << "#version 430\n"
+ << "layout(location = 0) in vec4 in_position;\n"
+ << "layout(location = 1) in vec4 in_color;\n"
+ << "layout(location = 0) out vec4 out_color;\n"
+
+ << "void main() {\n"
+ << " gl_Position = in_position;\n"
+ << " out_color = in_color;\n"
+ << "}\n";
+
+ m_vertShaderSource = vertShader.str();
+
+ std::stringstream fragShader;
+ fragShader << "#version 430\n"
+ << "layout(location = 0) in vec4 in_color;\n"
+ << "layout(location = 0) out vec4 out_color;\n"
+
+ << "void main()\n"
+ << "{\n"
+ << " out_color = in_color;\n"
+ << "}\n";
+
+ m_fragShaderSource = fragShader.str();
+}
+
+TestInstance* AhbTestCase::createInstance (Context& context) const
+{
+ return new AhbTestInstance(context, m_data);
+}
+
+void AhbTestInstance::generateDrawData (void)
+{
+ de::Random rnd (SEED ^ m_data.m_numLayers ^ m_data.m_numVertices);
+
+ for (deUint32 i = 0; i < m_data.m_numVertices; i++)
+ {
+ const float f0 = rnd.getFloat(-1.0f, 1.0f);
+ const float f1 = rnd.getFloat(-1.0f, 1.0f);
+
+ m_data.m_vertices.push_back(PositionColorVertex(
+ tcu::Vec4(f0, f1, 1.0f, 1.0f), // Coord
+ tcu::randomVec4(rnd))); // Color
+ }
+}
+
+tcu::TestStatus AhbTestInstance::iterate (void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkFormat colorAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM;
+ tcu::TestLog &log = m_context.getTestContext().getLog();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const VkDevice device = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const PipelineLayoutCreateInfo pipelineLayoutCreateInfo;
+ const Unique<VkPipelineLayout> pipelineLayout (createPipelineLayout(vk, device, &pipelineLayoutCreateInfo));
+ vector<Move<VkBuffer>> resultBuffers;
+ vector<de::MovePtr<Allocation>> resultBufferAllocations;
+
+ for (deUint32 i = 0u; i < m_data.m_numLayers; i++)
+ {
+ const VkBufferUsageFlags bufferUsage (VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ const VkDeviceSize pixelSize = mapVkFormat(colorAttachmentFormat).getPixelSize();
+ const VkBufferCreateInfo createInfo =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkBufferCreateFlags flags
+ WIDTH * HEIGHT * pixelSize, // VkDeviceSize size
+ bufferUsage, // VkBufferUsageFlags usage
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode
+ 0u, // uint32_t queueFamilyIndexCount
+ DE_NULL // const uint32_t* pQueueFamilyIndices
+ };
+
+ resultBuffers.push_back(createBuffer(vk, device, &createInfo));
+ resultBufferAllocations.push_back(m_context.getDefaultAllocator().allocate(getBufferMemoryRequirements(vk, device, *resultBuffers.back()), MemoryRequirement::HostVisible));
+ VK_CHECK(vk.bindBufferMemory(device, *resultBuffers.back(), resultBufferAllocations.back()->getMemory(), resultBufferAllocations.back()->getOffset()));
+ }
+
+ const VkExtent3D targetImageExtent = { WIDTH, HEIGHT, 1 };
+ const ImageCreateInfo targetImageCreateInfo (VK_IMAGE_TYPE_2D, colorAttachmentFormat, targetImageExtent, 1, m_data.m_numLayers, VK_SAMPLE_COUNT_1_BIT,
+ VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+
+ // Enable this to use non-AHB images for color output.
+#if 0
+ const Unique<VkImage> colorTargetImage (createImage(vk, device, &targetImageCreateInfo, DE_NULL));
+ de::MovePtr<Allocation> m_colorImageAllocation = m_context.getDefaultAllocator().allocate(getImageMemoryRequirements(vk, device, *colorTargetImage), MemoryRequirement::Any);
+ VK_CHECK(vk.bindImageMemory(device, *colorTargetImage, m_colorImageAllocation->getMemory(), m_colorImageAllocation->getOffset()));
+#else
+ AndroidHardwareBufferExternalApi* ahbApi = AndroidHardwareBufferExternalApi::getInstance();
+
+ if (!ahbApi)
+ TCU_THROW(NotSupportedError, "Android Hardware Buffer not supported");
+
+ m_context.requireDeviceFunctionality("VK_ANDROID_external_memory_android_hardware_buffer");
+
+ deUint64 requiredAhbUsage = ahbApi->vkUsageToAhbUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+
+ pt::AndroidHardwareBufferPtr ahb = ahbApi->allocate(WIDTH, HEIGHT, targetImageCreateInfo.arrayLayers, ahbApi->vkFormatToAhbFormat(colorAttachmentFormat), requiredAhbUsage);
+
+ if (ahb.internal == DE_NULL)
+ TCU_THROW(NotSupportedError, "Required number of layers for Android Hardware Buffer not supported");
+
+ NativeHandle nativeHandle(ahb);
+ const Unique<VkImage> colorTargetImage (createExternalImage(vk, device, queueFamilyIndex, VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,
+ colorAttachmentFormat, WIDTH, HEIGHT, VK_IMAGE_TILING_OPTIMAL, 0u,
+ targetImageCreateInfo.usage, targetImageCreateInfo.mipLevels, targetImageCreateInfo.arrayLayers));
+
+ deUint32 ahbFormat = 0;
+ ahbApi->describe(nativeHandle.getAndroidHardwareBuffer(), DE_NULL, DE_NULL, DE_NULL, &ahbFormat, DE_NULL, DE_NULL);
+
+ VkAndroidHardwareBufferPropertiesANDROID ahbProperties =
+ {
+ VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID, // VkStructureType sType
+ DE_NULL, // void* pNext
+ 0u, // VkDeviceSize allocationSize
+ 0u // uint32_t memoryTypeBits
+ };
+
+ vk.getAndroidHardwareBufferPropertiesANDROID(device, nativeHandle.getAndroidHardwareBuffer(), &ahbProperties);
+
+ const VkImportAndroidHardwareBufferInfoANDROID importInfo =
+ {
+ VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ nativeHandle.getAndroidHardwareBuffer() // struct AHardwareBuffer* buffer
+ };
+
+ const VkMemoryDedicatedAllocateInfo dedicatedInfo =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, // VkStructureType sType
+ &importInfo, // const void* pNext
+ *colorTargetImage, // VkImage image
+ DE_NULL, // VkBuffer buffer
+ };
+
+ const VkMemoryAllocateInfo allocateInfo =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // VkStructureType sType
+ (const void*)&dedicatedInfo, // const void* pNext
+ ahbProperties.allocationSize, // VkDeviceSize allocationSize
+ chooseMemoryType(ahbProperties.memoryTypeBits) // uint32_t memoryTypeIndex
+ };
+
+ const Unique<VkDeviceMemory> colorImageMemory (allocateMemory(vk, device, &allocateInfo));
+ VK_CHECK(vk.bindImageMemory(device, *colorTargetImage, *colorImageMemory, 0u));
+#endif
+
+ vector<Move<VkImageView>> imageViews;
+ vector<VkImageView> colorAttachments;
+ RenderPassCreateInfo renderPassCreateInfo;
+
+ for (deUint32 i = 0u; i < m_data.m_numLayers; i++)
+ {
+ const VkImageSubresourceRange subresourceRange =
+ {
+ VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask
+ 0u, // uint32_t baseMipLevel
+ 1u, // uint32_t levelCount
+ i, // uint32_t baseArrayLayer
+ 1u, // uint32_t layerCount
+ };
+
+ const VkImageViewCreateInfo imageViewCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkImageViewCreateFlags flags
+ *colorTargetImage, // VkImage image
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType
+ colorAttachmentFormat, // VkFormat format
+ ComponentMapping(), // VkComponentMapping components
+ subresourceRange // VkImageSubresourceRange subresourceRange
+ };
+
+ imageViews.push_back(createImageView(vk, device, &imageViewCreateInfo));
+ colorAttachments.push_back(*imageViews.back());
+
+ renderPassCreateInfo.addAttachment(AttachmentDescription(colorAttachmentFormat,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_CLEAR,
+ VK_ATTACHMENT_STORE_OP_STORE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_STORE,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
+
+
+ const VkAttachmentReference colorAttachmentReference =
+ {
+ i,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+ };
+
+ renderPassCreateInfo.addSubpass(SubpassDescription(VK_PIPELINE_BIND_POINT_GRAPHICS,
+ 0,
+ 0,
+ DE_NULL,
+ 1u,
+ &colorAttachmentReference,
+ DE_NULL,
+ AttachmentReference(),
+ 0,
+ DE_NULL));
+ }
+
+ Unique<VkRenderPass> renderPass (createRenderPass(vk, device, &renderPassCreateInfo));
+
+ const FramebufferCreateInfo framebufferCreateInfo (*renderPass, colorAttachments, WIDTH, HEIGHT, 1);
+ Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, device, &framebufferCreateInfo));
+
+ const VkVertexInputBindingDescription vertexInputBindingDescription =
+ {
+ 0, // uint32_t binding
+ (deUint32)sizeof(tcu::Vec4) * 2, // uint32_t stride
+ VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate
+ };
+
+ const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] =
+ {
+
+ {
+ 0u, // uint32_t location
+ 0u, // uint32_t binding
+ VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format
+ 0u // uint32_t offset
+ },
+ {
+ 1u, // uint32_t location
+ 0u, // uint32_t binding
+ VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format
+ (deUint32)(sizeof(float)* 4), // uint32_t offset
+ }
+ };
+
+ PipelineCreateInfo::VertexInputState vertexInputState = PipelineCreateInfo::VertexInputState(1, &vertexInputBindingDescription, 2, vertexInputAttributeDescriptions);
+ const VkDeviceSize dataSize = m_data.m_vertices.size() * sizeof(PositionColorVertex);
+ de::SharedPtr<Buffer> vertexBuffer = Buffer::createAndAlloc(vk, device, BufferCreateInfo(dataSize,
+ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), m_context.getDefaultAllocator(), MemoryRequirement::HostVisible);
+ deUint8* ptr = reinterpret_cast<deUint8*>(vertexBuffer->getBoundMemory().getHostPtr());
+
+ deMemcpy(ptr, &(m_data.m_vertices[0]), static_cast<size_t>(dataSize));
+ flushAlloc(vk, device, vertexBuffer->getBoundMemory());
+
+ 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 Unique<VkShaderModule> vs (createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0));
+ const Unique<VkShaderModule> fs (createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0));
+ VkViewport viewport = makeViewport(WIDTH, HEIGHT);
+ VkRect2D scissor = makeRect2D(WIDTH, HEIGHT);
+ vector<Move<VkPipeline>> pipelines;
+
+ PipelineCreateInfo pipelineCreateInfo(*pipelineLayout, *renderPass, 0, 0);
+ pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", VK_SHADER_STAGE_VERTEX_BIT));
+ pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", VK_SHADER_STAGE_FRAGMENT_BIT));
+ pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(vertexInputState));
+ pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
+ PipelineCreateInfo::ColorBlendState::Attachment attachment;
+ pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1u, &attachment));
+ pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1, vector<VkViewport>(1, viewport), vector<VkRect2D>(1, scissor)));
+ pipelineCreateInfo.addState(PipelineCreateInfo::DepthStencilState());
+ pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
+ pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
+
+ for (deUint32 i = 0; i < m_data.m_numLayers; i++)
+ {
+ pipelineCreateInfo.subpass = i;
+ pipelines.push_back(createGraphicsPipeline(vk, device, DE_NULL, &pipelineCreateInfo));
+ }
+
+ beginCommandBuffer(vk, *cmdBuffer, 0u);
+
+ const VkImageMemoryBarrier initialTransition =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkAccessFlags srcAccessMask
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex
+ *colorTargetImage, // VkImage image
+ makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0, m_data.m_numLayers) // VkImageSubresourceRange subresourceRange
+ };
+
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, (vk::VkDependencyFlags)0, 0, (const vk::VkMemoryBarrier*)DE_NULL,
+ 0, (const vk::VkBufferMemoryBarrier*)DE_NULL, 1, &initialTransition);
+
+ const VkRect2D renderArea = makeRect2D(WIDTH, HEIGHT);
+
+ vector<VkClearValue> clearColors (m_data.m_numLayers, makeClearValueColorF32(0.0f, 0.0f, 0.0f, 1.0f));
+
+ const VkRenderPassBeginInfo renderPassBeginInfo =
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ *renderPass, // VkRenderPass renderPass
+ *framebuffer, // VkFramebuffer framebuffer
+ renderArea, // VkRect2D renderArea
+ (deUint32)clearColors.size(), // deUint32 clearValueCount
+ clearColors.data(), // const VkClearValue* pClearValues
+ };
+
+ vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+ const VkDeviceSize vertexBufferOffset = 0;
+ const VkBuffer vertexBufferObj = vertexBuffer->object();
+
+ vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBufferObj, &vertexBufferOffset);
+ for (deUint32 i = 0; i < m_data.m_numLayers; i++)
+ {
+ if (i != 0)
+ vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
+
+ vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelines[i]);
+ vk.cmdDraw(*cmdBuffer, 9u, 1u, i * 9u, 0u);
+ }
+
+ endRenderPass(vk, *cmdBuffer);
+
+ const VkImageMemoryBarrier imageBarrier =
+ {
+ 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_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex
+ *colorTargetImage, // VkImage image
+ makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0, m_data.m_numLayers) // VkImageSubresourceRange subresourceRange;
+ };
+
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u,
+ 0u, DE_NULL, 0u, DE_NULL, 1u, &imageBarrier);
+
+ for (deUint32 i = 0; i < m_data.m_numLayers; i++)
+ {
+ const VkImageSubresourceLayers subresource =
+ {
+ VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask
+ 0u, // deUint32 mipLevel
+ i, // deUint32 baseArrayLayer
+ 1u // deUint32 layerCount
+ };
+
+ const VkBufferImageCopy region =
+ {
+ 0ull, // VkDeviceSize bufferOffset
+ 0u, // deUint32 bufferRowLength
+ 0u, // deUint32 bufferImageHeight
+ subresource, // VkImageSubresourceLayers imageSubresource
+ makeOffset3D(0, 0, 0), // VkOffset3D imageOffset
+ makeExtent3D(WIDTH, HEIGHT, 1u) // VkExtent3D imageExtent
+ };
+
+ vk.cmdCopyImageToBuffer(*cmdBuffer, *colorTargetImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *resultBuffers[i], 1u, ®ion);
+
+ 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
+ *resultBuffers[i], // VkBuffer buffer
+ 0ull, // VkDeviceSize offset
+ VK_WHOLE_SIZE // VkDeviceSize size
+ };
+
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u,
+ 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
+ }
+
+ endCommandBuffer(vk, *cmdBuffer);
+
+ submitCommandsAndWait(vk, device, queue, cmdBuffer.get());
+
+ qpTestResult res = QP_TEST_RESULT_PASS;
+
+ for (deUint32 i = 0; i < m_data.m_numLayers; i++)
+ {
+ invalidateMappedMemoryRange(vk, m_context.getDevice(), resultBufferAllocations[i]->getMemory(),
+ resultBufferAllocations[i]->getOffset(), VK_WHOLE_SIZE);
+
+ tcu::TextureLevel refImage(mapVkFormat(colorAttachmentFormat), WIDTH, HEIGHT);
+ tcu::clear(refImage.getAccess(), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
+
+ vector<tcu::Vec4> vertices;
+ vector<tcu::Vec4> colors;
+
+ for (int v = 0; v < 9; v++)
+ {
+ int idx = i * 9 + v;
+ vertices.push_back(m_data.m_vertices[idx].position);
+ colors.push_back(m_data.m_vertices[idx].color);
+ }
+
+ generateRefImage(refImage.getAccess(), vertices, colors);
+
+ const tcu::TextureFormat format (mapVkFormat(colorAttachmentFormat));
+ const void *const ptrResult (resultBufferAllocations[i]->getHostPtr());
+ const tcu::ConstPixelBufferAccess renderedFrame (format, WIDTH, HEIGHT, 1, ptrResult);
+
+ if (!tcu::fuzzyCompare(log, "Result", "Image comparison result", refImage.getAccess(), renderedFrame, 0.053f, tcu::COMPARE_LOG_RESULT))
+ res = QP_TEST_RESULT_FAIL;
+ }
+
+ return tcu::TestStatus(res, qpGetTestResultName(res));
+}
+
+void createAhbDrawTests (tcu::TestCaseGroup* testGroup)
+{
+ testGroup->addChild(new AhbTestCase(testGroup->getTestContext(), "triangle_list", "Draw triangle list to a single layer color buffer",
+ DrawParams(9u, 1u)));
+
+ testGroup->addChild(new AhbTestCase(testGroup->getTestContext(), "triangle_list_layers_3", "Draw triangle list to a color buffer with three layers",
+ DrawParams(9u * 3u, 3u)));
+
+ testGroup->addChild(new AhbTestCase(testGroup->getTestContext(), "triangle_list_layers_5", "Draw triangle list to a color buffer with five layers",
+ DrawParams(9u * 5u, 5u)));
+
+ testGroup->addChild(new AhbTestCase(testGroup->getTestContext(), "triangle_list_layers_8", "Draw triangle list to a color buffer with eight layers",
+ DrawParams(9u * 8u, 8u)));
+
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createAhbTests (tcu::TestContext& testCtx)
+{
+ return createTestGroup(testCtx, "ahb", "Draw tests using Android Hardware Buffer", createAhbDrawTests);
+}
+
+} // DrawTests
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/draw/vktDrawAhbTests.hpp
similarity index 65%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/draw/vktDrawAhbTests.hpp
index 1a85ebf..cbb0f03 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawAhbTests.hpp
@@ -1,11 +1,12 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTDRAWAHBTESTS_HPP
+#define _VKTDRAWAHBTESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Google LLC
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,20 +22,20 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Android Hardware Buffer Draw Tests
*//*--------------------------------------------------------------------*/
-#include "tcuDefs.hpp"
-#include "tcuTestCase.hpp"
+#include "vkDefs.hpp"
+#include "vktTestCase.hpp"
namespace vkt
{
-namespace pipeline
+namespace Draw
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createAhbTests (tcu::TestContext& testCtx);
-} // pipeline
+} // Draw
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTDRAWAHBTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp
index 03679c3..b3a38c3 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawConcurrentTests.cpp
@@ -27,6 +27,7 @@
#include "vktDrawConcurrentTests.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktDrawTestCaseUtil.hpp"
#include "../compute/vktComputeTestsUtil.hpp"
@@ -106,6 +107,7 @@
const deUint32 numValues = 1024;
const InstanceInterface& instance = m_context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const auto validation = m_context.getTestContext().getCommandLine().isValidationEnabled();
tcu::TestLog& log = m_context.getTestContext().getLog();
Move<VkDevice> computeDevice;
std::vector<VkQueueFamilyProperties> queueFamilyProperties;
@@ -156,7 +158,7 @@
deviceInfo.queueCreateInfoCount = 1;
deviceInfo.pQueueCreateInfos = &queueInfos;
- computeDevice = createDevice(m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
+ computeDevice = createCustomDevice(validation, m_context.getPlatformInterface(), m_context.getInstance(), instance, physicalDevice, &deviceInfo);
vk.getDeviceQueue(*computeDevice, computeQueue.queueFamilyIndex, 0, &computeQueue.queue);
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawCreateInfoUtil.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawCreateInfoUtil.cpp
index 16bee00..0acbee5 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawCreateInfoUtil.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawCreateInfoUtil.cpp
@@ -112,7 +112,7 @@
break;
}
- subresourceRange = ImageSubresourceRange(aspectFlags);;
+ subresourceRange = ImageSubresourceRange(aspectFlags);
flags = _flags;
}
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp
index f0df4a2..ad28aff 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawInstancedTests.cpp
@@ -310,6 +310,13 @@
TCU_THROW(NotSupportedError, "Implementation does not support multiview feature");
}
}
+
+ if (m_params.topology == vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
}
TestInstance* createInstance (Context& context) const
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp
index 3144dd9..6fad4f0 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawInvertedDepthRangesTests.cpp
@@ -59,9 +59,12 @@
struct TestParams
{
- VkBool32 depthClampEnable;
float minDepth;
float maxDepth;
+ VkBool32 depthClampEnable;
+ VkBool32 depthBiasEnable;
+ float depthBiasClamp;
+
};
constexpr deUint32 kImageDim = 256u;
@@ -75,6 +78,10 @@
constexpr float kMargin = 0.2f; // Space between triangle and image border. See kVertices.
constexpr float kDiagonalMargin = 0.00125f; // Makes sure the image diagonal falls inside the triangle. See kVertices.
const Vec4 kVertexColor (0.0f, 0.5f, 0.5f, 1.0f); // Note: the first component will vary.
+
+// Maximum depth slope is constant for triangle and the value here is true only for triangle used it this tests.
+constexpr float kMaxDepthSlope = 1.4f / 205;
+
const std::array<Vec4, 3u> kVertices =
{{
Vec4(-1.0f + kMargin, -1.0f + kMargin, -0.2f, 1.0f), // 0-----2
@@ -272,16 +279,16 @@
pipelineCreateInfo.addState (PipelineCreateInfo::ViewportState (1, std::vector<VkViewport>(), std::vector<VkRect2D>(1, scissor)));
pipelineCreateInfo.addState (PipelineCreateInfo::DepthStencilState (true, true));
pipelineCreateInfo.addState (PipelineCreateInfo::RasterizerState (
- m_params.depthClampEnable, // depthClampEnable
- VK_FALSE, // rasterizerDiscardEnable
- VK_POLYGON_MODE_FILL, // polygonMode
- VK_CULL_MODE_NONE, // cullMode
- VK_FRONT_FACE_CLOCKWISE, // frontFace
- VK_FALSE, // depthBiasEnable
- 0.0f, // depthBiasConstantFactor
- 0.0f, // depthBiasClamp
- 0.0f, // depthBiasSlopeFactor
- 1.0f)); // lineWidth
+ m_params.depthClampEnable, // depthClampEnable
+ VK_FALSE, // rasterizerDiscardEnable
+ VK_POLYGON_MODE_FILL, // polygonMode
+ VK_CULL_MODE_NONE, // cullMode
+ VK_FRONT_FACE_CLOCKWISE, // frontFace
+ m_params.depthBiasEnable, // depthBiasEnable
+ 0.0f, // depthBiasConstantFactor
+ m_params.depthBiasEnable ? m_params.depthBiasClamp : 0.0f, // depthBiasClamp
+ m_params.depthBiasEnable ? 1.0f : 0.0f, // depthBiasSlopeFactor
+ 1.0f)); // lineWidth
pipelineCreateInfo.addState (PipelineCreateInfo::MultiSampleState ());
pipelineCreateInfo.addState (PipelineCreateInfo::DynamicState (dynamicStates));
@@ -385,6 +392,7 @@
const float clampMin = de::min(m_params.minDepth, m_params.maxDepth);
const float clampMax = de::max(m_params.minDepth, m_params.maxDepth);
std::array<float, 3> depthValues;
+ float depthBias = 0.0f;
// Depth value of each vertex in kVertices.
DE_ASSERT(depthValues.size() == kVertices.size());
@@ -396,6 +404,25 @@
{
tcu::clearDepth(access, kClearDepth);
tcu::clearStencil(access, kClearStencil);
+
+ if (m_params.depthBiasEnable)
+ {
+ const float depthBiasSlopeFactor = 1.0f;
+ const float r = 0.000030518f; // minimum resolvable difference is an implementation-dependent parameter
+ const float depthBiasConstantFactor = 0.0f; // so we use factor 0.0 to not include it; same as in PipelineCreateInfo
+
+ // Equations taken from vkCmdSetDepthBias manual page
+ depthBias = kMaxDepthSlope * depthBiasSlopeFactor + r * depthBiasConstantFactor;
+
+ // dbclamp(x) function depends on the sign of the depthBiasClamp
+ if (m_params.depthBiasClamp < 0.0f)
+ depthBias = de::max(depthBias, m_params.depthBiasClamp);
+ else if (m_params.depthBiasClamp > 0.0f)
+ depthBias = de::min(depthBias, m_params.depthBiasClamp);
+
+ if (m_params.maxDepth < m_params.minDepth)
+ depthBias *= -1.0f;
+ }
}
for (int y = 0; y < iHeight; ++y)
@@ -417,11 +444,12 @@
const float b = (ycoord - p1f) / triangleSide;
const float c = (xcoord - p1f) / triangleSide;
const float a = 1.0f - b - c;
- const float depth = a * depthValues[0] + b * depthValues[1] + c * depthValues[2];
+ const float depth = a * depthValues[0] + b * depthValues[1] + c * depthValues[2];
- const float depthClamped = de::clamp(depth, 0.0f, 1.0f);
- const float depthFinal = depthClamped * m_params.maxDepth + (1.0f - depthClamped) * m_params.minDepth;
- const float storedDepth = (m_params.depthClampEnable ? de::clamp(depthFinal, clampMin, clampMax) : depthFinal);
+ // Depth values are always limited to the range [0,1] by clamping after depth bias addition is performed
+ const float depthClamped = de::clamp(depth + depthBias, 0.0f, 1.0f);
+ const float depthFinal = depthClamped * m_params.maxDepth + (1.0f - depthClamped) * m_params.minDepth;
+ const float storedDepth = (m_params.depthClampEnable ? de::clamp(depthFinal, clampMin, clampMax) : depthFinal);
if (m_params.depthClampEnable || de::inRange(depth, -kDepthEpsilon, 1.0f + kDepthEpsilon))
{
@@ -587,8 +615,8 @@
{
const struct
{
- const char* const name;
- VkBool32 depthClamp;
+ std::string name;
+ VkBool32 depthClamp;
} depthClamp[] =
{
{ "depthclamp", VK_TRUE },
@@ -597,35 +625,44 @@
const struct
{
- const char* const name;
- float delta;
- } delta[] =
+ std::string name;
+ float delta;
+ VkBool32 depthBiasEnable;
+ float depthBiasClamp;
+ } depthParams[] =
{
- { "deltazero", 0.0f },
- { "deltasmall", 0.3f },
- { "deltaone", 1.0f },
+ { "deltazero", 0.0f, DE_FALSE, 0.0f },
+ { "deltasmall", 0.3f, DE_FALSE, 0.0f },
+ { "deltaone", 1.0f, DE_FALSE, 0.0f },
+
+ // depthBiasClamp must be smaller then maximum depth slope to make a difference
+ { "deltaone_bias_clamp_neg", 1.0f, DE_TRUE, -0.003f },
+ { "deltasmall_bias_clamp_pos", 0.3f, DE_TRUE, 0.003f },
// Range > 1.0 requires VK_EXT_depth_range_unrestricted extension
- { "depth_range_unrestricted", 2.7f },
+ { "depth_range_unrestricted", 2.7f, DE_FALSE, 0.0f },
};
for (int ndxDepthClamp = 0; ndxDepthClamp < DE_LENGTH_OF_ARRAY(depthClamp); ++ndxDepthClamp)
- for (int ndxDelta = 0; ndxDelta < DE_LENGTH_OF_ARRAY(delta); ++ndxDelta)
+ for (int ndxParams = 0; ndxParams < DE_LENGTH_OF_ARRAY(depthParams); ++ndxParams)
{
- const float minDepth = 0.5f + delta[ndxDelta].delta / 2.0f;
- const float maxDepth = minDepth - delta[ndxDelta].delta;
+ const auto& cDepthClamp = depthClamp[ndxDepthClamp];
+ const auto& cDepthParams = depthParams[ndxParams];
+ const float minDepth = 0.5f + cDepthParams.delta / 2.0f;
+ const float maxDepth = minDepth - cDepthParams.delta;
DE_ASSERT(minDepth >= maxDepth);
const TestParams params =
{
- depthClamp[ndxDepthClamp].depthClamp,
minDepth,
- maxDepth
+ maxDepth,
+ cDepthClamp.depthClamp,
+ cDepthParams.depthBiasEnable,
+ cDepthParams.depthBiasClamp,
};
- std::ostringstream name;
- name << depthClamp[ndxDepthClamp].name << "_" << delta[ndxDelta].name;
- testGroup->addChild(new InvertedDepthRangesTest(testGroup->getTestContext(), name.str(), "", params));
+ std::string name = cDepthClamp.name + "_" + cDepthParams.name;
+ testGroup->addChild(new InvertedDepthRangesTest(testGroup->getTestContext(), name, "", params));
}
}
diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawMultipleClearsWithinRenderPass.cpp
new file mode 100644
index 0000000..f22749e
--- /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 0000000..d361408
--- /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 9b176ce..47b2e4a 100644
--- a/external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp
+++ b/external/vulkancts/modules/vulkan/draw/vktDrawTests.cpp
@@ -43,6 +43,8 @@
#include "vktDrawExplicitVertexParameterTests.hpp"
#include "vktDrawOutputLocationTests.hpp"
#include "vktDrawDepthClampTests.hpp"
+#include "vktDrawAhbTests.hpp"
+#include "vktDrawMultipleClearsWithinRenderPass.hpp"
namespace vkt
{
@@ -56,25 +58,27 @@
{
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(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/modules/vulkan/dynamic_state/CMakeLists.txt b/external/vulkancts/modules/vulkan/dynamic_state/CMakeLists.txt
index 473fc1a..76ca72c 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/dynamic_state/CMakeLists.txt
@@ -9,10 +9,14 @@
vktDynamicStateBaseClass.cpp
vktDynamicStateCBTests.cpp
vktDynamicStateCBTests.hpp
+ vktDynamicStateComputeTests.cpp
+ vktDynamicStateComputeTests.hpp
vktDynamicStateDSTests.cpp
vktDynamicStateDSTests.hpp
vktDynamicStateGeneralTests.cpp
vktDynamicStateGeneralTests.hpp
+ vktDynamicStateInheritanceTests.cpp
+ vktDynamicStateInheritanceTests.hpp
vktDynamicStateRSTests.cpp
vktDynamicStateRSTests.hpp
vktDynamicStateTests.cpp
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateComputeTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateComputeTests.cpp
new file mode 100644
index 0000000..fefbbfb
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateComputeTests.cpp
@@ -0,0 +1,974 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
+ *
+ * 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 Dynamic State tests mixing it with compute and transfer.
+ *//*--------------------------------------------------------------------*/
+#include "vktDynamicStateComputeTests.hpp"
+
+#include "vkBufferWithMemory.hpp"
+#include "vkObjUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkTypeUtil.hpp"
+
+#include "tcuVector.hpp"
+
+#include <vector>
+#include <string>
+#include <functional>
+#include <map>
+#include <sstream>
+#include <cstring>
+#include <iterator>
+#include <numeric>
+
+namespace vkt
+{
+namespace DynamicState
+{
+
+namespace
+{
+
+using namespace vk;
+
+// Additional objects needed to set a given dynamic state that need to exist beyond the state-setting call. Empty by default.
+struct DynamicStateData
+{
+ virtual ~DynamicStateData() {}
+};
+
+// A vertex buffer and graphics pipeline are needed for vkCmdBindVertexBuffers2EXT().
+struct BindVertexBuffersData : public DynamicStateData
+{
+private:
+ using BufferPtr = de::MovePtr<BufferWithMemory>;
+ using RenderPassPtr = Move<VkRenderPass>;
+ using LayoutPtr = Move<VkPipelineLayout>;
+ using ModulePtr = Move<VkShaderModule>;
+ using PipelinePtr = Move<VkPipeline>;
+
+ static constexpr deUint32 kWidth = 16u;
+ static constexpr deUint32 kHeight = 16u;
+
+ VkExtent3D getExtent (void)
+ {
+ return makeExtent3D(kWidth, kHeight, 1u);
+ }
+
+public:
+ BindVertexBuffersData(Context& ctx)
+ : m_vertexBuffer ()
+ , m_dataSize (0u)
+ , m_vertexBufferSize (0ull)
+ , m_renderPass ()
+ , m_pipelineLayout ()
+ , m_vertexShader ()
+ , m_graphicsPipeline ()
+ {
+ const auto& vki = ctx.getInstanceInterface();
+ const auto phyDev = ctx.getPhysicalDevice();
+ const auto& vkd = ctx.getDeviceInterface();
+ const auto device = ctx.getDevice();
+ auto& alloc = ctx.getDefaultAllocator();
+
+ // Vertex buffer.
+ tcu::Vec4 vertex (0.f, 0.f, 0.f, 1.f);
+ m_dataSize = sizeof(vertex);
+ m_vertexBufferSize = de::roundUp(static_cast<VkDeviceSize>(m_dataSize), getPhysicalDeviceProperties(vki, phyDev).limits.nonCoherentAtomSize);
+ const auto bufferInfo = makeBufferCreateInfo(m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+
+ m_vertexBuffer = BufferPtr(new BufferWithMemory(vkd, device, alloc, bufferInfo, MemoryRequirement::HostVisible));
+ auto& bufferAlloc = m_vertexBuffer->getAllocation();
+
+ deMemcpy(bufferAlloc.getHostPtr(), &vertex, m_dataSize);
+ flushAlloc(vkd, device, bufferAlloc);
+
+ // Empty render pass.
+ m_renderPass = makeRenderPass(vkd, device);
+
+ // Empty pipeline layout.
+ m_pipelineLayout = makePipelineLayout(vkd, device);
+
+ // Passthrough vertex shader.
+ m_vertexShader = createShaderModule(vkd, device, ctx.getBinaryCollection().get("vert"), 0u);
+
+ const auto extent = getExtent();
+ const std::vector<VkViewport> viewports (1, makeViewport(extent));
+ const std::vector<VkRect2D> scissors (1, makeRect2D(extent));
+ const VkDynamicState state = VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT;
+
+ const VkPipelineDynamicStateCreateInfo dynamicStateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineDynamicStateCreateFlags flags;
+ 1u, // deUint32 dynamicStateCount;
+ &state, // const VkDynamicState* pDynamicStates;
+ };
+
+ // Graphics pipeline.
+ m_graphicsPipeline = makeGraphicsPipeline(vkd, device, m_pipelineLayout.get(),
+ m_vertexShader.get(), DE_NULL, DE_NULL, DE_NULL, DE_NULL,
+ m_renderPass.get(), viewports, scissors, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0u, 0u,
+ nullptr, nullptr, nullptr, nullptr, nullptr, &dynamicStateInfo);
+ }
+
+ const BufferWithMemory* getVertexBuffer () const
+ {
+ return m_vertexBuffer.get();
+ }
+
+ size_t getDataSize () const
+ {
+ return m_dataSize;
+ }
+
+ VkPipeline getPipeline () const
+ {
+ return m_graphicsPipeline.get();
+ }
+
+ virtual ~BindVertexBuffersData() {}
+
+private:
+ BufferPtr m_vertexBuffer;
+ size_t m_dataSize;
+ VkDeviceSize m_vertexBufferSize;
+ RenderPassPtr m_renderPass;
+ LayoutPtr m_pipelineLayout;
+ ModulePtr m_vertexShader;
+ PipelinePtr m_graphicsPipeline;
+};
+
+// Function that records a state-setting command in the given command buffer.
+using RecordStateFunction = std::function<void(const DeviceInterface*, VkCommandBuffer, const DynamicStateData*)>;
+
+// State-setting functions
+void setViewport (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkViewport viewport =
+ {
+ 0.0f, // float x;
+ 0.0f, // float y;
+ 1.0f, // float width;
+ 1.0f, // float height;
+ 0.0f, // float minDepth;
+ 1.0f, // float maxDepth;
+ };
+ vkd->cmdSetViewport(cmdBuffer, 0u, 1u, &viewport);
+}
+
+void setScissor (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkRect2D scissor =
+ {
+ { 0, 0 }, // VkOffset2D offset;
+ { 1u, 1u }, // VkExtent2D extent;
+ };
+ vkd->cmdSetScissor(cmdBuffer, 0u, 1u, &scissor);
+}
+
+void setLineWidth (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetLineWidth(cmdBuffer, 1.0f);
+}
+
+void setDepthBias (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetDepthBias(cmdBuffer, 0.0f, 0.0f, 0.0f);
+}
+
+void setBlendConstants (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const float blendConstants[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ vkd->cmdSetBlendConstants(cmdBuffer, blendConstants);
+}
+
+void setDepthBounds (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetDepthBounds(cmdBuffer, 0.0f, 1.0f);
+}
+
+void setStencilCompareMask (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetStencilCompareMask(cmdBuffer, VK_STENCIL_FACE_FRONT_AND_BACK, 0xFFu);
+}
+
+void setStencilWriteMask (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetStencilWriteMask(cmdBuffer, VK_STENCIL_FACE_FRONT_AND_BACK, 0xFFu);
+}
+
+void setStencilReference (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetStencilReference(cmdBuffer, VK_STENCIL_FACE_FRONT_AND_BACK, 0xFFu);
+}
+
+void setDiscardRectangle (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkRect2D rectangle =
+ {
+ { 0, 0 }, // VkOffset2D offset;
+ { 1u, 1u }, // VkExtent2D extent;
+ };
+ vkd->cmdSetDiscardRectangleEXT(cmdBuffer, 0u, 1u, &rectangle);
+}
+
+void setSampleLocations (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkSampleLocationEXT locations[] =
+ {
+ { 0.5f, 0.5f },
+ { 0.5f, 1.5f },
+ { 1.5f, 0.5f },
+ { 1.5f, 1.5f },
+ };
+ const VkSampleLocationsInfoEXT info =
+ {
+ VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ VK_SAMPLE_COUNT_4_BIT, // VkSampleCountFlagBits sampleLocationsPerPixel;
+ { 1u, 1u }, // VkExtent2D sampleLocationGridSize;
+ 4u, // deUint32 sampleLocationsCount;
+ locations, // const VkSampleLocationEXT* pSampleLocations;
+ };
+ vkd->cmdSetSampleLocationsEXT(cmdBuffer, &info);
+}
+
+void setRTPipelineStatckSize (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetRayTracingPipelineStackSizeKHR(cmdBuffer, 4096u);
+}
+
+void setFragmentShadingRage (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkExtent2D fragmentSize = { 1u, 1u };
+ const VkFragmentShadingRateCombinerOpKHR combinerOps[2] =
+ {
+ VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
+ VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
+ };
+ vkd->cmdSetFragmentShadingRateKHR(cmdBuffer, &fragmentSize, combinerOps);
+}
+
+void setLineStipple (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetLineStippleEXT(cmdBuffer, 1u, 1u);
+}
+
+void setCullMode (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetCullModeEXT(cmdBuffer, VK_CULL_MODE_FRONT_AND_BACK);
+}
+
+void setFrontFace (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetFrontFaceEXT(cmdBuffer, VK_FRONT_FACE_COUNTER_CLOCKWISE);
+}
+
+void setPrimitiveTopology (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetPrimitiveTopologyEXT(cmdBuffer, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP);
+}
+
+void setViewportWithCount (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkViewport viewport =
+ {
+ 0.0f, // float x;
+ 0.0f, // float y;
+ 1.0f, // float width;
+ 1.0f, // float height;
+ 0.0f, // float minDepth;
+ 1.0f, // float maxDepth;
+ };
+ vkd->cmdSetViewportWithCountEXT(cmdBuffer, 1u, &viewport);
+}
+
+void setScissorWithCount (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkRect2D scissor =
+ {
+ { 0, 0 }, // VkOffset2D offset;
+ { 1u, 1u }, // VkExtent2D extent;
+ };
+ vkd->cmdSetScissorWithCountEXT(cmdBuffer, 1u, &scissor);
+}
+
+void bindVertexBuffers (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData* data)
+{
+ const auto bindData = dynamic_cast<const BindVertexBuffersData*>(data);
+ DE_ASSERT(bindData != nullptr);
+ const auto vertexBuffer = bindData->getVertexBuffer();
+ const auto dataSize = static_cast<VkDeviceSize>(bindData->getDataSize());
+ const auto bufferOffset = vertexBuffer->getAllocation().getOffset();
+ const auto stride = static_cast<VkDeviceSize>(0);
+ const auto pipeline = bindData->getPipeline();
+
+ vkd->cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+ vkd->cmdBindVertexBuffers2EXT(cmdBuffer, 0u, 1u, &vertexBuffer->get(), &bufferOffset, &dataSize, &stride);
+}
+
+void setDepthTestEnable (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetDepthTestEnableEXT(cmdBuffer, VK_TRUE);
+}
+
+void setDepthWriteEnable (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetDepthWriteEnableEXT(cmdBuffer, VK_TRUE);
+}
+
+void setDepthCompareOp (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetDepthCompareOpEXT(cmdBuffer, VK_COMPARE_OP_LESS);
+}
+
+void setDepthBoundsTestEnable (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetDepthBoundsTestEnableEXT(cmdBuffer, VK_TRUE);
+}
+
+void setStencilTestEnable (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetStencilTestEnableEXT(cmdBuffer, VK_TRUE);
+}
+
+void setStencilOp (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ vkd->cmdSetStencilOpEXT(cmdBuffer, VK_STENCIL_FRONT_AND_BACK, VK_STENCIL_OP_ZERO, VK_STENCIL_OP_INCREMENT_AND_CLAMP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS);
+}
+
+void setViewportWScaling (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkViewportWScalingNV viewport =
+ {
+ 1.0f, // float xcoeff;
+ 1.0f, // float ycoeff;
+ };
+ vkd->cmdSetViewportWScalingNV(cmdBuffer, 0u, 1u, &viewport);
+}
+
+void setViewportShadingRatePalette (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkShadingRatePaletteEntryNV entry = VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV;
+ const VkShadingRatePaletteNV palette =
+ {
+ 1u, // deUint32 shadingRatePaletteEntryCount;
+ &entry, // const VkShadingRatePaletteEntryNV* pShadingRatePaletteEntries;
+ };
+ vkd->cmdSetViewportShadingRatePaletteNV(cmdBuffer, 0u, 1u, &palette);
+}
+
+void setCoarseSamplingOrder (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkCoarseSampleLocationNV location =
+ {
+ 0u, // deUint32 pixelX;
+ 0u, // deUint32 pixelY;
+ 0u, // deUint32 sample;
+ };
+ const VkCoarseSampleOrderCustomNV order =
+ {
+ VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV, // VkShadingRatePaletteEntryNV shadingRate;
+ 1u, // deUint32 sampleCount;
+ 1u, // deUint32 sampleLocationCount;
+ &location // const VkCoarseSampleLocationNV* pSampleLocations;
+ };
+ vkd->cmdSetCoarseSampleOrderNV(cmdBuffer, VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, 1u, &order);
+}
+
+void setExclusiveScissor (const DeviceInterface* vkd, VkCommandBuffer cmdBuffer, const DynamicStateData*)
+{
+ const VkRect2D scissor =
+ {
+ { 0, 0 }, // VkOffset2D offset;
+ { 1u, 1u }, // VkExtent2D extent;
+ };
+ vkd->cmdSetExclusiveScissorNV(cmdBuffer, 0u, 1u, &scissor);
+}
+
+const VkDynamicState dynamicStateList[] =
+{
+ VK_DYNAMIC_STATE_VIEWPORT,
+ VK_DYNAMIC_STATE_SCISSOR,
+ VK_DYNAMIC_STATE_LINE_WIDTH,
+ VK_DYNAMIC_STATE_DEPTH_BIAS,
+ VK_DYNAMIC_STATE_BLEND_CONSTANTS,
+ VK_DYNAMIC_STATE_DEPTH_BOUNDS,
+ VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
+ VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
+ VK_DYNAMIC_STATE_STENCIL_REFERENCE,
+ VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT,
+ VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT,
+ VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR,
+ VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR,
+ VK_DYNAMIC_STATE_LINE_STIPPLE_EXT,
+ VK_DYNAMIC_STATE_CULL_MODE_EXT,
+ VK_DYNAMIC_STATE_FRONT_FACE_EXT,
+ VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT,
+ VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
+ VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
+ VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT,
+ VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT,
+ VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
+ VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,
+ VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT,
+ VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT,
+ VK_DYNAMIC_STATE_STENCIL_OP_EXT,
+ VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV,
+ VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV,
+ VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV,
+ VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV,
+};
+
+// Information about a dynamic state.
+struct StateInfo
+{
+ std::vector<std::string> requirements; // List of required functionalities.
+ RecordStateFunction recorder; // Function that records the state to the command buffer being used.
+};
+
+// Returns the state info for a given dynamic state.
+const StateInfo& getDynamicStateInfo (VkDynamicState state)
+{
+ // Maps a given state to its state info structure.
+ using StateInfoMap = std::map<VkDynamicState, StateInfo>;
+
+ static const StateInfoMap result =
+ {
+ { VK_DYNAMIC_STATE_VIEWPORT, { {}, setViewport } },
+ { VK_DYNAMIC_STATE_SCISSOR, { {}, setScissor } },
+ { VK_DYNAMIC_STATE_LINE_WIDTH, { {}, setLineWidth } },
+ { VK_DYNAMIC_STATE_DEPTH_BIAS, { {}, setDepthBias } },
+ { VK_DYNAMIC_STATE_BLEND_CONSTANTS, { {}, setBlendConstants } },
+ { VK_DYNAMIC_STATE_DEPTH_BOUNDS, { {}, setDepthBounds } },
+ { VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, { {}, setStencilCompareMask } },
+ { VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, { {}, setStencilWriteMask } },
+ { VK_DYNAMIC_STATE_STENCIL_REFERENCE, { {}, setStencilReference } },
+ { VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT, { { "VK_EXT_discard_rectangles" }, setDiscardRectangle } },
+ { VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, { { "VK_EXT_sample_locations" }, setSampleLocations } },
+ { VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR, { { "VK_KHR_ray_tracing_pipeline" }, setRTPipelineStatckSize } },
+ { VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR, { { "VK_KHR_fragment_shading_rate" }, setFragmentShadingRage } },
+ { VK_DYNAMIC_STATE_LINE_STIPPLE_EXT, { { "VK_EXT_line_rasterization" }, setLineStipple } },
+ { VK_DYNAMIC_STATE_CULL_MODE_EXT, { { "VK_EXT_extended_dynamic_state" }, setCullMode } },
+ { VK_DYNAMIC_STATE_FRONT_FACE_EXT, { { "VK_EXT_extended_dynamic_state" }, setFrontFace } },
+ { VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT, { { "VK_EXT_extended_dynamic_state" }, setPrimitiveTopology } },
+ { VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT, { { "VK_EXT_extended_dynamic_state" }, setViewportWithCount } },
+ { VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT, { { "VK_EXT_extended_dynamic_state" }, setScissorWithCount } },
+ { VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT, { { "VK_EXT_extended_dynamic_state" }, bindVertexBuffers } },
+ { VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT, { { "VK_EXT_extended_dynamic_state" }, setDepthTestEnable } },
+ { VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT, { { "VK_EXT_extended_dynamic_state" }, setDepthWriteEnable } },
+ { VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT, { { "VK_EXT_extended_dynamic_state" }, setDepthCompareOp } },
+ { VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT, { { "VK_EXT_extended_dynamic_state" }, setDepthBoundsTestEnable } },
+ { VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT, { { "VK_EXT_extended_dynamic_state" }, setStencilTestEnable } },
+ { VK_DYNAMIC_STATE_STENCIL_OP_EXT, { { "VK_EXT_extended_dynamic_state" }, setStencilOp } },
+ { VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, { { "VK_NV_clip_space_w_scaling" }, setViewportWScaling } },
+ { VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV, { { "VK_NV_shading_rate_image"}, setViewportShadingRatePalette } },
+ { VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV, { { "VK_NV_shading_rate_image"}, setCoarseSamplingOrder } },
+ { VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV, { { "VK_NV_scissor_exclusive"}, setExclusiveScissor } },
+ };
+
+ const auto itr = result.find(state);
+ DE_ASSERT(itr != result.end());
+
+ return itr->second;
+}
+
+// Returns the set of auxiliary data needed to set a given state.
+de::MovePtr<DynamicStateData> getDynamicStateData (Context& ctx, VkDynamicState state)
+{
+ // Create vertex buffer for VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT.
+ if (state == VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT)
+ return de::MovePtr<DynamicStateData>(new BindVertexBuffersData(ctx));
+
+ // null pointer normally.
+ return de::MovePtr<DynamicStateData>();
+}
+
+enum class OperType { COMPUTE = 0, TRANSFER };
+enum class WhenToSet { BEFORE = 0, AFTER };
+
+// Set dynamic state before or after attempting to run a compute or transfer operation.
+struct TestParams
+{
+ OperType operationType;
+ WhenToSet whenToSet;
+ std::vector<VkDynamicState> states;
+};
+
+class DynamicStateComputeCase : public vkt::TestCase
+{
+public:
+
+ DynamicStateComputeCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~DynamicStateComputeCase (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+protected:
+ TestParams m_params;
+};
+
+class DynamicStateComputeInstance : public vkt::TestInstance
+{
+public:
+ DynamicStateComputeInstance (Context& context, const TestParams& params);
+ virtual ~DynamicStateComputeInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ tcu::TestStatus iterateTransfer (void);
+ tcu::TestStatus iterateCompute (void);
+
+ TestParams m_params;
+};
+
+DynamicStateComputeCase::DynamicStateComputeCase(tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+DynamicStateComputeInstance::DynamicStateComputeInstance (Context& context, const TestParams& params)
+ : vkt::TestInstance (context)
+ , m_params (params)
+{}
+
+void DynamicStateComputeCase::checkSupport (Context& context) const
+{
+ // Check required functionalities.
+ for (const auto& state : m_params.states)
+ {
+ const auto stateInfo = getDynamicStateInfo(state);
+ for (const auto& functionality : stateInfo.requirements)
+ context.requireDeviceFunctionality(functionality);
+ }
+}
+
+void DynamicStateComputeCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ if (m_params.operationType == OperType::COMPUTE)
+ {
+ std::ostringstream comp;
+ comp
+ << "#version 450\n"
+ << "\n"
+ << "layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
+ << "\n"
+ << "layout (push_constant, std430) uniform PushConstants {\n"
+ << " uint valueIndex;\n"
+ << "} pc;\n"
+ << "\n"
+ << "layout (set=0, binding=0, std430) buffer OutputBlock {\n"
+ << " uint value[];\n"
+ << "} ob;\n"
+ << "\n"
+ << "void main ()\n"
+ << "{\n"
+ << " ob.value[pc.valueIndex] = 1u;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("comp") << glu::ComputeSource(comp.str());
+ }
+
+ if (de::contains(begin(m_params.states), end(m_params.states), VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT))
+ {
+ // Passthrough vertex shader for stand-in graphics pipeline.
+ std::ostringstream vert;
+ vert
+ << "#version 450\n"
+ << "layout (location=0) in vec4 inVertex;\n"
+ << "void main() {\n"
+ << " gl_Position = inVertex;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vert.str());
+ }
+}
+
+vkt::TestInstance* DynamicStateComputeCase::createInstance (Context& context) const
+{
+ return new DynamicStateComputeInstance(context, m_params);
+}
+
+tcu::TestStatus DynamicStateComputeInstance::iterate (void)
+{
+ if (m_params.operationType == OperType::COMPUTE)
+ return iterateCompute();
+ else
+ return iterateTransfer();
+}
+
+void fillBuffer(const DeviceInterface& vkd, VkDevice device, BufferWithMemory& buffer, const std::vector<deUint32> &values)
+{
+ auto& alloc = buffer.getAllocation();
+
+ deMemcpy(alloc.getHostPtr(), values.data(), de::dataSize(values));
+ flushAlloc(vkd, device, alloc);
+}
+
+tcu::TestStatus DynamicStateComputeInstance::iterateTransfer (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto phyDev = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ // Prepare two host-visible buffers for a transfer operation, with one element per dynamic state.
+ const deUint32 seqStart = 1611747605u;
+
+ DE_ASSERT(!m_params.states.empty());
+ std::vector<deUint32> srcValues(m_params.states.size());
+ const decltype(srcValues) dstValues(srcValues.size(), 0u);
+ std::iota(begin(srcValues), end(srcValues), seqStart);
+
+ const auto elemSize = static_cast<VkDeviceSize>(sizeof(decltype(srcValues)::value_type));
+ const auto dataSize = static_cast<VkDeviceSize>(de::dataSize(srcValues));
+ const auto bufferSize = de::roundUp(dataSize, getPhysicalDeviceProperties(vki, phyDev).limits.nonCoherentAtomSize);
+ const auto srcInfo = makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+ const auto dstInfo = makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ BufferWithMemory srcBuffer (vkd, device, alloc, srcInfo, MemoryRequirement::HostVisible);
+ BufferWithMemory dstBuffer (vkd, device, alloc, dstInfo, MemoryRequirement::HostVisible);
+
+ // Fill source and destination buffer.
+ fillBuffer(vkd, device, srcBuffer, srcValues);
+ fillBuffer(vkd, device, dstBuffer, dstValues);
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // We need to preserve dynamic state data until the command buffer has run.
+ std::vector<de::MovePtr<DynamicStateData>> statesData;
+
+ for (size_t stateIdx = 0; stateIdx < m_params.states.size(); ++stateIdx)
+ {
+ // Get extra data needed for using the dynamic state.
+ const auto offset = elemSize * stateIdx;
+ const auto& state = m_params.states[stateIdx];
+ const auto stateInfo = getDynamicStateInfo(state);
+ statesData.push_back(getDynamicStateData(m_context, state));
+
+ // Record command if before.
+ if (m_params.whenToSet == WhenToSet::BEFORE)
+ stateInfo.recorder(&vkd, cmdBuffer, statesData.back().get());
+
+ // Transfer op (copy one buffer element per dynamic state).
+ const VkBufferCopy region = { offset, offset, elemSize };
+ vkd.cmdCopyBuffer(cmdBuffer, srcBuffer.get(), dstBuffer.get(), 1u, ®ion);
+
+ // Record command if after.
+ if (m_params.whenToSet == WhenToSet::AFTER)
+ stateInfo.recorder(&vkd, cmdBuffer, statesData.back().get());
+ }
+
+ const auto barrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &barrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Invalidate alloc and check destination buffer.
+ auto& dstBufferAlloc = dstBuffer.getAllocation();
+ invalidateAlloc(vkd, device, dstBufferAlloc);
+
+ decltype(srcValues) results (srcValues.size());
+ deMemcpy(results.data(), dstBufferAlloc.getHostPtr(), de::dataSize(srcValues));
+
+ for (size_t valueIdx = 0; valueIdx < srcValues.size(); ++valueIdx)
+ {
+ const auto& orig = srcValues[valueIdx];
+ const auto& res = results[valueIdx];
+
+ if (orig != res)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected value found in destination buffer at position " << valueIdx << " (found=" << res << " expected=" << orig << ")";
+ TCU_FAIL(msg.str());
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+tcu::TestStatus DynamicStateComputeInstance::iterateCompute (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto phyDev = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ DescriptorSetLayoutBuilder setLayoutBuilder;
+ setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT);
+ const auto setLayout = setLayoutBuilder.build(vkd, device);
+
+ // Push constants.
+ const deUint32 pcSize = static_cast<deUint32>(sizeof(deUint32));
+ const auto pcRange = makePushConstantRange(VK_SHADER_STAGE_COMPUTE_BIT, 0u, pcSize);
+
+ // Pipeline.
+ const VkPipelineLayoutCreateInfo layoutInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineLayoutCreateFlags flags;
+ 1u, // deUint32 setLayoutCount;
+ &setLayout.get(), // const VkDescriptorSetLayout* pSetLayouts;
+ 1u, // deUint32 pushConstantRangeCount;
+ &pcRange, // const VkPushConstantRange* pPushConstantRanges;
+ };
+ const auto pipelineLayout = createPipelineLayout(vkd, device, &layoutInfo);
+
+ const auto shaderModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0u);
+
+ const VkPipelineShaderStageCreateInfo shaderStageInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ shaderModule.get(), // VkShaderModule module;
+ "main", // const char* pName;
+ nullptr, // const VkSpecializationInfo* pSpecializationInfo;
+ };
+
+ const VkComputePipelineCreateInfo pipelineInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ shaderStageInfo, // VkPipelineShaderStageCreateInfo stage;
+ pipelineLayout.get(), // VkPipelineLayout layout;
+ DE_NULL, // VkPipeline basePipelineHandle;
+ 0, // deInt32 basePipelineIndex;
+ };
+ const auto pipeline = createComputePipeline(vkd, device, DE_NULL, &pipelineInfo);
+
+ DE_ASSERT(!m_params.states.empty());
+
+ // Output buffer with one value per state.
+ std::vector<deUint32> bufferData (m_params.states.size(), 0u);
+ const auto dataSize (de::dataSize(bufferData));
+ const auto outputBufferSize = de::roundUp(static_cast<VkDeviceSize>(dataSize), getPhysicalDeviceProperties(vki, phyDev).limits.nonCoherentAtomSize);
+ const auto bufferCreateInfo = makeBufferCreateInfo(outputBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+
+ BufferWithMemory outputBuffer (vkd, device, alloc, bufferCreateInfo, MemoryRequirement::HostVisible);
+ auto& outputBufferAlloc = outputBuffer.getAllocation();
+ auto outputBufferPtr = outputBufferAlloc.getHostPtr();
+
+ deMemcpy(outputBufferPtr, bufferData.data(), dataSize);
+ flushAlloc(vkd, device, outputBufferAlloc);
+
+ // Descriptor set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), setLayout.get());
+
+ const auto bufferInfo = makeDescriptorBufferInfo(outputBuffer.get(), 0ull, outputBufferSize);
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &bufferInfo);
+ updateBuilder.update(vkd, device);
+
+ // Record and submit.
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // We need to preserve dynamic state data until the command buffer has run.
+ std::vector<de::MovePtr<DynamicStateData>> statesData;
+
+ for (size_t stateIdx = 0; stateIdx < m_params.states.size(); ++stateIdx)
+ {
+ // Objects needed to set the dynamic state.
+ const auto& state = m_params.states[stateIdx];
+ const auto stateInfo = getDynamicStateInfo(state);
+ statesData.push_back(getDynamicStateData(m_context, state));
+
+ if (m_params.whenToSet == WhenToSet::BEFORE)
+ stateInfo.recorder(&vkd, cmdBuffer, statesData.back().get());
+
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ {
+ // Each state will write to a different buffer position.
+ const deUint32 pcData = static_cast<deUint32>(stateIdx);
+ vkd.cmdPushConstants(cmdBuffer, pipelineLayout.get(), VK_SHADER_STAGE_COMPUTE_BIT, 0u, pcSize, &pcData);
+ }
+ vkd.cmdDispatch(cmdBuffer, 1u, 1u, 1u);
+
+ if (m_params.whenToSet == WhenToSet::AFTER)
+ stateInfo.recorder(&vkd, cmdBuffer, statesData.back().get());
+ }
+
+ // Barrier to read buffer contents.
+ const auto barrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &barrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Read and verify buffer contents.
+ invalidateAlloc(vkd, device, outputBufferAlloc);
+ deMemcpy(bufferData.data(), outputBufferPtr, dataSize);
+
+ for (size_t idx = 0u; idx < bufferData.size(); ++idx)
+ {
+ if (bufferData[idx] != 1u)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected value found at buffer position " << idx << ": " << bufferData[idx];
+ TCU_FAIL(msg.str());
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+std::string getDynamicStateBriefName (VkDynamicState state)
+{
+ const auto fullName = de::toString(state);
+ const auto prefixLen = strlen("VK_DYNAMIC_STATE_");
+
+ return de::toLower(fullName.substr(prefixLen));
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createDynamicStateComputeTests (tcu::TestContext& testCtx)
+{
+ using GroupPtr = de::MovePtr<tcu::TestCaseGroup>;
+
+ GroupPtr mainGroup(new tcu::TestCaseGroup(testCtx, "compute_transfer", "Dynamic state mixed with compute and transfer operations"));
+
+ const struct
+ {
+ OperType operationType;
+ const char* name;
+ } operations[] =
+ {
+ { OperType::COMPUTE, "compute" },
+ { OperType::TRANSFER, "transfer" },
+ };
+
+ const struct
+ {
+ WhenToSet when;
+ const char* name;
+ } moments[] =
+ {
+ { WhenToSet::BEFORE, "before" },
+ { WhenToSet::AFTER, "after" },
+ };
+
+ // Tests with a single dynamic state.
+ {
+ GroupPtr singleStateGroup(new tcu::TestCaseGroup(testCtx, "single", "Tests using a single dynamic state"));
+
+ for (int operIdx = 0; operIdx < DE_LENGTH_OF_ARRAY(operations); ++operIdx)
+ {
+ GroupPtr operationGroup(new tcu::TestCaseGroup(testCtx, operations[operIdx].name, ""));
+
+ for (int stateIdx = 0; stateIdx < DE_LENGTH_OF_ARRAY(dynamicStateList); ++stateIdx)
+ {
+ const auto state = dynamicStateList[stateIdx];
+ const auto stateName = getDynamicStateBriefName(state);
+
+ GroupPtr stateGroup(new tcu::TestCaseGroup(testCtx, stateName.c_str(), ""));
+
+ for (int momentIdx = 0; momentIdx < DE_LENGTH_OF_ARRAY(moments); ++momentIdx)
+ {
+ const TestParams testParams =
+ {
+ operations[operIdx].operationType, // OperType operationType;
+ moments[momentIdx].when, // WhenToSet whenToSet;
+ std::vector<VkDynamicState>(1, state), // std::vector<VkDynamicState> state;
+ };
+
+ stateGroup->addChild(new DynamicStateComputeCase(testCtx, moments[momentIdx].name, "", testParams));
+ }
+
+ operationGroup->addChild(stateGroup.release());
+ }
+
+ singleStateGroup->addChild(operationGroup.release());
+ }
+
+ mainGroup->addChild(singleStateGroup.release());
+ }
+
+ // A few tests with several dynamic states.
+ {
+ GroupPtr multiStateGroup(new tcu::TestCaseGroup(testCtx, "multi", "Tests using multiple dynamic states"));
+
+ for (int operIdx = 0; operIdx < DE_LENGTH_OF_ARRAY(operations); ++operIdx)
+ {
+ GroupPtr operationGroup(new tcu::TestCaseGroup(testCtx, operations[operIdx].name, ""));
+
+ for (int momentIdx = 0; momentIdx < DE_LENGTH_OF_ARRAY(moments); ++momentIdx)
+ {
+ TestParams testParams =
+ {
+ operations[operIdx].operationType, // OperType operationType;
+ moments[momentIdx].when, // WhenToSet whenToSet;
+ std::vector<VkDynamicState>(), // std::vector<VkDynamicState> states;
+ };
+
+ // Use the basic states so as not to introduce extra requirements.
+ for (int stateIdx = 0; stateIdx < DE_LENGTH_OF_ARRAY(dynamicStateList); ++stateIdx)
+ {
+ testParams.states.push_back(dynamicStateList[stateIdx]);
+ if (dynamicStateList[stateIdx] == VK_DYNAMIC_STATE_STENCIL_REFERENCE)
+ break;
+ }
+
+ operationGroup->addChild(new DynamicStateComputeCase(testCtx, moments[momentIdx].name, "", testParams));
+ }
+
+ multiStateGroup->addChild(operationGroup.release());
+ }
+
+ mainGroup->addChild(multiStateGroup.release());
+ }
+
+ return mainGroup.release();
+}
+
+} // DynamicState
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateComputeTests.hpp
similarity index 66%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateComputeTests.hpp
index 1a85ebf..d97b349 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateComputeTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTDYNAMICSTATECOMPUTETESTS_HPP
+#define _VKTDYNAMICSTATECOMPUTETESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,20 +21,20 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Dynamic State tests mixing it with compute and transfer.
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
-#include "tcuTestCase.hpp"
+#include "vktTestCase.hpp"
namespace vkt
{
-namespace pipeline
+namespace DynamicState
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createDynamicStateComputeTests (tcu::TestContext& testCtx);
-} // pipeline
+} // DynamicState
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTDYNAMICSTATECOMPUTETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp
index 024ab82..982d8ba 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp
@@ -331,7 +331,7 @@
transition2DImage(m_vk, *m_cmdBuffer, m_depthStencilImage->object(), vk::VK_IMAGE_ASPECT_DEPTH_BIT | vk::VK_IMAGE_ASPECT_STENCIL_BIT,
vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
vk::beginRenderPass(m_vk, *m_cmdBuffer, *m_renderPass, *m_framebuffer, vk::makeRect2D(0, 0, WIDTH, HEIGHT));
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.cpp
new file mode 100644
index 0000000..6c9b66c
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.cpp
@@ -0,0 +1,1133 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 NVIDIA Corporation
+ *
+ * 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 VK_NV_inherited_viewport_scissor Tests
+ *
+ * Simple test cases for secondary command buffers inheriting dynamic
+ * viewport and scissor state from the calling primary command buffer
+ * or an earlier secondary command buffer. Tests draw a bunch of color
+ * rectangles using a trivial geometry pipeline (no vertex
+ * transformation except for fixed-function viewport transform,
+ * geometry shader selects viewport/scissor index). The depth test is
+ * enabled to check for incorrect depth transformation.
+ *//*--------------------------------------------------------------------*/
+#include "vktDynamicStateInheritanceTests.hpp"
+
+#include <math.h>
+#include <sstream>
+#include <vector>
+
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+
+using namespace vk;
+using tcu::Vec2;
+using tcu::Vec3;
+
+namespace vkt
+{
+namespace DynamicState
+{
+namespace
+{
+// Size of test framebuffer, power of 2 to avoid rounding errors.
+static const deInt32 kWidth = 256, kHeight = 128;
+
+// Maximum viewport/scissors, and maximum rectangles, for any test case.
+static const deUint32 kMaxViewports = 16, kMaxRectangles = 1024;
+
+// Color format of framebuffer image, this seems universally supported.
+static const VkFormat kFormat = VK_FORMAT_B8G8R8A8_UNORM;
+
+// Texel data matching kFormat, and functions for converting to/from
+// packed 32-bit color. alpha is unused.
+struct Texel
+{
+ deUint8 blue, green, red, alpha;
+};
+
+inline Texel texelFrom_r8g8b8(deInt32 r8g8b8)
+{
+ return {deUint8(r8g8b8 & 255),
+ deUint8((r8g8b8 >> 8) & 255),
+ deUint8((r8g8b8 >> 16) & 255), 0u};
+}
+
+// Parameters of axis-aligned rectangle to rasterize. No mvp matrix
+// or anything, only testing fixed-function viewport transformation.
+struct Rectangle
+{
+ Vec3 xyz; // Before viewport transformation
+ deInt32 r8g8b8; // (8-bit) red << 16 | green << 8 | blue
+ Vec2 widthHeight; // positive; before viewport transformation
+ deInt32 viewportIndex;
+};
+
+// Determines where the secondary command buffer's inherited viewport/scissor state comes from (if inherited at all).
+enum InheritanceMode
+{
+ kInheritanceDisabled, // Disable extension, use non-dynamic viewport/scissor count
+ kInheritFromPrimary, // Inherit from calling primary cmd buffer
+ kInheritFromSecondary, // Inherit from earlier secondary cmd buffer
+ kSplitInheritance, // Split viewport/scissor array in two, inherit
+ // some from primary and rest from secondary
+
+ // Inherit state-with-count-EXT from calling primary cmd buffer
+ kInheritFromPrimaryWithCount,
+ // Inherit state-with-count-EXT from earlier secondary cmd buffer
+ kInheritFromSecondaryWithCount,
+};
+
+// Input test geometry.
+struct TestGeometry
+{
+ // Color and depth to clear the framebuffer to.
+ Vec3 clearColor;
+ float clearDepth;
+
+ // List of rectangles to rasterize, in order.
+ std::vector<Rectangle> rectangles;
+
+ // List of viewports and scissors to use, both vectors must have
+ // same length and have length at least 1.
+ std::vector<VkViewport> viewports;
+ std::vector<VkRect2D> scissors;
+ InheritanceMode inheritanceMode;
+};
+
+
+// Whether the test was a success, and both the device-rasterized image
+// and the CPU-computed expected image.
+struct TestResults
+{
+ bool passed;
+
+ // Index with [y][x]
+ Texel deviceResult[kHeight][kWidth];
+ Texel expectedResult[kHeight][kWidth];
+};
+
+
+// TODO probably tcu has a clamp already.
+template <typename T>
+inline T clamp(T x, T minVal, T maxVal)
+{
+ return std::min(std::max(x, minVal), maxVal);
+}
+
+
+class InheritanceTestInstance : public TestInstance
+{
+ const vk::InstanceInterface& m_in;
+ const vk::DeviceInterface& m_vk;
+ InheritanceMode m_inheritanceMode;
+
+ // Vertex buffer storing rectangle list, and its mapping and
+ // backing memory. kMaxRectangles is its capacity (in Rectangles).
+ BufferWithMemory m_rectangleBuffer;
+
+ // Buffer for downloading rendered image from device
+ BufferWithMemory m_downloadBuffer;
+
+ // Image attachments and views.
+ // Create info for depth buffer set at runtime due to depth format search.
+ VkImageCreateInfo m_depthImageInfo;
+ ImageWithMemory m_colorImage, m_depthImage;
+ VkImageViewCreateInfo m_colorViewInfo, m_depthViewInfo;
+ Unique<VkImageView> m_colorView, m_depthView;
+
+ // Simple render pass and framebuffer.
+ Move<VkRenderPass> m_renderPass;
+ Move<VkFramebuffer> m_framebuffer;
+
+ // Shader modules for graphics pipelines.
+ Move<VkShaderModule> m_vertModule, m_geomModule, m_fragModule;
+
+ // Vertex, geometry, fragment stages for creating the pipeline.
+ VkPipelineShaderStageCreateInfo m_stages[3];
+
+ // Geometry shader pipeline, converts points into rasterized
+ // struct Rectangles using geometry shader, which also selects the
+ // viewport to use. Pipeline array maps viewport/scissor count to
+ // the pipeline to use (special value 0 indicates that
+ // viewport/scissor count is dynamic state).
+ Move<VkPipelineLayout> m_rectanglePipelineLayout;
+ Move<VkPipeline> m_rectanglePipelines[kMaxViewports + 1];
+
+ // Command pool
+ Move<VkCommandPool> m_cmdPool;
+
+ // Primary command buffer, re-used for every test
+ VkCommandBuffer m_primaryCmdBuffer;
+
+ // Secondary command buffers, first for specifying
+ // viewport/scissor state, second for subpass contents.
+ // Both re-used to check for stale state.
+ VkCommandBuffer m_setStateCmdBuffer, m_subpassCmdBuffer;
+
+ // "depth buffer" used for CPU rasterization of expected image.
+ float m_cpuDepthBuffer[kHeight][kWidth];
+
+public:
+ InheritanceTestInstance(Context& context, InheritanceMode inheritanceMode);
+ tcu::TestStatus iterate(void);
+
+private:
+ void startRenderCmds(const TestGeometry& geometry);
+ void rasterizeExpectedResults(const TestGeometry& geometry, Texel (&output)[kHeight][kWidth]);
+};
+
+
+
+// Most state for graphics pipeline
+namespace pipelinestate {
+
+// Vertex shader, just pass through Rectangle data.
+const char vert_glsl[] =
+"#version 460\n"
+"\n"
+"layout(location=0) in vec3 xyz;\n"
+"layout(location=1) in int r8g8b8;\n"
+"layout(location=2) in vec2 widthHeight;\n"
+"layout(location=3) in int viewportIndex;\n"
+"\n"
+"layout(location=0) flat out int o_r8g8b8;\n"
+"layout(location=1) flat out vec2 o_widthHeight;\n"
+"layout(location=2) flat out int o_viewportIndex;\n"
+"\n"
+"void main()\n"
+"{\n"
+" gl_Position = vec4(xyz, 1.0);\n"
+" o_r8g8b8 = r8g8b8;\n"
+" o_widthHeight = widthHeight;\n"
+" o_viewportIndex = viewportIndex;\n"
+"}\n";
+
+// Geometry shader, convert points to rectangles and select correct viewport.
+const char geom_glsl[] =
+"#version 460\n"
+"\n"
+"layout(points) in;\n"
+"layout(triangle_strip, max_vertices=4) out;\n"
+"\n"
+"layout(location=0) flat in int r8g8b8[];\n"
+"layout(location=1) flat in vec2 widthHeight[];\n"
+"layout(location=2) flat in int viewportIndex[];\n"
+"\n"
+"layout(location=0) flat out vec4 o_color;\n"
+"\n"
+"void main()\n"
+"{\n"
+" int redBits = (r8g8b8[0] >> 16) & 255;\n"
+" int greenBits = (r8g8b8[0] >> 8) & 255;\n"
+" int blueBits = r8g8b8[0] & 255;\n"
+" float n = 1.0 / 255.0;\n"
+" vec4 color = vec4(redBits * n, greenBits * n, blueBits * n, 1.0);\n"
+"\n"
+" gl_ViewportIndex = viewportIndex[0];\n"
+" gl_Position = gl_in[0].gl_Position;\n"
+" o_color = color;\n"
+" EmitVertex();\n"
+"\n"
+" gl_ViewportIndex = viewportIndex[0];\n"
+" gl_Position = gl_in[0].gl_Position + vec4(0.0, widthHeight[0].y, 0.0, 0.0);\n"
+" o_color = color;\n"
+" EmitVertex();\n"
+"\n"
+" gl_ViewportIndex = viewportIndex[0];\n"
+" gl_Position = gl_in[0].gl_Position + vec4(widthHeight[0].x, 0.0, 0.0, 0.0);\n"
+" o_color = color;\n"
+" EmitVertex();\n"
+"\n"
+" gl_ViewportIndex = viewportIndex[0];\n"
+" gl_Position = gl_in[0].gl_Position + vec4(widthHeight[0].xy, 0.0, 0.0);\n"
+" o_color = color;\n"
+" EmitVertex();\n"
+"\n"
+" EndPrimitive();\n"
+"}\n";
+
+// Pass through fragment shader
+const char frag_glsl[] =
+"#version 460\n"
+"layout(location=0) flat in vec4 color;\n"
+"layout(location=0) out vec4 o_color;\n"
+"\n"
+"void main()\n"
+"{\n"
+" o_color = color;\n"
+"}\n";
+
+static const VkVertexInputBindingDescription binding = {0, sizeof(Rectangle), VK_VERTEX_INPUT_RATE_VERTEX};
+
+static const VkVertexInputAttributeDescription attributes[4] = {
+ {0, 0, VK_FORMAT_R32G32B32_SFLOAT, offsetof(Rectangle, xyz)},
+ {1, 0, VK_FORMAT_R32_SINT, offsetof(Rectangle, r8g8b8)},
+ {2, 0, VK_FORMAT_R32G32_SFLOAT, offsetof(Rectangle, widthHeight)},
+ {3, 0, VK_FORMAT_R32_SINT, offsetof(Rectangle, viewportIndex)} };
+
+static const VkPipelineVertexInputStateCreateInfo vertexInput = {
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, NULL,
+ 0, 1, &binding, 4, attributes };
+
+static const VkPipelineInputAssemblyStateCreateInfo assembly {
+ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, NULL,
+ 0, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_FALSE };
+
+static const VkPipelineViewportStateCreateInfo viewportTemplate = {
+ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, NULL,
+ 0, 0, NULL, 0, NULL };
+
+static const VkPipelineRasterizationStateCreateInfo rasterization = {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, NULL,
+ 0,
+ VK_FALSE,
+ VK_FALSE,
+ VK_POLYGON_MODE_FILL,
+ VK_CULL_MODE_BACK_BIT,
+ VK_FRONT_FACE_COUNTER_CLOCKWISE,
+ VK_FALSE, 0.0f, 0.0f, 0.0f, 1.0f };
+
+static const VkPipelineMultisampleStateCreateInfo multisample = {
+ VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, NULL,
+ 0, VK_SAMPLE_COUNT_1_BIT, VK_FALSE, 0.0f, NULL, VK_FALSE, VK_FALSE };
+
+static const VkPipelineDepthStencilStateCreateInfo depthStencil = {
+ VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, NULL,
+ 0, VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS,
+ 0, 0, {}, {}, 0, 0 };
+
+static const VkPipelineColorBlendAttachmentState blendAttachment {
+ VK_FALSE,
+ VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD,
+ VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD,
+ VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT };
+
+static const VkPipelineColorBlendStateCreateInfo blend = {
+ VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, NULL,
+ 0, VK_FALSE, VK_LOGIC_OP_CLEAR, 1, &blendAttachment, {} };
+
+static const VkDynamicState dynamicStateData[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };
+static const VkDynamicState dynamicStateWithCountData[2] = {
+ VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
+ VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT };
+
+static const VkPipelineDynamicStateCreateInfo dynamicState = {
+ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, NULL,
+ 0, 2, dynamicStateData };
+
+static const VkPipelineDynamicStateCreateInfo dynamicStateWithCount = {
+ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, NULL,
+ 0, 2, dynamicStateWithCountData };
+
+// Fill in the given graphics pipeline state. The caller needs to
+// provide space to store the generated
+// VkPipelineViewportStateCreateInfo, and provide the render pass,
+// pipeline layout, shader modules, and the viewport/scissor count (0
+// to use VK_DYNAMIC_STATE_VIEWPORT/SCISSOR_WITH_COUNT_EXT)
+static void fill(VkRenderPass renderPass,
+ VkPipelineLayout layout,
+ deUint32 staticViewportScissorCount,
+ deUint32 stageCount,
+ const VkPipelineShaderStageCreateInfo* pStages,
+ VkGraphicsPipelineCreateInfo* outCreateInfo,
+ VkPipelineViewportStateCreateInfo* outViewportState)
+{
+ outCreateInfo->sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+ outCreateInfo->pNext = NULL;
+ outCreateInfo->flags = 0;
+ outCreateInfo->stageCount = stageCount;
+ outCreateInfo->pStages = pStages;
+ outCreateInfo->pVertexInputState = &vertexInput;
+ outCreateInfo->pInputAssemblyState = &assembly;
+ outCreateInfo->pTessellationState = NULL;
+ outCreateInfo->pViewportState = outViewportState;
+ outCreateInfo->pRasterizationState = &rasterization;
+ outCreateInfo->pMultisampleState = &multisample;
+ outCreateInfo->pDepthStencilState = &depthStencil;
+ outCreateInfo->pColorBlendState = &blend;
+ outCreateInfo->pDynamicState = staticViewportScissorCount == 0 ? &dynamicStateWithCount : &dynamicState;
+ outCreateInfo->layout = layout;
+ outCreateInfo->renderPass = renderPass;
+ outCreateInfo->subpass = 0;
+ outCreateInfo->basePipelineHandle = 0;
+ outCreateInfo->basePipelineIndex = 0;
+
+ VkPipelineViewportStateCreateInfo viewportState = viewportTemplate;
+ viewportState.viewportCount = staticViewportScissorCount;
+ viewportState.scissorCount = staticViewportScissorCount;
+ *outViewportState = viewportState;
+}
+
+} // end namespace pipelinestate
+
+
+const VkBufferCreateInfo rectangleBufferInfo = {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, NULL, 0,
+ kMaxRectangles * sizeof(Rectangle),
+ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 0, NULL };
+
+const VkBufferCreateInfo downloadBufferInfo = {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, NULL, 0,
+ kWidth * kHeight * sizeof(Texel),
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 0, NULL };
+
+const VkImageCreateInfo colorImageInfo = {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, NULL, 0,
+ VK_IMAGE_TYPE_2D,
+ kFormat,
+ { kWidth, kHeight, 1 },
+ 1, 1, VK_SAMPLE_COUNT_1_BIT,
+ VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
+ VK_SHARING_MODE_EXCLUSIVE, 0, NULL,
+ VK_IMAGE_LAYOUT_UNDEFINED };
+
+VkImageCreateInfo makeDepthImageInfo(Context& context)
+{
+ VkImageCreateInfo info = {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, NULL, 0,
+ VK_IMAGE_TYPE_2D,
+ VK_FORMAT_UNDEFINED, // To be filled in.
+ { kWidth, kHeight, 1 },
+ 1, 1, VK_SAMPLE_COUNT_1_BIT,
+ VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
+ VK_SHARING_MODE_EXCLUSIVE, 0, NULL,
+ VK_IMAGE_LAYOUT_UNDEFINED
+ };
+
+ VkFormat depthFormats[4] = {
+ VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D24_UNORM_S8_UINT,
+ VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT};
+ for (int i = 0; i < 4; ++i)
+ {
+ VkFormatProperties properties;
+ context.getInstanceInterface().getPhysicalDeviceFormatProperties(
+ context.getPhysicalDevice(), depthFormats[i], &properties);
+ if (properties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
+ {
+ info.format = depthFormats[i];
+ return info;
+ }
+ }
+ throw std::runtime_error("Did not find suitable depth attachment format.");
+}
+
+
+
+// Initialize the Vulkan state for the tests.
+InheritanceTestInstance::InheritanceTestInstance(Context& context, InheritanceMode inheritanceMode)
+ : TestInstance(context)
+ , m_in(context.getInstanceInterface())
+ , m_vk(context.getDeviceInterface())
+ , m_inheritanceMode(inheritanceMode)
+ , m_rectangleBuffer(m_vk, m_context.getDevice(), m_context.getDefaultAllocator(), rectangleBufferInfo,
+ MemoryRequirement::HostVisible | MemoryRequirement::Coherent)
+ , m_downloadBuffer(m_vk, m_context.getDevice(), m_context.getDefaultAllocator(), downloadBufferInfo,
+ MemoryRequirement::HostVisible | MemoryRequirement::Coherent)
+ , m_depthImageInfo(makeDepthImageInfo(context))
+ , m_colorImage(m_vk, m_context.getDevice(), m_context.getDefaultAllocator(), colorImageInfo, MemoryRequirement::Local)
+ , m_depthImage(m_vk, m_context.getDevice(), m_context.getDefaultAllocator(), m_depthImageInfo, MemoryRequirement::Local)
+ , m_colorViewInfo{ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, NULL, 0, m_colorImage.get(), VK_IMAGE_VIEW_TYPE_2D,
+ kFormat, {}, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } }
+ , m_depthViewInfo{ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, NULL, 0, m_depthImage.get(), VK_IMAGE_VIEW_TYPE_2D,
+ m_depthImageInfo.format, {}, { VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1 } }
+ , m_colorView(createImageView(m_vk, m_context.getDevice(), &m_colorViewInfo, NULL))
+ , m_depthView(createImageView(m_vk, m_context.getDevice(), &m_depthViewInfo, NULL))
+{
+ VkDevice dev = m_context.getDevice();
+
+ // Render pass, adapted from Alexander Overvoorde's
+ // vulkan-tutorial.com (CC0 1.0 Universal)
+ VkAttachmentDescription colorAttachment{};
+ colorAttachment.format = kFormat;
+ colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
+ colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+
+ VkAttachmentDescription depthAttachment{};
+ depthAttachment.format = m_depthImageInfo.format;
+ depthAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
+ depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ VkAttachmentReference colorAttachmentRef{};
+ colorAttachmentRef.attachment = 0;
+ colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+
+ VkAttachmentReference depthAttachmentRef{};
+ depthAttachmentRef.attachment = 1;
+ depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ VkSubpassDescription subpass{};
+ subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
+ subpass.colorAttachmentCount = 1;
+ subpass.pColorAttachments = &colorAttachmentRef;
+ subpass.pDepthStencilAttachment = &depthAttachmentRef;
+
+ VkSubpassDependency dependency{};
+ dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
+ dependency.dstSubpass = 0;
+ dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ dependency.srcAccessMask = 0;
+ dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+
+ VkAttachmentDescription attachments[2] = {colorAttachment, depthAttachment};
+ VkRenderPassCreateInfo renderPassInfo{};
+ renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+ renderPassInfo.attachmentCount = 2;
+ renderPassInfo.pAttachments = attachments;
+ renderPassInfo.subpassCount = 1;
+ renderPassInfo.pSubpasses = &subpass;
+ renderPassInfo.dependencyCount = 1;
+ renderPassInfo.pDependencies = &dependency;
+
+ m_renderPass = createRenderPass(m_vk, dev, &renderPassInfo, NULL);
+
+ // Set up framebuffer
+ VkImageView attachmentViews[2] = { m_colorView.get(), m_depthView.get() };
+ VkFramebufferCreateInfo framebufferInfo {
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
+ NULL,
+ 0,
+ m_renderPass.get(),
+ 2, attachmentViews,
+ kWidth, kHeight, 1 };
+ m_framebuffer = createFramebuffer(m_vk, dev, &framebufferInfo, NULL);
+
+ // Compile graphics pipeline stages.
+ m_vertModule = vk::createShaderModule(m_vk, dev, m_context.getBinaryCollection().get("vert"), 0u);
+ m_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ m_stages[0].pNext = NULL;
+ m_stages[0].flags = 0;
+ m_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
+ m_stages[0].module = m_vertModule.get();
+ m_stages[0].pName = "main";
+ m_stages[0].pSpecializationInfo = NULL;
+
+ m_geomModule = vk::createShaderModule(m_vk, dev, m_context.getBinaryCollection().get("geom"), 0u);
+ m_stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ m_stages[1].pNext = NULL;
+ m_stages[1].flags = 0;
+ m_stages[1].stage = VK_SHADER_STAGE_GEOMETRY_BIT;
+ m_stages[1].module = m_geomModule.get();
+ m_stages[1].pName = "main";
+ m_stages[1].pSpecializationInfo = NULL;
+
+ m_fragModule = vk::createShaderModule(m_vk, dev, m_context.getBinaryCollection().get("frag"), 0u);
+ m_stages[2].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ m_stages[2].pNext = NULL;
+ m_stages[2].flags = 0;
+ m_stages[2].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
+ m_stages[2].module = m_fragModule.get();
+ m_stages[2].pName = "main";
+ m_stages[2].pSpecializationInfo = NULL;
+
+ // Set up pipeline layout (empty)
+ VkPipelineLayoutCreateInfo pipelineLayoutInfo{ };
+ pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+ m_rectanglePipelineLayout = createPipelineLayout(m_vk, dev, &pipelineLayoutInfo, NULL);
+ // Graphics pipelines are created on-the-fly later.
+
+ // Command pool and command buffers.
+ VkCommandPoolCreateInfo poolInfo {
+ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+ NULL,
+ VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
+ m_context.getUniversalQueueFamilyIndex() };
+ m_cmdPool = createCommandPool(m_vk, dev, &poolInfo, NULL);
+
+ VkCommandBufferAllocateInfo cmdBufferInfo {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, NULL,
+ m_cmdPool.get(),
+ VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1 };
+ VK_CHECK(m_vk.allocateCommandBuffers(dev, &cmdBufferInfo, &m_primaryCmdBuffer));
+ cmdBufferInfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
+ VK_CHECK(m_vk.allocateCommandBuffers(dev, &cmdBufferInfo, &m_setStateCmdBuffer));
+ VK_CHECK(m_vk.allocateCommandBuffers(dev, &cmdBufferInfo, &m_subpassCmdBuffer));
+}
+
+
+static deUint8 u8_from_unorm(float x)
+{
+ return deUint8(roundf(clamp(x, 0.0f, 1.0f) * 255.0f));
+}
+
+
+// Start work (on the univeral queue) for filling m_downloadBuffer with the image
+// resulting from rendering the test case. Must vkQueueWaitIdle before
+// accessing the data, or calling this function again.
+void InheritanceTestInstance::startRenderCmds(const TestGeometry& geometry)
+{
+ DE_ASSERT(geometry.viewports.size() > 0);
+ DE_ASSERT(geometry.viewports.size() <= kMaxViewports);
+ DE_ASSERT(geometry.viewports.size() == geometry.scissors.size());
+
+ // Fill vertex buffer
+ DE_ASSERT(kMaxRectangles >= geometry.rectangles.size());
+ Rectangle* pRectangles = static_cast<Rectangle*>(m_rectangleBuffer.getAllocation().getHostPtr());
+ for (size_t i = 0; i < geometry.rectangles.size(); ++i)
+ {
+ pRectangles[i] = geometry.rectangles[i];
+ }
+
+ VkCommandBufferInheritanceInfo inheritanceInfo {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
+ NULL,
+ m_renderPass.get(),
+ 0,
+ m_framebuffer.get(),
+ 0, 0, 0 };
+
+ VkCommandBufferBeginInfo cmdBeginInfo {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+ NULL,
+ VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,
+ &inheritanceInfo };
+
+ // ************************************************************************
+ // Record state-setting secondary command buffer.
+ // ************************************************************************
+ VK_CHECK(m_vk.beginCommandBuffer(m_setStateCmdBuffer, &cmdBeginInfo));
+ switch (m_inheritanceMode)
+ {
+ case kInheritanceDisabled:
+ case kInheritFromPrimary:
+ case kInheritFromPrimaryWithCount:
+ break;
+ case kInheritFromSecondary:
+ // Set all viewport/scissor state.
+ m_vk.cmdSetViewport(m_setStateCmdBuffer, 0, deUint32(geometry.viewports.size()), &geometry.viewports[0]);
+ m_vk.cmdSetScissor(m_setStateCmdBuffer, 0, deUint32(geometry.scissors.size()), &geometry.scissors[0]);
+ break;
+ case kSplitInheritance:
+ // Set just the first viewport / scissor, rest are set in
+ // primary command buffer. Checks that extension properly
+ // muxes state from different sources.
+ m_vk.cmdSetViewport(m_setStateCmdBuffer, 0, 1, &geometry.viewports[0]);
+ m_vk.cmdSetScissor(m_setStateCmdBuffer, 0, 1, &geometry.scissors[0]);
+ break;
+ case kInheritFromSecondaryWithCount:
+ m_vk.cmdSetViewportWithCountEXT(m_setStateCmdBuffer,
+ deUint32(geometry.viewports.size()),
+ &geometry.viewports[0]);
+ m_vk.cmdSetScissorWithCountEXT(m_setStateCmdBuffer,
+ deUint32(geometry.scissors.size()),
+ &geometry.scissors[0]);
+ break;
+ }
+ VK_CHECK(m_vk.endCommandBuffer(m_setStateCmdBuffer));
+
+ // ************************************************************************
+ // Record subpass command buffer, bind vertex buffer and pipeline,
+ // then draw rectangles.
+ // ************************************************************************
+ if (m_inheritanceMode != kInheritanceDisabled)
+ {
+ // Enable viewport/scissor inheritance struct.
+ VkCommandBufferInheritanceViewportScissorInfoNV inheritViewportInfo {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV,
+ NULL,
+ VK_TRUE,
+ deUint32(geometry.viewports.size()), &geometry.viewports[0] };
+ inheritanceInfo.pNext = &inheritViewportInfo;
+ VK_CHECK(m_vk.beginCommandBuffer(m_subpassCmdBuffer, &cmdBeginInfo));
+ inheritanceInfo.pNext = NULL;
+ }
+ else
+ {
+ VK_CHECK(m_vk.beginCommandBuffer(m_subpassCmdBuffer, &cmdBeginInfo));
+ }
+ // Set viewport/scissor state only when not inherited.
+ if (m_inheritanceMode == kInheritanceDisabled)
+ {
+ m_vk.cmdSetViewport(m_subpassCmdBuffer, 0, deUint32(geometry.viewports.size()), &geometry.viewports[0]);
+ m_vk.cmdSetScissor(m_subpassCmdBuffer, 0, deUint32(geometry.scissors.size()), &geometry.scissors[0]);
+ }
+ // Get the graphics pipeline, creating it if needed (encountered
+ // new static viewport/scissor count). 0 = dynamic count.
+ deUint32 staticViewportCount = 0;
+ switch (m_inheritanceMode)
+ {
+ case kInheritanceDisabled:
+ case kInheritFromPrimary:
+ case kInheritFromSecondary:
+ case kSplitInheritance:
+ staticViewportCount = deUint32(geometry.viewports.size());
+ break;
+ case kInheritFromPrimaryWithCount:
+ case kInheritFromSecondaryWithCount:
+ staticViewportCount = 0;
+ break;
+ }
+ VkPipeline graphicsPipeline = m_rectanglePipelines[staticViewportCount].get();
+ if (!graphicsPipeline)
+ {
+ VkGraphicsPipelineCreateInfo pipelineInfo;
+ VkPipelineViewportStateCreateInfo viewportInfo;
+ pipelinestate::fill(
+ m_renderPass.get(), m_rectanglePipelineLayout.get(), staticViewportCount,
+ 3, m_stages,
+ &pipelineInfo, &viewportInfo);
+ m_rectanglePipelines[staticViewportCount] = createGraphicsPipeline(m_vk, m_context.getDevice(), 0, &pipelineInfo, NULL);
+ graphicsPipeline = m_rectanglePipelines[staticViewportCount].get();
+ }
+ m_vk.cmdBindPipeline(m_subpassCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
+
+ // Bind vertex buffer and draw.
+ VkDeviceSize offset = 0;
+ VkBuffer vertexBuffer = m_rectangleBuffer.get();
+ m_vk.cmdBindVertexBuffers(m_subpassCmdBuffer, 0, 1, &vertexBuffer, &offset);
+ m_vk.cmdDraw(m_subpassCmdBuffer, deUint32(geometry.rectangles.size()), 1, 0, 0);
+ VK_CHECK(m_vk.endCommandBuffer(m_subpassCmdBuffer));
+
+ // ************************************************************************
+ // Primary command buffer commands, start render pass and execute
+ // the secondary command buffers, then copy rendered image to
+ // download buffer.
+ // ************************************************************************
+ VkCommandBufferBeginInfo beginInfo {
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+ NULL,
+ 0, NULL };
+ VK_CHECK(m_vk.beginCommandBuffer(m_primaryCmdBuffer, &beginInfo));
+
+ VkClearValue clearValues[2];
+ clearValues[0].color.float32[0] = geometry.clearColor.x();
+ clearValues[0].color.float32[1] = geometry.clearColor.y();
+ clearValues[0].color.float32[2] = geometry.clearColor.z();
+ clearValues[0].color.float32[3] = 1.0f;
+ clearValues[1].depthStencil = { geometry.clearDepth, 0 };
+
+ VkRenderPassBeginInfo renderPassBeginInfo {
+ VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+ NULL,
+ m_renderPass.get(),
+ m_framebuffer.get(),
+ { { 0, 0 }, { kWidth, kHeight } },
+ 2, clearValues };
+
+ switch (m_inheritanceMode)
+ {
+ case kInheritFromPrimary:
+ // Specify all viewport/scissor state only when we expect to.
+ // inherit ALL viewport/scissor state from primary command buffer.
+ m_vk.cmdSetViewport(m_primaryCmdBuffer, 0, deUint32(geometry.viewports.size()), &geometry.viewports[0]);
+ m_vk.cmdSetScissor(m_primaryCmdBuffer, 0, deUint32(geometry.scissors.size()), &geometry.scissors[0]);
+ break;
+ case kInheritFromPrimaryWithCount:
+ // Same but with count inherited.
+ m_vk.cmdSetViewportWithCountEXT(m_primaryCmdBuffer,
+ deUint32(geometry.viewports.size()),
+ &geometry.viewports[0]);
+ m_vk.cmdSetScissorWithCountEXT(m_primaryCmdBuffer,
+ deUint32(geometry.scissors.size()),
+ &geometry.scissors[0]);
+ break;
+ case kSplitInheritance:
+ // Specify the remaining viewport, scissors not set by the
+ // setStateCmdBuffer in this test mode.
+ if (geometry.viewports.size() > 1)
+ {
+ m_vk.cmdSetViewport(m_primaryCmdBuffer, 1, deUint32(geometry.viewports.size() - 1), &geometry.viewports[1]);
+ m_vk.cmdSetScissor(m_primaryCmdBuffer, 1, deUint32(geometry.scissors.size() - 1), &geometry.scissors[1]);
+ }
+ /* FALLTHRU FALL-THROUGH */
+ case kInheritanceDisabled:
+ case kInheritFromSecondary:
+ case kInheritFromSecondaryWithCount:
+ // Specify some bogus state, ensure correctly overwritten later.
+ VkViewport bogusViewport { 0.f, 0.f, 8.f, 8.f, 0.f, 0.1f };
+ VkRect2D bogusScissors { { 2, 0 }, { 100, 100 }};
+ m_vk.cmdSetViewport(m_primaryCmdBuffer, 0, 1, &bogusViewport);
+ m_vk.cmdSetScissor(m_primaryCmdBuffer, 0, 1, &bogusScissors);
+ break;
+ }
+
+ m_vk.cmdBeginRenderPass(m_primaryCmdBuffer, &renderPassBeginInfo,
+ VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
+ VkCommandBuffer secondaryCmdBuffers[2] = {m_setStateCmdBuffer,
+ m_subpassCmdBuffer};
+ m_vk.cmdExecuteCommands(m_primaryCmdBuffer, 2, secondaryCmdBuffers);
+ m_vk.cmdEndRenderPass(m_primaryCmdBuffer);
+
+ // Barrier, then copy rendered image to download buffer.
+ VkImageMemoryBarrier imageBarrier {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ NULL,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_ACCESS_TRANSFER_READ_BIT,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ 0, 0,
+ m_colorImage.get(),
+ { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }};
+ m_vk.cmdPipelineBarrier(
+ m_primaryCmdBuffer,
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ 0, 0, NULL, 0, NULL, 1, &imageBarrier );
+ VkBufferImageCopy bufferImageCopy {
+ 0, 0, 0,
+ { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 },
+ { 0, 0, 0 },
+ { kWidth, kHeight, 1 } };
+ m_vk.cmdCopyImageToBuffer(
+ m_primaryCmdBuffer,
+ m_colorImage.get(),
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ m_downloadBuffer.get(),
+ 1, &bufferImageCopy);
+
+ // Barrier, make buffer visible to host.
+ VkBufferMemoryBarrier bufferBarrier {
+ VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+ NULL,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_ACCESS_HOST_READ_BIT,
+ 0, 0,
+ m_downloadBuffer.get(),
+ 0, VK_WHOLE_SIZE };
+ m_vk.cmdPipelineBarrier(
+ m_primaryCmdBuffer,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ VK_PIPELINE_STAGE_HOST_BIT,
+ 0, 0, NULL, 1, &bufferBarrier, 0, NULL);
+
+ // End and submit primary command buffer.
+ VK_CHECK(m_vk.endCommandBuffer(m_primaryCmdBuffer));
+ VkSubmitInfo submitInfo {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO,
+ NULL,
+ 0, NULL, NULL,
+ 1, &m_primaryCmdBuffer,
+ 0, NULL };
+ m_vk.queueSubmit(m_context.getUniversalQueue(), 1, &submitInfo, 0);
+}
+
+
+void InheritanceTestInstance::rasterizeExpectedResults(const TestGeometry& geometry, Texel (&output)[kHeight][kWidth])
+{
+ // Clear color and depth buffers.
+ Texel clearColorTexel{u8_from_unorm(geometry.clearColor.z()),
+ u8_from_unorm(geometry.clearColor.y()),
+ u8_from_unorm(geometry.clearColor.x()), 0u};
+ for (size_t y = 0; y < kHeight; ++y)
+ {
+ for (size_t x = 0; x < kWidth; ++x)
+ {
+ m_cpuDepthBuffer[y][x] = geometry.clearDepth;
+ output[y][x] = clearColorTexel;
+ }
+ }
+
+ // Rasterize each rectangle. Pixels have half-integer centers.
+ for (size_t i = 0; i < geometry.rectangles.size(); ++i) {
+ Rectangle r = geometry.rectangles[i];
+
+ // Select correct viewport and scissor.
+ VkViewport viewport = geometry.viewports.at(r.viewportIndex);
+ VkRect2D scissor = geometry.scissors.at(r.viewportIndex);
+
+ // Transform xyz and width/height with selected viewport.
+ float ox = viewport.x + viewport.width * 0.5f;
+ float oy = viewport.y + viewport.height * 0.5f;
+ float oz = viewport.minDepth;
+
+ float px = viewport.width;
+ float py = viewport.height;
+ float pz = viewport.maxDepth - viewport.minDepth;
+
+ float xLow = clamp(r.xyz.x(), -1.0f, 1.0f);
+ float xHigh = clamp(r.xyz.x() + r.widthHeight.x(), -1.0f, 1.0f);
+ float yLow = clamp(r.xyz.y(), -1.0f, 1.0f);
+ float yHigh = clamp(r.xyz.y() + r.widthHeight.y(), -1.0f, 1.0f);
+
+ float xf[2];
+ xf[0] = px * 0.5f * xLow + ox;
+ xf[1] = px * 0.5f * xHigh + ox;
+ float yf[2];
+ yf[0] = py * 0.5f * yLow + oy;
+ yf[1] = py * 0.5f * yHigh + oy;
+ float zf = pz * r.xyz.z() + oz;
+
+ deInt32 xBegin = deInt32(floorf(xf[0] + 0.5f));
+ deInt32 xEnd = deInt32(floorf(xf[1] + 0.5f));
+ deInt32 yBegin = deInt32(floorf(yf[0] + 0.5f));
+ deInt32 yEnd = deInt32(floorf(yf[1] + 0.5f));
+
+ // Scissor test, only correct when drawn rectangle has
+ // positive width/height.
+ deInt32 xsLow = scissor.offset.x;
+ deInt32 xsHigh = xsLow + deInt32(scissor.extent.width);
+ xBegin = clamp(xBegin, xsLow, xsHigh);
+ xEnd = clamp(xEnd, xsLow, xsHigh);
+ deInt32 ysLow = scissor.offset.y;
+ deInt32 ysHigh = ysLow + deInt32(scissor.extent.height);
+ yBegin = clamp(yBegin, ysLow, ysHigh);
+ yEnd = clamp(yEnd, ysLow, ysHigh);
+
+ // Clamp to framebuffer size
+ xBegin = clamp(xBegin, 0, kWidth);
+ xEnd = clamp(xEnd, 0, kWidth);
+ yBegin = clamp(yBegin, 0, kHeight);
+ yEnd = clamp(yEnd, 0, kHeight);
+
+ // Rasterize.
+ Texel rectTexel = texelFrom_r8g8b8(r.r8g8b8);
+ for (deInt32 x = xBegin; x < xEnd; ++x)
+ {
+ for (deInt32 y = yBegin; y < yEnd; ++y)
+ {
+ // Depth test
+ float oldDepth = m_cpuDepthBuffer[y][x];
+ if (!(zf < oldDepth)) continue;
+
+ output[y][x] = rectTexel;
+ m_cpuDepthBuffer[y][x] = zf;
+ }
+ }
+ }
+}
+
+
+std::vector<TestGeometry> makeGeometry()
+{
+ std::vector<TestGeometry> cases;
+
+ TestGeometry geometry;
+ geometry.clearColor = Vec3(1.0f, 1.0f, 1.0f);
+ geometry.clearDepth = 1.0f;
+
+ // Simple test case, three squares, the last one should go in
+ // between the first two in depth due to viewport 1 halving the
+ // actual depth value.
+ geometry.rectangles.push_back(Rectangle{
+ Vec3(-0.5f, -1.0f, 0.2f),
+ 0xFF0000,
+ Vec2(0.5f, 1.0f),
+ 0 });
+ geometry.rectangles.push_back(Rectangle{
+ Vec3(0.0f, 0.0f, 0.6f),
+ 0x0000FF,
+ Vec2(0.5f, 1.0f),
+ 0 });
+ geometry.rectangles.push_back(Rectangle{
+ Vec3(-0.25f, -0.5f, 0.8f), // becomes 0.4f depth
+ 0x008000,
+ Vec2(0.5f, 1.0f),
+ 1 });
+ geometry.viewports.push_back({0, 0, kWidth, kHeight, 0.0f, 1.0f});
+ geometry.viewports.push_back({0, 0, kWidth, kHeight, 0.0f, 0.5f});
+ geometry.scissors.push_back({{0, 0}, {kWidth, kHeight}});
+ geometry.scissors.push_back({{0, 0}, {kWidth, kHeight}});
+
+ cases.push_back(geometry);
+
+ // Apply scissor rectangle to red and blue squares.
+ geometry.scissors[0].extent.width = kWidth / 2 + 1;
+ cases.push_back(geometry);
+
+ // Squash down and offset green rectangle's viewport.
+ geometry.viewports[1].y = kHeight * 0.25f;
+ geometry.viewports[1].height = kHeight * 0.75f;
+ cases.push_back(geometry);
+
+ // Add another viewport and scissor.
+ geometry.viewports.push_back(
+ {kWidth / 2 - 4, 0, kWidth / 2, kHeight - 8, 0.5f, 1.0f});
+ geometry.scissors.push_back(
+ {{kWidth / 2 - 2, 10}, {kWidth / 2, kHeight}});
+ geometry.rectangles.push_back(Rectangle{
+ Vec3(-1.0f, -1.0f, 0.5f), // Becomes 0.75f depth
+ 0x000000,
+ Vec2(1.75f, 1.75f),
+ 2 });
+ cases.push_back(geometry);
+
+ // Add a few more rectangles.
+ geometry.rectangles.push_back(Rectangle{
+ Vec3(-0.25f, -0.25f, 0.1f),
+ 0xFF00FF,
+ Vec2(0.375f, 0.375f),
+ 0 });
+ geometry.rectangles.push_back(Rectangle{
+ Vec3(-1.0f, -1.0f, 0.8f), // Becomes 0.9f depth
+ 0x00FFFF,
+ Vec2(2.0f, 2.0f),
+ 2 });
+ geometry.rectangles.push_back(Rectangle{
+ Vec3(-1.0f, -1.0f, 0.7f),
+ 0x808000,
+ Vec2(2.0f, 2.0f),
+ 0 });
+ cases.push_back(geometry);
+
+ // Change clear depth and color.
+ geometry.clearDepth = 0.85f;
+ geometry.clearColor = Vec3(1.0f, 1.0f, 0.0f);
+ cases.push_back(geometry);
+
+ // Alter viewport/scissor 2.
+ geometry.viewports[2] = VkViewport{ 0, 0, kWidth, kHeight, 0.51f, 0.53f };
+ geometry.scissors[2] = VkRect2D{ { 20, 0 }, { kWidth, kHeight } };
+ cases.push_back(geometry);
+
+ // Change clear depth and color again.
+ geometry.clearDepth = 0.5f;
+ geometry.clearColor = Vec3(0.0f, 1.0f, 0.0f);
+ cases.push_back(geometry);
+
+ return cases;
+}
+
+
+tcu::TestStatus InheritanceTestInstance::iterate(void)
+{
+ std::vector<TestGeometry> testGeometries = makeGeometry();
+ deUint32 failBits = 0;
+ DE_ASSERT(testGeometries.size() < 32);
+
+ for (size_t i = 0; i != testGeometries.size(); ++i)
+ {
+ const TestGeometry& geometry = testGeometries[i];
+ TestResults results;
+
+ // Start drawing commands.
+ startRenderCmds(geometry);
+
+ // Work on CPU-side expected results while waiting for device.
+ rasterizeExpectedResults(geometry, results.expectedResult);
+
+ // Wait for commands to finish and copy back results.
+ m_vk.queueWaitIdle(m_context.getUniversalQueue());
+ memcpy(results.deviceResult,
+ m_downloadBuffer.getAllocation().getHostPtr(),
+ kWidth * kHeight * sizeof(Texel));
+
+ // Compare results. The test cases should be simple enough not to
+ // require fuzzy matching (power of 2 framebuffer, no nearby depth
+ // values, etc.)
+ bool passed = true;
+ for (size_t y = 0; y < kHeight; ++y)
+ {
+ for (size_t x = 0; x < kWidth; ++x)
+ {
+ passed &= results.expectedResult[y][x].red == results.deviceResult[y][x].red;
+ passed &= results.expectedResult[y][x].green == results.deviceResult[y][x].green;
+ passed &= results.expectedResult[y][x].blue == results.deviceResult[y][x].blue;
+ }
+ }
+ results.passed = passed; // Log results?
+
+ failBits |= deUint32(!passed) << i;
+ }
+
+ if (failBits != 0)
+ {
+ std::stringstream stream;
+ stream << "Failed for test geometry";
+ for (int i = 0; i < 32; ++i)
+ {
+ if (1 & (failBits >> i))
+ {
+ stream << ' ' << i;
+ }
+ }
+ return tcu::TestStatus::fail(stream.str());
+ }
+ else
+ {
+ return tcu::TestStatus::pass("pass");
+ }
+}
+
+
+class InheritanceTestCase : public TestCase
+{
+public:
+ InheritanceTestCase (tcu::TestContext& testCtx, InheritanceMode inheritanceMode,
+ const char* name, const char* description)
+ : TestCase(testCtx, name, description), m_inheritanceMode(inheritanceMode)
+ {
+
+ }
+
+ TestInstance* createInstance (Context& context) const
+ {
+ return new InheritanceTestInstance(context, m_inheritanceMode);
+ }
+
+ virtual void checkSupport (Context& context) const
+ {
+ context.requireDeviceFunctionality("VK_NV_inherited_viewport_scissor");
+ if (m_inheritanceMode == kInheritFromPrimaryWithCount || m_inheritanceMode == kInheritFromSecondaryWithCount)
+ {
+ context.requireDeviceFunctionality("VK_EXT_extended_dynamic_state");
+ }
+ }
+
+ virtual void initPrograms (vk::SourceCollections& programCollection) const
+ {
+ programCollection.glslSources.add("vert") << glu::VertexSource (pipelinestate::vert_glsl);
+ programCollection.glslSources.add("geom") << glu::GeometrySource(pipelinestate::geom_glsl);
+ programCollection.glslSources.add("frag") << glu::FragmentSource(pipelinestate::frag_glsl);
+ }
+private:
+ InheritanceMode m_inheritanceMode;
+};
+
+} // anonymous namespace
+
+
+DynamicStateInheritanceTests::DynamicStateInheritanceTests (tcu::TestContext& testCtx)
+ : TestCaseGroup(testCtx, "inheritance", "Tests for inherited viewport/scissor state")
+{
+
+}
+
+void DynamicStateInheritanceTests::init (void)
+{
+ addChild(new InheritanceTestCase(m_testCtx, kInheritanceDisabled, "baseline",
+ "Baseline, no viewport/scissor inheritance"));
+ addChild(new InheritanceTestCase(m_testCtx, kInheritFromPrimary, "primary",
+ "Inherit viewport/scissor from calling primary command buffer"));
+ addChild(new InheritanceTestCase(m_testCtx, kInheritFromSecondary, "secondary",
+ "Inherit viewport/scissor from another secondary command buffer"));
+ addChild(new InheritanceTestCase(m_testCtx, kSplitInheritance, "split",
+ "Inherit some viewports/scissors from primary, some from secondary"));
+ addChild(new InheritanceTestCase(m_testCtx, kInheritFromPrimaryWithCount, "primary_with_count",
+ "Inherit viewport/scissor with count from calling primary command buffer"));
+ addChild(new InheritanceTestCase(m_testCtx, kInheritFromSecondaryWithCount, "secondary_with_count",
+ "Inherit viewport/scissor with count from another secondary command buffer"));
+}
+
+} // DynamicState
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.hpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.hpp
new file mode 100644
index 0000000..72c2a46
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.hpp
@@ -0,0 +1,47 @@
+#ifndef _VKTDYNAMICSTATEINHERITANCETESTS_HPP
+#define _VKTDYNAMICSTATEINHERITANCETESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 NVIDIA Corporation
+ *
+ * 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 VK_NV_inherited_viewport_scissor Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace DynamicState
+{
+
+class DynamicStateInheritanceTests : public tcu::TestCaseGroup
+{
+public:
+ DynamicStateInheritanceTests (tcu::TestContext& testCtx);
+ void init (void);
+private:
+ DynamicStateInheritanceTests (const DynamicStateInheritanceTests& other); // not implemented
+ DynamicStateInheritanceTests& operator= (const DynamicStateInheritanceTests& other); // not implemented
+};
+
+} // DynamicState
+} // vkt
+
+#endif // _VKTDYNAMICSTATEINHERITANCETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp
index d487798..a6dd053 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp
@@ -306,7 +306,7 @@
transition2DImage(m_vk, *m_cmdBuffer, m_depthStencilImage->object(), vk::VK_IMAGE_ASPECT_DEPTH_BIT | vk::VK_IMAGE_ASPECT_STENCIL_BIT,
vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
vk::beginRenderPass(m_vk, *m_cmdBuffer, *m_renderPass, *m_framebuffer, vk::makeRect2D(0, 0, WIDTH, HEIGHT));
diff --git a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTests.cpp b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTests.cpp
index 16f501c..e7398cf 100644
--- a/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTests.cpp
+++ b/external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTests.cpp
@@ -29,6 +29,8 @@
#include "vktDynamicStateCBTests.hpp"
#include "vktDynamicStateDSTests.hpp"
#include "vktDynamicStateGeneralTests.hpp"
+#include "vktDynamicStateComputeTests.hpp"
+#include "vktDynamicStateInheritanceTests.hpp"
#include "vktTestGroupUtil.hpp"
namespace vkt
@@ -48,6 +50,8 @@
group->addChild(new DynamicStateCBTests(testCtx));
group->addChild(new DynamicStateDSTests(testCtx));
group->addChild(new DynamicStateGeneralTests(testCtx));
+ group->addChild(createDynamicStateComputeTests(testCtx));
+ group->addChild(new DynamicStateInheritanceTests(testCtx));
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp b/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp
index 847d09d..814cf95 100644
--- a/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_shader_interlock/vktFragmentShaderInterlockBasic.cpp
@@ -238,12 +238,8 @@
context.getInstanceInterface().getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &features2);
-
- if (!context.getFragmentShadingRateFeatures().pipelineFragmentShadingRate ||
- !context.getFragmentShadingRateProperties().fragmentShadingRateWithFragmentShaderInterlock)
- {
- TCU_THROW(NotSupportedError, "fragment shading rate not supported");
- }
+ if (!shadingRateImageFeatures.shadingRateImage)
+ TCU_THROW(NotSupportedError, "Shading rate image not supported");
}
}
@@ -393,7 +389,7 @@
const VkDevice device = getDevice(m_context, m_data.interlock);
Allocator& allocator = m_context.getDefaultAllocator();
VkFlags allShaderStages = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
- VkFlags allPipelineStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
+ VkFlags allPipelineStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
VkPhysicalDeviceProperties2 properties;
deMemset(&properties, 0, sizeof(properties));
@@ -778,7 +774,7 @@
vk.cmdFillBuffer(*cmdBuffer, **buffer, 0, bufferSize, 0);
memBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
- memBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
+ memBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, allPipelineStages,
0, 1, &memBarrier, 0, DE_NULL, 0, DE_NULL);
diff --git a/external/vulkancts/modules/vulkan/fragment_shading_rate/CMakeLists.txt b/external/vulkancts/modules/vulkan/fragment_shading_rate/CMakeLists.txt
index 0cbd423..07a339d 100644
--- a/external/vulkancts/modules/vulkan/fragment_shading_rate/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/fragment_shading_rate/CMakeLists.txt
@@ -5,6 +5,8 @@
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/vktFragmentShadingRateBasic.cpp b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateBasic.cpp
index 754bf3f..b464644 100644
--- a/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateBasic.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateBasic.cpp
@@ -906,7 +906,8 @@
Move<VkImageView> dsImageView, dImageView, sImageView;
VkImageUsageFlags dsUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
VK_IMAGE_USAGE_SAMPLED_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT;
if (m_data.useDepthStencil)
{
const VkImageCreateInfo imageCreateInfo =
@@ -1910,6 +1911,15 @@
{
VkImageSubresourceRange range = makeImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, VK_REMAINING_ARRAY_LAYERS);
VkClearValue clearColor = makeClearValueDepthStencil(0.0, 0);
+ VkImageMemoryBarrier dsBarrier = imageBarrier;
+ dsBarrier.image = **dsImage;
+ dsBarrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ dsBarrier.subresourceRange = range;
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+ 0u, // dependencyFlags
+ 0u, nullptr,
+ 0u, nullptr,
+ 1u, &dsBarrier);
vk.cmdClearDepthStencilImage(*cmdBuffer, **dsImage, VK_IMAGE_LAYOUT_GENERAL, &clearColor.depthStencil, 1, &range);
}
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
index 0000000..04929d4
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.cpp
@@ -0,0 +1,1352 @@
+/*------------------------------------------------------------------------
+ * 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;
+
+ deviceExtensions.push_back("VK_KHR_fragment_shading_rate");
+
+ 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);
+ for (deUint32 i = 0; i < m_supportedFragmentShadingRateCount; ++i)
+ {
+ m_supportedFragmentShadingRates[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR;
+ m_supportedFragmentShadingRates[i].pNext = nullptr;
+ }
+ 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, ©Region);
+
+ 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/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.hpp
similarity index 65%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.hpp
index 1a85ebf..4d2ee8c 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRatePixelConsistency.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTFRAGMENTSHADINGRATEPIXELCONSISTENCY_HPP
+#define _VKTFRAGMENTSHADINGRATEPIXELCONSISTENCY_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * 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.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Tests for VK_KHR_fragment_shading_rate.
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +29,12 @@
namespace vkt
{
-namespace pipeline
+namespace FragmentShadingRate
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+void createPixelConsistencyTests(tcu::TestContext& testCtx, tcu::TestCaseGroup* group);
-} // pipeline
+} // FragmentShadingRate
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTFRAGMENTSHADINGRATEPIXELCONSISTENCY_HPP
diff --git a/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateTests.cpp b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateTests.cpp
index 721f7a7..b1ea10f 100644
--- a/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateTests.cpp
+++ b/external/vulkancts/modules/vulkan/fragment_shading_rate/vktFragmentShadingRateTests.cpp
@@ -24,6 +24,7 @@
#include "vktFragmentShadingRateTests.hpp"
#include "vktFragmentShadingRateBasic.hpp"
+#include "vktFragmentShadingRatePixelConsistency.hpp"
#include "vktTestGroupUtil.hpp"
namespace vkt
@@ -38,7 +39,8 @@
{
tcu::TestContext& testCtx = group->getTestContext();
- createBasicTests(testCtx, group);
+ createBasicTests (testCtx, group);
+ createPixelConsistencyTests(testCtx, group);
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp
index 6ec246d..d748e70 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryInputGeometryShaderTests.cpp
@@ -143,6 +143,13 @@
void GeometryExpanderRenderTest::checkSupport (Context& context) const
{
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+
+ if (m_primitiveType == vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
}
void GeometryExpanderRenderTest::initPrograms (SourceCollections& sourceCollections) const
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp
index 8d43032..47a5700 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryLayeredRenderingTests.cpp
@@ -1457,7 +1457,7 @@
vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &colorBarrier);
if (dsUsed)
- vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &dsBarrier);
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &dsBarrier);
}
{
@@ -1809,8 +1809,16 @@
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
if (params.image.viewType == VK_IMAGE_VIEW_TYPE_3D)
+ {
context.requireDeviceFunctionality("VK_KHR_maintenance1");
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().imageView2DOn3DImage)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Implementation does not support 2D or 2D array image view to be created on a 3D VkImage");
+ }
+ }
+
if (params.testType == TEST_TYPE_SECONDARY_CMD_BUFFER)
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_FRAGMENT_STORES_AND_ATOMICS);
}
diff --git a/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp b/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp
index 709e21d..d93a268 100644
--- a/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/geometry/vktGeometryTestsUtil.cpp
@@ -418,7 +418,7 @@
tcu::ImageIO::loadPNG(referenceImage, context.getTestContext().getArchive(), fileName.c_str());
if (tcu::fuzzyCompare(context.getTestContext().getLog(), "ImageComparison", "Image Comparison",
- referenceImage.getAccess(), resultImage, 0.001f, tcu::COMPARE_LOG_RESULT))
+ referenceImage.getAccess(), resultImage, 0.0015f, tcu::COMPARE_LOG_RESULT))
return tcu::intThresholdPositionDeviationCompare(context.getTestContext().getLog(), "ImageComparison", "Image Comparison",
referenceImage.getAccess(), resultImage, tcu::UVec4(1u, 1u, 1u, 1u), tcu::IVec3(2,2,2), false, tcu::COMPARE_LOG_RESULT);
else
diff --git a/external/vulkancts/modules/vulkan/image/CMakeLists.txt b/external/vulkancts/modules/vulkan/image/CMakeLists.txt
index 1ac3333..0c1f3ca 100644
--- a/external/vulkancts/modules/vulkan/image/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/image/CMakeLists.txt
@@ -35,6 +35,8 @@
vktImageMisalignedCubeTests.hpp
vktImageSubresourceLayoutTests.cpp
vktImageSubresourceLayoutTests.hpp
+ vktImageMismatchedWriteOpTests.cpp
+ vktImageMismatchedWriteOpTests.hpp
)
set(DEQP_VK_IMAGE_LIBS
diff --git a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
index 9776289..e5c187e 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp
@@ -26,6 +26,7 @@
#include "deUniquePtr.hpp"
#include "deStringUtil.hpp"
+#include "deSTLUtil.hpp"
#include "vktTestCaseUtil.hpp"
#include "vkPrograms.hpp"
@@ -96,6 +97,18 @@
ATOMIC_OPERATION_LAST
};
+enum class ShaderReadType
+{
+ NORMAL = 0,
+ SPARSE,
+};
+
+enum class ImageBackingType
+{
+ NORMAL = 0,
+ SPARSE,
+};
+
static string getCoordStr (const ImageType imageType,
const std::string& x,
const std::string& y,
@@ -120,6 +133,38 @@
}
}
+static string getComponentTypeStr (deUint32 componentWidth, bool intFormat, bool uintFormat, bool floatFormat)
+{
+ DE_ASSERT(intFormat || uintFormat || floatFormat);
+
+ const bool is64 = (componentWidth == 64);
+
+ if (intFormat)
+ return (is64 ? "int64_t" : "int");
+ if (uintFormat)
+ return (is64 ? "uint64_t" : "uint");
+ if (floatFormat)
+ return (is64 ? "double" : "float");
+
+ return "";
+}
+
+static string getVec4TypeStr (deUint32 componentWidth, bool intFormat, bool uintFormat, bool floatFormat)
+{
+ DE_ASSERT(intFormat || uintFormat || floatFormat);
+
+ const bool is64 = (componentWidth == 64);
+
+ if (intFormat)
+ return (is64 ? "i64vec4" : "ivec4");
+ if (uintFormat)
+ return (is64 ? "u64vec4" : "uvec4");
+ if (floatFormat)
+ return (is64 ? "f64vec4" : "vec4");
+
+ return "";
+}
+
static string getAtomicFuncArgumentShaderStr (const AtomicOperation op,
const string& x,
const string& y,
@@ -348,18 +393,34 @@
}
}
+VkImageUsageFlags getUsageFlags (bool useTransfer)
+{
+ VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_STORAGE_BIT;
+
+ if (useTransfer)
+ usageFlags |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+
+ return usageFlags;
+}
+
void AddFillReadShader (SourceCollections& sourceCollections,
const ImageType& imageType,
const tcu::TextureFormat& format,
- const string& type)
+ const string& componentType,
+ const string& vec4Type)
{
const string imageInCoord = getCoordStr(imageType, "gx", "gy", "gz");
const string shaderImageFormatStr = getShaderImageFormatQualifier(format);
const string shaderImageTypeStr = getShaderImageType(format, imageType);
+ const auto componentWidth = getFormatComponentWidth(mapTextureFormat(format), 0u);
+ const string extensions = ((componentWidth == 64u)
+ ? "#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require\n"
+ "#extension GL_EXT_shader_image_int64 : require\n"
+ : "");
+
const string fillShader = "#version 450\n"
- "#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require\n"
- "#extension GL_EXT_shader_image_int64 : require\n"
+ + extensions +
"precision highp " + shaderImageTypeStr + ";\n"
"\n"
"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
@@ -367,7 +428,7 @@
"\n"
"layout(std430, binding = 1) buffer inputBuffer\n"
"{\n"
- " "+ type + " data[];\n"
+ " "+ componentType + " data[];\n"
"} inBuffer;\n"
"\n"
"void main(void)\n"
@@ -376,12 +437,11 @@
" int gy = int(gl_GlobalInvocationID.y);\n"
" int gz = int(gl_GlobalInvocationID.z);\n"
" uint index = gx + (gy * gl_NumWorkGroups.x) + (gz *gl_NumWorkGroups.x * gl_NumWorkGroups.y);\n"
- " imageStore(u_resultImage, " + imageInCoord + ", i64vec4(inBuffer.data[index]));\n"
+ " imageStore(u_resultImage, " + imageInCoord + ", " + vec4Type + "(inBuffer.data[index]));\n"
"}\n";
const string readShader = "#version 450\n"
- "#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require\n"
- "#extension GL_EXT_shader_image_int64 : require\n"
+ + extensions +
"precision highp " + shaderImageTypeStr + ";\n"
"\n"
"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
@@ -389,7 +449,7 @@
"\n"
"layout(std430, binding = 1) buffer outputBuffer\n"
"{\n"
- " " + type + " data[];\n"
+ " " + componentType + " data[];\n"
"} outBuffer;\n"
"\n"
"void main(void)\n"
@@ -406,12 +466,9 @@
(imageType != IMAGE_TYPE_1D_ARRAY) &&
(imageType != IMAGE_TYPE_BUFFER))
{
- const string gvec4 = isUintFormat(mapTextureFormat(format)) ? "u64vec4" : "i64vec4";
-
const string readShaderResidency = "#version 450\n"
"#extension GL_ARB_sparse_texture2 : require\n"
- "#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require\n"
- "#extension GL_EXT_shader_image_int64 : require\n"
+ + extensions +
"precision highp " + shaderImageTypeStr + ";\n"
"\n"
"layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
@@ -419,7 +476,7 @@
"\n"
"layout(std430, binding = 1) buffer outputBuffer\n"
"{\n"
- " " + type + " data[];\n"
+ " " + componentType + " data[];\n"
"} outBuffer;\n"
"\n"
"void main(void)\n"
@@ -429,10 +486,10 @@
" int gz = int(gl_GlobalInvocationID.z);\n"
" uint index = gx + (gy * gl_NumWorkGroups.x) + (gz *gl_NumWorkGroups.x * gl_NumWorkGroups.y);\n"
" outBuffer.data[index] = imageLoad(u_resultImage, " + imageInCoord + ").x;\n"
- " " + gvec4 + " sparseValue;\n"
+ " " + vec4Type + " sparseValue;\n"
" sparseImageLoadARB(u_resultImage, " + imageInCoord + ", sparseValue);\n"
" if (outBuffer.data[index] != sparseValue.x)\n"
- " outBuffer.data[index] = " + gvec4 + "(1234).x;\n"
+ " outBuffer.data[index] = " + vec4Type + "(1234).x;\n"
"}\n";
sourceCollections.glslSources.add("readShaderResidency") << glu::ComputeSource(readShaderResidency.c_str()) << vk::ShaderBuildOptions(sourceCollections.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
@@ -442,15 +499,6 @@
sourceCollections.glslSources.add("readShader") << glu::ComputeSource(readShader.c_str()) << vk::ShaderBuildOptions(sourceCollections.usedVulkanVersion, vk::SPIRV_VERSION_1_3, 0u);
}
-static bool isSupportedFeatureTransfer (const Context& context, const VkFormat& format)
-{
- const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(),
- context.getPhysicalDevice(), format);
-
- return ((formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) &&
- (formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT));
-}
-
//! Prepare the initial data for the image
static void initDataForImage (const VkDevice device,
const DeviceInterface& deviceInterface,
@@ -489,6 +537,93 @@
flushAlloc(deviceInterface, device, bufferAllocation);
}
+void commonCheckSupport (Context& context, const tcu::TextureFormat& tcuFormat, ImageType imageType, AtomicOperation operation, bool useTransfer, ShaderReadType readType, ImageBackingType backingType)
+{
+ const VkFormat format = mapTextureFormat(tcuFormat);
+ const VkImageType vkImgType = mapImageType(imageType);
+ const VkFormatFeatureFlags texelBufferSupport = (VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT);
+ const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(),
+ context.getPhysicalDevice(), format);
+
+ if ((imageType == IMAGE_TYPE_BUFFER) &&
+ ((formatProperties.bufferFeatures & texelBufferSupport) != texelBufferSupport))
+ TCU_THROW(NotSupportedError, "Atomic storage texel buffers not supported");
+
+ if (imageType == IMAGE_TYPE_CUBE_ARRAY)
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
+
+ if (backingType == ImageBackingType::SPARSE)
+ {
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_BINDING);
+
+ switch (vkImgType)
+ {
+ case VK_IMAGE_TYPE_2D: context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_RESIDENCY_IMAGE2D); break;
+ case VK_IMAGE_TYPE_3D: context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_RESIDENCY_IMAGE3D); break;
+ default: DE_ASSERT(false); break;
+ }
+
+ if (!checkSparseImageFormatSupport(context.getPhysicalDevice(), context.getInstanceInterface(), format, vkImgType, VK_SAMPLE_COUNT_1_BIT, getUsageFlags(useTransfer), VK_IMAGE_TILING_OPTIMAL))
+ TCU_THROW(NotSupportedError, "Format does not support sparse images");
+ }
+
+ if (isFloatFormat(format))
+ {
+ context.requireDeviceFunctionality("VK_EXT_shader_atomic_float");
+
+ const VkFormatFeatureFlags requiredFeatures = (VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT);
+ const auto& atomicFloatFeatures = context.getShaderAtomicFloatFeaturesEXT();
+
+ if (!atomicFloatFeatures.shaderImageFloat32Atomics)
+ TCU_THROW(NotSupportedError, "shaderImageFloat32Atomics not supported");
+
+ if ((operation == ATOMIC_OPERATION_ADD) && !atomicFloatFeatures.shaderImageFloat32AtomicAdd)
+ TCU_THROW(NotSupportedError, "shaderImageFloat32AtomicAdd not supported");
+
+ if ((formatProperties.optimalTilingFeatures & requiredFeatures) != requiredFeatures)
+ TCU_FAIL("Required format feature bits not supported");
+
+ if (backingType == ImageBackingType::SPARSE)
+ {
+ if (!atomicFloatFeatures.sparseImageFloat32Atomics)
+ TCU_THROW(NotSupportedError, "sparseImageFloat32Atomics not supported");
+
+ if (operation == ATOMIC_OPERATION_ADD && !atomicFloatFeatures.sparseImageFloat32AtomicAdd)
+ TCU_THROW(NotSupportedError, "sparseImageFloat32AtomicAdd not supported");
+ }
+
+ }
+ else if (format == VK_FORMAT_R64_UINT || format == VK_FORMAT_R64_SINT)
+ {
+ context.requireDeviceFunctionality("VK_EXT_shader_image_atomic_int64");
+
+ const VkFormatFeatureFlags requiredFeatures = (VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT);
+ const auto& atomicInt64Features = context.getShaderImageAtomicInt64FeaturesEXT();
+
+ if (!atomicInt64Features.shaderImageInt64Atomics)
+ TCU_THROW(NotSupportedError, "shaderImageInt64Atomics not supported");
+
+ if (backingType == ImageBackingType::SPARSE && !atomicInt64Features.sparseImageInt64Atomics)
+ TCU_THROW(NotSupportedError, "sparseImageInt64Atomics not supported");
+
+ if ((formatProperties.optimalTilingFeatures & requiredFeatures) != requiredFeatures)
+ TCU_FAIL("Mandatory format features not supported");
+ }
+
+ if (useTransfer)
+ {
+ const VkFormatFeatureFlags transferFeatures = (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+ if ((formatProperties.optimalTilingFeatures & transferFeatures) != transferFeatures)
+ TCU_THROW(NotSupportedError, "Transfer features not supported for this format");
+ }
+
+ if (readType == ShaderReadType::SPARSE)
+ {
+ DE_ASSERT(imageType != IMAGE_TYPE_1D && imageType != IMAGE_TYPE_1D_ARRAY && imageType != IMAGE_TYPE_BUFFER);
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SHADER_RESOURCE_RESIDENCY);
+ }
+}
+
class BinaryAtomicEndResultCase : public vkt::TestCase
{
public:
@@ -499,6 +634,9 @@
const tcu::UVec3& imageSize,
const tcu::TextureFormat& format,
const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType,
const glu::GLSLVersion glslVersion);
void initPrograms (SourceCollections& sourceCollections) const;
@@ -510,6 +648,9 @@
const tcu::UVec3 m_imageSize;
const tcu::TextureFormat m_format;
const AtomicOperation m_operation;
+ const bool m_useTransfer;
+ const ShaderReadType m_readType;
+ const ImageBackingType m_backingType;
const glu::GLSLVersion m_glslVersion;
};
@@ -520,80 +661,38 @@
const tcu::UVec3& imageSize,
const tcu::TextureFormat& format,
const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType,
const glu::GLSLVersion glslVersion)
: TestCase (testCtx, name, description)
, m_imageType (imageType)
, m_imageSize (imageSize)
, m_format (format)
, m_operation (operation)
+ , m_useTransfer (useTransfer)
+ , m_readType (shaderReadType)
+ , m_backingType (backingType)
, m_glslVersion (glslVersion)
{
}
void BinaryAtomicEndResultCase::checkSupport (Context& context) const
{
- const VkFormat format = mapTextureFormat(m_format);
- const VkFormatFeatureFlags texelBufferSupport = VkFormatFeatureFlags(VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT |
- VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT);
- const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(),
- context.getPhysicalDevice(), format);
-
- if ((m_imageType == IMAGE_TYPE_BUFFER) &&
- ((formatProperties.bufferFeatures & texelBufferSupport) != texelBufferSupport))
- TCU_THROW(NotSupportedError, "STORAGE_TEXEL_BUFFER_ATOMIC is not supported");
-
- if (m_imageType == IMAGE_TYPE_CUBE_ARRAY)
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
-
- if (isFloatFormat(mapTextureFormat(m_format)))
- {
- const VkFormatFeatureFlags requiredFormatSupport = VkFormatFeatureFlags(VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
- VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT);
-
- context.requireDeviceFunctionality("VK_EXT_shader_atomic_float");
- if (!context.getShaderAtomicFloatFeaturesEXT().shaderImageFloat32Atomics)
- {
- TCU_THROW(NotSupportedError, "VkShaderAtomicFloat32: 32-bit floating point image atomic operations not supported");
- }
- if ((m_operation == ATOMIC_OPERATION_ADD) && !context.getShaderAtomicFloatFeaturesEXT().shaderImageFloat32AtomicAdd)
- {
- TCU_THROW(NotSupportedError, "VkShaderAtomicFloat32: 32-bit floating point image atomic add not supported");
- }
- if ((formatProperties.optimalTilingFeatures & requiredFormatSupport) != requiredFormatSupport)
- TCU_FAIL("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT and VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT must be supported");
- }
-
- if (format == VK_FORMAT_R64_UINT || format == VK_FORMAT_R64_SINT)
- {
- const VkFormatFeatureFlags requisiteSupportR64 = VkFormatFeatureFlags(VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
- VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT);
-
- context.requireDeviceFunctionality("VK_EXT_shader_image_atomic_int64");
-
- if (!context.getShaderImageAtomicInt64FeaturesEXT().shaderImageInt64Atomics)
- {
- TCU_THROW(NotSupportedError, "shaderImageInt64Atomics is not supported");
- }
-
- if ((formatProperties.optimalTilingFeatures & requisiteSupportR64) != requisiteSupportR64)
- TCU_FAIL("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT and VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT must be supported");
- }
+ commonCheckSupport(context, m_format, m_imageType, m_operation, m_useTransfer, m_readType, m_backingType);
}
void BinaryAtomicEndResultCase::initPrograms (SourceCollections& sourceCollections) const
{
const VkFormat imageFormat = mapTextureFormat(m_format);
const deUint32 componentWidth = getFormatComponentWidth(imageFormat, 0);
- const bool uintFormat = isUintFormat(imageFormat);
const bool intFormat = isIntFormat(imageFormat);
- const string type = (64 == componentWidth ?
- (uintFormat ? "uint64_t" : intFormat ? "int64_t" : "double") :
- (uintFormat ? "uint" : intFormat ? "int" : "float"));
+ const bool uintFormat = isUintFormat(imageFormat);
+ const bool floatFormat = isFloatFormat(imageFormat);
+ const string type = getComponentTypeStr(componentWidth, intFormat, uintFormat, floatFormat);
+ const string vec4Type = getVec4TypeStr(componentWidth, intFormat, uintFormat, floatFormat);
- if (imageFormat == VK_FORMAT_R64_UINT || imageFormat == VK_FORMAT_R64_SINT)
- {
- AddFillReadShader(sourceCollections, m_imageType, m_format, type);
- }
+ AddFillReadShader(sourceCollections, m_imageType, m_format, type, vec4Type);
if (isSpirvAtomicOperation(m_operation))
{
@@ -661,6 +760,9 @@
const tcu::UVec3& imageSize,
const tcu::TextureFormat& format,
const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType,
const glu::GLSLVersion glslVersion);
void initPrograms (SourceCollections& sourceCollections) const;
@@ -672,6 +774,9 @@
const tcu::UVec3 m_imageSize;
const tcu::TextureFormat m_format;
const AtomicOperation m_operation;
+ const bool m_useTransfer;
+ const ShaderReadType m_readType;
+ const ImageBackingType m_backingType;
const glu::GLSLVersion m_glslVersion;
};
@@ -682,79 +787,38 @@
const tcu::UVec3& imageSize,
const TextureFormat& format,
const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType,
const glu::GLSLVersion glslVersion)
: TestCase (testCtx, name, description)
, m_imageType (imageType)
, m_imageSize (imageSize)
, m_format (format)
, m_operation (operation)
+ , m_useTransfer (useTransfer)
+ , m_readType (shaderReadType)
+ , m_backingType (backingType)
, m_glslVersion (glslVersion)
{
}
void BinaryAtomicIntermValuesCase::checkSupport (Context& context) const
{
- const VkFormat format = mapTextureFormat(m_format);
- const VkFormatFeatureFlags texelBufferSupport = VkFormatFeatureFlags(VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT |
- VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT);
- const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(),
- context.getPhysicalDevice(), format);
-
- if ((m_imageType == IMAGE_TYPE_BUFFER) &&
- ((formatProperties.bufferFeatures & texelBufferSupport) != texelBufferSupport))
- TCU_THROW(NotSupportedError, "STORAGE_TEXEL_BUFFER_ATOMIC is not supported");
-
- if (m_imageType == IMAGE_TYPE_CUBE_ARRAY)
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
-
- if (isFloatFormat(mapTextureFormat(m_format)))
- {
- const VkFormatFeatureFlags requiredFormatSupport = VkFormatFeatureFlags(VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
- VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT);
- context.requireDeviceFunctionality("VK_EXT_shader_atomic_float");
- if (!context.getShaderAtomicFloatFeaturesEXT().shaderImageFloat32Atomics)
- {
- TCU_THROW(NotSupportedError, "VkShaderAtomicFloat32: 32-bit floating point image atomic operations not supported");
- }
- if ((m_operation == ATOMIC_OPERATION_ADD) && !context.getShaderAtomicFloatFeaturesEXT().shaderImageFloat32AtomicAdd)
- {
- TCU_THROW(NotSupportedError, "VkShaderAtomicFloat32: 32-bit floating point image atomic add not supported");
- }
- if ((formatProperties.optimalTilingFeatures & requiredFormatSupport) != requiredFormatSupport)
- TCU_FAIL("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT and VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT must be supported");
- }
-
- if (format == VK_FORMAT_R64_UINT || format == VK_FORMAT_R64_SINT)
- {
- const VkFormatFeatureFlags requisiteSupportR64 = VkFormatFeatureFlags(VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT |
- VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT);
-
- context.requireDeviceFunctionality("VK_EXT_shader_image_atomic_int64");
-
- if (!context.getShaderImageAtomicInt64FeaturesEXT().shaderImageInt64Atomics)
- {
- TCU_THROW(NotSupportedError, "shaderImageInt64Atomics is not supported");
- }
-
- if ((formatProperties.optimalTilingFeatures & requisiteSupportR64) != requisiteSupportR64)
- TCU_FAIL("VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT and VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT must be supported");
- }
+ commonCheckSupport(context, m_format, m_imageType, m_operation, m_useTransfer, m_readType, m_backingType);
}
void BinaryAtomicIntermValuesCase::initPrograms (SourceCollections& sourceCollections) const
{
- const VkFormat imageFormat = mapTextureFormat(m_format);
+ const VkFormat imageFormat = mapTextureFormat(m_format);
const deUint32 componentWidth = getFormatComponentWidth(imageFormat, 0);
- const bool uintFormat = isUintFormat(imageFormat);
const bool intFormat = isIntFormat(imageFormat);
- const string type = (64 == componentWidth ?
- (uintFormat ? "uint64_t" : intFormat ? "int64_t" : "double") :
- (uintFormat ? "uint" : intFormat ? "int" : "float"));
+ const bool uintFormat = isUintFormat(imageFormat);
+ const bool floatFormat = isFloatFormat(imageFormat);
+ const string type = getComponentTypeStr(componentWidth, intFormat, uintFormat, floatFormat);
+ const string vec4Type = getVec4TypeStr(componentWidth, intFormat, uintFormat, floatFormat);
- if (imageFormat == VK_FORMAT_R64_UINT || imageFormat == VK_FORMAT_R64_SINT)
- {
- AddFillReadShader(sourceCollections, m_imageType, m_format, type);
- }
+ AddFillReadShader(sourceCollections, m_imageType, m_format, type, vec4Type);
if (isSpirvAtomicOperation(m_operation))
{
@@ -771,7 +835,6 @@
else
{
const string versionDecl = glu::getGLSLVersionDeclaration(m_glslVersion);
- const string colorVecTypeName = string(uintFormat ? "u" : intFormat ? "i" : "") + (64 == componentWidth ? "64" : "") + "vec4";
const UVec3 gridSize = getShaderGridSize(m_imageType, m_imageSize);
const string atomicCoord = getCoordStr(m_imageType, "gx % " + toString(gridSize.x()), "gy", "gz");
const string invocationCoord = getCoordStr(m_imageType, "gx", "gy", "gz");
@@ -807,7 +870,7 @@
" int gx = int(gl_GlobalInvocationID.x);\n"
" int gy = int(gl_GlobalInvocationID.y);\n"
" int gz = int(gl_GlobalInvocationID.z);\n"
- " imageStore(u_intermValuesImage, " + invocationCoord + ", " + colorVecTypeName + "(" + atomicInvocation + "));\n"
+ " imageStore(u_intermValuesImage, " + invocationCoord + ", " + vec4Type + "(" + atomicInvocation + "));\n"
"}\n";
sourceCollections.glslSources.add(m_name) << glu::ComputeSource(source.c_str());
@@ -823,13 +886,16 @@
const ImageType imageType,
const tcu::UVec3& imageSize,
const TextureFormat& format,
- const AtomicOperation operation);
+ const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType);
tcu::TestStatus iterate (void);
virtual deUint32 getOutputBufferSize (void) const = 0;
- virtual void prepareResources (const bool isSupportedTransfer) = 0;
+ virtual void prepareResources (const bool useTransfer) = 0;
virtual void prepareDescriptors (const bool isTexelBuffer) = 0;
virtual void commandsBeforeCompute (const VkCommandBuffer cmdBuffer) const = 0;
@@ -838,7 +904,7 @@
const VkPipelineLayout pipelineLayout,
const VkDescriptorSet descriptorSet,
const VkDeviceSize& range,
- const bool isSupportedTransfer) = 0;
+ const bool useTransfer) = 0;
virtual bool verifyResult (Allocation& outputBufferAllocation,
const bool is64Bit) const = 0;
@@ -853,14 +919,23 @@
const VkDeviceSize& range,
const tcu::UVec3& gridSize);
- void createdImageResources (const VkFormat& imageFormat,
- const bool isSupportedTransfer);
+ void createImageAndView (VkFormat imageFormat,
+ const tcu::UVec3& imageExent,
+ bool useTransfer,
+ de::MovePtr<Image>& imagePtr,
+ Move<VkImageView>& imageViewPtr);
+
+ void createImageResources (const VkFormat& imageFormat,
+ const bool useTransfer);
const string m_name;
const ImageType m_imageType;
const tcu::UVec3 m_imageSize;
const TextureFormat m_format;
const AtomicOperation m_operation;
+ const bool m_useTransfer;
+ const ShaderReadType m_readType;
+ const ImageBackingType m_backingType;
de::MovePtr<Buffer> m_inputBuffer;
de::MovePtr<Buffer> m_outputBuffer;
@@ -875,6 +950,8 @@
de::MovePtr<Image> m_resultImage;
Move<VkImageView> m_resultImageView;
+
+ std::vector<VkSemaphore> m_waitSemaphores;
};
BinaryAtomicInstanceBase::BinaryAtomicInstanceBase (Context& context,
@@ -882,13 +959,19 @@
const ImageType imageType,
const tcu::UVec3& imageSize,
const TextureFormat& format,
- const AtomicOperation operation)
+ const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType)
: vkt::TestInstance (context)
, m_name (name)
, m_imageType (imageType)
, m_imageSize (imageSize)
, m_format (format)
, m_operation (operation)
+ , m_useTransfer (useTransfer)
+ , m_readType (shaderReadType)
+ , m_backingType (backingType)
{
}
@@ -902,17 +985,14 @@
const VkDeviceSize imageSizeInBytes = tcu::getPixelSize(m_format) * getNumPixels(m_imageType, m_imageSize);
const VkDeviceSize outBuffSizeInBytes = getOutputBufferSize();
const VkFormat imageFormat = mapTextureFormat(m_format);
- const bool isSupportedTransfer = (imageFormat != VK_FORMAT_R64_SINT) &&
- (imageFormat != VK_FORMAT_R64_UINT) &&
- isSupportedFeatureTransfer(m_context, imageFormat);
const bool isTexelBuffer = (m_imageType == IMAGE_TYPE_BUFFER);
if (!isTexelBuffer)
{
- createdImageResources(imageFormat, isSupportedTransfer);
+ createImageResources(imageFormat, m_useTransfer);
}
- tcu::UVec3 gridSize = getShaderGridSize(m_imageType, m_imageSize);
+ tcu::UVec3 gridSize = getShaderGridSize(m_imageType, m_imageSize);
//Prepare the buffer with the initial data for the image
m_inputBuffer = de::MovePtr<Buffer>(new Buffer(deviceInterface,
@@ -939,7 +1019,7 @@
if (!isTexelBuffer)
{
- prepareResources(isSupportedTransfer);
+ prepareResources(m_useTransfer);
}
prepareDescriptors(isTexelBuffer);
@@ -954,7 +1034,7 @@
Move<VkPipelineLayout> pipelineLayoutReadImage;
Move<VkPipeline> pipelineReadImage;
- if (!isSupportedTransfer)
+ if (!m_useTransfer)
{
m_descriptorSetLayoutNoTransfer =
DescriptorSetLayoutBuilder()
@@ -982,13 +1062,7 @@
pipelineLayoutFillImage = makePipelineLayout(deviceInterface, device, *m_descriptorSetLayoutNoTransfer);
pipelineFillImage = makeComputePipeline(deviceInterface, device, *pipelineLayoutFillImage, *shaderModuleFillImage);
- const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
-
- if ((deviceFeatures.shaderResourceResidency == VK_TRUE) &&
- m_context.getShaderImageAtomicInt64FeaturesEXT().sparseImageInt64Atomics &&
- (m_imageType != IMAGE_TYPE_1D) &&
- (m_imageType != IMAGE_TYPE_1D_ARRAY) &&
- (m_imageType != IMAGE_TYPE_BUFFER))
+ if (m_readType == ShaderReadType::SPARSE)
{
shaderModuleReadImage = createShaderModule(deviceInterface, device, m_context.getBinaryCollection().get("readShaderResidency"), 0);
}
@@ -1013,7 +1087,7 @@
if (!isTexelBuffer)
{
- if (isSupportedTransfer)
+ if (m_useTransfer)
{
const vector<VkBufferImageCopy> bufferImageCopy(1, makeBufferImageCopy(makeExtent3D(getLayerSize(m_imageType, m_imageSize)), getNumLayers(m_imageType, m_imageSize)));
copyBufferToImage(deviceInterface,
@@ -1042,24 +1116,26 @@
*pipelineLayoutReadImage,
*descriptorSetReadImage,
outBuffSizeInBytes,
- isSupportedTransfer);
+ m_useTransfer);
const VkBufferMemoryBarrier outputBufferPreHostReadBarrier
- = makeBufferMemoryBarrier(((isSupportedTransfer || isTexelBuffer) ? VK_ACCESS_TRANSFER_WRITE_BIT : VK_ACCESS_SHADER_WRITE_BIT),
+ = makeBufferMemoryBarrier(((m_useTransfer || isTexelBuffer) ? VK_ACCESS_TRANSFER_WRITE_BIT : VK_ACCESS_SHADER_WRITE_BIT),
VK_ACCESS_HOST_READ_BIT,
m_outputBuffer->get(),
0ull,
outBuffSizeInBytes);
deviceInterface.cmdPipelineBarrier(*cmdBuffer,
- ((isSupportedTransfer || isTexelBuffer) ? VK_PIPELINE_STAGE_TRANSFER_BIT : VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
+ ((m_useTransfer || isTexelBuffer) ? VK_PIPELINE_STAGE_TRANSFER_BIT : VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
VK_PIPELINE_STAGE_HOST_BIT,
DE_FALSE, 0u, DE_NULL,
1u, &outputBufferPreHostReadBarrier, 0u, DE_NULL);
endCommandBuffer(deviceInterface, *cmdBuffer);
- submitCommandsAndWait(deviceInterface, device, queue, *cmdBuffer);
+ std::vector<VkPipelineStageFlags> waitStages(m_waitSemaphores.size(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+ submitCommandsAndWait(deviceInterface, device, queue, *cmdBuffer, false, 1u,
+ static_cast<deUint32>(m_waitSemaphores.size()), de::dataOrNull(m_waitSemaphores), de::dataOrNull(waitStages));
Allocation& outputBufferAllocation = m_outputBuffer->getAllocation();
@@ -1126,45 +1202,77 @@
1, &imageBarrierPost);
}
-void BinaryAtomicInstanceBase::createdImageResources (const VkFormat& imageFormat,
- const bool isSupportedTransfer)
+void BinaryAtomicInstanceBase::createImageAndView (VkFormat imageFormat,
+ const tcu::UVec3& imageExent,
+ bool useTransfer,
+ de::MovePtr<Image>& imagePtr,
+ Move<VkImageView>& imageViewPtr)
{
const VkDevice device = m_context.getDevice();
const DeviceInterface& deviceInterface = m_context.getDeviceInterface();
Allocator& allocator = m_context.getDefaultAllocator();
+ const VkImageUsageFlags usageFlags = getUsageFlags(useTransfer);
+ VkImageCreateFlags createFlags = 0u;
- const VkImageCreateInfo imageParams =
+ if (m_imageType == IMAGE_TYPE_CUBE || m_imageType == IMAGE_TYPE_CUBE_ARRAY)
+ createFlags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
+
+ const auto numLayers = getNumLayers(m_imageType, m_imageSize);
+
+ VkImageCreateInfo createInfo =
{
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
- (m_imageType == IMAGE_TYPE_CUBE ||
- m_imageType == IMAGE_TYPE_CUBE_ARRAY ?
- (VkImageCreateFlags)VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT :
- (VkImageCreateFlags)0u), // VkImageCreateFlags flags;
+ createFlags, // VkImageCreateFlags flags;
mapImageType(m_imageType), // VkImageType imageType;
imageFormat, // VkFormat format;
- makeExtent3D(getLayerSize(m_imageType, m_imageSize)), // VkExtent3D extent;
+ makeExtent3D(imageExent), // VkExtent3D extent;
1u, // deUint32 mipLevels;
- getNumLayers(m_imageType, m_imageSize), // deUint32 arrayLayers;
+ numLayers, // deUint32 arrayLayers;
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- (VkImageUsageFlags)(isSupportedTransfer ?
- (VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
- VK_IMAGE_USAGE_TRANSFER_DST_BIT) :
- VK_IMAGE_USAGE_STORAGE_BIT), // VkImageUsageFlags usage;
+ usageFlags, // VkImageUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
0u, // deUint32 queueFamilyIndexCount;
DE_NULL, // const deUint32* pQueueFamilyIndices;
VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
};
+ if (m_backingType == ImageBackingType::SPARSE)
+ {
+ const auto& vki = m_context.getInstanceInterface();
+ const auto physicalDevice = m_context.getPhysicalDevice();
+ const auto sparseQueue = m_context.getSparseQueue();
+ const auto sparseQueueIdx = m_context.getSparseQueueFamilyIndex();
+ const auto universalQIdx = m_context.getUniversalQueueFamilyIndex();
+ const deUint32 queueIndices[] = { universalQIdx, sparseQueueIdx };
+
+ createInfo.flags |= (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT);
+
+ if (sparseQueueIdx != universalQIdx)
+ {
+ createInfo.sharingMode = VK_SHARING_MODE_CONCURRENT;
+ createInfo.queueFamilyIndexCount = static_cast<deUint32>(DE_LENGTH_OF_ARRAY(queueIndices));
+ createInfo.pQueueFamilyIndices = queueIndices;
+ }
+
+ const auto sparseImage = new SparseImage(deviceInterface, device, physicalDevice, vki, createInfo, sparseQueue, allocator, m_format);
+ m_waitSemaphores.push_back(sparseImage->getSemaphore());
+ imagePtr = de::MovePtr<Image>(sparseImage);
+ }
+ else
+ imagePtr = de::MovePtr<Image>(new Image(deviceInterface, device, allocator, createInfo, MemoryRequirement::Any));
+
+ const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, numLayers);
+
+ imageViewPtr = makeImageView(deviceInterface, device, imagePtr->get(), mapImageViewType(m_imageType), imageFormat, subresourceRange);
+}
+
+void BinaryAtomicInstanceBase::createImageResources (const VkFormat& imageFormat,
+ const bool useTransfer)
+{
//Create the image that is going to store results of atomic operations
- m_resultImage = de::MovePtr<Image>(new Image(deviceInterface, device, allocator, imageParams, MemoryRequirement::Any));
-
- const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, getNumLayers(m_imageType, m_imageSize));
-
- m_resultImageView = makeImageView(deviceInterface, device, m_resultImage->get(), mapImageViewType(m_imageType), imageFormat, subresourceRange);
+ createImageAndView(imageFormat, getLayerSize(m_imageType, m_imageSize), useTransfer, m_resultImage, m_resultImageView);
}
class BinaryAtomicEndResultInstance : public BinaryAtomicInstanceBase
@@ -1176,12 +1284,15 @@
const ImageType imageType,
const tcu::UVec3& imageSize,
const TextureFormat& format,
- const AtomicOperation operation)
- : BinaryAtomicInstanceBase(context, name, imageType, imageSize, format, operation) {}
+ const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType)
+ : BinaryAtomicInstanceBase(context, name, imageType, imageSize, format, operation, useTransfer, shaderReadType, backingType) {}
virtual deUint32 getOutputBufferSize (void) const;
- virtual void prepareResources (const bool isSupportedTransfer) { DE_UNREF(isSupportedTransfer); }
+ virtual void prepareResources (const bool useTransfer) { DE_UNREF(useTransfer); }
virtual void prepareDescriptors (const bool isTexelBuffer);
virtual void commandsBeforeCompute (const VkCommandBuffer) const {}
@@ -1190,7 +1301,7 @@
const VkPipelineLayout pipelineLayout,
const VkDescriptorSet descriptorSet,
const VkDeviceSize& range,
- const bool isSupportedTransfer);
+ const bool useTransfer);
virtual bool verifyResult (Allocation& outputBufferAllocation,
const bool is64Bit) const;
@@ -1230,6 +1341,7 @@
.build(deviceInterface, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
m_descriptorSet = makeDescriptorSet(deviceInterface, device, *m_descriptorPool, *m_descriptorSetLayout);
+
if (isTexelBuffer)
{
m_descResultBufferView = makeBufferView(deviceInterface, device, *(*m_inputBuffer), mapTextureFormat(m_format), 0, VK_WHOLE_SIZE);
@@ -1253,7 +1365,7 @@
const VkPipelineLayout pipelineLayout,
const VkDescriptorSet descriptorSet,
const VkDeviceSize& range,
- const bool isSupportedTransfer)
+ const bool useTransfer)
{
const DeviceInterface& deviceInterface = m_context.getDeviceInterface();
const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, getNumLayers(m_imageType, m_imageSize));
@@ -1263,7 +1375,7 @@
{
m_outputBuffer = m_inputBuffer;
}
- else if (isSupportedTransfer)
+ else if (useTransfer)
{
const VkImageMemoryBarrier resultImagePostDispatchBarrier =
makeImageMemoryBarrier( VK_ACCESS_SHADER_WRITE_BIT,
@@ -1295,12 +1407,12 @@
.update(deviceInterface, device);
const VkImageMemoryBarrier resultImagePostDispatchBarrier =
- makeImageMemoryBarrier( VK_ACCESS_SHADER_WRITE_BIT,
- VK_ACCESS_SHADER_READ_BIT,
- VK_IMAGE_LAYOUT_GENERAL,
- VK_IMAGE_LAYOUT_GENERAL,
- m_resultImage->get(),
- subresourceRange);
+ makeImageMemoryBarrier( VK_ACCESS_SHADER_WRITE_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ VK_IMAGE_LAYOUT_GENERAL,
+ VK_IMAGE_LAYOUT_GENERAL,
+ m_resultImage->get(),
+ subresourceRange);
deviceInterface.cmdPipelineBarrier( cmdBuffer,
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
@@ -1442,7 +1554,7 @@
TestInstance* BinaryAtomicEndResultCase::createInstance (Context& context) const
{
- return new BinaryAtomicEndResultInstance(context, m_name, m_imageType, m_imageSize, m_format, m_operation);
+ return new BinaryAtomicEndResultInstance(context, m_name, m_imageType, m_imageSize, m_format, m_operation, m_useTransfer, m_readType, m_backingType);
}
class BinaryAtomicIntermValuesInstance : public BinaryAtomicInstanceBase
@@ -1454,12 +1566,15 @@
const ImageType imageType,
const tcu::UVec3& imageSize,
const TextureFormat& format,
- const AtomicOperation operation)
- : BinaryAtomicInstanceBase(context, name, imageType, imageSize, format, operation) {}
+ const AtomicOperation operation,
+ const bool useTransfer,
+ const ShaderReadType shaderReadType,
+ const ImageBackingType backingType)
+ : BinaryAtomicInstanceBase(context, name, imageType, imageSize, format, operation, useTransfer, shaderReadType, backingType) {}
virtual deUint32 getOutputBufferSize (void) const;
- virtual void prepareResources (const bool isSupportedTransfer);
+ virtual void prepareResources (const bool useTransfer);
virtual void prepareDescriptors (const bool isTexelBuffer);
virtual void commandsBeforeCompute (const VkCommandBuffer cmdBuffer) const;
@@ -1468,7 +1583,7 @@
const VkPipelineLayout pipelineLayout,
const VkDescriptorSet descriptorSet,
const VkDeviceSize& range,
- const bool isSupportedTransfer);
+ const bool useTransfer);
virtual bool verifyResult (Allocation& outputBufferAllocation,
const bool is64Bit) const;
@@ -1499,48 +1614,14 @@
return NUM_INVOCATIONS_PER_PIXEL * tcu::getPixelSize(m_format) * getNumPixels(m_imageType, m_imageSize);
}
-void BinaryAtomicIntermValuesInstance::prepareResources (const bool isSupportedTransfer)
+void BinaryAtomicIntermValuesInstance::prepareResources (const bool useTransfer)
{
- const VkDevice device = m_context.getDevice();
- const DeviceInterface& deviceInterface = m_context.getDeviceInterface();
- Allocator& allocator = m_context.getDefaultAllocator();
-
const UVec3 layerSize = getLayerSize(m_imageType, m_imageSize);
const bool isCubeBasedImage = (m_imageType == IMAGE_TYPE_CUBE || m_imageType == IMAGE_TYPE_CUBE_ARRAY);
const UVec3 extendedLayerSize = isCubeBasedImage ? UVec3(NUM_INVOCATIONS_PER_PIXEL * layerSize.x(), NUM_INVOCATIONS_PER_PIXEL * layerSize.y(), layerSize.z())
: UVec3(NUM_INVOCATIONS_PER_PIXEL * layerSize.x(), layerSize.y(), layerSize.z());
- const VkImageCreateInfo imageParams =
- {
- VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- (m_imageType == IMAGE_TYPE_CUBE ||
- m_imageType == IMAGE_TYPE_CUBE_ARRAY ?
- (VkImageCreateFlags)VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT :
- (VkImageCreateFlags)0u), // VkImageCreateFlags flags;
- mapImageType(m_imageType), // VkImageType imageType;
- mapTextureFormat(m_format), // VkFormat format;
- makeExtent3D(extendedLayerSize), // VkExtent3D extent;
- 1u, // deUint32 mipLevels;
- getNumLayers(m_imageType, m_imageSize), // deUint32 arrayLayers;
- VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- (VkImageUsageFlags)(isSupportedTransfer ?
- (VK_IMAGE_USAGE_STORAGE_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
- VK_IMAGE_USAGE_TRANSFER_DST_BIT) :
- VK_IMAGE_USAGE_STORAGE_BIT), // VkImageUsageFlags
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 0u, // deUint32 queueFamilyIndexCount;
- DE_NULL, // const deUint32* pQueueFamilyIndices;
- VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
- };
-
- m_intermResultsImage = de::MovePtr<Image>(new Image(deviceInterface, device, allocator, imageParams, MemoryRequirement::Any));
-
- const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, getNumLayers(m_imageType, m_imageSize));
-
- m_intermResultsImageView = makeImageView(deviceInterface, device, m_intermResultsImage->get(), mapImageViewType(m_imageType), mapTextureFormat(m_format), subresourceRange);
+ createImageAndView(mapTextureFormat(m_format), extendedLayerSize, useTransfer, m_intermResultsImage, m_intermResultsImageView);
}
void BinaryAtomicIntermValuesInstance::prepareDescriptors (const bool isTexelBuffer)
@@ -1608,7 +1689,7 @@
const VkPipelineLayout pipelineLayout,
const VkDescriptorSet descriptorSet,
const VkDeviceSize& range,
- const bool isSupportedTransfer)
+ const bool useTransfer)
{
// nothing is needed for texel image buffer
if (m_imageType == IMAGE_TYPE_BUFFER)
@@ -1618,7 +1699,7 @@
const VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, getNumLayers(m_imageType, m_imageSize));
const UVec3 layerSize = getLayerSize(m_imageType, m_imageSize);
- if (isSupportedTransfer)
+ if (useTransfer)
{
const VkImageMemoryBarrier imagePostDispatchBarrier =
makeImageMemoryBarrier( VK_ACCESS_SHADER_WRITE_BIT,
@@ -1785,7 +1866,7 @@
TestInstance* BinaryAtomicIntermValuesCase::createInstance (Context& context) const
{
- return new BinaryAtomicIntermValuesInstance(context, m_name, m_imageType, m_imageSize, m_format, m_operation);
+ return new BinaryAtomicIntermValuesInstance(context, m_name, m_imageType, m_imageSize, m_format, m_operation, m_useTransfer, m_readType, m_backingType);
}
} // anonymous ns
@@ -1805,7 +1886,7 @@
const tcu::UVec3 m_imageSize;
};
- static const ImageParams imageParamsArray[] =
+ const ImageParams imageParamsArray[] =
{
ImageParams(IMAGE_TYPE_1D, tcu::UVec3(64u, 1u, 1u)),
ImageParams(IMAGE_TYPE_1D_ARRAY, tcu::UVec3(64u, 1u, 8u)),
@@ -1817,7 +1898,7 @@
ImageParams(IMAGE_TYPE_BUFFER, tcu::UVec3(64u, 1u, 1u))
};
- static const tcu::TextureFormat formats[] =
+ const tcu::TextureFormat formats[] =
{
tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32),
tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32),
@@ -1826,6 +1907,26 @@
tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT64)
};
+ const struct
+ {
+ ShaderReadType type;
+ const char* name;
+ } readTypes[] =
+ {
+ { ShaderReadType::NORMAL, "normal_read" },
+ { ShaderReadType::SPARSE, "sparse_read" },
+ };
+
+ const struct
+ {
+ ImageBackingType type;
+ const char* name;
+ } backingTypes[] =
+ {
+ { ImageBackingType::NORMAL, "normal_img" },
+ { ImageBackingType::SPARSE, "sparse_img" },
+ };
+
for (deUint32 operationI = 0; operationI < ATOMIC_OPERATION_LAST; operationI++)
{
const AtomicOperation operation = (AtomicOperation)operationI;
@@ -1839,33 +1940,77 @@
de::MovePtr<tcu::TestCaseGroup> imageTypeGroup(new tcu::TestCaseGroup(testCtx, getImageTypeName(imageType).c_str(), ""));
- for (deUint32 formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); formatNdx++)
+ for (int useTransferIdx = 0; useTransferIdx < 2; ++useTransferIdx)
{
- const TextureFormat& format = formats[formatNdx];
- const std::string formatName = getShaderImageFormatQualifier(format);
+ const bool useTransfer = (useTransferIdx > 0);
+ const string groupName = (!useTransfer ? "no" : "") + string("transfer");
- // Need SPIRV programs in vktImageAtomicSpirvShaders.cpp
- if (imageType == IMAGE_TYPE_BUFFER && (format.type != tcu::TextureFormat::FLOAT))
- {
- continue;
- }
+ de::MovePtr<tcu::TestCaseGroup> transferGroup(new tcu::TestCaseGroup(testCtx, groupName.c_str(), ""));
- // Only ADD and EXCHANGE are supported on floating-point
- if (format.type == tcu::TextureFormat::FLOAT)
+ for (int readTypeIdx = 0; readTypeIdx < DE_LENGTH_OF_ARRAY(readTypes); ++readTypeIdx)
{
- if (operation != ATOMIC_OPERATION_ADD && operation != ATOMIC_OPERATION_EXCHANGE)
+ const auto& readType = readTypes[readTypeIdx];
+
+ de::MovePtr<tcu::TestCaseGroup> readTypeGroup(new tcu::TestCaseGroup(testCtx, readType.name, ""));
+
+ for (int backingTypeIdx = 0; backingTypeIdx < DE_LENGTH_OF_ARRAY(backingTypes); ++backingTypeIdx)
{
- continue;
+ const auto& backingType = backingTypes[backingTypeIdx];
+
+ de::MovePtr<tcu::TestCaseGroup> backingTypeGroup(new tcu::TestCaseGroup(testCtx, backingType.name, ""));
+
+ for (deUint32 formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); formatNdx++)
+ {
+ const TextureFormat& format = formats[formatNdx];
+ const std::string formatName = getShaderImageFormatQualifier(format);
+
+ // Need SPIRV programs in vktImageAtomicSpirvShaders.cpp
+ if (imageType == IMAGE_TYPE_BUFFER && (format.type != tcu::TextureFormat::FLOAT))
+ {
+ continue;
+ }
+
+ // Only 2D and 3D images may support sparse residency.
+ const auto vkImageType = mapImageType(imageType);
+ if (backingType.type == ImageBackingType::SPARSE && (vkImageType != VK_IMAGE_TYPE_2D && vkImageType != VK_IMAGE_TYPE_3D))
+ continue;
+
+ // Only ADD and EXCHANGE are supported on floating-point
+ if (format.type == tcu::TextureFormat::FLOAT)
+ {
+ if (operation != ATOMIC_OPERATION_ADD && operation != ATOMIC_OPERATION_EXCHANGE)
+ {
+ continue;
+ }
+ }
+
+ if (readType.type == ShaderReadType::SPARSE)
+ {
+ // When using transfer, shader reads will not be used, so avoid creating two identical cases.
+ if (useTransfer)
+ continue;
+
+ // Sparse reads are not supported for all types of images.
+ if (imageType == IMAGE_TYPE_1D || imageType == IMAGE_TYPE_1D_ARRAY || imageType == IMAGE_TYPE_BUFFER)
+ continue;
+ }
+
+ //!< Atomic case checks the end result of the operations, and not the intermediate return values
+ const string caseEndResult = formatName + "_end_result";
+ backingTypeGroup->addChild(new BinaryAtomicEndResultCase(testCtx, caseEndResult, "", imageType, imageSize, format, operation, useTransfer, readType.type, backingType.type, glu::GLSL_VERSION_450));
+
+ //!< Atomic case checks the return values of the atomic function and not the end result.
+ const string caseIntermValues = formatName + "_intermediate_values";
+ backingTypeGroup->addChild(new BinaryAtomicIntermValuesCase(testCtx, caseIntermValues, "", imageType, imageSize, format, operation, useTransfer, readType.type, backingType.type, glu::GLSL_VERSION_450));
+ }
+
+ readTypeGroup->addChild(backingTypeGroup.release());
}
+
+ transferGroup->addChild(readTypeGroup.release());
}
- //!< Atomic case checks the end result of the operations, and not the intermediate return values
- const string caseEndResult = formatName + "_end_result";
- imageTypeGroup->addChild(new BinaryAtomicEndResultCase(testCtx, caseEndResult, "", imageType, imageSize, format, operation, glu::GLSL_VERSION_450));
-
- //!< Atomic case checks the return values of the atomic function and not the end result.
- const string caseIntermValues = formatName + "_intermediate_values";
- imageTypeGroup->addChild(new BinaryAtomicIntermValuesCase(testCtx, caseIntermValues, "", imageType, imageSize, format, operation, glu::GLSL_VERSION_450));
+ imageTypeGroup->addChild(transferGroup.release());
}
operationGroup->addChild(imageTypeGroup.release());
diff --git a/external/vulkancts/modules/vulkan/image/vktImageMismatchedFormatsTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageMismatchedFormatsTests.cpp
index 4911b8f..ae248f8 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageMismatchedFormatsTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageMismatchedFormatsTests.cpp
@@ -190,6 +190,31 @@
WRITE
};
+void fillImageCreateInfo (VkImageCreateInfo& imageCreateInfo, TestType testType, VkFormat format)
+{
+ const VkImageCreateFlags imageFlags = ((testType == TestType::SPARSE_READ) ? (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) : 0u);
+ const VkImageCreateInfo createInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ imageFlags, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ makeExtent3D(8, 8, 1), // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0u, // deUint32 queueFamilyIndexCount;
+ nullptr, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
+ };
+
+ imageCreateInfo = createInfo;
+}
+
class MismatchedFormatTest : public TestCase
{
public:
@@ -225,13 +250,23 @@
void MismatchedFormatTest::checkSupport (Context& context) const
{
+ const auto& vki = context.getInstanceInterface();
+ const auto physicalDevice = context.getPhysicalDevice();
+
if (m_type == TestType::SPARSE_READ)
{
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SPARSE_BINDING);
- if (!getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice()).sparseResidencyBuffer)
- {
+ if (!getPhysicalDeviceFeatures(vki, physicalDevice).sparseResidencyBuffer)
TCU_THROW(NotSupportedError, "Sparse partially resident buffers not supported");
+
+ // Check sparse operations support before creating the image.
+ VkImageCreateInfo imageCreateInfo;
+ fillImageCreateInfo(imageCreateInfo, m_type, m_format);
+
+ if (!checkSparseImageFormatSupport(physicalDevice, vki, imageCreateInfo))
+ {
+ TCU_THROW(NotSupportedError, "The image format does not support sparse operations.");
}
if (!getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice()).shaderResourceResidency)
@@ -240,7 +275,7 @@
}
}
- VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), m_format);
+ VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(vki, physicalDevice, m_format);
if ((formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) == 0)
{
@@ -340,6 +375,9 @@
const VkDevice device = m_context.getDevice();
const VkQueue queue = m_context.getUniversalQueue();
const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ auto& allocator = m_context.getDefaultAllocator();
+ const auto physicalDevice = m_context.getPhysicalDevice();
+ const auto& instance = m_context.getInstanceInterface();
Move<VkShaderModule> shaderModule = createShaderModule(vk, device, m_context.getBinaryCollection().get("comp"), 0);
@@ -355,28 +393,11 @@
Move<VkPipeline> pipeline = makeComputePipeline(vk, device, *pipelineLayout, *shaderModule);
- VkImageCreateFlags imageFlag = m_type == TestType::SPARSE_READ ? (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) : 0u;
-
- const VkImageCreateInfo imageCreateInfo =
- {
- VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- imageFlag, // VkImageCreateFlags flags;
- VK_IMAGE_TYPE_2D, // VkImageType imageType;
- m_format, // VkFormat format;
- makeExtent3D(8, 8, 1), // VkExtent3D extent;
- 1u, // deUint32 mipLevels;
- 1u, // deUint32 arrayLayers;
- VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage;
- VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
- 0u, // deUint32 queueFamilyIndexCount;
- DE_NULL, // const deUint32* pQueueFamilyIndices;
- VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
- };
+ VkImageCreateInfo imageCreateInfo;
+ fillImageCreateInfo(imageCreateInfo, m_type, m_format);
vk::Move<vk::VkImage> storageImage = createImage(vk, device, &imageCreateInfo);
+ const auto tcuFormat = mapVkFormat(m_format);
de::MovePtr<vk::Allocation> storageAllocation;
vk::Move<vk::VkSemaphore> bindSemaphore;
@@ -384,19 +405,20 @@
if (m_type == TestType::SPARSE_READ)
{
- bindSemaphore = createSemaphore(m_context.getDeviceInterface(), m_context.getDevice());
+ bindSemaphore = createSemaphore(vk, device);
- allocateAndBindSparseImage( vk, device, m_context.getPhysicalDevice(), m_context.getInstanceInterface(),
+ allocateAndBindSparseImage( vk, device, physicalDevice, instance,
imageCreateInfo, *bindSemaphore, m_context.getSparseQueue(),
- m_context.getDefaultAllocator(), allocations, mapVkFormat(m_format), *storageImage );
+ allocator, allocations, tcuFormat, *storageImage );
}
else
{
- storageAllocation = m_context.getDefaultAllocator().allocate(getImageMemoryRequirements(vk, device, *storageImage), MemoryRequirement::Any);
+ storageAllocation = allocator.allocate(getImageMemoryRequirements(vk, device, *storageImage), MemoryRequirement::Any);
VK_CHECK(vk.bindImageMemory(device, *storageImage, storageAllocation->getMemory(), storageAllocation->getOffset()));
}
- Move<VkImageView> storageImageView = makeImageView(vk, device, *storageImage, VK_IMAGE_VIEW_TYPE_2D, m_format, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
+ const auto subresourceRange = makeImageSubresourceRange(getImageAspectFlags(tcuFormat), 0u, 1u, 0u, 1u);
+ Move<VkImageView> storageImageView = makeImageView(vk, device, *storageImage, VK_IMAGE_VIEW_TYPE_2D, m_format, subresourceRange);
VkDescriptorImageInfo storageImageInfo = makeDescriptorImageInfo(DE_NULL, *storageImageView, VK_IMAGE_LAYOUT_GENERAL);
DescriptorSetUpdateBuilder builder;
@@ -407,7 +429,10 @@
Move<VkCommandPool> cmdPool = createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto layoutBarrier = makeImageMemoryBarrier(0u, (VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, *storageImage, subresourceRange);
+
beginCommandBuffer(vk, *cmdBuffer);
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &layoutBarrier);
vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
vk.cmdDispatch(*cmdBuffer, 8, 8, 1);
diff --git a/external/vulkancts/modules/vulkan/image/vktImageMismatchedWriteOpTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageMismatchedWriteOpTests.cpp
new file mode 100644
index 0000000..53a42b4
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/image/vktImageMismatchedWriteOpTests.cpp
@@ -0,0 +1,935 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2016 The Android Open Source Project
+ *
+ * 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 Testing writing and reading for mismatched vector sizes.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktImageMismatchedWriteOpTests.hpp"
+
+#include "vktImageTexture.hpp"
+#include "vkImageUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vktImageTestsUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkBarrierUtil.hpp"
+
+#include "tcuStringTemplate.hpp"
+#include "tcuTexture.hpp"
+#include "tcuTextureUtil.hpp"
+
+#define EPSILON_COMPARE(a,b,e) ((de::max((a),(b))-de::min((a),(b)))<=(e))
+
+using namespace vk;
+
+namespace vkt
+{
+namespace image
+{
+namespace
+{
+
+using tcu::TextureFormat;
+
+class MismatchedVectorSizesTest : public TestCase
+{
+public:
+ struct Params
+ {
+ VkFormat vkFormat;
+ int sourceWidth;
+ int textureWidth;
+ int textureHeight;
+ };
+ typedef de::SharedPtr<Params> ParamsSp;
+
+ MismatchedVectorSizesTest (tcu::TestContext& testCtx,
+ const std::string& name,
+ const std::string& description,
+ const ParamsSp params)
+ : TestCase (testCtx, name, description)
+ , m_params (params)
+ {
+ DE_ASSERT(getNumUsedChannels(params->vkFormat) <= params->sourceWidth);
+ }
+
+ virtual void checkSupport (Context& context) const override;
+ virtual void initPrograms (SourceCollections& programCollection) const override;
+ virtual TestInstance* createInstance (Context& context) const override;
+
+private:
+ const ParamsSp m_params;
+};
+
+class MismatchedVectorSizesTestInstance : public TestInstance
+{
+public:
+ using ParamsSp = MismatchedVectorSizesTest::ParamsSp;
+
+ MismatchedVectorSizesTestInstance (Context& context,
+ const ParamsSp params)
+ : TestInstance (context)
+ , m_params (params)
+ {
+ }
+
+ virtual tcu::TestStatus iterate (void) override;
+ void clear (tcu::PixelBufferAccess& data) const;
+ void populate (tcu::PixelBufferAccess& data) const;
+ bool compare (tcu::PixelBufferAccess& result,
+ tcu::PixelBufferAccess& reference) const;
+
+private:
+ const ParamsSp m_params;
+};
+
+namespace ut
+{
+
+class StorageBuffer2D
+{
+public:
+ StorageBuffer2D (Context& context,
+ const tcu::TextureFormat& format,
+ deUint32 width,
+ deUint32 height);
+
+ VkBuffer getBuffer (void) const { return *m_buffer; }
+ VkDeviceSize getSize (void) const { return m_bufferSize; }
+
+ tcu::PixelBufferAccess& getPixelAccess (void) { return m_access[0]; }
+
+ void flush (void) { flushAlloc(m_context.getDeviceInterface(), m_context.getDevice(), *m_bufferMemory); }
+ void invalidate (void) { invalidateAlloc(m_context.getDeviceInterface(), m_context.getDevice(), *m_bufferMemory); }
+
+protected:
+ friend class StorageImage2D;
+ Allocation& getMemory (void) const { return *m_bufferMemory; }
+
+private:
+ Context& m_context;
+ const tcu::TextureFormat m_format;
+ const deUint32 m_width;
+ const deUint32 m_height;
+ const VkDeviceSize m_bufferSize;
+ Move<VkBuffer> m_buffer;
+ de::MovePtr<Allocation> m_bufferMemory;
+ std::vector<tcu::PixelBufferAccess> m_access;
+};
+
+class StorageImage2D
+{
+public:
+ StorageImage2D (Context& context,
+ VkFormat vkFormat,
+ const int width,
+ const int height,
+ bool sparse = false);
+
+ VkImageView getView (void) const { return *m_view; }
+
+ tcu::PixelBufferAccess& getPixelAccess (void) { return m_buffer.getPixelAccess(); }
+
+ void flush (void) { m_buffer.flush(); }
+ void invalidate (void) { m_buffer.invalidate(); }
+
+ void upload (const VkCommandBuffer cmdBuffer);
+ void download (const VkCommandBuffer cmdBuffer);
+
+private:
+ Context& m_context;
+ const bool m_sparse;
+ const int m_width;
+ const int m_height;
+ const vk::VkFormat m_vkFormat;
+ const tcu::TextureFormat m_texFormat;
+ StorageBuffer2D m_buffer;
+
+ VkImageLayout m_layout;
+ Move<VkImage> m_image;
+ Move<VkImageView> m_view;
+ Move<VkSemaphore> m_semaphore;
+ std::vector<de::SharedPtr<Allocation>> m_allocations;
+ de::MovePtr<Allocation> m_imageMemory;
+};
+
+StorageImage2D::StorageImage2D (Context& context, VkFormat vkFormat, const int width, const int height, bool sparse)
+ : m_context (context)
+ , m_sparse (sparse)
+ , m_width (width)
+ , m_height (height)
+ , m_vkFormat (vkFormat)
+ , m_texFormat (mapVkFormat(m_vkFormat))
+ , m_buffer (m_context, m_texFormat, m_width, m_height)
+{
+ const DeviceInterface& vki = m_context.getDeviceInterface();
+ const VkDevice dev = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ // Create an image
+ {
+ VkImageCreateFlags imageCreateFlags = m_sparse? (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) : 0u;
+ VkImageUsageFlags imageUsageFlags = VK_IMAGE_USAGE_STORAGE_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;
+ imageCreateFlags, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ m_vkFormat, // VkFormat format;
+ { deUint32(m_width), deUint32(m_height), 1u }, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ imageUsageFlags, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ (m_layout = VK_IMAGE_LAYOUT_UNDEFINED) // VkImageLayout initialLayout;
+ };
+
+ m_image = createImage(vki, dev, &imageCreateInfo);
+
+ if (m_sparse)
+ {
+ m_semaphore = createSemaphore(vki, dev);
+
+ allocateAndBindSparseImage( vki, dev, m_context.getPhysicalDevice(), m_context.getInstanceInterface(),
+ imageCreateInfo, *m_semaphore, m_context.getSparseQueue(),
+ allocator, m_allocations, mapVkFormat(m_vkFormat), *m_image );
+ }
+ else
+ {
+ m_imageMemory = allocator.allocate(getImageMemoryRequirements(vki, dev, *m_image), MemoryRequirement::Any);
+ VK_CHECK(vki.bindImageMemory(dev, *m_image, m_imageMemory->getMemory(), m_imageMemory->getOffset()));
+ }
+
+ VkImageSubresourceRange subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ m_view = makeImageView(vki, dev, *m_image, VK_IMAGE_VIEW_TYPE_2D, m_vkFormat, subresourceRange);
+ }
+}
+
+void StorageImage2D::upload (const VkCommandBuffer cmdBuffer)
+{
+ const DeviceInterface& vki = m_context.getDeviceInterface();
+ const VkImageSubresourceRange fullImageSubresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(makeExtent3D(tcu::IVec3(m_width, m_height, 1)), 1u);
+
+ {
+ const VkBufferMemoryBarrier bufferBarrier = makeBufferMemoryBarrier(
+ VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
+ m_buffer.getBuffer(), 0ull, m_buffer.getSize());
+
+ const VkImageMemoryBarrier beforeCopyBarrier = makeImageMemoryBarrier(
+ (VkAccessFlagBits)0, VK_ACCESS_TRANSFER_WRITE_BIT,
+ m_layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ *m_image, fullImageSubresourceRange);
+
+ vki.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0,
+ 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 1, &beforeCopyBarrier);
+ }
+
+ vki.cmdCopyBufferToImage(cmdBuffer, m_buffer.getBuffer(), *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, ©Region);
+
+ {
+ const VkBufferMemoryBarrier bufferBarrier = makeBufferMemoryBarrier(
+ VK_ACCESS_TRANSFER_READ_BIT, (VkAccessFlags)0,
+ m_buffer.getBuffer(), 0ull, m_buffer.getSize());
+
+ m_layout = VK_IMAGE_LAYOUT_GENERAL;
+ const VkImageMemoryBarrier afterCopyBarrier = makeImageMemoryBarrier(
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_WRITE_BIT,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, m_layout,
+ *m_image, fullImageSubresourceRange);
+
+ vki.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0,
+ 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 1, &afterCopyBarrier);
+ }
+}
+
+void StorageImage2D::download (const VkCommandBuffer cmdBuffer)
+{
+ const DeviceInterface& vki = m_context.getDeviceInterface();
+ const VkImageSubresourceRange fullImageSubresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ const VkBufferImageCopy copyRegion = makeBufferImageCopy(makeExtent3D(tcu::IVec3(m_width, m_height, 1)), 1u);
+
+ {
+ const VkBufferMemoryBarrier bufferBarrier = makeBufferMemoryBarrier(
+ (VkAccessFlags)0, VK_ACCESS_TRANSFER_WRITE_BIT,
+ m_buffer.getBuffer(), 0ull, m_buffer.getSize());
+
+ const VkImageMemoryBarrier beforeCopyBarrier = makeImageMemoryBarrier(
+ VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
+ m_layout, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ *m_image, fullImageSubresourceRange);
+
+ vki.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0,
+ 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 1, &beforeCopyBarrier);
+ }
+
+ vki.cmdCopyImageToBuffer(cmdBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_buffer.getBuffer(), 1, ©Region);
+
+ {
+ const VkBufferMemoryBarrier bufferBarrier = makeBufferMemoryBarrier(
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
+ m_buffer.getBuffer(), 0ull, m_buffer.getSize());
+
+ const VkImageMemoryBarrier afterCopyBarrier = makeImageMemoryBarrier(
+ VK_ACCESS_TRANSFER_READ_BIT, (VkAccessFlags)0,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_layout,
+ *m_image, fullImageSubresourceRange);
+
+ vki.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0,
+ 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 1, &afterCopyBarrier);
+ }
+
+}
+
+StorageBuffer2D::StorageBuffer2D (Context& context, const tcu::TextureFormat& format, deUint32 width, deUint32 height)
+ : m_context (context)
+ , m_format (format)
+ , m_width (width)
+ , m_height (height)
+ , m_bufferSize (m_width * m_height * m_format.getPixelSize())
+{
+ const DeviceInterface& vki = m_context.getDeviceInterface();
+ const VkDevice dev = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ const VkBufferUsageFlags bufferUsageFlags = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+
+ const VkBufferCreateInfo bufferCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkBufferCreateFlags flags;
+ m_bufferSize, // VkDeviceSize size;
+ bufferUsageFlags, // VkBufferUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
+ };
+
+ m_buffer = createBuffer(vki, dev, &bufferCreateInfo);
+
+ m_bufferMemory = allocator.allocate(getBufferMemoryRequirements(vki, dev, *m_buffer), MemoryRequirement::HostVisible);
+ VK_CHECK(vki.bindBufferMemory(dev, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset()));
+
+ m_access.emplace_back(m_format, tcu::IVec3(m_width, m_height, 1), m_bufferMemory->getHostPtr());
+}
+
+tcu::Vec4 gluePixels (const tcu::Vec4& a, const tcu::Vec4& b, const int pivot)
+{
+ tcu::Vec4 result;
+ for (int i = 0; i < pivot; ++i) result[i] = a[i];
+ for (int i = pivot; i < 4; ++i) result[i] = b[i];
+ return result;
+}
+
+template<class T, int N>
+bool comparePixels(const tcu::Vector<T,N>& res, const tcu::Vector<T,N>& ref, const int targetWidth, const T eps = {})
+{
+ bool ok = true;
+
+ for (int i = 0; ok && i < targetWidth; ++i)
+ {
+ ok &= EPSILON_COMPARE(res[i], ref[i], eps);
+ }
+
+ return ok;
+}
+
+} // ut
+
+TestInstance* MismatchedVectorSizesTest::createInstance (Context& context) const
+{
+ return new MismatchedVectorSizesTestInstance(context, m_params);
+}
+
+enum class OpCapability
+{
+ Shader,
+ StorageImageExtendedFormats,
+ Int64ImageEXT
+};
+
+const char* OpCapabilityToStr(const OpCapability& cap)
+{
+ switch (cap)
+ {
+ case OpCapability::Shader: return "Shader";
+ case OpCapability::StorageImageExtendedFormats: return "StorageImageExtendedFormats";
+ case OpCapability::Int64ImageEXT: return "Int64ImageEXT";
+ }
+ DE_ASSERT(DE_FALSE);
+ return nullptr;
+}
+
+struct FormatInfo {
+ VkFormat vkFormat;
+ const char* spirvName;
+ OpCapability capability;
+}
+formatsInfos[] =
+{
+ { VK_FORMAT_R32G32B32A32_SFLOAT, "Rgba32f", OpCapability::Shader },
+ { VK_FORMAT_R16G16B16A16_SFLOAT, "Rgba16f", OpCapability::Shader },
+ { VK_FORMAT_R32_SFLOAT, "R32f", OpCapability::Shader },
+ { VK_FORMAT_R8G8B8A8_UNORM, "Rgba8", OpCapability::Shader },
+ { VK_FORMAT_R8G8B8A8_SNORM, "Rgba8Snorm", OpCapability::Shader },
+ { VK_FORMAT_R32G32_SFLOAT, "Rg32f", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16G16_SFLOAT, "Rg16f", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_B10G11R11_UFLOAT_PACK32, "R11fG11fB10f", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16_SFLOAT, "R16f", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16G16B16A16_UNORM, "Rgba16", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_A2B10G10R10_UNORM_PACK32, "Rgb10A2", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16G16_UNORM, "Rg16", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8G8_UNORM, "Rg8", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16_UNORM, "R16", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8_UNORM, "R8", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16G16B16A16_SNORM, "Rgba16Snorm", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16G16_SNORM, "Rg16Snorm", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8G8_SNORM, "Rg8Snorm", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16_SNORM, "R16Snorm", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8_SNORM, "R8Snorm", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R32G32B32A32_SINT, "Rgba32i", OpCapability::Shader },
+ { VK_FORMAT_R16G16B16A16_SINT, "Rgba16i", OpCapability::Shader },
+ { VK_FORMAT_R8G8B8A8_SINT, "Rgba8i", OpCapability::Shader },
+ { VK_FORMAT_R32_SINT, "R32i", OpCapability::Shader },
+ { VK_FORMAT_R32G32_SINT, "Rg32i", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16G16_SINT, "Rg16i", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8G8_SINT, "Rg8i", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16_SINT, "R16i", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8_SINT, "R8i", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R32G32B32A32_UINT, "Rgba32ui", OpCapability::Shader },
+ { VK_FORMAT_R16G16B16A16_UINT, "Rgba16ui", OpCapability::Shader },
+ { VK_FORMAT_R8G8B8A8_UINT, "Rgba8ui", OpCapability::Shader },
+ { VK_FORMAT_R32_UINT, "R32ui", OpCapability::Shader },
+ { VK_FORMAT_A2B10G10R10_UINT_PACK32, "Rgb10a2ui", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R32G32_UINT, "Rg32ui", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16G16_UINT, "Rg16ui", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8G8_UINT, "Rg8ui", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R16_UINT, "R16ui", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R8_UINT, "R8ui", OpCapability::StorageImageExtendedFormats },
+ { VK_FORMAT_R64_UINT, "R64ui", OpCapability::Int64ImageEXT },
+ { VK_FORMAT_R64_SINT, "R64i", OpCapability::Int64ImageEXT }
+};
+
+const FormatInfo* findFormatInfo(VkFormat vkFormat)
+{
+ for (const auto& formatInfo : formatsInfos)
+ {
+ if (formatInfo.vkFormat == vkFormat)
+ return &formatInfo;
+ }
+ DE_ASSERT(DE_FALSE);
+ return nullptr;
+}
+
+const char* getChannelStr (const TextureFormat& format)
+{
+ switch (format.type)
+ {
+ case TextureFormat::FLOAT: return "float";
+ case TextureFormat::SIGNED_INT32: return "sint";
+ case TextureFormat::UNSIGNED_INT32: return "uint";
+ case TextureFormat::FLOAT64: return "double";
+ case TextureFormat::SIGNED_INT64: return "slong";
+ case TextureFormat::UNSIGNED_INT64: return "ulong";
+ default: DE_ASSERT(DE_FALSE);
+ }
+
+ return nullptr;
+}
+
+TextureFormat makeBufferFormat (tcu::TextureChannelClass channelClass, bool doubled)
+{
+ auto channelType = TextureFormat::ChannelType::CHANNELTYPE_LAST;
+ switch (channelClass)
+ {
+ case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
+ channelType = doubled ? TextureFormat::ChannelType::SIGNED_INT64 : TextureFormat::ChannelType::SIGNED_INT32;
+ break;
+ case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
+ channelType = doubled ? TextureFormat::ChannelType::UNSIGNED_INT64 : TextureFormat::ChannelType::UNSIGNED_INT32;
+ break;
+ default:
+ channelType = doubled ? TextureFormat::ChannelType::FLOAT64 : TextureFormat::ChannelType::FLOAT;
+ }
+ return TextureFormat(TextureFormat::ChannelOrder::RGBA, channelType);
+}
+
+void MismatchedVectorSizesTest::checkSupport (Context& context) const
+{
+ const FormatInfo* info = findFormatInfo(m_params->vkFormat);
+
+ // capabilities that may be used in the shader
+ if (info->capability == OpCapability::Int64ImageEXT)
+ {
+ const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice());
+ if(!deviceFeatures.shaderInt64)
+ {
+ TCU_THROW(NotSupportedError, "Device feature shaderInt64 is not supported");
+ }
+ context.requireDeviceFunctionality("VK_EXT_shader_image_atomic_int64");
+ }
+
+ // extensions used statically in the shader
+ context.requireDeviceFunctionality("VK_KHR_variable_pointers");
+ context.requireDeviceFunctionality("VK_KHR_storage_buffer_storage_class");
+
+ VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), m_params->vkFormat);
+
+ if ((formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) == 0)
+ {
+ TCU_THROW(NotSupportedError, "Creating storage image with this format is not supported");
+ }
+}
+
+
+void MismatchedVectorSizesTest::initPrograms (SourceCollections& programCollection) const
+{
+ tcu::StringTemplate shaderTemplate(R"(
+
+ ${ENABLING_CAPABILITIES}
+ ${CAPABILITY_INT64}
+ OpExtension "SPV_KHR_variable_pointers"
+ OpExtension "SPV_KHR_storage_buffer_storage_class"
+ ${EXTENSIONS}
+
+ %std450 = OpExtInstImport "GLSL.std.450"
+ OpMemoryModel Logical GLSL450
+
+ OpEntryPoint GLCompute %main "main" %gid %image %buffer
+ OpExecutionMode %main LocalSize 1 1 1
+
+ OpDecorate %gid BuiltIn GlobalInvocationId
+
+ OpDecorate %image DescriptorSet 0
+ OpDecorate %image Binding 0
+
+ OpDecorate %rta ArrayStride ${ARRAY_STRIDE}
+ OpMemberDecorate %struct 0 Offset 0
+ OpDecorate %struct Block
+ OpDecorate %buffer DescriptorSet 0
+ OpDecorate %buffer Binding 1
+
+ %void = OpTypeVoid
+ %fn_void = OpTypeFunction %void
+
+ ${TYPES_INT64}
+
+ %float = OpTypeFloat 32
+ %sint = OpTypeInt 32 1
+ %uint = OpTypeInt 32 0
+
+ %v4float = OpTypeVector %float 4
+ %v3float = OpTypeVector %float 3
+ %v2float = OpTypeVector %float 2
+
+ %v4sint = OpTypeVector %sint 4
+ %v3sint = OpTypeVector %sint 3
+ %v2sint = OpTypeVector %sint 2
+
+ %v4uint = OpTypeVector %uint 4
+ %v3uint = OpTypeVector %uint 3
+ %v2uint = OpTypeVector %uint 2
+
+ %v3uint_in_ptr = OpTypePointer Input %v3uint
+ %gid = OpVariable %v3uint_in_ptr Input
+
+ %image_type = OpTypeImage %${SAMPLED_TYPE} 2D 0 0 0 2 ${SPIRV_IMAGE_FORMAT}
+ %image_ptr = OpTypePointer UniformConstant %image_type
+ %image = OpVariable %image_ptr UniformConstant
+
+ %image_width = OpConstant %sint ${IMAGE_WIDTH}
+ %image_height = OpConstant %sint ${IMAGE_HEIGHT}
+
+ %rta_offset = OpConstant %uint 0
+ %rta = OpTypeRuntimeArray %v4${SAMPLED_TYPE}
+ %struct = OpTypeStruct %rta
+ %ssbo_ptr = OpTypePointer StorageBuffer %struct
+ %buffer = OpVariable %ssbo_ptr StorageBuffer
+
+ %red_offset = OpConstant %uint 0
+ %green_offset = OpConstant %uint 1
+ %blue_offset = OpConstant %uint 2
+ %alpha_offset = OpConstant %uint 3
+
+ %${SAMPLED_TYPE}_PTR = OpTypePointer StorageBuffer %${SAMPLED_TYPE}
+ %var_sint_ptr = OpTypePointer Function %sint
+
+ ; Entry main procedure
+ %main = OpFunction %void None %fn_void
+ %entry = OpLabel
+
+ %index = OpVariable %var_sint_ptr Function
+
+ ; Transform gl_GlobalInvocationID.xyz to ivec2(gl_GlobalInvocationID.xy)
+ %id = OpLoad %v3uint %gid
+
+ %u_id_x = OpCompositeExtract %uint %id 0
+ %s_id_x = OpBitcast %sint %u_id_x
+
+ %u_id_y = OpCompositeExtract %uint %id 1
+ %s_id_y = OpBitcast %sint %u_id_y
+
+ %id_xy = OpCompositeConstruct %v2sint %s_id_x %s_id_y
+
+ ; Calculate index in buffer
+ %mul = OpIMul %sint %s_id_y %image_width
+ %add = OpIAdd %sint %mul %s_id_x
+ OpStore %index %add
+
+ ; Final image variable used to read from or write to
+ %img = OpLoad %image_type %image
+
+ ; Accessors to buffer components
+ %idx = OpLoad %sint %index
+ %alpha_access = OpAccessChain %${SAMPLED_TYPE}_PTR %buffer %rta_offset %idx %alpha_offset
+ %blue_access = OpAccessChain %${SAMPLED_TYPE}_PTR %buffer %rta_offset %idx %blue_offset
+ %green_access = OpAccessChain %${SAMPLED_TYPE}_PTR %buffer %rta_offset %idx %green_offset
+ %red_access = OpAccessChain %${SAMPLED_TYPE}_PTR %buffer %rta_offset %idx %red_offset
+
+ %red = OpLoad %${SAMPLED_TYPE} %red_access
+ %green = OpLoad %${SAMPLED_TYPE} %green_access
+ %blue = OpLoad %${SAMPLED_TYPE} %blue_access
+ %alpha = OpLoad %${SAMPLED_TYPE} %alpha_access
+
+ ${WRITE_TO_IMAGE}
+
+ OpReturn
+ OpFunctionEnd
+ )");
+
+ const std::string typesInt64(R"(
+ %slong = OpTypeInt 64 1
+ %ulong = OpTypeInt 64 0
+
+ %v4slong = OpTypeVector %slong 4
+ %v3slong = OpTypeVector %slong 3
+ %v2slong = OpTypeVector %slong 2
+
+ %v4ulong = OpTypeVector %ulong 4
+ %v3ulong = OpTypeVector %ulong 3
+ %v2ulong = OpTypeVector %ulong 2
+ )");
+
+ const tcu::StringTemplate writeFromSingleComponent(R"(
+ OpImageWrite %img %id_xy %red
+ )");
+ const tcu::StringTemplate writeFromTwoComponents(R"(
+ %rg = OpCompositeConstruct %v2${SAMPLED_TYPE} %red %green
+ OpImageWrite %img %id_xy %rg
+ )");
+
+ const tcu::StringTemplate writeFromThreeComponents(R"(
+ %rgb = OpCompositeConstruct %v3${SAMPLED_TYPE} %red %green %blue
+ OpImageWrite %img %id_xy %rgb
+ )");
+ const tcu::StringTemplate writeFromFourComponents(R"(
+ %rgba = OpCompositeConstruct %v4${SAMPLED_TYPE} %red %green %blue %alpha
+ OpImageWrite %img %id_xy %rgba
+ )");
+
+
+ std::map<std::string, std::string> specs;
+
+ const FormatInfo* info = findFormatInfo(m_params->vkFormat);
+ const TextureFormat texFormat = mapVkFormat(m_params->vkFormat);
+ const tcu::TextureFormat buffFormat = makeBufferFormat(getTextureChannelClass(texFormat.type), info->capability == OpCapability::Int64ImageEXT);
+
+ specs["SPIRV_IMAGE_FORMAT"] = info->spirvName;
+ specs["ENABLING_CAPABILITIES"] = std::string("OpCapability ") + OpCapabilityToStr(info->capability);
+ specs["CAPABILITY_INT64"] = "";
+ specs["EXTENSIONS"] = "";
+ specs["TYPES_INT64"] = "";
+
+ if (info->capability == OpCapability::Int64ImageEXT)
+ {
+ specs["EXTENSIONS"] = "OpExtension \"SPV_EXT_shader_image_int64\"";
+ specs["CAPABILITY_INT64"] = std::string("OpCapability Int64");
+ specs["TYPES_INT64"] = typesInt64;
+ }
+
+
+ specs["SAMPLED_TYPE"] = getChannelStr(buffFormat);
+ specs["IMAGE_WIDTH"] = std::to_string(m_params->textureWidth);
+ specs["IMAGE_HEIGHT"] = std::to_string(m_params->textureHeight);
+ specs["ARRAY_STRIDE"] = std::to_string(tcu::getChannelSize(buffFormat.type) * tcu::getNumUsedChannels(buffFormat.order));
+
+ specs["WRITE_TO_IMAGE"] = (m_params->sourceWidth == 1
+ ? writeFromSingleComponent
+ : m_params->sourceWidth == 2
+ ? writeFromTwoComponents
+ : m_params->sourceWidth == 3
+ ? writeFromThreeComponents
+ : writeFromFourComponents).specialize(specs);
+
+ programCollection.spirvAsmSources.add("comp")
+ << shaderTemplate.specialize(specs)
+ << vk::SpirVAsmBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, true);
+}
+
+void MismatchedVectorSizesTestInstance::clear (tcu::PixelBufferAccess& pixels) const
+{
+ const auto channelClass = tcu::getTextureChannelClass(mapVkFormat(m_params->vkFormat).type);
+ switch (channelClass)
+ {
+ case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
+ tcu::clear(pixels, tcu::IVec4(-1, -2, -3, -4));
+ break;
+
+ case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
+ tcu::clear(pixels, tcu::UVec4(1, 2, 3, 4));
+ break;
+
+ default:
+ tcu::clear(pixels, tcu::Vec4(0.2f, 0.3f, 0.4f, 0.5f));
+ }
+}
+
+void MismatchedVectorSizesTestInstance::populate (tcu::PixelBufferAccess& pixels) const
+{
+ const auto texFormat = mapVkFormat(m_params->vkFormat);
+ const auto bitDepth = tcu::getTextureFormatBitDepth(texFormat);
+ const auto channelClass = tcu::getTextureChannelClass(texFormat.type);
+
+ const tcu::IVec4 signedMinValues (bitDepth[0] ? deIntMinValue32(deMin32(bitDepth[0], 32)) : (-1),
+ bitDepth[1] ? deIntMinValue32(deMin32(bitDepth[1], 32)) : (-1),
+ bitDepth[2] ? deIntMinValue32(deMin32(bitDepth[2], 32)) : (-1),
+ bitDepth[3] ? deIntMinValue32(deMin32(bitDepth[3], 32)) : (-1));
+
+ const tcu::IVec4 signedMaxValues (bitDepth[0] ? deIntMaxValue32(deMin32(bitDepth[0], 32)) : 1,
+ bitDepth[1] ? deIntMaxValue32(deMin32(bitDepth[1], 32)) : 1,
+ bitDepth[2] ? deIntMaxValue32(deMin32(bitDepth[2], 32)) : 1,
+ bitDepth[3] ? deIntMaxValue32(deMin32(bitDepth[3], 32)) : 1);
+
+ const tcu::UVec4 unsignedMinValues (0u);
+
+ const tcu::UVec4 unsignedMaxValues (bitDepth[0] ? deUintMaxValue32(deMin32(bitDepth[0], 32)) : 1u,
+ bitDepth[1] ? deUintMaxValue32(deMin32(bitDepth[1], 32)) : 1u,
+ bitDepth[2] ? deUintMaxValue32(deMin32(bitDepth[2], 32)) : 1u,
+ bitDepth[3] ? deUintMaxValue32(deMin32(bitDepth[3], 32)) : 1u);
+
+ auto nextSigned = [&](tcu::IVec4& color)
+ {
+ color[0] = (static_cast<deInt64>(color[0] + 2) < signedMaxValues[0]) ? (color[0] + 2) : signedMinValues[0];
+ color[1] = (static_cast<deInt64>(color[1] + 3) < signedMaxValues[1]) ? (color[1] + 3) : signedMinValues[1];
+ color[2] = (static_cast<deInt64>(color[2] + 5) < signedMaxValues[2]) ? (color[2] + 5) : signedMinValues[2];
+ color[3] = (static_cast<deInt64>(color[3] + 7) < signedMaxValues[3]) ? (color[3] + 7) : signedMinValues[3];
+ };
+
+ auto nextUnsigned = [&](tcu::UVec4& color)
+ {
+ color[0] = (static_cast<deUint64>(color[0] + 2) < unsignedMaxValues[0]) ? (color[0] + 2) : unsignedMinValues[0];
+ color[1] = (static_cast<deUint64>(color[1] + 3) < unsignedMaxValues[1]) ? (color[1] + 3) : unsignedMinValues[1];
+ color[2] = (static_cast<deUint64>(color[2] + 5) < unsignedMaxValues[2]) ? (color[2] + 5) : unsignedMinValues[2];
+ color[3] = (static_cast<deUint64>(color[3] + 7) < unsignedMaxValues[3]) ? (color[3] + 7) : unsignedMinValues[3];
+ };
+
+ double floatsData [4];
+ tcu::PixelBufferAccess floatsAccess (texFormat, 1, 1, 1, floatsData);
+ tcu::Vec4 tmpFloats (0.0f);
+
+ const float divider = static_cast<float>(m_params->textureHeight);
+ const tcu::Vec4 ufloatStep (1.0f/(divider*1.0f), 1.0f/(divider*2.0f), 1.0f/(divider*3.0f), 1.0f/(divider*5.0f));
+ const tcu::Vec4 sfloatStep (2.0f/(divider*1.0f), 2.0f/(divider*2.0f), 2.0f/(divider*3.0f), 2.0f/(divider*5.0f));
+
+ tcu::IVec4 signedColor (0);
+ tcu::UVec4 unsignedColor (0u);
+ tcu::Vec4 ufloatColor (0.0f);
+ tcu::Vec4 sfloatColor (-1.0f);
+
+ for (int y = 0; y < m_params->textureHeight; ++y)
+ {
+ for (int x = 0; x < m_params->textureWidth; ++x)
+ {
+ switch (channelClass)
+ {
+ case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
+ pixels.setPixel(signedColor, x, y);
+ break;
+
+ case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
+ pixels.setPixel(unsignedColor, x, y);
+ break;
+
+ case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
+ floatsAccess.setPixel(sfloatColor, 0, 0);
+ tmpFloats = ut::gluePixels(floatsAccess.getPixel(0, 0), sfloatColor, tcu::getNumUsedChannels(texFormat.order));
+ pixels.setPixel(tmpFloats, x, y);
+ break;
+
+ // TEXTURECHANNELCLASS_FLOATING_POINT or
+ // TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT
+ default:
+ floatsAccess.setPixel(ufloatColor, 0, 0);
+ tmpFloats = ut::gluePixels(floatsAccess.getPixel(0, 0), ufloatColor, tcu::getNumUsedChannels(texFormat.order));
+ pixels.setPixel(tmpFloats, x, y);
+ break;
+ }
+ }
+
+ nextSigned (signedColor);
+ nextUnsigned (unsignedColor);
+ sfloatColor += sfloatStep;
+ ufloatColor += ufloatStep;
+ }
+}
+
+bool MismatchedVectorSizesTestInstance::compare (tcu::PixelBufferAccess& result, tcu::PixelBufferAccess& reference) const
+{
+ const tcu::TextureFormat texFormat = mapVkFormat(m_params->vkFormat);
+ const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(texFormat.type);
+ const int targetWidth = getNumUsedChannels(texFormat.order);
+
+ bool doContinue = true;
+
+ for (int y = 0; doContinue && y < m_params->textureHeight; ++y)
+ {
+ for (int x = 0; doContinue && x < m_params->textureWidth; ++x)
+ {
+ switch (channelClass)
+ {
+ case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
+ doContinue = ut::comparePixels(result.getPixelInt(x,y), reference.getPixelInt(x,y), targetWidth );
+ break;
+ case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
+ doContinue = ut::comparePixels(result.getPixelUint(x,y), reference.getPixelUint(x,y), targetWidth );
+ break;
+ default:
+ doContinue = ut::comparePixels(result.getPixel(x,y), reference.getPixel(x,y), targetWidth, 0.0005f);
+ break;
+ }
+ }
+ }
+
+ return doContinue;
+}
+
+tcu::TestStatus MismatchedVectorSizesTestInstance::iterate (void)
+{
+ const DeviceInterface& vki = m_context.getDeviceInterface();
+ const VkDevice dev = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+
+ Move<VkCommandPool> cmdPool = createCommandPool(vki, dev, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
+ Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vki, dev, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ Move<VkShaderModule> shaderModule = createShaderModule(vki, dev, m_context.getBinaryCollection().get("comp"), 0);
+
+ Move<VkDescriptorSetLayout> descriptorSetLayout = DescriptorSetLayoutBuilder()
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT)
+ .build(vki, dev);
+ Move<VkDescriptorPool> descriptorPool = DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .build(vki, dev, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ Move<VkDescriptorSet> descriptorSet = makeDescriptorSet(vki, dev, *descriptorPool, *descriptorSetLayout);
+ Move<VkPipelineLayout> pipelineLayout = makePipelineLayout(vki, dev, *descriptorSetLayout);
+ Move<VkPipeline> pipeline = makeComputePipeline(vki, dev, *pipelineLayout, *shaderModule);
+
+
+ ut::StorageImage2D image (m_context, m_params->vkFormat, m_params->textureWidth, m_params->textureHeight);
+
+ const TextureFormat texFormat = mapVkFormat(m_params->vkFormat);
+ const TextureFormat bufferFormat = makeBufferFormat(getTextureChannelClass(texFormat.type),
+ findFormatInfo(m_params->vkFormat)->capability == OpCapability::Int64ImageEXT);
+ ut::StorageBuffer2D buffer (m_context, bufferFormat, m_params->textureWidth, m_params->textureHeight);
+
+ VkDescriptorImageInfo inputImageInfo = makeDescriptorImageInfo(DE_NULL, image.getView(), VK_IMAGE_LAYOUT_GENERAL);
+ VkDescriptorBufferInfo outputBufferInfo = makeDescriptorBufferInfo(buffer.getBuffer(), 0u, buffer.getSize());
+
+ DescriptorSetUpdateBuilder builder;
+ builder
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &inputImageInfo)
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &outputBufferInfo)
+ .update(vki, dev);
+
+ populate (buffer.getPixelAccess());
+ clear (image.getPixelAccess());
+
+ beginCommandBuffer(vki, *cmdBuffer);
+ image.upload(*cmdBuffer);
+ vki.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+ vki.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
+ vki.cmdDispatch(*cmdBuffer, m_params->textureWidth, m_params->textureHeight, 1);
+ image.download(*cmdBuffer);
+ endCommandBuffer(vki, *cmdBuffer);
+
+ image.flush();
+ buffer.flush();
+
+ submitCommandsAndWait(vki, dev, queue, *cmdBuffer);
+
+ image.invalidate();
+ buffer.invalidate();
+
+ return compare(image.getPixelAccess(), buffer.getPixelAccess())
+ ? tcu::TestStatus::pass("")
+ : tcu::TestStatus::fail("Pixel comparison failed");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createImageMismatchedVectorSizesTests (tcu::TestContext& testCtx)
+{
+ std::stringstream ss;
+ auto createTestName = [&](const FormatInfo& info, const MismatchedVectorSizesTest::Params* params) -> std::string
+ {
+ ss.str(std::string());
+ ss << de::toLower(info.spirvName) << "_from";
+ if (params->sourceWidth > 1)
+ ss << "_vec" << params->sourceWidth;
+ else ss << "_scalar";
+
+ return ss.str();
+ };
+
+ auto testGroup = new tcu::TestCaseGroup(testCtx, "mismatched_write_op", "Test image OpImageWrite operation in various aspects.");
+ auto testGroupMismatchedVectorSizes = new tcu::TestCaseGroup(testCtx, "mismatched_vector_sizes", "Case OpImageWrite operation on mismatched vector sizes.");
+
+ for (const auto& info : formatsInfos)
+ {
+ for (int sourceWidth = 4; sourceWidth > 0; --sourceWidth)
+ {
+ if (sourceWidth >= getNumUsedChannels(info.vkFormat))
+ {
+ auto params = new MismatchedVectorSizesTest::Params { info.vkFormat, sourceWidth, 12*sourceWidth, 8*(4-sourceWidth+1) };
+ testGroupMismatchedVectorSizes->addChild(new MismatchedVectorSizesTest(testCtx, createTestName(info, params), {}, MismatchedVectorSizesTest::ParamsSp(params)));
+ }
+ }
+ }
+
+ testGroup->addChild(testGroupMismatchedVectorSizes);
+
+ return testGroup;
+}
+
+} // image
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/image/vktImageMismatchedWriteOpTests.hpp
similarity index 68%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/image/vktImageMismatchedWriteOpTests.hpp
index 1a85ebf..c5d1ec0 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageMismatchedWriteOpTests.hpp
@@ -1,11 +1,10 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTIMAGEMISMATCHEDWRITEOPTESTS_HPP
+#define _VKTIMAGEMISMATCHEDWRITEOPTESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 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.
@@ -21,20 +20,21 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Testing writing and reading for mismatched vector sizes.
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
#include "tcuTestCase.hpp"
+#include "vktTestCase.hpp"
namespace vkt
{
-namespace pipeline
+namespace image
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createImageMismatchedVectorSizesTests (tcu::TestContext& testCtx);
-} // pipeline
+} // image
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTIMAGEMISMATCHEDWRITEOPTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/image/vktImageTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageTests.cpp
index 218b13e..6a8a28c 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageTests.cpp
@@ -35,6 +35,7 @@
#include "vktImageMisalignedCubeTests.hpp"
#include "vktImageSubresourceLayoutTests.hpp"
#include "vktImageMismatchedFormatsTests.hpp"
+#include "vktImageMismatchedWriteOpTests.hpp"
namespace vkt
{
@@ -65,6 +66,7 @@
imageTests->addChild(createImageLoadStoreLodAMDTests(testCtx));
imageTests->addChild(createImageSubresourceLayoutTests(testCtx));
imageTests->addChild(createImageMismatchedFormatsTests(testCtx));
+ imageTests->addChild(createImageMismatchedVectorSizesTests(testCtx));
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp b/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp
index 227412e..adb2461 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp
@@ -53,8 +53,30 @@
const MemoryRequirement memoryRequirement)
{
m_image = createImage(vk, device, &imageCreateInfo);
- m_allocation = allocator.allocate(getImageMemoryRequirements(vk, device, *m_image), memoryRequirement);
- VK_CHECK(vk.bindImageMemory(device, *m_image, m_allocation->getMemory(), m_allocation->getOffset()));
+ de::SharedPtr<vk::Allocation> allocation(allocator.allocate(getImageMemoryRequirements(vk, device, *m_image), memoryRequirement).release());
+ m_allocations.push_back(allocation);
+ VK_CHECK(vk.bindImageMemory(device, *m_image, allocation->getMemory(), allocation->getOffset()));
+}
+
+Image::Image (void)
+ : m_allocations ()
+ , m_image ()
+{}
+
+SparseImage::SparseImage (const vk::DeviceInterface& vkd,
+ vk::VkDevice device,
+ vk::VkPhysicalDevice physicalDevice,
+ const vk::InstanceInterface& vki,
+ const vk::VkImageCreateInfo& createInfo,
+ const vk::VkQueue sparseQueue,
+ vk::Allocator& allocator,
+ const tcu::TextureFormat& format)
+ : Image ()
+ , m_semaphore ()
+{
+ m_image = createImage(vkd, device, &createInfo);
+ m_semaphore = createSemaphore(vkd, device);
+ allocateAndBindSparseImage(vkd, device, physicalDevice, vki, createInfo, m_semaphore.get(), sparseQueue, allocator, m_allocations, format, m_image.get());
}
tcu::UVec3 getShaderGridSize (const ImageType imageType, const tcu::UVec3& imageSize)
diff --git a/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.hpp b/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.hpp
index f7ca361..5553a44 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.hpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageTestsUtil.hpp
@@ -99,14 +99,40 @@
const vk::VkImage& get (void) const { return *m_image; }
const vk::VkImage& operator* (void) const { return get(); }
- vk::Allocation& getAllocation (void) const { return *m_allocation; }
-private:
- de::MovePtr<vk::Allocation> m_allocation;
+ virtual vk::VkSemaphore getSemaphore (void) const { return DE_NULL; }
+
+ Image (const Image&) = delete;
+ Image& operator= (const Image&) = delete;
+
+protected:
+ using AllocationsVec = std::vector<de::SharedPtr<vk::Allocation>>;
+
+ Image (void);
+
+ AllocationsVec m_allocations;
vk::Move<vk::VkImage> m_image;
+};
- Image (const Image&); // "deleted"
- Image& operator= (const Image&);
+class SparseImage : public Image
+{
+public:
+ SparseImage (const vk::DeviceInterface& vkd,
+ vk::VkDevice device,
+ vk::VkPhysicalDevice physicalDevice,
+ const vk::InstanceInterface& vki,
+ const vk::VkImageCreateInfo& createInfo,
+ const vk::VkQueue sparseQueue,
+ vk::Allocator& allocator,
+ const tcu::TextureFormat& format);
+
+ virtual vk::VkSemaphore getSemaphore (void) const { return m_semaphore.get(); }
+
+ SparseImage (const SparseImage&) = delete;
+ SparseImage& operator= (const SparseImage&) = delete;
+
+protected:
+ vk::Move<vk::VkSemaphore> m_semaphore;
};
tcu::UVec3 getShaderGridSize (const ImageType imageType, const tcu::UVec3& imageSize); //!< Size used for addresing image in a shader
diff --git a/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp
index 77f9212..668dd0e 100644
--- a/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp
+++ b/external/vulkancts/modules/vulkan/image/vktImageTranscodingSupportTests.cpp
@@ -862,6 +862,16 @@
if (differenceFound)
{
+ if ((context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().imageViewFormatReinterpretation))
+ {
+ tcu::TextureFormat textureImageFormat = vk::mapVkFormat(m_parameters.featuredFormat);
+ tcu::TextureFormat textureViewFormat = vk::mapVkFormat(featurelessFormat);
+
+ if (tcu::getTextureFormatBitDepth(textureImageFormat) != tcu::getTextureFormatBitDepth(textureViewFormat))
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Format must not contain a different number of bits in each component, than the format of the VkImage");
+ }
+
TestParameters calculatedParameters =
{
m_parameters.operation, // Operation operation
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
index a2db4ac..d204ad1 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryAllocationTests.cpp
@@ -120,7 +120,7 @@
class BaseAllocateTestInstance : public TestInstance
{
public:
- BaseAllocateTestInstance (Context& context, bool useDeviceGroups)
+ BaseAllocateTestInstance (Context& context, bool useDeviceGroups)
: TestInstance (context)
, m_useDeviceGroups (useDeviceGroups)
, m_subsetAllocationAllowed (false)
@@ -130,7 +130,7 @@
if (m_useDeviceGroups)
createDeviceGroup();
else
- createDevice();
+ createTestDevice();
m_allocFlagsInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR;
m_allocFlagsInfo.pNext = DE_NULL;
@@ -138,7 +138,7 @@
m_allocFlagsInfo.deviceMask = 0;
}
- void createDevice (void);
+ void createTestDevice (void);
void createDeviceGroup (void);
const vk::DeviceInterface& getDeviceInterface (void) { return m_useDeviceGroups ? *m_deviceDriver : m_context.getDeviceInterface(); }
vk::VkDevice getDevice (void) { return m_logicalDevice.get();}
@@ -156,7 +156,7 @@
de::MovePtr<vk::DeviceDriver> m_deviceDriver;
};
-void BaseAllocateTestInstance::createDevice (void)
+void BaseAllocateTestInstance::createTestDevice (void)
{
VkInstance instance (m_context.getInstance());
InstanceDriver instanceDriver (m_context.getPlatformInterface(), instance);
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp
index 6888aed..af7757c 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryExternalMemoryHostTests.cpp
@@ -325,7 +325,7 @@
const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
deUint32 memoryTypeIndexToTest;
VkMemoryRequirements imageMemoryRequirements;
- const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL;
+ const VkImageTiling tiling = VK_IMAGE_TILING_LINEAR;
const VkImageUsageFlags usageFlags = (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
// Verify image format properties before proceeding.
@@ -1055,6 +1055,13 @@
context.requireDeviceFunctionality("VK_EXT_external_memory_host");
}
+void checkEvent (Context& context)
+{
+ checkSupport(context);
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
+}
+
} // unnamed namespace
tcu::TestCaseGroup* createMemoryExternalMemoryHostTests (tcu::TestContext& testCtx)
@@ -1100,7 +1107,7 @@
synchronization->addChild(new InstanceFactory1WithSupport<ExternalMemoryHostSynchronizationTestInstance, TestParams, FunctionSupport0, AddPrograms> (testCtx, tcu::NODETYPE_SELF_VALIDATE,
"synchronization", "synchronization", AddPrograms(),
- TestParams(testFormats[0].format, true), checkSupport));
+ TestParams(testFormats[0].format, true), checkEvent));
group->addChild(synchronization.release());
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryMappingTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryMappingTests.cpp
index a9bf33a..be7a6fb 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryMappingTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryMappingTests.cpp
@@ -29,6 +29,7 @@
#include "tcuResultCollector.hpp"
#include "tcuTestLog.hpp"
#include "tcuPlatform.hpp"
+#include "tcuTextureUtil.hpp"
#include "vkDeviceUtil.hpp"
#include "vkPlatform.hpp"
@@ -37,6 +38,7 @@
#include "vkRefUtil.hpp"
#include "vkStrUtil.hpp"
#include "vkAllocationCallbackUtil.hpp"
+#include "vkImageUtil.hpp"
#include "deRandom.hpp"
#include "deSharedPtr.hpp"
@@ -304,16 +306,37 @@
Move<VkImage> makeImage (const DeviceInterface& vk, VkDevice device, VkDeviceSize size, deUint32 queueFamilyIndex)
{
- const VkDeviceSize sizeInPixels = (size + 3u) / 4u;
- const deUint32 sqrtSize = static_cast<deUint32>(deFloatCeil(deFloatSqrt(static_cast<float>(sizeInPixels))));
- const deUint32 powerOfTwoSize = deSmallestGreaterOrEquallPowerOfTwoU32(sqrtSize);
+ const VkFormat formats[] =
+ {
+ VK_FORMAT_R8G8B8A8_UINT,
+ VK_FORMAT_R16G16B16A16_UINT,
+ VK_FORMAT_R32G32B32A32_UINT,
+ };
+
+ VkFormat format = VK_FORMAT_UNDEFINED;
+ deUint32 powerOfTwoSize = 0;
+
+ for (const VkFormat f : formats)
+ {
+ const int pixelSize = vk::mapVkFormat(f).getPixelSize();
+ const VkDeviceSize sizeInPixels = (size + 3u) / pixelSize;
+ const deUint32 sqrtSize = static_cast<deUint32>(deFloatCeil(deFloatSqrt(static_cast<float>(sizeInPixels))));
+
+ format = f;
+ powerOfTwoSize = deSmallestGreaterOrEquallPowerOfTwoU32(sqrtSize);
+
+ // maxImageDimension2D
+ if (powerOfTwoSize < 4096)
+ break;
+ }
+
const VkImageCreateInfo colorImageParams =
{
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkImageCreateFlags flags;
VK_IMAGE_TYPE_2D, // VkImageType imageType;
- VK_FORMAT_R8G8B8A8_UINT, // VkFormat format;
+ format, // VkFormat format;
{
powerOfTwoSize,
powerOfTwoSize,
@@ -415,7 +438,35 @@
return allocateMemory(vk, device, &pAllocInfo);
}
-Move<VkDeviceMemory> allocMemory (const DeviceInterface& vk, VkDevice device, VkDeviceSize pAllocInfo_allocationSize, deUint32 pAllocInfo_memoryTypeIndex, Move<VkImage>& image, Move<VkBuffer>& buffer)
+VkDeviceSize findLargeAllocationSize (const DeviceInterface& vk, VkDevice device, VkDeviceSize max, deUint32 memoryTypeIndex)
+{
+ // max must be power of two
+ DE_ASSERT((max & (max - 1)) == 0);
+
+ for (VkDeviceSize size = max; size > 0; size >>= 1)
+ {
+ const VkMemoryAllocateInfo allocInfo =
+ {
+ VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
+ DE_NULL,
+ size,
+ memoryTypeIndex,
+ };
+
+ VkDeviceMemory memory;
+ VkResult result = vk.allocateMemory(device, &allocInfo, NULL, &memory);
+
+ if (result == VK_SUCCESS)
+ {
+ vk.freeMemory(device, memory, NULL);
+ return size;
+ }
+ }
+
+ return 0;
+}
+
+Move<VkDeviceMemory> allocMemory (const DeviceInterface& vk, VkDevice device, VkDeviceSize pAllocInfo_allocationSize, deUint32 pAllocInfo_memoryTypeIndex, Move<VkImage>& image, Move<VkBuffer>& buffer, const VkAllocationCallbacks* allocator = DE_NULL)
{
DE_ASSERT((!image) || (!buffer));
@@ -435,7 +486,7 @@
pAllocInfo_allocationSize,
pAllocInfo_memoryTypeIndex,
};
- return allocateMemory(vk, device, &pAllocInfo);
+ return allocateMemory(vk, device, &pAllocInfo, allocator);
}
struct MemoryRange
@@ -465,17 +516,21 @@
vector<MemoryRange> flushMappings;
vector<MemoryRange> invalidateMappings;
bool remap;
+ bool implicitUnmap;
AllocationKind allocationKind;
};
-bool compareAndLogBuffer (TestLog& log, size_t size, const deUint8* result, const deUint8* reference)
+bool compareAndLogBuffer (TestLog& log, size_t size, size_t referenceSize, const deUint8* result, const deUint8* reference)
{
+ size_t stride = size / referenceSize;
size_t failedBytes = 0;
size_t firstFailed = (size_t)-1;
- for (size_t ndx = 0; ndx < size; ndx++)
+ DE_ASSERT(referenceSize <= size);
+
+ for (size_t ndx = 0; ndx < referenceSize; ndx += stride)
{
- if (result[ndx] != reference[ndx])
+ if (result[ndx * stride] != reference[ndx])
{
failedBytes++;
@@ -491,7 +546,7 @@
std::ostringstream expectedValues;
std::ostringstream resultValues;
- for (size_t ndx = firstFailed; ndx < firstFailed + 10 && ndx < size; ndx++)
+ for (size_t ndx = firstFailed; ndx < firstFailed + 10 && ndx < referenceSize; ndx++)
{
if (ndx != firstFailed)
{
@@ -500,7 +555,7 @@
}
expectedValues << reference[ndx];
- resultValues << result[ndx];
+ resultValues << result[ndx * stride];
}
if (firstFailed + 10 < size)
@@ -562,13 +617,28 @@
{
try
{
- const tcu::ScopedLogSection section (log, "MemoryType" + de::toString(memoryTypeIndex), "MemoryType" + de::toString(memoryTypeIndex));
- const vk::VkMemoryType& memoryType = memoryProperties.memoryTypes[memoryTypeIndex];
- const VkMemoryHeap& memoryHeap = memoryProperties.memoryHeaps[memoryType.heapIndex];
- const VkDeviceSize atomSize = nonCoherentAtomSize;
+ const tcu::ScopedLogSection section (log, "MemoryType" + de::toString(memoryTypeIndex), "MemoryType" + de::toString(memoryTypeIndex));
+ const vk::VkMemoryType& memoryType = memoryProperties.memoryTypes[memoryTypeIndex];
+ const VkMemoryHeap& memoryHeap = memoryProperties.memoryHeaps[memoryType.heapIndex];
+ const VkDeviceSize atomSize = nonCoherentAtomSize;
+ const VkDeviceSize stride = config.implicitUnmap ? 1024 : 1;
+ const deUint32 iterations = config.implicitUnmap ? 128 : 1;
- VkDeviceSize allocationSize = (config.allocationSize % atomSize == 0) ? config.allocationSize : config.allocationSize + (atomSize - (config.allocationSize % atomSize));
- vk::VkMemoryRequirements req =
+ VkDeviceSize allocationSize = (config.allocationSize % atomSize == 0) ? config.allocationSize : config.allocationSize + (atomSize - (config.allocationSize % atomSize));
+ size_t referenceSize = 0;
+ vector<deUint8> reference;
+
+ if (config.implicitUnmap)
+ {
+ VkDeviceSize max = 0x10000000; // 256MiB
+
+ while (memoryHeap.size <= 4 * max)
+ max >>= 1;
+
+ allocationSize = findLargeAllocationSize(vkd, device, max, memoryTypeIndex);
+ }
+
+ vk::VkMemoryRequirements req =
{
(VkDeviceSize)allocationSize,
(VkDeviceSize)0,
@@ -595,6 +665,9 @@
mappingSize = allocationSize;
}
+ referenceSize = static_cast<size_t>(mappingSize / stride);
+ reference.resize(static_cast<size_t>(mappingOffset) + referenceSize);
+
log << TestLog::Message << "MemoryType: " << memoryType << TestLog::EndMessage;
log << TestLog::Message << "MemoryHeap: " << memoryHeap << TestLog::EndMessage;
log << TestLog::Message << "AtomSize: " << atomSize << TestLog::EndMessage;
@@ -645,12 +718,13 @@
{
log << TestLog::Message << "Memory type's heap is too small." << TestLog::EndMessage;
}
- else
+ else for (deUint32 iteration = 0; iteration < iterations; iteration++)
{
atLeastOneTestPerformed = true;
- const Unique<VkDeviceMemory> memory (allocMemory(vkd, device, allocationSize, memoryTypeIndex, image, buffer));
+ AllocationCallbackRecorder recorder (getSystemAllocator());
+ const VkAllocationCallbacks* allocator = config.implicitUnmap ? recorder.getCallbacks() : DE_NULL;
+ Move<VkDeviceMemory> memory (allocMemory(vkd, device, allocationSize, memoryTypeIndex, image, buffer, allocator));
de::Random rng (config.seed);
- vector<deUint8> reference ((size_t)(allocationSize));
deUint8* mapping = DE_NULL;
{
@@ -661,11 +735,11 @@
mapping = (deUint8*)ptr;
}
- for (VkDeviceSize ndx = 0; ndx < mappingSize; ndx++)
+ for (VkDeviceSize ndx = 0; ndx < referenceSize; ndx += stride)
{
const deUint8 val = rng.getUint8();
- mapping[ndx] = val;
+ mapping[ndx * stride] = val;
reference[(size_t)(mappingOffset + ndx)] = val;
}
@@ -723,10 +797,25 @@
VK_CHECK(vkd.invalidateMappedMemoryRanges(device, static_cast<deUint32>(ranges.size()), &ranges[0]));
}
- if (!compareAndLogBuffer(log, static_cast<size_t>(mappingSize), mapping, &reference[static_cast<size_t>(mappingOffset)]))
+ if (!compareAndLogBuffer(log, static_cast<size_t>(mappingSize), referenceSize, mapping, &reference[static_cast<size_t>(mappingOffset)]))
result.fail("Unexpected values read from mapped memory.");
- vkd.unmapMemory(device, *memory);
+ if (config.implicitUnmap)
+ {
+ AllocationCallbackValidationResults results;
+
+ vkd.freeMemory(device, memory.disown(), allocator);
+ validateAllocationCallbacks(recorder, &results);
+
+ if (!results.liveAllocations.empty())
+ result.fail("Live allocations remain after freeing mapped memory");
+ }
+ else
+ {
+ vkd.unmapMemory(device, *memory);
+ }
+
+ context.getTestContext().touchWatchdog();
}
}
catch (const tcu::TestError& error)
@@ -1512,6 +1601,7 @@
OP_SUB_INVALIDATE_OVERLAPPING,
OP_REMAP,
+ OP_IMPLICIT_UNMAP,
OP_LAST
};
@@ -1528,6 +1618,7 @@
config.seed = seed;
config.mapping = mapping;
config.remap = false;
+ config.implicitUnmap = false;
config.allocationKind = allocationKind;
switch (op)
@@ -1539,6 +1630,10 @@
config.remap = true;
break;
+ case OP_IMPLICIT_UNMAP:
+ config.implicitUnmap = true;
+ break;
+
case OP_FLUSH:
config.flushMappings = vector<MemoryRange>(1, MemoryRange(mapping.offset, mapping.size));
break;
@@ -1650,7 +1745,7 @@
const VkDeviceSize allocationSizes[] =
{
- 33, 257, 4087, 8095, 1*1024*1024 + 1
+ 0, 33, 257, 4087, 8095, 1*1024*1024 + 1,
};
const VkDeviceSize offsets[] =
@@ -1671,6 +1766,7 @@
{
{ OP_NONE, "simple" },
{ OP_REMAP, "remap" },
+ { OP_IMPLICIT_UNMAP, "implicit_unmap" },
{ OP_FLUSH, "flush" },
{ OP_SUB_FLUSH, "subflush" },
{ OP_SUB_FLUSH_SEPARATE, "subflush_separate" },
@@ -1690,11 +1786,18 @@
for (size_t allocationSizeNdx = 0; allocationSizeNdx < DE_LENGTH_OF_ARRAY(allocationSizes); allocationSizeNdx++)
{
const VkDeviceSize allocationSize = allocationSizes[allocationSizeNdx];
- de::MovePtr<tcu::TestCaseGroup> allocationSizeGroup (new tcu::TestCaseGroup(testCtx, de::toString(allocationSize).c_str(), ""));
+ const string sizeGroupName = (allocationSize == 0) ? "variable" : de::toString(allocationSize);
+ de::MovePtr<tcu::TestCaseGroup> allocationSizeGroup (new tcu::TestCaseGroup(testCtx, sizeGroupName.c_str(), ""));
for (size_t opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++)
{
const Op op = ops[opNdx].op;
+
+ // implicit_unmap ignores allocationSize
+ if (((allocationSize == 0) && (op != OP_IMPLICIT_UNMAP)) ||
+ ((allocationSize != 0) && (op == OP_IMPLICIT_UNMAP)))
+ continue;
+
const char* const name = ops[opNdx].name;
const deUint32 seed = (deUint32)(opNdx * allocationSizeNdx);
const TestConfig config = fullMappedConfig(allocationSize, op, seed, static_cast<AllocationKind>(allocationKindNdx));
@@ -1716,7 +1819,8 @@
for (size_t allocationSizeNdx = 0; allocationSizeNdx < DE_LENGTH_OF_ARRAY(allocationSizes); allocationSizeNdx++)
{
const VkDeviceSize allocationSize = allocationSizes[allocationSizeNdx];
- de::MovePtr<tcu::TestCaseGroup> allocationSizeGroup (new tcu::TestCaseGroup(testCtx, de::toString(allocationSize).c_str(), ""));
+ const string sizeGroupName = (allocationSize == 0) ? "variable" : de::toString(allocationSize);
+ de::MovePtr<tcu::TestCaseGroup> allocationSizeGroup (new tcu::TestCaseGroup(testCtx, sizeGroupName.c_str(), ""));
for (size_t offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++)
{
@@ -1741,8 +1845,14 @@
for (size_t opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++)
{
- const deUint32 seed = (deUint32)(opNdx * allocationSizeNdx);
const Op op = ops[opNdx].op;
+
+ // implicit_unmap ignores allocationSize
+ if (((allocationSize == 0) && (op != OP_IMPLICIT_UNMAP)) ||
+ ((allocationSize != 0) && (op == OP_IMPLICIT_UNMAP)))
+ continue;
+
+ const deUint32 seed = (deUint32)(opNdx * allocationSizeNdx);
const char* const name = ops[opNdx].name;
const TestConfig config = subMappedConfig(allocationSize, MemoryRange(offset, size), op, seed, static_cast<AllocationKind>(allocationKindNdx));
diff --git a/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp b/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp
index 6316c88..4010f52 100644
--- a/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp
+++ b/external/vulkancts/modules/vulkan/memory/vktMemoryRequirementsTests.cpp
@@ -829,6 +829,12 @@
return false;
}
+ if (isYCbCrExtensionFormat(info.format)
+ && !context.isDeviceFunctionalitySupported("VK_EXT_ycbcr_2plane_444_formats"))
+ {
+ return false;
+ }
+
if (info.imageType == VK_IMAGE_TYPE_1D)
{
DE_ASSERT(info.extent.height == 1u && info.extent.depth == 1u);
@@ -1253,6 +1259,10 @@
VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR,
VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,
VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,
+ VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT,
+ VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT,
+ VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT,
+ VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT,
};
const DeviceInterface& vk = context.getDeviceInterface();
const InstanceInterface& vki = context.getInstanceInterface();
diff --git a/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp b/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp
index 369f45d..0456c5d 100755
--- a/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp
+++ b/external/vulkancts/modules/vulkan/memory_model/vktMemoryModelMessagePassing.cpp
@@ -1175,13 +1175,28 @@
vk, device, allocator, makeBufferCreateInfo(bufferSizes[2], VK_BUFFER_USAGE_TRANSFER_DST_BIT), MemoryRequirement::HostVisible));
}
+ VkFormat imageFormat;
+ switch (m_data.dataType)
+ {
+ case DATA_TYPE_UINT:
+ case DATA_TYPE_UINT64:
+ imageFormat = VK_FORMAT_R32_UINT;
+ break;
+ case DATA_TYPE_FLOAT32:
+ case DATA_TYPE_FLOAT64:
+ imageFormat = VK_FORMAT_R32_SFLOAT;
+ break;
+ default:
+ TCU_FAIL("Invalid data type.");
+ }
+
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;
- VK_FORMAT_R32_UINT, // VkFormat format;
+ 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;
{
DIM*NUM_WORKGROUP_EACH_DIM, // deUint32 width;
DIM*NUM_WORKGROUP_EACH_DIM, // deUint32 height;
@@ -1206,7 +1221,7 @@
(VkImageViewCreateFlags)0u, // VkImageViewCreateFlags flags;
DE_NULL, // VkImage image;
VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
- VK_FORMAT_R32_UINT, // VkFormat format;
+ imageFormat, // VkFormat format;
{
VK_COMPONENT_SWIZZLE_R, // VkComponentSwizzle r;
VK_COMPONENT_SWIZZLE_G, // VkComponentSwizzle g;
diff --git a/external/vulkancts/modules/vulkan/modifiers/vktModifiersTests.cpp b/external/vulkancts/modules/vulkan/modifiers/vktModifiersTests.cpp
index 9b9621e..4d6bcd2 100644
--- a/external/vulkancts/modules/vulkan/modifiers/vktModifiersTests.cpp
+++ b/external/vulkancts/modules/vulkan/modifiers/vktModifiersTests.cpp
@@ -39,10 +39,14 @@
#include "tcuTextureUtil.hpp"
#include "tcuImageIO.hpp"
#include "tcuImageCompare.hpp"
+#include "tcuMaybe.hpp"
#include "deUniquePtr.hpp"
#include "deStringUtil.hpp"
#include <string>
+#include <vector>
+#include <algorithm>
+#include <iterator>
namespace vkt
{
@@ -99,15 +103,16 @@
return drmFormatModifiers;
}
-VkImageFormatProperties2 verifyHandleTypeForFormatModifier (const InstanceInterface& vki,
- VkPhysicalDevice physicalDevice,
- const VkFormat format,
- const VkImageType imageType,
- const VkImageUsageFlags imageUsages,
- const VkExternalMemoryHandleTypeFlags handleType,
- const deUint64 drmFormatModifier)
+// Returns true if the image with the given parameters and modifiers supports the given handle type.
+bool verifyHandleTypeForFormatModifier (const InstanceInterface& vki,
+ VkPhysicalDevice physicalDevice,
+ const VkFormat format,
+ const VkImageType imageType,
+ const VkImageUsageFlags imageUsages,
+ const VkExternalMemoryHandleTypeFlags handleType,
+ const deUint64 drmFormatModifier)
{
- const VkPhysicalDeviceImageDrmFormatModifierInfoEXT imageFormatModifierInfo =
+ const VkPhysicalDeviceImageDrmFormatModifierInfoEXT imageFormatModifierInfo =
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT,
DE_NULL,
@@ -116,13 +121,15 @@
0,
DE_NULL,
};
+
const VkPhysicalDeviceExternalImageFormatInfo externalImageFormatInfo =
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,
&imageFormatModifierInfo,
(VkExternalMemoryHandleTypeFlagBits)handleType,
};
- const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
+
+ const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
{
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
&externalImageFormatInfo,
@@ -132,25 +139,49 @@
imageUsages,
0,
};
- VkExternalImageFormatProperties externalImageProperties;
- deMemset(&externalImageProperties, 0, sizeof(externalImageProperties));
- externalImageProperties.sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES;
- externalImageProperties.sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES;
- VkImageFormatProperties2 imageProperties;
- deMemset(&imageProperties, 0, sizeof(imageProperties));
- imageProperties.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
- imageProperties.pNext = &externalImageProperties;
+ VkExternalImageFormatProperties externalImageProperties = initVulkanStructure();
+ VkImageFormatProperties2 imageProperties = initVulkanStructure(&externalImageProperties);
+
if (vki.getPhysicalDeviceImageFormatProperties2(physicalDevice, &imageFormatInfo, &imageProperties) == VK_ERROR_FORMAT_NOT_SUPPORTED)
- {
- TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers");
- };
+ return false;
+
if ((externalImageProperties.externalMemoryProperties.compatibleHandleTypes & handleType) != handleType)
+ return false;
+
+ return true;
+}
+
+std::vector<deUint64> getExportImportCompatibleModifiers (Context& context, VkFormat format)
+{
+ const auto& vki = context.getInstanceInterface();
+ const auto drmFormatModifiers = getDrmFormatModifiers(vki, context.getPhysicalDevice(), format);
+ std::vector<deUint64> compatibleModifiers;
+
+ if (drmFormatModifiers.empty())
+ return compatibleModifiers;
+
+ const VkFormatFeatureFlags testFeatures = (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+
+ for (const auto& modifierProps : drmFormatModifiers)
{
- TCU_THROW(NotSupportedError, de::toString(format) + " does not support the expected memory handle type");
+ if ((modifierProps.drmFormatModifierTilingFeatures & testFeatures) != testFeatures)
+ continue;
+
+ const auto& modifier = modifierProps.drmFormatModifier;
+ const auto supported = verifyHandleTypeForFormatModifier(vki, context.getPhysicalDevice(), format,
+ VK_IMAGE_TYPE_2D,
+ (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
+ modifier);
+
+ if (!supported)
+ continue;
+
+ compatibleModifiers.push_back(modifier);
}
- return imageProperties;
+ return compatibleModifiers;
}
void checkExportImportExtensions (Context& context, VkFormat format)
@@ -179,29 +210,11 @@
if (!context.isDeviceFunctionalitySupported("VK_KHR_external_memory_fd"))
TCU_THROW(NotSupportedError, "VK_KHR_external_memory_fd not supported");
+
checkModifiersSupported(context, format);
- const InstanceInterface& vki = context.getInstanceInterface();
- std::vector<VkDrmFormatModifierPropertiesEXT> drmFormatModifiers = getDrmFormatModifiers(vki, context.getPhysicalDevice(), format);
-
- if (drmFormatModifiers.size() < 1)
- TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers");
- bool featureCompatible = false;
- for (deUint32 m = 0; m < drmFormatModifiers.size(); m++)
- {
- const VkFormatFeatureFlags testFeatures = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
- if ((drmFormatModifiers[m].drmFormatModifierTilingFeatures & testFeatures) != testFeatures)
- continue;
- verifyHandleTypeForFormatModifier(vki, context.getPhysicalDevice(), format,
- VK_IMAGE_TYPE_2D,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT,
- VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
- drmFormatModifiers[m].drmFormatModifier);
-
- featureCompatible = true;
- }
- if (!featureCompatible)
+ const auto compatibleModifiers = getExportImportCompatibleModifiers(context, format);
+ if (compatibleModifiers.empty())
TCU_THROW(NotSupportedError, "Could not find a format modifier supporting required transfer features for " + de::toString(format));
}
@@ -251,19 +264,21 @@
TestLog& log = context.getTestContext().getLog();
const InstanceInterface& vki = context.getInstanceInterface();
std::vector<VkDrmFormatModifierPropertiesEXT> drmFormatModifiers = getDrmFormatModifiers(vki, context.getPhysicalDevice(), format);
+ bool noneCompatible = true;
- if (drmFormatModifiers.size() < 1)
+ if (drmFormatModifiers.empty())
TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers");
for (deUint32 m = 0; m < drmFormatModifiers.size(); m++) {
VkImageFormatProperties2 imageProperties {};
- deBool isCompatible = isModifierCompatibleWithImageProperties(vki, context.getPhysicalDevice(),
- &format, 1u, VK_IMAGE_TYPE_2D,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
- drmFormatModifiers[m].drmFormatModifier, imageProperties);
+ deBool isCompatible = isModifierCompatibleWithImageProperties(vki, context.getPhysicalDevice(),
+ &format, 1u, VK_IMAGE_TYPE_2D,
+ (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
+ drmFormatModifiers[m].drmFormatModifier, imageProperties);
if (!isCompatible)
- TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers");
+ continue;
+ noneCompatible = false;
TCU_CHECK(imageProperties.imageFormatProperties.maxExtent.width >= 1 && imageProperties.imageFormatProperties.maxExtent.height >= 1);
TCU_CHECK(imageProperties.imageFormatProperties.maxArrayLayers >= 1);
@@ -275,6 +290,9 @@
<< TestLog::EndMessage;
}
+ if (noneCompatible)
+ TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers for the requested image features");
+
return tcu::TestStatus::pass("OK");
}
@@ -306,14 +324,14 @@
return createImage(vkd, device, &createInfo);
}
-Move<VkImage> createImageWithDrmFormatModifiers (const DeviceInterface& vkd,
- const VkDevice device,
- const VkImageType imageType,
- const VkImageUsageFlags imageUsages,
- const VkExternalMemoryHandleTypeFlags externalMemoryHandleTypeFlags,
- const std::vector<VkFormat> formats,
- const UVec2& size,
- const std::vector<deUint64>& drmFormatModifiers)
+Move<VkImage> createImageWithDrmFormatModifiers (const DeviceInterface& vkd,
+ const VkDevice device,
+ const VkImageType imageType,
+ const VkImageUsageFlags imageUsages,
+ const VkExternalMemoryHandleTypeFlags externalMemoryHandleTypeFlags,
+ const std::vector<VkFormat>& formats,
+ const UVec2& size,
+ const std::vector<deUint64>& drmFormatModifiers)
{
const VkImageDrmFormatModifierListCreateInfoEXT modifierListCreateInfo =
{
@@ -373,50 +391,44 @@
const VkDevice device = context.getDevice();
std::vector<VkDrmFormatModifierPropertiesEXT> drmFormatModifiers = getDrmFormatModifiers(vki, context.getPhysicalDevice(), format);
- if (drmFormatModifiers.size() < 1)
+ if (drmFormatModifiers.empty())
TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers");
- for (deUint32 modifierNdx = 0; modifierNdx < drmFormatModifiers.size(); modifierNdx++) {
- VkImageDrmFormatModifierPropertiesEXT properties;
- std::vector<deUint64> modifiers;
- bool found = false;
+ // Get the list of modifiers supported for some specific image parameters.
+ std::vector<deUint64> modifiers;
- deMemset(&properties, 0, sizeof(properties));
- properties.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT;
+ for (const auto& modProps : drmFormatModifiers)
+ {
+ VkImageFormatProperties2 imgFormatProperties = initVulkanStructure();
+ const auto isCompatible = isModifierCompatibleWithImageProperties(vki, context.getPhysicalDevice(), &format, 1u, VK_IMAGE_TYPE_2D,
+ (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
+ modProps.drmFormatModifier, imgFormatProperties);
+ if (isCompatible)
+ modifiers.push_back(modProps.drmFormatModifier);
+ }
- for (deUint32 m = 0; m <= modifierNdx; m++)
- {
- VkImageFormatProperties2 imgFormatProperties {};
- deBool isCompatible = isModifierCompatibleWithImageProperties(vki, context.getPhysicalDevice(), &format, 1u, VK_IMAGE_TYPE_2D,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
- drmFormatModifiers[m].drmFormatModifier, imgFormatProperties);
- if (isCompatible)
- modifiers.push_back(drmFormatModifiers[m].drmFormatModifier);
- }
+ if (modifiers.empty())
+ TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers for the requested image features");
- if (modifiers.empty())
- TCU_THROW(NotSupportedError, de::toString(format) + " does not support any DRM modifiers");
+ // Test with lists of compatible modifiers of increasing lengths.
+ for (size_t len = 1u; len <= modifiers.size(); ++len)
+ {
+ std::vector<deUint64> creationModifiers;
+ creationModifiers.reserve(len);
+ std::copy_n(begin(modifiers), len, std::back_inserter(creationModifiers));
+
+ VkImageDrmFormatModifierPropertiesEXT properties = initVulkanStructure();
{
- Move<VkImage> image (createImageWithDrmFormatModifiers(vkd, device, VK_IMAGE_TYPE_2D,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT,
- 0,
- {format}, UVec2(64, 64), modifiers));
-
+ std::vector<VkFormat> formats (1u, format);
+ const auto image = createImageWithDrmFormatModifiers(vkd, device, VK_IMAGE_TYPE_2D,
+ (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
+ 0, formats, UVec2(64, 64), creationModifiers);
VK_CHECK(vkd.getImageDrmFormatModifierPropertiesEXT(device, *image, &properties));
}
- for (deUint32 m = 0; m < modifiers.size(); m++)
- {
- if (properties.drmFormatModifier == modifiers[m]) {
- found = true;
- break;
- }
- }
-
- if (!found)
+ if (!de::contains(begin(creationModifiers), end(creationModifiers), properties.drmFormatModifier))
return tcu::TestStatus::fail("Image created with modifier not specified in the create list");
}
@@ -437,21 +449,24 @@
return -1;
}
-bool exportImportMemoryExplicitModifiersCase (Context& context, const VkFormat format, const VkDrmFormatModifierPropertiesEXT& modifier)
+bool exportImportMemoryExplicitModifiersCase (Context& context, const VkFormat format, deUint64 modifier)
{
const InstanceInterface& vki = context.getInstanceInterface();
const DeviceInterface& vkd = context.getDeviceInterface();
const VkDevice device = context.getDevice();
- verifyHandleTypeForFormatModifier(vki, context.getPhysicalDevice(), format,
- VK_IMAGE_TYPE_2D,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT,
- VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
- modifier.drmFormatModifier);
+ const auto supported = verifyHandleTypeForFormatModifier(vki, context.getPhysicalDevice(), format,
+ VK_IMAGE_TYPE_2D,
+ (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
+ modifier);
+
+ if (!supported)
+ TCU_FAIL("Modifier " + de::toString(modifier) + " for format " + de::toString(format) + " expected to be compatible");
+
std::vector<deUint64> modifiers;
- modifiers.push_back(modifier.drmFormatModifier);
+ modifiers.push_back(modifier);
const UVec2 imageSize (64, 64);
@@ -683,15 +698,14 @@
tcu::TestStatus exportImportMemoryExplicitModifiersCase (Context& context, const VkFormat format)
{
- const InstanceInterface& vki = context.getInstanceInterface();
- std::vector<VkDrmFormatModifierPropertiesEXT> drmFormatModifiers = getDrmFormatModifiers(vki, context.getPhysicalDevice(), format);
+ const auto compatibleModifiers = getExportImportCompatibleModifiers(context, format);
- for (deUint32 m = 0; m < drmFormatModifiers.size(); m++)
+ if (compatibleModifiers.empty())
+ TCU_FAIL("Expected non-empty list of compatible modifiers for the given format");
+
+ for (const auto& modifier : compatibleModifiers)
{
- const VkFormatFeatureFlags testFeatures = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
- if ((drmFormatModifiers[m].drmFormatModifierTilingFeatures & testFeatures) != testFeatures)
- continue;
- if (!exportImportMemoryExplicitModifiersCase(context, format, drmFormatModifiers[m]))
+ if (!exportImportMemoryExplicitModifiersCase(context, format, modifier))
return tcu::TestStatus::fail("Unexpected copy image result");
}
diff --git a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
index 01d3e1f..d3e1cba 100644
--- a/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
+++ b/external/vulkancts/modules/vulkan/multiview/vktMultiViewRenderTests.cpp
@@ -3289,8 +3289,8 @@
imageBarrier(*m_device, *m_cmdBuffer, m_dsAttachment->getImage(), subresourceRange,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
}
void MultiViewDepthStencilTestInstance::afterDraw (void)
diff --git a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
index 2df5782..d23e7bf 100644
--- a/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
@@ -1,14 +1,13 @@
-include_directories(
- ..
- ../amber
- )
-
set(DEQP_VK_PIPELINE_SRCS
+ vktPipelineBindPointTests.cpp
+ vktPipelineBindPointTests.hpp
vktPipelineBlendTests.cpp
vktPipelineBlendTests.hpp
vktPipelineClearUtil.cpp
vktPipelineClearUtil.hpp
+ vktPipelineColorWriteEnableTests.cpp
+ vktPipelineColorWriteEnableTests.hpp
vktPipelineCombinationsIterator.hpp
vktPipelineDepthTests.cpp
vktPipelineDepthTests.hpp
@@ -22,6 +21,8 @@
vktPipelineImageSamplingInstance.hpp
vktPipelineImageTests.cpp
vktPipelineImageTests.hpp
+ vktPipelineLogicOpTests.cpp
+ vktPipelineLogicOpTests.hpp
vktPipelinePushConstantTests.cpp
vktPipelinePushConstantTests.hpp
vktPipelinePushDescriptorTests.cpp
@@ -81,8 +82,8 @@
vktPipelineVertexInputTests.hpp
vktPipelineTimestampTests.cpp
vktPipelineTimestampTests.hpp
- vktPipelineVertexOnlyTests.cpp
- vktPipelineVertexOnlyTests.hpp
+ vktPipelineMiscTests.cpp
+ vktPipelineMiscTests.hpp
vktPipelineVertexUtil.cpp
vktPipelineVertexUtil.hpp
vktPipelineCacheTests.cpp
@@ -101,6 +102,10 @@
vktPipelineBlendOperationAdvancedTests.hpp
vktPipelineExtendedDynamicStateTests.cpp
vktPipelineExtendedDynamicStateTests.hpp
+ vktPipelineCreationCacheControlTests.cpp
+ vktPipelineCreationCacheControlTests.hpp
+ vktPipelineNoPositionTests.cpp
+ vktPipelineNoPositionTests.hpp
)
set(DEQP_VK_PIPELINE_LIBS
@@ -111,8 +116,13 @@
)
PCH(DEQP_VK_PIPELINE_SRCS ../pch.cpp)
-include_directories("../../../../amber/src/include")
-include_directories("../amber")
add_library(deqp-vk-pipeline STATIC ${DEQP_VK_PIPELINE_SRCS})
target_link_libraries(deqp-vk-pipeline ${DEQP_VK_PIPELINE_LIBS})
+target_include_directories(deqp-vk-pipeline
+ PRIVATE
+ ..
+ ../../../../amber/src/include
+ ../amber
+ ../util
+)
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineBindPointTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBindPointTests.cpp
new file mode 100644
index 0000000..fe49d94
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBindPointTests.cpp
@@ -0,0 +1,969 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
+ *
+ * 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 Pipeline Bind Point Tests
+ *//*--------------------------------------------------------------------*/
+#include "vktPipelineBindPointTests.hpp"
+#include "vktPipelineImageUtil.hpp"
+
+#include "vkObjUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkRayTracingUtil.hpp"
+
+#include "tcuVector.hpp"
+
+#include <algorithm>
+#include <string>
+#include <sstream>
+#include <type_traits>
+#include <utility>
+
+namespace vkt
+{
+namespace pipeline
+{
+
+namespace
+{
+
+using namespace vk;
+
+// These operations will be tried in different orders.
+// To avoid combinatory explosions, we'll only use two pipeline types per test, which means 2 pipeline bind operations and 2 related set bind operations.
+// The following types will be mixed: (graphics, compute), (graphics, ray tracing) and (compute, ray tracing).
+enum class SetupOp
+{
+ BIND_GRAPHICS_PIPELINE = 0,
+ BIND_COMPUTE_PIPELINE = 1,
+ BIND_RAYTRACING_PIPELINE = 2,
+ BIND_GRAPHICS_SET = 3,
+ BIND_COMPUTE_SET = 4,
+ BIND_RAYTRACING_SET = 5,
+ OP_COUNT = 6,
+};
+
+// How to bind each set.
+enum class SetUpdateType
+{
+ WRITE = 0,
+ PUSH = 1,
+ PUSH_WITH_TEMPLATE = 2,
+ TYPE_COUNT = 3,
+};
+
+// Types of operations to dispatch. They will be tried in different orders and are related to the setup sequence.
+enum class DispatchOp
+{
+ DRAW = 0,
+ COMPUTE = 1,
+ TRACE_RAYS = 2,
+ OP_COUNT = 3,
+};
+
+constexpr auto kTestBindPoints = 2; // Two bind points per test.
+constexpr auto kSetupSequenceSize = kTestBindPoints * 2; // For each bind point: bind pipeline and bind set.
+constexpr auto kDispatchSequenceSize = kTestBindPoints; // Dispatch two types of work, matching the bind points being used.
+
+using SetupSequence = tcu::Vector<SetupOp, kSetupSequenceSize>;
+using DispatchSequence = tcu::Vector<DispatchOp, kDispatchSequenceSize>;
+
+// Test parameters.
+struct TestParams
+{
+ SetUpdateType graphicsSetUpdateType;
+ SetUpdateType computeSetUpdateType;
+ SetUpdateType rayTracingSetUpdateType;
+ SetupSequence setupSequence;
+ DispatchSequence dispatchSequence;
+
+protected:
+ bool hasSetupOp (SetupOp op) const
+ {
+ for (int i = 0; i < decltype(setupSequence)::SIZE; ++i)
+ {
+ if (setupSequence[i] == op)
+ return true;
+ }
+ return false;
+ }
+
+ bool hasAnyOf (const std::vector<SetupOp>& opVec) const
+ {
+ for (const auto& op : opVec)
+ {
+ if (hasSetupOp(op))
+ return true;
+ }
+ return false;
+ }
+
+public:
+ bool hasGraphics (void) const
+ {
+ const std::vector<SetupOp> setupOps {SetupOp::BIND_GRAPHICS_PIPELINE, SetupOp::BIND_GRAPHICS_SET};
+ return hasAnyOf(setupOps);
+ }
+
+ bool hasCompute (void) const
+ {
+ const std::vector<SetupOp> setupOps {SetupOp::BIND_COMPUTE_PIPELINE, SetupOp::BIND_COMPUTE_SET};
+ return hasAnyOf(setupOps);
+ }
+
+ bool hasRayTracing (void) const
+ {
+ const std::vector<SetupOp> setupOps {SetupOp::BIND_RAYTRACING_PIPELINE, SetupOp::BIND_RAYTRACING_SET};
+ return hasAnyOf(setupOps);
+ }
+
+};
+
+// Expected output values in each buffer.
+constexpr deUint32 kExpectedBufferValueGraphics = 1u;
+constexpr deUint32 kExpectedBufferValueCompute = 2u;
+constexpr deUint32 kExpectedBufferValueRayTracing = 3u;
+
+class BindPointTest : public vkt::TestCase
+{
+public:
+ BindPointTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~BindPointTest (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+protected:
+ TestParams m_params;
+};
+
+class BindPointInstance : public vkt::TestInstance
+{
+public:
+ BindPointInstance (Context& context, const TestParams& params);
+ virtual ~BindPointInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ TestParams m_params;
+};
+
+BindPointTest::BindPointTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+void BindPointTest::checkSupport (Context& context) const
+{
+ if (m_params.graphicsSetUpdateType != SetUpdateType::WRITE || m_params.computeSetUpdateType != SetUpdateType::WRITE)
+ {
+ context.requireDeviceFunctionality("VK_KHR_push_descriptor");
+
+ if (m_params.graphicsSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE || m_params.computeSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE)
+ context.requireDeviceFunctionality("VK_KHR_descriptor_update_template");
+ }
+
+ if (m_params.hasRayTracing())
+ context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+}
+
+void BindPointTest::initPrograms (vk::SourceCollections& programCollection) const
+{
+ // The flags array will only have 1 element.
+ const std::string descriptorDecl = "layout(set=0, binding=0, std430) buffer BufferBlock { uint flag[]; } outBuffer;\n";
+
+ if (m_params.hasGraphics())
+ {
+ std::ostringstream vert;
+ vert
+ << "#version 450\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ // Full-screen clockwise triangle fan with 4 vertices.
+ << " const float x = (-1.0+2.0*(((gl_VertexIndex+1)&2)>>1));\n"
+ << " const float y = (-1.0+2.0*(( gl_VertexIndex &2)>>1));\n"
+ << " gl_Position = vec4(x, y, 0.0, 1.0);\n"
+ << "}\n"
+ ;
+
+ // Note: the color attachment will be a 1x1 image, so gl_FragCoord.xy is (0.5, 0.5).
+ std::ostringstream frag;
+ frag
+ << "#version 450\n"
+ << descriptorDecl
+ << "layout(location=0) out vec4 outColor;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint xCoord = uint(trunc(gl_FragCoord.x));\n"
+ << " const uint yCoord = uint(trunc(gl_FragCoord.y));\n"
+ << " outBuffer.flag[xCoord + yCoord] = " << kExpectedBufferValueGraphics << "u;\n"
+ << " outColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vert.str());
+ programCollection.glslSources.add("frag") << glu::FragmentSource(frag.str());
+ }
+
+ if (m_params.hasCompute())
+ {
+ // Note: we will only dispatch 1 group.
+ std::ostringstream comp;
+ comp
+ << "#version 450\n"
+ << descriptorDecl
+ << "layout(local_size_x=1, local_size_y=1, local_size_z=1) in;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint index = gl_GlobalInvocationID.x + gl_GlobalInvocationID.y + gl_GlobalInvocationID.z;\n"
+ << " outBuffer.flag[index] = " << kExpectedBufferValueCompute << "u;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("comp") << glu::ComputeSource(comp.str());
+ }
+
+ if (m_params.hasRayTracing())
+ {
+ // We will only call the ray gen shader once.
+ std::ostringstream rgen;
+ rgen
+ << "#version 460\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << descriptorDecl
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint index = gl_LaunchIDEXT.x + gl_LaunchIDEXT.y + gl_LaunchIDEXT.z;\n"
+ << " outBuffer.flag[index] = " << kExpectedBufferValueRayTracing << "u;\n"
+ << "}\n"
+ ;
+
+ const vk::ShaderBuildOptions buildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+ }
+}
+
+vkt::TestInstance* BindPointTest::createInstance (Context& context) const
+{
+ return new BindPointInstance(context, m_params);
+}
+
+BindPointInstance::BindPointInstance (Context& context, const TestParams& params)
+ : vkt::TestInstance (context)
+ , m_params (params)
+{}
+
+Move<VkDescriptorSetLayout> makeSetLayout(const DeviceInterface& vkd, VkDevice device, VkShaderStageFlags stages, bool push)
+{
+ VkDescriptorSetLayoutCreateFlags createFlags = 0u;
+ if (push)
+ createFlags |= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
+
+ DescriptorSetLayoutBuilder builder;
+ builder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stages);
+ return builder.build(vkd, device, createFlags);
+}
+
+void zeroOutAndFlush (const DeviceInterface& vkd, VkDevice device, BufferWithMemory& buffer, VkDeviceSize bufferSize)
+{
+ auto& alloc = buffer.getAllocation();
+ void* hostPtr = alloc.getHostPtr();
+
+ deMemset(hostPtr, 0, static_cast<size_t>(bufferSize));
+ flushAlloc(vkd, device, alloc);
+}
+
+void makePoolAndSet (const DeviceInterface& vkd, VkDevice device, VkDescriptorSetLayout layout, Move<VkDescriptorPool>& pool, Move<VkDescriptorSet>& set)
+{
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ pool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ set = makeDescriptorSet(vkd, device, pool.get(), layout);
+}
+
+void writeSetUpdate (const DeviceInterface& vkd, VkDevice device, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkDescriptorSet set)
+{
+ DescriptorSetUpdateBuilder updateBuilder;
+ const auto bufferInfo = makeDescriptorBufferInfo(buffer, offset, size);
+ updateBuilder.writeSingle(set, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &bufferInfo);
+ updateBuilder.update(vkd, device);
+}
+
+Move<VkDescriptorUpdateTemplate> makeUpdateTemplate (const DeviceInterface& vkd, VkDevice device, VkDescriptorSetLayout setLayout, VkPipelineBindPoint bindPoint, VkPipelineLayout pipelineLayout)
+{
+ const auto templateEntry = makeDescriptorUpdateTemplateEntry(0u, 0u, 1u, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, static_cast<deUintptr>(0), static_cast<deUintptr>(sizeof(VkDescriptorBufferInfo)));
+ const VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkDescriptorUpdateTemplateCreateFlags flags;
+ 1u, // deUint32 descriptorUpdateEntryCount;
+ &templateEntry, // const VkDescriptorUpdateTemplateEntry* pDescriptorUpdateEntries;
+ VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, // VkDescriptorUpdateTemplateType templateType;
+ setLayout, // VkDescriptorSetLayout descriptorSetLayout;
+ bindPoint, // VkPipelineBindPoint pipelineBindPoint;
+ pipelineLayout, // VkPipelineLayout pipelineLayout;
+ 0u, // deUint32 set;
+ };
+ return createDescriptorUpdateTemplate(vkd, device, &templateCreateInfo);
+}
+
+void pushBufferDescriptor(const DeviceInterface& vkd, VkCommandBuffer cmdBuffer, VkPipelineBindPoint bindPoint, VkPipelineLayout layout, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size)
+{
+ const auto bufferInfo = makeDescriptorBufferInfo(buffer, offset, size);
+ const VkWriteDescriptorSet write =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ DE_NULL, // VkDescriptorSet dstSet;
+ 0u, // deUint32 dstBinding;
+ 0u, // deUint32 dstArrayElement;
+ 1u, // deUint32 descriptorCount;
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // VkDescriptorType descriptorType;
+ nullptr, // const VkDescriptorImageInfo* pImageInfo;
+ &bufferInfo, // const VkDescriptorBufferInfo* pBufferInfo;
+ nullptr, // const VkBufferView* pTexelBufferView;
+ };
+ vkd.cmdPushDescriptorSetKHR(cmdBuffer, bindPoint, layout, 0u, 1u, &write);
+}
+
+void verifyBufferContents (const DeviceInterface& vkd, VkDevice device, const BufferWithMemory& buffer, const std::string& bufferName, deUint32 expected)
+{
+ auto& bufferAlloc = buffer.getAllocation();
+ const auto dataPtr = reinterpret_cast<deUint32*>(bufferAlloc.getHostPtr());
+ deUint32 data;
+
+ invalidateAlloc(vkd, device, bufferAlloc);
+ deMemcpy(&data, dataPtr, sizeof(data));
+
+ if (data != expected)
+ {
+ std::ostringstream msg;
+ msg << "Invalid value found in " << bufferName << " buffer: expected " << expected << " and found " << data;
+ TCU_FAIL(msg.str());
+ }
+}
+
+VkBufferMemoryBarrier makeBufferBarrier (VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size)
+{
+ return makeBufferMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, buffer, offset, size);
+}
+
+void recordBufferBarrier (const DeviceInterface& vkd, VkCommandBuffer cmdBuffer, VkPipelineStageFlagBits stage, const VkBufferMemoryBarrier& barrier)
+{
+ vkd.cmdPipelineBarrier(cmdBuffer, stage, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, nullptr, 1u, &barrier, 0u, nullptr);
+}
+
+tcu::TestStatus BindPointInstance::iterate (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto physDev = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+ auto& alloc = m_context.getDefaultAllocator();
+
+ const auto imageFormat = VK_FORMAT_R8G8B8A8_UNORM;
+ const auto imageExtent = makeExtent3D(1u, 1u, 1u);
+ const auto imageType = VK_IMAGE_TYPE_2D;
+ const auto imageViewType = VK_IMAGE_VIEW_TYPE_2D;
+ const auto imageUsage = static_cast<VkImageUsageFlags>(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+
+ const auto viewport = makeViewport(imageExtent);
+ const auto scissor = makeRect2D(imageExtent);
+
+ const auto hasGraphics = m_params.hasGraphics();
+ const auto hasCompute = m_params.hasCompute();
+ const auto hasRayTracing = m_params.hasRayTracing();
+
+ // Storage buffers.
+ const auto bufferSize = static_cast<VkDeviceSize>(sizeof(deUint32));
+ const auto bufferCreateInfo = makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+
+ using BufferWithMemoryPtr = de::MovePtr<BufferWithMemory>;
+ using ImageWithMemoryPtr = de::MovePtr<ImageWithMemory>;
+
+ BufferWithMemoryPtr graphicsBuffer;
+ BufferWithMemoryPtr computeBuffer;
+ BufferWithMemoryPtr rayTracingBuffer;
+
+ if (hasGraphics) graphicsBuffer = BufferWithMemoryPtr(new BufferWithMemory(vkd, device, alloc, bufferCreateInfo, MemoryRequirement::HostVisible));
+ if (hasCompute) computeBuffer = BufferWithMemoryPtr(new BufferWithMemory(vkd, device, alloc, bufferCreateInfo, MemoryRequirement::HostVisible));
+ if (hasRayTracing) rayTracingBuffer = BufferWithMemoryPtr(new BufferWithMemory(vkd, device, alloc, bufferCreateInfo, MemoryRequirement::HostVisible));
+
+ if (hasGraphics) zeroOutAndFlush(vkd, device, *graphicsBuffer, bufferSize);
+ if (hasCompute) zeroOutAndFlush(vkd, device, *computeBuffer, bufferSize);
+ if (hasRayTracing) zeroOutAndFlush(vkd, device, *rayTracingBuffer, bufferSize);
+
+ ImageWithMemoryPtr colorAttachment;
+ Move<VkImageView> colorAttachmentView;
+
+ if (hasGraphics)
+ {
+ // Color attachment.
+ const VkImageCreateInfo imageCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ imageType, // VkImageType imageType;
+ imageFormat, // VkFormat format;
+ imageExtent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ imageUsage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &qIndex, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+
+ const auto subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ colorAttachment = ImageWithMemoryPtr(new ImageWithMemory(vkd, device, alloc, imageCreateInfo, MemoryRequirement::Any));
+ colorAttachmentView = makeImageView(vkd, device, colorAttachment->get(), imageViewType, imageFormat, subresourceRange);
+ }
+
+ // Command buffer and pool.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ // Set and pipeline layouts.
+ Move<VkDescriptorSetLayout> graphicsSetLayout;
+ Move<VkDescriptorSetLayout> computeSetLayout;
+ Move<VkDescriptorSetLayout> rayTracingSetLayout;
+
+ if (hasGraphics) graphicsSetLayout = makeSetLayout(vkd, device, VK_SHADER_STAGE_FRAGMENT_BIT, (m_params.graphicsSetUpdateType != SetUpdateType::WRITE));
+ if (hasCompute) computeSetLayout = makeSetLayout(vkd, device, VK_SHADER_STAGE_COMPUTE_BIT, (m_params.computeSetUpdateType != SetUpdateType::WRITE));
+ if (hasRayTracing) rayTracingSetLayout = makeSetLayout(vkd, device, VK_SHADER_STAGE_RAYGEN_BIT_KHR, (m_params.rayTracingSetUpdateType != SetUpdateType::WRITE));
+
+ Move<VkPipelineLayout> graphicsPipelineLayout;
+ Move<VkPipelineLayout> computePipelineLayout;
+ Move<VkPipelineLayout> rayTracingPipelineLayout;
+
+ if (hasGraphics) graphicsPipelineLayout = makePipelineLayout(vkd, device, graphicsSetLayout.get());
+ if (hasCompute) computePipelineLayout = makePipelineLayout(vkd, device, computeSetLayout.get());
+ if (hasRayTracing) rayTracingPipelineLayout = makePipelineLayout(vkd, device, rayTracingSetLayout.get());
+
+ // Shader modules.
+ Move<VkShaderModule> vertShader;
+ Move<VkShaderModule> fragShader;
+ Move<VkShaderModule> compShader;
+ Move<VkShaderModule> rgenShader;
+
+ if (hasGraphics) vertShader = createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0u);
+ if (hasGraphics) fragShader = createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0u);
+ if (hasCompute) compShader = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0u);
+ if (hasRayTracing) rgenShader = createShaderModule(vkd, device, m_context.getBinaryCollection().get("rgen"), 0u);
+
+ Move<VkRenderPass> renderPass;
+ Move<VkFramebuffer> framebuffer;
+ Move<VkPipeline> graphicsPipeline;
+
+ if (hasGraphics)
+ {
+ // Render pass and framebuffer.
+ renderPass = makeRenderPass(vkd, device, imageFormat);
+ framebuffer = makeFramebuffer(vkd, device, renderPass.get(), colorAttachmentView.get(), imageExtent.width, imageExtent.height);
+
+ // Graphics pipeline.
+ std::vector<VkViewport> viewports(1u, viewport);
+ std::vector<VkRect2D> scissors(1u, scissor);
+
+ const VkPipelineVertexInputStateCreateInfo vertexInputState =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType
+ nullptr, // const void* pNext
+ 0u, // VkPipelineVertexInputStateCreateFlags flags
+ 0u, // deUint32 vertexBindingDescriptionCount
+ nullptr, // const VkVertexInputBindingDescription* pVertexBindingDescriptions
+ 0u, // deUint32 vertexAttributeDescriptionCount
+ nullptr, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions
+ };
+
+ graphicsPipeline = makeGraphicsPipeline(vkd, device, graphicsPipelineLayout.get(),
+ vertShader.get(), DE_NULL, DE_NULL, DE_NULL, fragShader.get(), // Shaders.
+ renderPass.get(), viewports, scissors, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, 0u, 0u, &vertexInputState);
+ }
+
+ // Compute pipeline.
+ Move<VkPipeline> computePipeline;
+
+ if (hasCompute)
+ {
+ const VkPipelineShaderStageCreateInfo computeShaderStageInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ compShader.get(), // VkShaderModule module;
+ "main", // const char* pName;
+ nullptr, // const VkSpecializationInfo* pSpecializationInfo;
+ };
+
+ const VkComputePipelineCreateInfo computePipelineCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ computeShaderStageInfo, // VkPipelineShaderStageCreateInfo stage;
+ computePipelineLayout.get(), // VkPipelineLayout layout;
+ DE_NULL, // VkPipeline basePipelineHandle;
+ 0u, // deInt32 basePipelineIndex;
+ };
+
+ computePipeline = createComputePipeline(vkd, device, DE_NULL, &computePipelineCreateInfo);
+ }
+
+ // Ray tracing pipeline and shader binding tables.
+ using RayTracingPipelineHelperPtr = de::MovePtr<RayTracingPipeline>;
+
+ RayTracingPipelineHelperPtr rayTracingPipelineHelper;
+ Move<VkPipeline> rayTracingPipeline;
+ BufferWithMemoryPtr raygenSBT;
+
+ VkStridedDeviceAddressRegionKHR raygenSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR missSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR hitSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR callableSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+
+ if (hasRayTracing)
+ {
+ const auto rtProperties = makeRayTracingProperties(vki, physDev);
+ const auto shaderGroupHandleSize = rtProperties->getShaderGroupHandleSize();
+ const auto shaderGroupBaseAlignment = rtProperties->getShaderGroupBaseAlignment();
+ rayTracingPipelineHelper = RayTracingPipelineHelperPtr(new RayTracingPipeline());
+
+ rayTracingPipelineHelper->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, rgenShader, 0);
+ rayTracingPipeline = rayTracingPipelineHelper->createPipeline(vkd, device, rayTracingPipelineLayout.get());
+
+ raygenSBT = rayTracingPipelineHelper->createShaderBindingTable(vkd, device, rayTracingPipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 0, 1);
+ raygenSBTRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, raygenSBT->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+
+ // Descriptor pools and sets if needed.
+ Move<VkDescriptorPool> graphicsDescriptorPool;
+ Move<VkDescriptorPool> computeDescriptorPool;
+ Move<VkDescriptorPool> rayTracingDescriptorPool;
+ Move<VkDescriptorSet> graphicsDescritorSet;
+ Move<VkDescriptorSet> computeDescriptorSet;
+ Move<VkDescriptorSet> rayTracingDescriptorSet;
+
+ if (m_params.graphicsSetUpdateType == SetUpdateType::WRITE)
+ {
+ makePoolAndSet(vkd, device, graphicsSetLayout.get(), graphicsDescriptorPool, graphicsDescritorSet);
+ writeSetUpdate(vkd, device, graphicsBuffer->get(), 0ull, bufferSize, graphicsDescritorSet.get());
+ }
+
+ if (m_params.computeSetUpdateType == SetUpdateType::WRITE)
+ {
+ makePoolAndSet(vkd, device, computeSetLayout.get(), computeDescriptorPool, computeDescriptorSet);
+ writeSetUpdate(vkd, device, computeBuffer->get(), 0ull, bufferSize, computeDescriptorSet.get());
+ }
+
+ if (m_params.rayTracingSetUpdateType == SetUpdateType::WRITE)
+ {
+ makePoolAndSet(vkd, device, rayTracingSetLayout.get(), rayTracingDescriptorPool, rayTracingDescriptorSet);
+ writeSetUpdate(vkd, device, rayTracingBuffer->get(), 0ull, bufferSize, rayTracingDescriptorSet.get());
+ }
+
+ // Templates if needed.
+ Move<VkDescriptorUpdateTemplate> graphicsUpdateTemplate;
+ Move<VkDescriptorUpdateTemplate> computeUpdateTemplate;
+ Move<VkDescriptorUpdateTemplate> rayTracingUpdateTemplate;
+
+ if (m_params.graphicsSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE)
+ graphicsUpdateTemplate = makeUpdateTemplate(vkd, device, graphicsSetLayout.get(), VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipelineLayout.get());
+
+ if (m_params.computeSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE)
+ computeUpdateTemplate = makeUpdateTemplate(vkd, device, computeSetLayout.get(), VK_PIPELINE_BIND_POINT_COMPUTE, computePipelineLayout.get());
+
+ if (m_params.rayTracingSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE)
+ rayTracingUpdateTemplate = makeUpdateTemplate(vkd, device, rayTracingSetLayout.get(), VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, rayTracingPipelineLayout.get());
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Helper flags to check the test has been specified properly.
+ bool boundGraphicsPipeline = false;
+ bool boundGraphicsSet = false;
+ bool boundComputePipeline = false;
+ bool boundComputeSet = false;
+ bool boundRayTracingPipeline = false;
+ bool boundRayTracingSet = false;
+
+ // Setup operations in desired order.
+ for (int i = 0; i < decltype(m_params.setupSequence)::SIZE; ++i)
+ {
+ const auto& setupOp = m_params.setupSequence[i];
+ switch (setupOp)
+ {
+ case SetupOp::BIND_GRAPHICS_PIPELINE:
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline.get());
+ boundGraphicsPipeline = true;
+ break;
+
+ case SetupOp::BIND_COMPUTE_PIPELINE:
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, computePipeline.get());
+ boundComputePipeline = true;
+ break;
+
+ case SetupOp::BIND_RAYTRACING_PIPELINE:
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, rayTracingPipeline.get());
+ boundRayTracingPipeline = true;
+ break;
+
+ case SetupOp::BIND_GRAPHICS_SET:
+ if (m_params.graphicsSetUpdateType == SetUpdateType::WRITE)
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipelineLayout.get(), 0u, 1u, &graphicsDescritorSet.get(), 0u, nullptr);
+ else if (m_params.graphicsSetUpdateType == SetUpdateType::PUSH)
+ pushBufferDescriptor(vkd, cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipelineLayout.get(), graphicsBuffer->get(), 0ull, bufferSize);
+ else if (m_params.graphicsSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE)
+ {
+ const auto bufferInfo = makeDescriptorBufferInfo(graphicsBuffer->get(), 0ull, bufferSize);
+ vkd.cmdPushDescriptorSetWithTemplateKHR(cmdBuffer, graphicsUpdateTemplate.get(), graphicsPipelineLayout.get(), 0u, &bufferInfo);
+ }
+ else
+ DE_ASSERT(false);
+ boundGraphicsSet = true;
+ break;
+
+ case SetupOp::BIND_COMPUTE_SET:
+ if (m_params.computeSetUpdateType == SetUpdateType::WRITE)
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, computePipelineLayout.get(), 0u, 1u, &computeDescriptorSet.get(), 0u, nullptr);
+ else if (m_params.computeSetUpdateType == SetUpdateType::PUSH)
+ pushBufferDescriptor(vkd, cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, computePipelineLayout.get(), computeBuffer->get(), 0ull, bufferSize);
+ else if (m_params.computeSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE)
+ {
+ const auto bufferInfo = makeDescriptorBufferInfo(computeBuffer->get(), 0ull, bufferSize);
+ vkd.cmdPushDescriptorSetWithTemplateKHR(cmdBuffer, computeUpdateTemplate.get(), computePipelineLayout.get(), 0u, &bufferInfo);
+ }
+ else
+ DE_ASSERT(false);
+ boundComputeSet = true;
+ break;
+
+ case SetupOp::BIND_RAYTRACING_SET:
+ if (m_params.rayTracingSetUpdateType == SetUpdateType::WRITE)
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, rayTracingPipelineLayout.get(), 0u, 1u, &rayTracingDescriptorSet.get(), 0u, nullptr);
+ else if (m_params.rayTracingSetUpdateType == SetUpdateType::PUSH)
+ pushBufferDescriptor(vkd, cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, rayTracingPipelineLayout.get(), rayTracingBuffer->get(), 0ull, bufferSize);
+ else if (m_params.rayTracingSetUpdateType == SetUpdateType::PUSH_WITH_TEMPLATE)
+ {
+ const auto bufferInfo = makeDescriptorBufferInfo(rayTracingBuffer->get(), 0ull, bufferSize);
+ vkd.cmdPushDescriptorSetWithTemplateKHR(cmdBuffer, rayTracingUpdateTemplate.get(), rayTracingPipelineLayout.get(), 0u, &bufferInfo);
+ }
+ else
+ DE_ASSERT(false);
+ boundRayTracingSet = true;
+ break;
+
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+ }
+
+ // Avoid warning in release builds.
+ DE_UNREF(boundGraphicsPipeline);
+ DE_UNREF(boundGraphicsSet);
+ DE_UNREF(boundComputePipeline);
+ DE_UNREF(boundComputeSet);
+ DE_UNREF(boundRayTracingPipeline);
+ DE_UNREF(boundRayTracingSet);
+
+ // Dispatch operations in desired order.
+ for (int i = 0; i < decltype(m_params.dispatchSequence)::SIZE; ++i)
+ {
+ const auto& dispatchOp = m_params.dispatchSequence[i];
+ switch (dispatchOp)
+ {
+ case DispatchOp::DRAW:
+ DE_ASSERT(boundGraphicsPipeline && boundGraphicsSet);
+ beginRenderPass(vkd, cmdBuffer, renderPass.get(), framebuffer.get(), scissor, tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
+ vkd.cmdDraw(cmdBuffer, 4u, 1u, 0u, 0u);
+ endRenderPass(vkd, cmdBuffer);
+ break;
+
+ case DispatchOp::COMPUTE:
+ DE_ASSERT(boundComputePipeline && boundComputeSet);
+ vkd.cmdDispatch(cmdBuffer, 1u, 1u, 1u);
+ break;
+
+ case DispatchOp::TRACE_RAYS:
+ DE_ASSERT(boundRayTracingPipeline && boundRayTracingSet);
+ cmdTraceRays(vkd, cmdBuffer, &raygenSBTRegion, &missSBTRegion, &hitSBTRegion, &callableSBTRegion, 1u, 1u, 1u);
+ break;
+
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+ }
+
+ if (hasGraphics)
+ {
+ const auto graphicsBufferBarrier = makeBufferBarrier(graphicsBuffer->get(), 0ull, bufferSize);
+ recordBufferBarrier(vkd, cmdBuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, graphicsBufferBarrier);
+ }
+ if (hasCompute)
+ {
+ const auto computeBufferBarrier = makeBufferBarrier(computeBuffer->get(), 0ull, bufferSize);
+ recordBufferBarrier(vkd, cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, computeBufferBarrier);
+ }
+ if (hasRayTracing)
+ {
+ const auto rayTracingBufferBarrier = makeBufferBarrier(rayTracingBuffer->get(), 0ull, bufferSize);
+ recordBufferBarrier(vkd, cmdBuffer, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, rayTracingBufferBarrier);
+ }
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify storage buffers.
+ if (hasGraphics) verifyBufferContents(vkd, device, *graphicsBuffer, "graphics", kExpectedBufferValueGraphics);
+ if (hasCompute) verifyBufferContents(vkd, device, *computeBuffer, "compute", kExpectedBufferValueCompute);
+ if (hasRayTracing) verifyBufferContents(vkd, device, *rayTracingBuffer, "raytracing", kExpectedBufferValueRayTracing);
+
+ // Verify color attachment.
+ if (hasGraphics)
+ {
+ const auto textureLevel = readColorAttachment(vkd, device, queue, qIndex, alloc, colorAttachment->get(), imageFormat, tcu::UVec2(imageExtent.width, imageExtent.height));
+ const auto pixelBuffer = textureLevel->getAccess();
+ const auto iWidth = static_cast<int>(imageExtent.width);
+ const auto iHeight = static_cast<int>(imageExtent.height);
+ const tcu::Vec4 expectedColor (0.0f, 1.0f, 0.0f, 1.0f);
+
+ for (int y = 0; y < iHeight; ++y)
+ for (int x = 0; x < iWidth; ++x)
+ {
+ const auto value = pixelBuffer.getPixel(x, y);
+ if (value != expectedColor)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected color found in attachment: expected " << expectedColor << " but found " << value;
+ TCU_FAIL(msg.str());
+ }
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+// Auxiliar string conversion functions.
+
+std::string toString(SetUpdateType updateType)
+{
+ switch (updateType)
+ {
+ case SetUpdateType::WRITE: return "write";
+ case SetUpdateType::PUSH: return "push";
+ case SetUpdateType::PUSH_WITH_TEMPLATE: return "template_push";
+ default: DE_ASSERT(false); break;
+ }
+
+ return "";
+}
+
+std::string toString(const SetupSequence& setupSequence)
+{
+ std::ostringstream out;
+
+ out << "setup";
+ for (int i = 0; i < std::remove_reference<decltype(setupSequence)>::type::SIZE; ++i)
+ {
+ out << "_";
+ switch (setupSequence[i])
+ {
+ case SetupOp::BIND_GRAPHICS_PIPELINE: out << "gp"; break;
+ case SetupOp::BIND_COMPUTE_PIPELINE: out << "cp"; break;
+ case SetupOp::BIND_RAYTRACING_PIPELINE: out << "rp"; break;
+ case SetupOp::BIND_GRAPHICS_SET: out << "gs"; break;
+ case SetupOp::BIND_COMPUTE_SET: out << "cs"; break;
+ case SetupOp::BIND_RAYTRACING_SET: out << "rs"; break;
+ default: DE_ASSERT(false); break;
+ }
+ }
+
+ return out.str();
+}
+
+std::string toString(const DispatchSequence& dispatchSequence)
+{
+ std::ostringstream out;
+
+ out << "cmd";
+ for (int i = 0; i < std::remove_reference<decltype(dispatchSequence)>::type::SIZE; ++i)
+ {
+ out << "_";
+ switch (dispatchSequence[i])
+ {
+ case DispatchOp::COMPUTE: out << "dispatch"; break;
+ case DispatchOp::DRAW: out << "draw"; break;
+ case DispatchOp::TRACE_RAYS: out << "tracerays"; break;
+ default: DE_ASSERT(false); break;
+ }
+ }
+
+ return out.str();
+}
+
+std::string toString(VkPipelineBindPoint point)
+{
+ if (point == VK_PIPELINE_BIND_POINT_GRAPHICS) return "graphics";
+ if (point == VK_PIPELINE_BIND_POINT_COMPUTE) return "compute";
+ if (point == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) return "raytracing";
+
+ DE_ASSERT(false);
+ return "";
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createBindPointTests (tcu::TestContext& testCtx)
+{
+ using GroupPtr = de::MovePtr<tcu::TestCaseGroup>;
+ using BindPointPair = tcu::Vector<VkPipelineBindPoint, kTestBindPoints>;
+
+ GroupPtr bindPointGroup(new tcu::TestCaseGroup(testCtx, "bind_point", "Tests checking bind points are independent and used properly"));
+
+ // Bind point combinations to test.
+ const BindPointPair testPairs[] =
+ {
+ BindPointPair(VK_PIPELINE_BIND_POINT_GRAPHICS, VK_PIPELINE_BIND_POINT_COMPUTE),
+ BindPointPair(VK_PIPELINE_BIND_POINT_GRAPHICS, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR),
+ BindPointPair(VK_PIPELINE_BIND_POINT_COMPUTE, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR),
+ };
+
+ for (int testPairIdx = 0; testPairIdx < DE_LENGTH_OF_ARRAY(testPairs); ++testPairIdx)
+ {
+ const auto& testPair = testPairs[testPairIdx];
+
+ // Default values. Two of them will be overwritten later.
+ TestParams params;
+ params.graphicsSetUpdateType = SetUpdateType::TYPE_COUNT;
+ params.computeSetUpdateType = SetUpdateType::TYPE_COUNT;
+ params.rayTracingSetUpdateType = SetUpdateType::TYPE_COUNT;
+
+ // What to test based on the test pair.
+ // Note: updateTypePtrs will tell us which of the set update type members above we need to vary (graphics, compute, ray tracing).
+ SetUpdateType* updateTypePtrs [kTestBindPoints] = { nullptr, nullptr };
+ SetupOp pipelineBinds [kTestBindPoints] = { SetupOp::OP_COUNT, SetupOp::OP_COUNT };
+ SetupOp setBinds [kTestBindPoints] = { SetupOp::OP_COUNT, SetupOp::OP_COUNT };
+ DispatchOp dispatches [kTestBindPoints] = { DispatchOp::OP_COUNT, DispatchOp::OP_COUNT };
+
+ for (int elemIdx = 0; elemIdx < std::remove_reference<decltype(testPair)>::type::SIZE; ++elemIdx)
+ {
+ if (testPair[elemIdx] == VK_PIPELINE_BIND_POINT_GRAPHICS)
+ {
+ updateTypePtrs[elemIdx] = ¶ms.graphicsSetUpdateType; // Test different graphics set update types.
+ pipelineBinds[elemIdx] = SetupOp::BIND_GRAPHICS_PIPELINE;
+ setBinds[elemIdx] = SetupOp::BIND_GRAPHICS_SET;
+ dispatches[elemIdx] = DispatchOp::DRAW;
+ }
+ else if (testPair[elemIdx] == VK_PIPELINE_BIND_POINT_COMPUTE)
+ {
+ updateTypePtrs[elemIdx] = ¶ms.computeSetUpdateType; // Test different compute set update types.
+ pipelineBinds[elemIdx] = SetupOp::BIND_COMPUTE_PIPELINE;
+ setBinds[elemIdx] = SetupOp::BIND_COMPUTE_SET;
+ dispatches[elemIdx] = DispatchOp::COMPUTE;
+ }
+ else if (testPair[elemIdx] == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR)
+ {
+ updateTypePtrs[elemIdx] = ¶ms.rayTracingSetUpdateType; // Test different ray tracing set update types.
+ pipelineBinds[elemIdx] = SetupOp::BIND_RAYTRACING_PIPELINE;
+ setBinds[elemIdx] = SetupOp::BIND_RAYTRACING_SET;
+ dispatches[elemIdx] = DispatchOp::TRACE_RAYS;
+ }
+ }
+
+ const std::string pairName = toString(testPair[0]) + "_" + toString(testPair[1]);
+ GroupPtr pairGroup (new tcu::TestCaseGroup(testCtx, pairName.c_str(), ""));
+
+ // Combine two update types.
+ for (int firstUpdateTypeIdx = 0; firstUpdateTypeIdx < static_cast<int>(SetUpdateType::TYPE_COUNT); ++firstUpdateTypeIdx)
+ for (int secondUpdateTypeIdx = 0; secondUpdateTypeIdx < static_cast<int>(SetUpdateType::TYPE_COUNT); ++ secondUpdateTypeIdx)
+ {
+ const auto firstUpdateType = static_cast<SetUpdateType>(firstUpdateTypeIdx);
+ const auto secondUpdateType = static_cast<SetUpdateType>(secondUpdateTypeIdx);
+ const std::string updateGroupName = toString(firstUpdateType) + "_" + toString(secondUpdateType);
+ GroupPtr updateGroup (new tcu::TestCaseGroup(testCtx, updateGroupName.c_str(), ""));
+
+ // Change update types of the relevant sets.
+ *updateTypePtrs[0] = firstUpdateType;
+ *updateTypePtrs[1] = secondUpdateType;
+
+ // Prepare initial permutation of test parameters.
+ params.setupSequence[0] = pipelineBinds[0];
+ params.setupSequence[1] = pipelineBinds[1];
+ params.setupSequence[2] = setBinds[0];
+ params.setupSequence[3] = setBinds[1];
+
+ // Permutate setup sequence and dispatch sequence.
+ const auto ssBegin = params.setupSequence.m_data;
+ const auto ssEnd = ssBegin + decltype(params.setupSequence)::SIZE;
+ do
+ {
+ const auto setupGroupName = toString(params.setupSequence);
+ GroupPtr setupGroup (new tcu::TestCaseGroup(testCtx, setupGroupName.c_str(), ""));
+
+ // Reset dispatch sequence permutation.
+ params.dispatchSequence = dispatches;
+
+ const auto dsBegin = params.dispatchSequence.m_data;
+ const auto dsEnd = dsBegin + decltype(params.dispatchSequence)::SIZE;
+ do
+ {
+ const auto testName = toString(params.dispatchSequence);
+ setupGroup->addChild(new BindPointTest(testCtx, testName, "", params));
+ } while (std::next_permutation(dsBegin, dsEnd));
+
+ updateGroup->addChild(setupGroup.release());
+
+ } while (std::next_permutation(ssBegin, ssEnd));
+
+ pairGroup->addChild(updateGroup.release());
+ }
+
+ bindPointGroup->addChild(pairGroup.release());
+ }
+
+
+ return bindPointGroup.release();
+}
+
+} // pipeline
+} // vkt
+
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBindPointTests.hpp
similarity index 68%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/pipeline/vktPipelineBindPointTests.hpp
index 1a85ebf..6606cea 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBindPointTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTPIPELINEBINDPOINTTESTS_HPP
+#define _VKTPIPELINEBINDPOINTTESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,20 +21,19 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Pipeline Bind Point Tests
*//*--------------------------------------------------------------------*/
-#include "tcuDefs.hpp"
-#include "tcuTestCase.hpp"
+#include "vktTestCase.hpp"
namespace vkt
{
namespace pipeline
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createBindPointTests (tcu::TestContext& testCtx);
} // pipeline
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTPIPELINEBINDPOINTTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp
index a0496bd..e14cb8b 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineBlendTests.cpp
@@ -438,6 +438,25 @@
{
if (!isSupportedBlendFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_colorFormat))
throw tcu::NotSupportedError(std::string("Unsupported color blending format: ") + getFormatName(m_colorFormat));
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().constantAlphaColorBlendFactors)
+ {
+ int quadNdx = 0;
+ for (; quadNdx < BlendTest::QUAD_COUNT; quadNdx++)
+ {
+ const VkPipelineColorBlendAttachmentState& blendState = m_blendStates[quadNdx];
+ if (blendState.srcColorBlendFactor == VK_BLEND_FACTOR_CONSTANT_ALPHA ||
+ blendState.dstColorBlendFactor == VK_BLEND_FACTOR_CONSTANT_ALPHA ||
+ blendState.srcColorBlendFactor == VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA ||
+ blendState.dstColorBlendFactor == VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA)
+ {
+ break;
+ }
+ }
+ if (quadNdx < BlendTest::QUAD_COUNT)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Constant alpha color blend factors are not supported by this implementation");
+ }
}
void BlendTest::initPrograms (SourceCollections& sourceCollections) const
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineColorWriteEnableTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineColorWriteEnableTests.cpp
new file mode 100644
index 0000000..8207e01
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineColorWriteEnableTests.cpp
@@ -0,0 +1,1204 @@
+/*------------------------------------------------------------------------
+* Vulkan Conformance Tests
+* ------------------------
+*
+* Copyright (c) 2021 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 Color Write Enable
+*//*--------------------------------------------------------------------*/
+
+#include "vktPipelineColorWriteEnableTests.hpp"
+#include "vktPipelineImageUtil.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkDefs.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkImageUtil.hpp"
+
+#include "tcuVector.hpp"
+#include "tcuMaybe.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuVectorUtil.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deStringUtil.hpp"
+
+#include <vector>
+#include <sstream>
+#include <algorithm>
+#include <utility>
+#include <iterator>
+#include <string>
+#include <limits>
+#include <memory>
+#include <functional>
+
+namespace vkt
+{
+namespace pipeline
+{
+
+namespace
+{
+
+// Framebuffer size.
+constexpr deUint32 kFramebufferWidth = 64u;
+constexpr deUint32 kFramebufferHeight = 64u;
+
+// Image formats.
+constexpr vk::VkFormat kColorFormat = vk::VK_FORMAT_R8G8B8A8_UNORM;
+const tcu::Vec4 kColorThreshold (0.005f); // 1/255 < 0.005 < 2/255.
+
+constexpr deUint32 kNumColorAttachments = 3u;
+
+const vk::VkFormat kDepthStencilFormats[] =
+{
+ vk::VK_FORMAT_D32_SFLOAT_S8_UINT,
+ vk::VK_FORMAT_D24_UNORM_S8_UINT
+};
+
+constexpr auto kCoordsSize = static_cast<deUint32>(2 * sizeof(float));
+
+using Bool32Vec = std::vector<vk::VkBool32>;
+
+// Generic, to be used with any state than can be set statically and, as an option, dynamically.
+template<typename T>
+struct StaticAndDynamicPair
+{
+ T staticValue;
+ tcu::Maybe<T> dynamicValue;
+
+ // Helper constructor to set a static value and no dynamic value.
+ StaticAndDynamicPair (const T& value)
+ : staticValue (value)
+ , dynamicValue (tcu::nothing<T>())
+ {
+ }
+
+ // Helper constructor to set both.
+ StaticAndDynamicPair (const T& sVal, const T& dVal)
+ : staticValue (sVal)
+ , dynamicValue (tcu::just<T>(dVal))
+ {
+ }
+
+ // If the dynamic value is present, swap static and dynamic values.
+ void swapValues (void)
+ {
+ if (!dynamicValue)
+ return;
+ std::swap(staticValue, dynamicValue.get());
+ }
+};
+
+const tcu::Vec4 kDefaultTriangleColor (0.0f, 0.0f, 1.0f, 1.0f); // Opaque blue.
+const tcu::Vec4 kDefaultClearColor (0.0f, 0.0f, 0.0f, 1.0f); // Opaque black.
+
+struct MeshParams
+{
+ tcu::Vec4 color;
+ float depth;
+ float scaleX;
+ float scaleY;
+ float offsetX;
+ float offsetY;
+
+ MeshParams (const tcu::Vec4& color_ = kDefaultTriangleColor,
+ float depth_ = 0.0f,
+ float scaleX_ = 1.0f,
+ float scaleY_ = 1.0f,
+ float offsetX_ = 0.0f,
+ float offsetY_ = 0.0f)
+ : color (color_)
+ , depth (depth_)
+ , scaleX (scaleX_)
+ , scaleY (scaleY_)
+ , offsetX (offsetX_)
+ , offsetY (offsetY_)
+ {}
+};
+
+enum class SequenceOrdering
+{
+ CMD_BUFFER_START = 0, // Set state at the start of the command buffer.
+ BEFORE_DRAW = 1, // After binding dynamic pipeline and just before drawing.
+ BETWEEN_PIPELINES = 2, // After a static state pipeline has been bound but before the dynamic state pipeline has been bound.
+ AFTER_PIPELINES = 3, // After a static state pipeline and a second dynamic state pipeline have been bound.
+ BEFORE_GOOD_STATIC = 4, // Before a static state pipeline with the correct values has been bound.
+ TWO_DRAWS_DYNAMIC = 5, // Bind bad static pipeline and draw, followed by binding correct dynamic pipeline and drawing again.
+ TWO_DRAWS_STATIC = 6, // Bind bad dynamic pipeline and draw, followed by binding correct static pipeline and drawing again.
+};
+
+struct TestConfig
+{
+ // Main sequence ordering.
+ SequenceOrdering sequenceOrdering;
+
+ // Drawing parameters.
+ MeshParams meshParams;
+
+ // Clearing parameters for the framebuffer.
+ tcu::Vec4 clearColorValue;
+ float clearDepthValue;
+
+ // Expected output in the attachments.
+ std::vector<tcu::Vec4> expectedColor;
+ float expectedDepth;
+
+ // Static and dynamic pipeline configuration.
+ StaticAndDynamicPair<Bool32Vec> colorWriteEnableConfig;
+
+ // Sane defaults.
+ TestConfig (SequenceOrdering ordering)
+ : sequenceOrdering (ordering)
+ , clearColorValue (kDefaultClearColor)
+ , clearDepthValue (1.0f)
+ , expectedColor (kNumColorAttachments, kDefaultTriangleColor)
+ , expectedDepth (1.0f)
+ , colorWriteEnableConfig (Bool32Vec(1u, VK_TRUE))
+ , m_swappedValues (false)
+ {
+ }
+
+ // Returns true if we should use the static and dynamic values exchanged.
+ // This makes the static part of the pipeline have the actual expected values.
+ bool isReversed () const
+ {
+ return (sequenceOrdering == SequenceOrdering::BEFORE_GOOD_STATIC ||
+ sequenceOrdering == SequenceOrdering::TWO_DRAWS_STATIC);
+ }
+
+ // Swaps static and dynamic configuration values.
+ void swapValues ()
+ {
+ colorWriteEnableConfig.swapValues();
+ m_swappedValues = !m_swappedValues;
+ }
+
+ // Returns the number of iterations when recording commands.
+ deUint32 numIterations () const
+ {
+ deUint32 iterations = 0u;
+
+ switch (sequenceOrdering)
+ {
+ case SequenceOrdering::TWO_DRAWS_DYNAMIC:
+ case SequenceOrdering::TWO_DRAWS_STATIC:
+ iterations = 2u;
+ break;
+ default:
+ iterations = 1u;
+ break;
+ }
+
+ return iterations;
+ }
+
+private:
+ // Color Write Enable cases as created by createColorWriteEnableTests() are based on the assumption that, when a state
+ // has a static and a dynamic value configured at the same time, the static value is wrong and the dynamic value will give
+ // expected results. That's appropriate for most test variants, but in some others we want to reverse the situation: a dynamic
+ // pipeline with wrong values and a static one with good values.
+ //
+ // Instead of modifying how tests are created, we use isReversed() and swapValues() above, allowing us to swap static and
+ // dynamic values and to know if we should do it for a given test case. However, we need to know were the good value is at any
+ // given point in time in order to correctly answer some questions while running the test. m_swappedValues tracks that state.
+ bool m_swappedValues;
+};
+
+struct PushConstants
+{
+ tcu::Vec4 triangleColor;
+ float meshDepth;
+ float scaleX;
+ float scaleY;
+ float offsetX;
+ float offsetY;
+};
+
+class ColorWriteEnableTest : public vkt::TestCase
+{
+public:
+ ColorWriteEnableTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestConfig& testConfig);
+ virtual ~ColorWriteEnableTest (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+private:
+ TestConfig m_testConfig;
+};
+
+class ColorWriteEnableInstance : public vkt::TestInstance
+{
+public:
+ ColorWriteEnableInstance (Context& context, const TestConfig& testConfig);
+ virtual ~ColorWriteEnableInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+private:
+ TestConfig m_testConfig;
+};
+
+ColorWriteEnableTest::ColorWriteEnableTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestConfig& testConfig)
+ : vkt::TestCase (testCtx, name, description)
+ , m_testConfig (testConfig)
+{
+}
+
+void ColorWriteEnableTest::checkSupport (Context& context) const
+{
+ const auto& vki = context.getInstanceInterface();
+ const auto physicalDevice = context.getPhysicalDevice();
+
+ // This is always required.
+ context.requireDeviceFunctionality("VK_EXT_color_write_enable");
+
+ // Check color image format support (depth/stencil will be chosen at runtime).
+ const vk::VkFormatFeatureFlags kColorFeatures = (vk::VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | vk::VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
+ const auto colorProperties = vk::getPhysicalDeviceFormatProperties(vki, physicalDevice, kColorFormat);
+
+ if ((colorProperties.optimalTilingFeatures & kColorFeatures) != kColorFeatures)
+ TCU_THROW(NotSupportedError, "Required color image features not supported");
+}
+
+void ColorWriteEnableTest::initPrograms (vk::SourceCollections& programCollection) const
+{
+ std::ostringstream pushSource;
+ pushSource
+ << "layout(push_constant, std430) uniform PushConstantsBlock {\n"
+ << " vec4 triangleColor;\n"
+ << " float depthValue;\n"
+ << " float scaleX;\n"
+ << " float scaleY;\n"
+ << " float offsetX;\n"
+ << " float offsetY;\n"
+ << "} pushConstants;\n"
+ ;
+
+ std::ostringstream vertSource;
+ vertSource
+ << "#version 450\n"
+ << pushSource.str()
+ << "layout(location=0) in vec2 position;\n"
+ << "out gl_PerVertex\n"
+ << "{\n"
+ << " vec4 gl_Position;\n"
+ << "};\n"
+ << "void main() {\n"
+ << " vec2 vertexCoords = position;\n"
+ << " gl_Position = vec4(vertexCoords.x * pushConstants.scaleX + pushConstants.offsetX, vertexCoords.y * pushConstants.scaleY + pushConstants.offsetY, pushConstants.depthValue, 1.0);\n"
+ << "}\n"
+ ;
+
+ std::ostringstream fragOutputs;
+ std::ostringstream colorWrite;
+ for (deUint32 i = 0u; i < kNumColorAttachments; ++i)
+ {
+ fragOutputs << "layout(location=" << i << ") out vec4 color" << i << ";\n";
+ colorWrite << " color" << i << " = pushConstants.triangleColor * " << powf(0.5f, static_cast<float>(i)) << ";\n";
+ }
+
+ std::ostringstream fragSource;
+ fragSource
+ << "#version 450\n"
+ << pushSource.str()
+ << fragOutputs.str()
+ << "void main() {\n"
+ << colorWrite.str()
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vertSource.str());
+ programCollection.glslSources.add("frag") << glu::FragmentSource(fragSource.str());
+}
+
+TestInstance* ColorWriteEnableTest::createInstance (Context& context) const
+{
+ return new ColorWriteEnableInstance(context, m_testConfig);
+}
+
+ColorWriteEnableInstance::ColorWriteEnableInstance(Context& context, const TestConfig& testConfig)
+ : vkt::TestInstance (context)
+ , m_testConfig (testConfig)
+{
+}
+
+void logErrors(tcu::TestLog& log, const std::string& setName, const std::string& setDesc, const tcu::ConstPixelBufferAccess& result, const tcu::ConstPixelBufferAccess& errorMask)
+{
+ log << tcu::TestLog::ImageSet(setName, setDesc)
+ << tcu::TestLog::Image(setName + "Result", "Result image", result)
+ << tcu::TestLog::Image(setName + "ErrorMask", "Error mask with errors marked in red", errorMask)
+ << tcu::TestLog::EndImageSet;
+}
+
+// Sets values for dynamic states if needed according to the test configuration.
+void setDynamicStates(const TestConfig& testConfig, const vk::DeviceInterface& vkd, vk::VkCommandBuffer cmdBuffer)
+{
+ if (testConfig.colorWriteEnableConfig.dynamicValue)
+ {
+ const auto& colorWriteEnables = testConfig.colorWriteEnableConfig.dynamicValue.get();
+ vkd.cmdSetColorWriteEnableEXT(cmdBuffer, static_cast<deUint32>(colorWriteEnables.size()), colorWriteEnables.data());
+ }
+}
+
+tcu::TestStatus ColorWriteEnableInstance::iterate (void)
+{
+ using ImageWithMemoryVec = std::vector<std::unique_ptr<vk::ImageWithMemory>>;
+ using ImageViewVec = std::vector<vk::Move<vk::VkImageView>>;
+ using FramebufferVec = std::vector<vk::Move<vk::VkFramebuffer>>;
+
+ const auto& vki = m_context.getInstanceInterface();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto physicalDevice = m_context.getPhysicalDevice();
+ const auto device = m_context.getDevice();
+ auto& allocator = m_context.getDefaultAllocator();
+ const auto queue = m_context.getUniversalQueue();
+ const auto queueIndex = m_context.getUniversalQueueFamilyIndex();
+ auto& log = m_context.getTestContext().getLog();
+
+ const auto kReversed = m_testConfig.isReversed();
+ const auto kNumIterations = m_testConfig.numIterations();
+ const auto kSequenceOrdering = m_testConfig.sequenceOrdering;
+
+ const auto kFramebufferExtent = vk::makeExtent3D(kFramebufferWidth, kFramebufferHeight, 1u);
+ const vk::VkImageUsageFlags kColorUsage = (vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ const vk::VkImageUsageFlags kDSUsage = (vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ const vk::VkFormatFeatureFlags kDSFeatures = (vk::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | vk::VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
+
+ // Choose depth/stencil format.
+ vk::VkFormat dsFormat = vk::VK_FORMAT_UNDEFINED;
+
+ for (int formatIdx = 0; formatIdx < DE_LENGTH_OF_ARRAY(kDepthStencilFormats); ++formatIdx)
+ {
+ const auto dsProperties = vk::getPhysicalDeviceFormatProperties(vki, physicalDevice, kDepthStencilFormats[formatIdx]);
+ if ((dsProperties.optimalTilingFeatures & kDSFeatures) == kDSFeatures)
+ {
+ dsFormat = kDepthStencilFormats[formatIdx];
+ break;
+ }
+ }
+
+ // Note: Not Supported insted of Fail because the transfer feature is not mandatory.
+ if (dsFormat == vk::VK_FORMAT_UNDEFINED)
+ TCU_THROW(NotSupportedError, "Required depth/stencil image features not supported");
+ log << tcu::TestLog::Message << "Chosen depth/stencil format: " << dsFormat << tcu::TestLog::EndMessage;
+
+ // Swap static and dynamic values in the test configuration so the static pipeline ends up with the expected values for cases
+ // where we will bind the static pipeline last before drawing.
+ if (kReversed)
+ m_testConfig.swapValues();
+
+ // Create color and depth/stencil images.
+ ImageWithMemoryVec colorImages;
+ ImageWithMemoryVec dsImages;
+
+ const vk::VkImageCreateInfo colorImageInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ vk::VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ kColorFormat, // VkFormat format;
+ kFramebufferExtent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ vk::VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ kColorUsage, // VkImageUsageFlags usage;
+ vk::VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueIndex, // const deUint32* pQueueFamilyIndices;
+ vk::VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+ for (deUint32 i = 0u; i < kNumIterations * kNumColorAttachments; ++i)
+ colorImages.emplace_back(new vk::ImageWithMemory(vkd, device, allocator, colorImageInfo, vk::MemoryRequirement::Any));
+
+ const vk::VkImageCreateInfo dsImageInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ vk::VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ dsFormat, // VkFormat format;
+ kFramebufferExtent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ vk::VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ kDSUsage, // VkImageUsageFlags usage;
+ vk::VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueIndex, // const deUint32* pQueueFamilyIndices;
+ vk::VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+ for (deUint32 i = 0u; i < kNumIterations; ++i)
+ dsImages.emplace_back(new vk::ImageWithMemory(vkd, device, allocator, dsImageInfo, vk::MemoryRequirement::Any));
+
+ const auto colorSubresourceRange = vk::makeImageSubresourceRange(vk::VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ const auto dsSubresourceRange = vk::makeImageSubresourceRange((vk::VK_IMAGE_ASPECT_DEPTH_BIT | vk::VK_IMAGE_ASPECT_STENCIL_BIT), 0u, 1u, 0u, 1u);
+
+ ImageViewVec colorImageViews;
+ ImageViewVec dsImageViews;
+
+ for (const auto& img : colorImages)
+ colorImageViews.emplace_back(vk::makeImageView(vkd, device, img->get(), vk::VK_IMAGE_VIEW_TYPE_2D, kColorFormat, colorSubresourceRange));
+
+ for (const auto& img : dsImages)
+ dsImageViews.emplace_back(vk::makeImageView(vkd, device, img->get(), vk::VK_IMAGE_VIEW_TYPE_2D, dsFormat, dsSubresourceRange));
+
+ // Vertex buffer.
+ // Full-screen triangle fan with 6 vertices.
+ //
+ // 4 3 2
+ // +-------+-------+
+ // |X X X|
+ // | X X X |
+ // | X X X |
+ // | X X X |
+ // | X X X |
+ // | X X X |
+ // | XXX |
+ // +-------+-------+
+ // 5 0 1
+ std::vector<float> vertices = {
+ 0.0f, 1.0f,
+ 1.0f, 1.0f,
+ 1.0f, -1.0f,
+ 0.0f, -1.0f,
+ -1.0f, -1.0f,
+ -1.0f, 1.0f,
+ };
+
+ const auto vertDataSize = vertices.size() * sizeof(float);
+ const auto vertBufferInfo = vk::makeBufferCreateInfo(static_cast<vk::VkDeviceSize>(vertDataSize), vk::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ vk::BufferWithMemory vertBuffer (vkd, device, allocator, vertBufferInfo, vk::MemoryRequirement::HostVisible);
+ auto& alloc = vertBuffer.getAllocation();
+
+ deMemcpy(reinterpret_cast<char*>(alloc.getHostPtr()), vertices.data(), vertDataSize);
+ vk::flushAlloc(vkd, device, alloc);
+
+ // Descriptor set layout.
+ vk::DescriptorSetLayoutBuilder layoutBuilder;
+ const auto descriptorSetLayout = layoutBuilder.build(vkd, device);
+
+ // Pipeline layout.
+ vk::VkShaderStageFlags pushConstantStageFlags = (vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT);
+
+ const vk::VkPushConstantRange pushConstantRange =
+ {
+ pushConstantStageFlags, // VkShaderStageFlags stageFlags;
+ 0u, // deUint32 offset;
+ static_cast<deUint32>(sizeof(PushConstants)), // deUint32 size;
+ };
+
+ const vk::VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineLayoutCreateFlags flags;
+ 1u, // deUint32 setLayoutCount;
+ &descriptorSetLayout.get(), // const VkDescriptorSetLayout* pSetLayouts;
+ 1u, // deUint32 pushConstantRangeCount;
+ &pushConstantRange, // const VkPushConstantRange* pPushConstantRanges;
+ };
+ const auto pipelineLayout = vk::createPipelineLayout(vkd, device, &pipelineLayoutCreateInfo);
+
+ // Render pass with single subpass.
+ std::vector<vk::VkAttachmentReference> colorAttachmentReference;
+ for (deUint32 i = 0u; i < kNumColorAttachments; ++i)
+ {
+ colorAttachmentReference.push_back(vk::VkAttachmentReference
+ {
+ i, // deUint32 attachment;
+ vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout;
+ }
+ );
+ }
+
+ const vk::VkAttachmentReference dsAttachmentReference =
+ {
+ kNumColorAttachments, // deUint32 attachment;
+ vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
+ };
+
+ const vk::VkSubpassDescription subpassDescription =
+ {
+ 0u, // VkSubpassDescriptionFlags flags;
+ vk::VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
+ 0u, // deUint32 inputAttachmentCount;
+ nullptr, // const VkAttachmentReference* pInputAttachments;
+ kNumColorAttachments, // deUint32 colorAttachmentCount;
+ colorAttachmentReference.data(), // const VkAttachmentReference* pColorAttachments;
+ nullptr, // const VkAttachmentReference* pResolveAttachments;
+ &dsAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment;
+ 0u, // deUint32 preserveAttachmentCount;
+ nullptr, // const deUint32* pPreserveAttachments;
+ };
+
+ std::vector<vk::VkAttachmentDescription> attachmentDescriptions(
+ kNumColorAttachments,
+ vk::VkAttachmentDescription
+ {
+ 0u, // VkAttachmentDescriptionFlags flags;
+ kColorFormat, // VkFormat format;
+ vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ vk::VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
+ vk::VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
+ vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
+ vk::VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
+ vk::VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
+ }
+ );
+
+ attachmentDescriptions.push_back(vk::VkAttachmentDescription
+ {
+ 0u, // VkAttachmentDescriptionFlags flags;
+ dsFormat, // VkFormat format;
+ vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ vk::VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
+ vk::VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
+ vk::VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp;
+ vk::VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp stencilStoreOp;
+ vk::VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
+ });
+
+ const vk::VkRenderPassCreateInfo renderPassCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkRenderPassCreateFlags flags;
+ static_cast<deUint32>(attachmentDescriptions.size()), // deUint32 attachmentCount;
+ attachmentDescriptions.data(), // const VkAttachmentDescription* pAttachments;
+ 1u, // deUint32 subpassCount;
+ &subpassDescription, // const VkSubpassDescription* pSubpasses;
+ 0u, // deUint32 dependencyCount;
+ nullptr, // const VkSubpassDependency* pDependencies;
+ };
+ const auto renderPass = vk::createRenderPass(vkd, device, &renderPassCreateInfo);
+
+ // Framebuffers.
+ FramebufferVec framebuffers;
+
+ DE_ASSERT(colorImageViews.size() == dsImageViews.size() * kNumColorAttachments);
+ for (size_t imgIdx = 0; imgIdx < dsImageViews.size(); ++imgIdx)
+ {
+ std::vector<vk::VkImageView> attachments;
+ for (deUint32 i = 0u; i < kNumColorAttachments; ++i)
+ attachments.push_back(colorImageViews[imgIdx * kNumColorAttachments + i].get());
+
+ attachments.push_back(dsImageViews[imgIdx].get());
+
+ const vk::VkFramebufferCreateInfo framebufferCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkFramebufferCreateFlags flags;
+ renderPass.get(), // VkRenderPass renderPass;
+ static_cast<deUint32>(attachments.size()), // deUint32 attachmentCount;
+ attachments.data(), // const VkImageView* pAttachments;
+ kFramebufferWidth, // deUint32 width;
+ kFramebufferHeight, // deUint32 height;
+ 1u, // deUint32 layers;
+ };
+
+ framebuffers.emplace_back(vk::createFramebuffer(vkd, device, &framebufferCreateInfo));
+ }
+
+ // Shader modules.
+ const auto vertModule = vk::createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0u);
+ const auto fragModule = vk::createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0u);
+
+ // Shader stages.
+ std::vector<vk::VkPipelineShaderStageCreateInfo> shaderStages;
+
+ vk::VkPipelineShaderStageCreateInfo shaderStageCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ vk::VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage;
+ vertModule.get(), // VkShaderModule module;
+ "main", // const char* pName;
+ nullptr, // const VkSpecializationInfo* pSpecializationInfo;
+ };
+
+ shaderStages.push_back(shaderStageCreateInfo);
+ shaderStageCreateInfo.stage = vk::VK_SHADER_STAGE_FRAGMENT_BIT;
+ shaderStageCreateInfo.module = fragModule.get();
+ shaderStages.push_back(shaderStageCreateInfo);
+
+ // Input state.
+ const auto vertexBinding = vk::makeVertexInputBindingDescription(0u, kCoordsSize, vk::VK_VERTEX_INPUT_RATE_VERTEX);
+ const std::vector<vk::VkVertexInputAttributeDescription> vertexAttributes = {
+ vk::makeVertexInputAttributeDescription(0u, 0u, vk::VK_FORMAT_R32G32_SFLOAT, 0u)
+ };
+
+ const vk::VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineVertexInputStateCreateFlags flags;
+ 1u, // deUint32 vertexBindingDescriptionCount;
+ &vertexBinding, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
+ static_cast<deUint32>(vertexAttributes.size()), // deUint32 vertexAttributeDescriptionCount;
+ vertexAttributes.data(), // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
+ };
+
+ // Input assembly.
+ const vk::VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineInputAssemblyStateCreateFlags flags;
+ vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, // VkPrimitiveTopology topology;
+ VK_FALSE, // VkBool32 primitiveRestartEnable;
+ };
+
+ // Viewport state.
+ const vk::VkViewport viewport (vk::makeViewport(kFramebufferWidth, kFramebufferHeight));
+ const vk::VkRect2D scissor (vk::makeRect2D(kFramebufferWidth, kFramebufferHeight));
+
+ // For the static pipeline.
+ const vk::VkPipelineViewportStateCreateInfo viewportStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineViewportStateCreateFlags flags;
+ 1u, // deUint32 viewportCount;
+ &viewport, // const VkViewport* pViewports;
+ 1u, // deUint32 scissorCount;
+ &scissor, // const VkRect2D* pScissors;
+ };
+
+ // Rasterization state.
+ const vk::VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineRasterizationStateCreateFlags flags;
+ VK_FALSE, // VkBool32 depthClampEnable;
+ VK_FALSE, // VkBool32 rasterizerDiscardEnable;
+ vk::VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
+ vk::VK_CULL_MODE_NONE, // VkCullModeFlags cullMode;
+ vk::VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
+ VK_FALSE, // VkBool32 depthBiasEnable;
+ 0.0f, // float depthBiasConstantFactor;
+ 0.0f, // float depthBiasClamp;
+ 0.0f, // float depthBiasSlopeFactor;
+ 1.0f, // float lineWidth;
+ };
+
+ // Multisample state.
+ const vk::VkPipelineMultisampleStateCreateInfo multisampleStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineMultisampleStateCreateFlags flags;
+ vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples;
+ VK_FALSE, // VkBool32 sampleShadingEnable;
+ 0.0f, // float minSampleShading;
+ nullptr, // const VkSampleMask* pSampleMask;
+ VK_FALSE, // VkBool32 alphaToCoverageEnable;
+ VK_FALSE, // VkBool32 alphaToOneEnable;
+ };
+
+ // Depth/stencil state.
+ const vk::VkStencilOpState stencil =
+ {
+ vk::VK_STENCIL_OP_KEEP, // VkStencilOp failOp;
+ vk::VK_STENCIL_OP_KEEP, // VkStencilOp passOp;
+ vk::VK_STENCIL_OP_KEEP, // VkStencilOp depthFailOp;
+ vk::VK_COMPARE_OP_ALWAYS, // VkCompareOp compareOp;
+ 0xFFu, // deUint32 compareMask;
+ 0xFFu, // deUint32 writeMask;
+ 0u, // deUint32 reference;
+ };
+
+ const vk::VkPipelineDepthStencilStateCreateInfo depthStencilStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineDepthStencilStateCreateFlags flags;
+ VK_TRUE, // VkBool32 depthTestEnable;
+ VK_TRUE, // VkBool32 depthWriteEnable;
+ vk::VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp;
+ VK_FALSE, // VkBool32 depthBoundsTestEnable;
+ VK_FALSE, // VkBool32 stencilTestEnable;
+ stencil, // VkStencilOpState front;
+ stencil, // VkStencilOpState back;
+ 0.0f, // float minDepthBounds;
+ 1.0f, // float maxDepthBounds;
+ };
+
+ // Dynamic state. Here we will set all states which have a dynamic value.
+ std::vector<vk::VkDynamicState> dynamicStates;
+
+ if (m_testConfig.colorWriteEnableConfig.dynamicValue)
+ dynamicStates.push_back(vk::VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT);
+
+ const vk::VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineDynamicStateCreateFlags flags;
+ static_cast<deUint32>(dynamicStates.size()), // deUint32 dynamicStateCount;
+ dynamicStates.data(), // const VkDynamicState* pDynamicStates;
+ };
+
+ std::vector<vk::VkPipelineColorBlendAttachmentState> colorBlendAttachmentState(
+ kNumColorAttachments,
+ vk::VkPipelineColorBlendAttachmentState
+ {
+ VK_FALSE, // VkBool32 blendEnable
+ vk::VK_BLEND_FACTOR_ZERO, // VkBlendFactor srcColorBlendFactor
+ vk::VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor
+ vk::VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp
+ vk::VK_BLEND_FACTOR_ZERO, // VkBlendFactor srcAlphaBlendFactor
+ vk::VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor
+ vk::VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp
+ vk::VK_COLOR_COMPONENT_R_BIT // VkColorComponentFlags colorWriteMask
+ | vk::VK_COLOR_COMPONENT_G_BIT
+ | vk::VK_COLOR_COMPONENT_B_BIT
+ | vk::VK_COLOR_COMPONENT_A_BIT
+ }
+ );
+
+ const vk::VkPipelineColorWriteCreateInfoEXT colorWriteCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ kNumColorAttachments, // deUint32 attachmentCount;
+ m_testConfig.colorWriteEnableConfig.staticValue.data() // const VkBool32* pColorWriteEnables;
+ };
+
+ const vk::VkPipelineColorBlendStateCreateInfo colorBlendStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType
+ &colorWriteCreateInfo, // const void* pNext
+ 0u, // VkPipelineColorBlendStateCreateFlags flags
+ VK_FALSE, // VkBool32 logicOpEnable
+ vk::VK_LOGIC_OP_CLEAR, // VkLogicOp logicOp
+ kNumColorAttachments, // deUint32 attachmentCount
+ colorBlendAttachmentState.data(), // const VkPipelineColorBlendAttachmentState* pAttachments
+ { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]
+ };
+
+ const vk::VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfoTemplate =
+ {
+ vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ static_cast<deUint32>(shaderStages.size()), // deUint32 stageCount;
+ shaderStages.data(), // const VkPipelineShaderStageCreateInfo* pStages;
+ &vertexInputStateCreateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
+ &inputAssemblyStateCreateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
+ nullptr, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
+ nullptr, // const VkPipelineViewportStateCreateInfo* pViewportState;
+ &rasterizationStateCreateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState;
+ &multisampleStateCreateInfo, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
+ &depthStencilStateCreateInfo, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
+ &colorBlendStateCreateInfo, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
+ nullptr, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
+ pipelineLayout.get(), // VkPipelineLayout layout;
+ renderPass.get(), // VkRenderPass renderPass;
+ 0u, // deUint32 subpass;
+ DE_NULL, // VkPipeline basePipelineHandle;
+ 0, // deInt32 basePipelineIndex;
+ };
+
+ vk::Move<vk::VkPipeline> staticPipeline;
+ const bool bindStaticFirst = (kSequenceOrdering == SequenceOrdering::BETWEEN_PIPELINES ||
+ kSequenceOrdering == SequenceOrdering::AFTER_PIPELINES ||
+ kSequenceOrdering == SequenceOrdering::TWO_DRAWS_DYNAMIC);
+ const bool useStaticPipeline = (bindStaticFirst || kReversed);
+
+ // Create static pipeline when needed.
+ if (useStaticPipeline)
+ {
+ auto staticPipelineCreateInfo = graphicsPipelineCreateInfoTemplate;
+ staticPipelineCreateInfo.pViewportState = &viewportStateCreateInfo;
+ staticPipeline = vk::createGraphicsPipeline(vkd, device, DE_NULL, &staticPipelineCreateInfo);
+ }
+
+ // Create dynamic pipeline.
+ vk::Move<vk::VkPipeline> graphicsPipeline;
+ {
+ auto dynamicPipelineCreateInfo = graphicsPipelineCreateInfoTemplate;
+ dynamicPipelineCreateInfo.pDynamicState = &dynamicStateCreateInfo;
+ dynamicPipelineCreateInfo.pViewportState = &viewportStateCreateInfo;
+ graphicsPipeline = vk::createGraphicsPipeline(vkd, device, DE_NULL, &dynamicPipelineCreateInfo);
+ }
+
+ // Command buffer.
+ const auto cmdPool = vk::makeCommandPool(vkd, device, queueIndex);
+ const auto cmdBufferPtr = vk::allocateCommandBuffer(vkd , device, cmdPool.get(), vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ // Clear values.
+ std::vector<vk::VkClearValue> clearValues;
+ auto colorClearValue = vk::makeClearValueColor(m_testConfig.clearColorValue);
+ for (deUint32 i = 0u; i < kNumColorAttachments; ++i)
+ clearValues.push_back(colorClearValue);
+ clearValues.push_back(vk::makeClearValueDepthStencil(m_testConfig.clearDepthValue, 0u));
+
+ // Record command buffer.
+ vk::beginCommandBuffer(vkd, cmdBuffer);
+
+ for (deUint32 iteration = 0u; iteration < kNumIterations; ++iteration)
+ {
+ // Maybe set dynamic state here.
+ if (kSequenceOrdering == SequenceOrdering::CMD_BUFFER_START)
+ {
+ setDynamicStates(m_testConfig, vkd, cmdBuffer);
+ }
+
+ // Begin render pass.
+ vk::beginRenderPass(vkd, cmdBuffer, renderPass.get(), framebuffers[iteration].get(), vk::makeRect2D(kFramebufferWidth, kFramebufferHeight), static_cast<deUint32>(clearValues.size()), clearValues.data());
+
+ // Bind a static pipeline first if needed.
+ if (bindStaticFirst && iteration == 0u)
+ {
+ vkd.cmdBindPipeline(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, staticPipeline.get());
+ }
+
+ // Maybe set dynamic state here.
+ if (kSequenceOrdering == SequenceOrdering::BETWEEN_PIPELINES)
+ {
+ setDynamicStates(m_testConfig, vkd, cmdBuffer);
+ }
+
+ // Bind dynamic pipeline.
+ if ((kSequenceOrdering != SequenceOrdering::TWO_DRAWS_DYNAMIC &&
+ kSequenceOrdering != SequenceOrdering::TWO_DRAWS_STATIC) ||
+ (kSequenceOrdering == SequenceOrdering::TWO_DRAWS_DYNAMIC && iteration > 0u) ||
+ (kSequenceOrdering == SequenceOrdering::TWO_DRAWS_STATIC && iteration == 0u))
+ {
+ vkd.cmdBindPipeline(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline.get());
+ }
+
+ if (kSequenceOrdering == SequenceOrdering::BEFORE_GOOD_STATIC ||
+ (kSequenceOrdering == SequenceOrdering::TWO_DRAWS_DYNAMIC && iteration > 0u) ||
+ (kSequenceOrdering == SequenceOrdering::TWO_DRAWS_STATIC && iteration == 0u))
+ {
+ setDynamicStates(m_testConfig, vkd, cmdBuffer);
+ }
+
+ // Bind a static pipeline last if needed.
+ if (kSequenceOrdering == SequenceOrdering::BEFORE_GOOD_STATIC ||
+ (kSequenceOrdering == SequenceOrdering::TWO_DRAWS_STATIC && iteration > 0u))
+ {
+ vkd.cmdBindPipeline(cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, staticPipeline.get());
+ }
+
+ // Push constants.
+ PushConstants pushConstants =
+ {
+ m_testConfig.meshParams.color, // tcu::Vec4 triangleColor;
+ m_testConfig.meshParams.depth, // float meshDepth;
+ m_testConfig.meshParams.scaleX, // float scaleX;
+ m_testConfig.meshParams.scaleY, // float scaleY;
+ m_testConfig.meshParams.offsetX, // float offsetX;
+ m_testConfig.meshParams.offsetY, // float offsetY;
+ };
+ vkd.cmdPushConstants(cmdBuffer, pipelineLayout.get(), pushConstantStageFlags, 0u, static_cast<deUint32>(sizeof(pushConstants)), &pushConstants);
+
+ // Maybe set dynamic state here.
+ if (kSequenceOrdering == SequenceOrdering::BEFORE_DRAW || kSequenceOrdering == SequenceOrdering::AFTER_PIPELINES)
+ {
+ setDynamicStates(m_testConfig, vkd, cmdBuffer);
+ }
+
+ // Bind vertex buffer and draw.
+ vk::VkDeviceSize offset = 0ull;
+ vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, &vertBuffer.get(), &offset);
+ vkd.cmdDraw(cmdBuffer, 6u, 1u, 0u, 0u);
+
+ vk::endRenderPass(vkd, cmdBuffer);
+ }
+
+ vk::endCommandBuffer(vkd, cmdBuffer);
+
+ // Submit commands.
+ vk::submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Read result image aspects from the last used framebuffer.
+ const tcu::UVec2 renderSize(kFramebufferWidth, kFramebufferHeight);
+
+ const int kWidth = static_cast<int>(kFramebufferWidth);
+ const int kHeight = static_cast<int>(kFramebufferHeight);
+
+ const tcu::Vec4 kGood(0.0f, 1.0f, 0.0f, 1.0f);
+ const tcu::Vec4 kBad(1.0f, 0.0f, 0.0f, 1.0f);
+
+ const tcu::TextureFormat errorFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
+
+ bool colorMatchAll = true;
+
+ // Check expected values.
+ auto nextAttachmentImage = colorImages.end() - kNumColorAttachments;
+ for (deUint32 attachmentIndex = 0u; attachmentIndex < kNumColorAttachments; ++attachmentIndex, ++nextAttachmentImage)
+ {
+ const auto colorBuffer = readColorAttachment(vkd, device, queue, queueIndex, allocator, (*nextAttachmentImage)->get(), kColorFormat, renderSize);
+ const auto colorAccess = colorBuffer->getAccess();
+
+ tcu::TextureLevel colorError (errorFormat, kWidth, kHeight);
+ const auto colorErrorAccess = colorError.getAccess();
+
+ bool colorMatch = true;
+
+ for (int y = 0; y < kHeight; ++y)
+ for (int x = 0; x < kWidth; ++x)
+ {
+ const auto colorPixel = colorAccess.getPixel(x, y);
+
+ bool match = tcu::boolAll(tcu::lessThan(tcu::absDiff(colorPixel, m_testConfig.expectedColor[attachmentIndex]), kColorThreshold));
+ colorErrorAccess.setPixel((match ? kGood : kBad), x, y);
+ if (!match)
+ colorMatch = false;
+ }
+
+ if (!colorMatch)
+ {
+ std::ostringstream desc;
+ desc << "Result color image and error mask for attachment #" << attachmentIndex;
+ logErrors(log, "Color", desc.str(), colorAccess, colorErrorAccess);
+ colorMatchAll = false;
+ }
+ }
+
+ const auto depthBuffer = readDepthAttachment(vkd, device, queue, queueIndex, allocator, dsImages.back()->get(), dsFormat, renderSize);
+ const auto depthAccess = depthBuffer->getAccess();
+ tcu::TextureLevel depthError(errorFormat, kWidth, kHeight);
+ const auto depthErrorAccess = depthError.getAccess();
+
+ const auto minDepth = m_testConfig.expectedDepth - 1.0e-07f;
+ const auto maxDepth = m_testConfig.expectedDepth + 1.0e-07f;
+ bool depthMatch = true;
+
+ for (int y = 0; y < kHeight; ++y)
+ for (int x = 0; x < kWidth; ++x)
+ {
+ const auto depthPixel = depthAccess.getPixDepth(x, y);
+ bool match = de::inRange(depthPixel, minDepth, maxDepth);
+ depthErrorAccess.setPixel((match ? kGood : kBad), x, y);
+ if (!match)
+ depthMatch = false;
+ }
+
+ if (!depthMatch)
+ {
+ logErrors(log, "Depth", "Result depth image and error mask", depthAccess, depthErrorAccess);
+ }
+
+ if (!(colorMatchAll && depthMatch))
+ {
+ return tcu::TestStatus::fail("Incorrect value found in attachments; please check logged images");
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+template <typename VectorType>
+VectorType MaskVector(const VectorType& valueIfMaskIsFalse, const VectorType& valueIfMaskIsTrue, const std::vector<bool>& mask, bool inverse = false)
+{
+ DE_ASSERT(valueIfMaskIsFalse.size() == valueIfMaskIsTrue.size() && valueIfMaskIsFalse.size() == mask.size());
+
+ VectorType ret(mask.size());
+
+ for (size_t i = 0; i < mask.size(); ++i)
+ {
+ bool m = mask[i];
+ if (inverse)
+ m = !m;
+ ret[i] = m ? valueIfMaskIsTrue[i] : valueIfMaskIsFalse[i];
+ }
+
+ return ret;
+}
+
+void AddSingleTestCaseStatic(
+ const std::string& name,
+ const std::string& description,
+ const std::vector<bool> mask,
+ bool inverse,
+ tcu::TestCaseGroup* orderingGroup,
+ tcu::TestContext& testCtx)
+{
+ TestConfig config(SequenceOrdering::CMD_BUFFER_START);
+
+ // Enable writes and expect the mesh color, or disable writes and expect the clear color.
+
+ config.clearColorValue = tcu::Vec4(0.25f, 0.5f, 0.75f, 0.5f);
+ config.meshParams.color = tcu::Vec4(1.0f, 0.75f, 0.5f, 0.25f);
+
+ const auto allVkFalse = Bool32Vec(kNumColorAttachments, VK_FALSE);
+ const auto allVkTrue = Bool32Vec(kNumColorAttachments, VK_TRUE);
+
+ config.colorWriteEnableConfig.staticValue = MaskVector(allVkFalse, allVkTrue, mask, inverse);
+
+ // Note colorWriteEnableConfig.dynamicValue is unset, defaults to an empty Maybe<T>
+
+ std::vector<tcu::Vec4> meshColorsPerAttachment(kNumColorAttachments);
+ meshColorsPerAttachment[0] = config.meshParams.color;
+ for (deUint32 i = 1u; i < kNumColorAttachments; ++i)
+ meshColorsPerAttachment[i] = meshColorsPerAttachment[i - 1] * 0.5f;
+
+ std::vector<tcu::Vec4> clearColorsPerAttachment(kNumColorAttachments, config.clearColorValue);
+
+ config.expectedColor = MaskVector(clearColorsPerAttachment, meshColorsPerAttachment, mask, inverse);
+
+ // Depth should always be written even when color is not
+ config.clearDepthValue = 0.5f;
+ config.meshParams.depth = 0.25f;
+ config.expectedDepth = 0.25f;
+
+ orderingGroup->addChild(new ColorWriteEnableTest(testCtx, name, description, config));
+}
+
+void AddSingleTestCaseDynamic(
+ const std::string& name,
+ const std::string& description,
+ const std::vector<bool> mask,
+ bool inverse,
+ tcu::TestCaseGroup* orderingGroup,
+ tcu::TestContext& testCtx,
+ SequenceOrdering ordering)
+{
+ TestConfig config(ordering);
+
+ // Enable writes and expect the mesh color, or disable writes and expect the clear color.
+
+ config.clearColorValue = tcu::Vec4(0.25f, 0.5f, 0.75f, 0.5f);
+ config.meshParams.color = tcu::Vec4(1.0f, 0.75f, 0.5f, 0.25f);
+
+ const auto allVkFalse = Bool32Vec(kNumColorAttachments, VK_FALSE);
+ const auto allVkTrue = Bool32Vec(kNumColorAttachments, VK_TRUE);
+
+ config.colorWriteEnableConfig.staticValue = inverse ? allVkTrue : allVkFalse;
+ config.colorWriteEnableConfig.dynamicValue = MaskVector(allVkFalse, allVkTrue, mask, inverse);
+
+ std::vector<tcu::Vec4> meshColorsPerAttachment(kNumColorAttachments);
+ meshColorsPerAttachment[0] = config.meshParams.color;
+ for (deUint32 i = 1u; i < kNumColorAttachments; ++i)
+ meshColorsPerAttachment[i] = meshColorsPerAttachment[i - 1] * 0.5f;
+
+ std::vector<tcu::Vec4> clearColorsPerAttachment(kNumColorAttachments, config.clearColorValue);
+
+ config.expectedColor = MaskVector(clearColorsPerAttachment, meshColorsPerAttachment, mask, inverse);
+
+ // Depth should always be written even when color is not
+ config.clearDepthValue = 0.5f;
+ config.meshParams.depth = 0.25f;
+ config.expectedDepth = 0.25f;
+
+ orderingGroup->addChild(new ColorWriteEnableTest(testCtx, name, description, config));
+}
+
+} // anonymous namespace
+
+tcu::TestCaseGroup* createColorWriteEnableTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> colorWriteEnableGroup(new tcu::TestCaseGroup(testCtx, "color_write_enable", "Tests for VK_EXT_color_write_enable"));
+
+ DE_ASSERT(kNumColorAttachments >= 2);
+
+ std::vector<bool> mask_all (kNumColorAttachments, true);
+ std::vector<bool> mask_first (kNumColorAttachments, false); mask_first[0] = true;
+ std::vector<bool> mask_second (kNumColorAttachments, false); mask_second[1] = true;
+ std::vector<bool> mask_last (kNumColorAttachments, false); mask_last.back() = true;
+ std::vector<bool> mask_first_and_second (kNumColorAttachments, false); mask_first_and_second[0] = mask_first_and_second[1] = true;
+ std::vector<bool> mask_second_and_last (kNumColorAttachments, false); mask_second_and_last[1] = mask_second_and_last.back() = true;
+
+ // Test cases for the dynamic state
+ static const struct
+ {
+ SequenceOrdering ordering;
+ std::string name;
+ std::string desc;
+ } kOrderingCases[] =
+ {
+ { SequenceOrdering::CMD_BUFFER_START, "cmd_buffer_start", "Dynamic state set after command buffer start" },
+ { SequenceOrdering::BEFORE_DRAW, "before_draw", "Dynamic state set just before drawing" },
+ { SequenceOrdering::BETWEEN_PIPELINES, "between_pipelines", "Dynamic after a pipeline with static states has been bound and before a pipeline with dynamic states has been bound" },
+ { SequenceOrdering::AFTER_PIPELINES, "after_pipelines", "Dynamic state set after both a static-state pipeline and a second dynamic-state pipeline have been bound" },
+ { SequenceOrdering::BEFORE_GOOD_STATIC, "before_good_static", "Dynamic state set after a dynamic pipeline has been bound and before a second static-state pipeline with the right values has been bound" },
+ { SequenceOrdering::TWO_DRAWS_DYNAMIC, "two_draws_dynamic", "Bind bad static pipeline and draw, followed by binding correct dynamic pipeline and drawing again" },
+ { SequenceOrdering::TWO_DRAWS_STATIC, "two_draws_static", "Bind bad dynamic pipeline and draw, followed by binding correct static pipeline and drawing again" },
+ };
+
+ for (int orderingIdx = 0; orderingIdx < DE_LENGTH_OF_ARRAY(kOrderingCases); ++orderingIdx)
+ {
+ const auto& kOrderingCase = kOrderingCases[orderingIdx];
+ const auto& kOrdering = kOrderingCase.ordering;
+
+ de::MovePtr<tcu::TestCaseGroup> orderingGroup(new tcu::TestCaseGroup(testCtx, kOrderingCase.name.c_str(), kOrderingCase.desc.c_str()));
+
+ AddSingleTestCaseDynamic("enable_all", "Dynamically enable writes to all color attachments", mask_all, false, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("enable_first", "Dynamically enable writes to the first color attachment", mask_first, false, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("enable_second", "Dynamically enable writes to the second color attachment", mask_second, false, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("enable_last", "Dynamically enable writes to the last color attachment", mask_last, false, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("enable_first_and_second", "Dynamically enable writes to the first two color attachments", mask_first_and_second, false, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("enable_second_and_last", "Dynamically enable writes to the second and last color attachments", mask_second_and_last, false, orderingGroup.get(), testCtx, kOrdering);
+
+ AddSingleTestCaseDynamic("disable_all", "Dynamically disable writes to all color attachments", mask_all, true, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("disable_first", "Dynamically disable writes to the first color attachment", mask_first, true, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("disable_second", "Dynamically disable writes to the second color attachment", mask_second, true, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("disable_last", "Dynamically disable writes to the last color attachment", mask_last, true, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("disable_first_and_second", "Dynamically disable writes to the first two color attachments", mask_first_and_second, true, orderingGroup.get(), testCtx, kOrdering);
+ AddSingleTestCaseDynamic("disable_second_and_last", "Dynamically disable writes to the second and last color attachments", mask_second_and_last, true, orderingGroup.get(), testCtx, kOrdering);
+
+ colorWriteEnableGroup->addChild(orderingGroup.release());
+ }
+
+ // Test cases for the static state
+ // Note that the dynamic state test cases above also test pipelines with static state (when ordering is BEFORE_GOOD_STATIC and TWO_DRAWS_STATIC).
+ // However they all bind a pipeline with the static state AFTER binding a pipeline with the dynamic state.
+ // The only case missing, then, is static state alone without any dynamic pipelines in the same render pass or command buffer.
+ de::MovePtr<tcu::TestCaseGroup> staticOrderingGroup(new tcu::TestCaseGroup(testCtx, "static", "Static state set"));
+
+ AddSingleTestCaseStatic("enable_all", "Statically enable writes to all color attachments", mask_all, false, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("enable_first", "Statically enable writes to the first color attachment", mask_first, false, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("enable_second", "Statically enable writes to the second color attachment", mask_second, false, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("enable_last", "Statically enable writes to the last color attachment", mask_last, false, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("enable_first_and_second", "Statically enable writes to the first two color attachments", mask_first_and_second, false, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("enable_second_and_last", "Statically enable writes to the second and last color attachments", mask_second_and_last, false, staticOrderingGroup.get(), testCtx);
+
+ AddSingleTestCaseStatic("disable_all", "Statically disable writes to all color attachments", mask_all, true, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("disable_first", "Statically disable writes to the first color attachment", mask_first, true, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("disable_second", "Statically disable writes to the second color attachment", mask_second, true, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("disable_last", "Statically disable writes to the last color attachment", mask_last, true, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("disable_first_and_second", "Statically disable writes to the first two color attachments", mask_first_and_second, true, staticOrderingGroup.get(), testCtx);
+ AddSingleTestCaseStatic("disable_second_and_last", "Statically disable writes to the second and last color attachments", mask_second_and_last, true, staticOrderingGroup.get(), testCtx);
+
+ colorWriteEnableGroup->addChild(staticOrderingGroup.release());
+
+ return colorWriteEnableGroup.release();
+}
+
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineColorWriteEnableTests.hpp
similarity index 70%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/pipeline/vktPipelineColorWriteEnableTests.hpp
index 1a85ebf..2abbf78 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineColorWriteEnableTests.hpp
@@ -1,11 +1,10 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTPIPELINECOLORWRITEENABLETESTS_HPP
+#define _VKTPIPELINECOLORWRITEENABLETESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 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.
@@ -21,10 +20,9 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Tests for Color Write Enable
*//*--------------------------------------------------------------------*/
-#include "tcuDefs.hpp"
#include "tcuTestCase.hpp"
namespace vkt
@@ -32,9 +30,9 @@
namespace pipeline
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createColorWriteEnableTests (tcu::TestContext& testCtx);
} // pipeline
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTPIPELINECOLORWRITEENABLETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationCacheControlTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationCacheControlTests.cpp
new file mode 100644
index 0000000..8e2673f
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationCacheControlTests.cpp
@@ -0,0 +1,1412 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Advanced Micro Devices, 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 Pipeline Cache Tests
+ */
+/*--------------------------------------------------------------------*/
+
+#include "vktPipelineCreationCacheControlTests.hpp"
+
+#include "deRandom.hpp"
+#include "deUniquePtr.hpp"
+#include "tcuStringTemplate.hpp"
+#include "vkDeviceUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vktConstexprVectorUtil.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestCaseUtil.hpp"
+
+#include <chrono>
+#include <random>
+#include <string>
+#include <vector>
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace
+{
+using namespace vk;
+
+using tcu::StringTemplate;
+using tcu::TestCaseGroup;
+using tcu::TestContext;
+using tcu::TestStatus;
+
+using ::std::array;
+using ::std::string;
+using ::std::vector;
+
+/*--------------------------------------------------------------------*//*!
+ * Elements common to all test types
+ *//*--------------------------------------------------------------------*/
+namespace test_common
+{
+static constexpr auto VK_NULL_HANDLE = DE_NULL;
+
+using ::std::chrono::high_resolution_clock;
+using ::std::chrono::microseconds;
+
+using duration = high_resolution_clock::duration;
+using UniquePipeline = Move<VkPipeline>;
+using UniqueShaderModule = Move<VkShaderModule>;
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Paired Vulkan API result with elapsed duration
+ *//*--------------------------------------------------------------------*/
+struct TimedResult
+{
+ VkResult result;
+ duration elapsed;
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Validation function type output from vkCreate*Pipelines()
+ *
+ * \param result - VkResult returned from API call
+ * \param pipeliens - vector of pipelines created
+ * \param elapsed - high_resolution_clock::duration of time elapsed in API
+ * \param reason - output string to give the reason for failure
+ *
+ * \return QP_TEST_RESULT_PASS on success QP_TEST_RESULT_FAIL otherwise
+ *//*--------------------------------------------------------------------*/
+using Validator = qpTestResult (*)(VkResult, const vector<UniquePipeline>&, duration, string&);
+
+static constexpr size_t VALIDATOR_ARRAY_MAX = 4;
+using ValidatorArray = ConstexprVector<Validator, VALIDATOR_ARRAY_MAX>;
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Run a loop of validation tests and return the result
+ *//*--------------------------------------------------------------------*/
+template <typename pipelines_t, qpTestResult FAIL_RESULT = QP_TEST_RESULT_FAIL>
+TestStatus validateResults(VkResult result,
+ const pipelines_t& pipelines,
+ duration elapsed,
+ const ValidatorArray& validators)
+{
+ using de::contains;
+ static constexpr VkResult ALLOWED_RESULTS[] = {VK_SUCCESS, VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT};
+
+ string reason;
+
+ if (contains(DE_ARRAY_BEGIN(ALLOWED_RESULTS), DE_ARRAY_END(ALLOWED_RESULTS), result) == DE_FALSE)
+ {
+ static const StringTemplate ERROR_MSG = {"Pipeline creation returned an error result: ${0}"};
+ TCU_THROW(InternalError, ERROR_MSG.format(result).c_str());
+ }
+
+ for (const auto& validator : validators)
+ {
+ const auto qpResult = validator(result, pipelines, elapsed, reason);
+ if (qpResult != QP_TEST_RESULT_PASS)
+ {
+ return {qpResult, reason};
+ }
+ }
+
+ return TestStatus::pass("Test passed.");
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Generate an error if result does not match VK_RESULT
+ *//*--------------------------------------------------------------------*/
+template <VkResult VK_RESULT, qpTestResult FAIL_RESULT = QP_TEST_RESULT_FAIL>
+qpTestResult checkResult(VkResult result, const vector<UniquePipeline>&, duration, string& reason)
+{
+ if (VK_RESULT != result)
+ {
+ static const StringTemplate ERROR_MSG = {"Got ${0}, Expected ${1}"};
+ reason = ERROR_MSG.format(result, VK_RESULT);
+ return FAIL_RESULT;
+ }
+
+ return QP_TEST_RESULT_PASS;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Generate an error if pipeline[INDEX] is not valid
+ *//*--------------------------------------------------------------------*/
+template <size_t INDEX, qpTestResult FAIL_RESULT = QP_TEST_RESULT_FAIL>
+qpTestResult checkPipelineMustBeValid(VkResult, const vector<UniquePipeline>& pipelines, duration, string& reason)
+{
+ if (pipelines.size() <= INDEX)
+ {
+ static const StringTemplate ERROR_MSG = {"Index ${0} is not in created pipelines (pipelines.size(): ${1})"};
+ TCU_THROW(TestError, ERROR_MSG.format(INDEX, pipelines.size()));
+ }
+
+ if (*pipelines[INDEX] == VK_NULL_HANDLE)
+ {
+ static const StringTemplate ERROR_MSG = {"pipelines[${0}] is not a valid VkPipeline object"};
+ reason = ERROR_MSG.format(INDEX);
+ return FAIL_RESULT;
+ }
+
+ return QP_TEST_RESULT_PASS;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Generate an error if pipeline[INDEX] is not VK_NULL_HANDLE
+ *//*--------------------------------------------------------------------*/
+template <size_t INDEX, qpTestResult FAIL_RESULT = QP_TEST_RESULT_FAIL>
+qpTestResult checkPipelineMustBeNull(VkResult, const vector<UniquePipeline>& pipelines, duration, string& reason)
+{
+ if (pipelines.size() <= INDEX)
+ {
+ static const StringTemplate ERROR_MSG = {"Index ${0} is not in created pipelines (pipelines.size(): ${1})"};
+ TCU_THROW(TestError, ERROR_MSG.format(INDEX, pipelines.size()));
+ }
+
+ if (*pipelines[INDEX] != VK_NULL_HANDLE)
+ {
+ static const StringTemplate ERROR_MSG = {"pipelines[${0}] is not VK_NULL_HANDLE"};
+ reason = ERROR_MSG.format(INDEX);
+ return FAIL_RESULT;
+ }
+
+ return QP_TEST_RESULT_PASS;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Generate an error if any pipeline is valid after an early-return failure
+ *//*--------------------------------------------------------------------*/
+template <size_t INDEX, qpTestResult FAIL_RESULT = QP_TEST_RESULT_FAIL>
+qpTestResult checkPipelineNullAfterIndex(VkResult, const vector<UniquePipeline>& pipelines, duration, string& reason)
+{
+ if (pipelines.size() <= INDEX)
+ {
+ static const StringTemplate ERROR_MSG = {"Index ${0} is not in created pipelines (pipelines.size(): ${1})"};
+ TCU_THROW(TestError, ERROR_MSG.format(INDEX, pipelines.size()));
+ }
+
+ if (pipelines.size() - 1 == INDEX)
+ {
+ static const StringTemplate ERROR_MSG = {"Index ${0} is the last pipeline, likely a malformed test case"};
+ TCU_THROW(TestError, ERROR_MSG.format(INDEX));
+ }
+
+ // Only have to iterate through if the requested index is null
+ if (*pipelines[INDEX] == VK_NULL_HANDLE)
+ {
+ for (size_t i = INDEX + 1; i < pipelines.size(); ++i)
+ {
+ if (*pipelines[i] != VK_NULL_HANDLE)
+ {
+ static const StringTemplate ERROR_MSG = {
+ "pipelines[${0}] is not VK_NULL_HANDLE after a explicit early return index"};
+ reason = ERROR_MSG.format(i);
+ return FAIL_RESULT;
+ }
+ }
+ }
+
+ return QP_TEST_RESULT_PASS;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * Time limit constants
+ *//*--------------------------------------------------------------------*/
+enum ElapsedTime
+{
+ ELAPSED_TIME_INFINITE = microseconds{-1}.count(),
+ ELAPSED_TIME_IMMEDIATE = microseconds{500}.count(),
+ ELAPSED_TIME_FAST = microseconds{1000}.count()
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Generate an error if elapsed time exceeds MAX_TIME
+ *//*--------------------------------------------------------------------*/
+template <ElapsedTime MAX_TIME, qpTestResult FAIL_RESULT = QP_TEST_RESULT_FAIL>
+qpTestResult checkElapsedTime(VkResult, const vector<UniquePipeline>&, duration elapsed, string& reason)
+{
+#if defined(DE_DEBUG)
+ DE_UNREF(elapsed);
+ DE_UNREF(reason);
+
+ // In debug mode timing is not likely to be accurate
+ return QP_TEST_RESULT_PASS;
+#else
+
+ using ::std::chrono::duration_cast;
+
+ static constexpr microseconds ALLOWED_TIME = microseconds{MAX_TIME};
+
+ if (elapsed > ALLOWED_TIME)
+ {
+ static const StringTemplate ERROR_MSG = {"pipeline creation took longer than ${0}us (actual time: ${1}us)"};
+ reason = ERROR_MSG.format(ALLOWED_TIME.count(), duration_cast<microseconds>(elapsed).count());
+ return FAIL_RESULT;
+ }
+
+ return QP_TEST_RESULT_PASS;
+#endif
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Test case parameters
+ *//*--------------------------------------------------------------------*/
+struct TestParams
+{
+ enum CacheType
+ {
+ NO_CACHE = 0,
+ EXPLICIT_CACHE,
+ DERIVATIVE_HANDLE,
+ DERIVATIVE_INDEX
+ };
+
+ struct Iteration
+ {
+ static constexpr size_t MAX_VARIANTS = 4;
+ using Variant = VkPipelineCreateFlags;
+ using VariantArray = ConstexprVector<Variant, MAX_VARIANTS>;
+
+ static constexpr Variant NORMAL = 0;
+ static constexpr Variant NO_COMPILE = VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT;
+ static constexpr Variant EARLY_RETURN = NO_COMPILE | VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT;
+
+ static constexpr VariantArray SINGLE_NORMAL = VariantArray{NORMAL};
+ static constexpr VariantArray SINGLE_NOCOMPILE = VariantArray{NO_COMPILE};
+ static constexpr VariantArray BATCH_NOCOMPILE_COMPILE_NOCOMPILE = VariantArray{NO_COMPILE, NORMAL, NO_COMPILE};
+ static constexpr VariantArray BATCH_RETURN_COMPILE_NOCOMPILE = VariantArray{EARLY_RETURN, NORMAL, NO_COMPILE};
+
+ inline constexpr Iteration() : variants{}, validators{} {};
+ inline constexpr Iteration(const VariantArray& v, const ValidatorArray& f) : variants{v}, validators{f} {};
+
+ VariantArray variants;
+ ValidatorArray validators;
+ };
+
+ static constexpr size_t MAX_ITERATIONS = 4;
+ using IterationArray = ConstexprVector<Iteration, MAX_ITERATIONS>;
+
+ const char* name;
+ const char* description;
+ CacheType cacheType;
+ IterationArray iterations;
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Verify extension and feature support
+ *//*--------------------------------------------------------------------*/
+void checkSupport(Context& context, const TestParams&)
+{
+ static constexpr char EXT_NAME[] = "VK_EXT_pipeline_creation_cache_control";
+ if (!context.requireDeviceFunctionality(EXT_NAME))
+ {
+ TCU_THROW(NotSupportedError, "Extension 'VK_EXT_pipeline_creation_cache_control' is not supported");
+ }
+
+ const auto features = context.getPipelineCreationCacheControlFeaturesEXT();
+ if (features.pipelineCreationCacheControl == DE_FALSE)
+ {
+ TCU_THROW(NotSupportedError, "Feature 'pipelineCreationCacheControl' is not enabled");
+ }
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Generate a random floating point number as a string
+ *//*--------------------------------------------------------------------*/
+float randomFloat()
+{
+#if !defined(DE_DEBUG)
+ static de::Random state = {::std::random_device{}()};
+#else
+ static de::Random state = {0xDEADBEEF};
+#endif
+
+ return state.getFloat();
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Get a string of VkResults from a vector
+ *//*--------------------------------------------------------------------*/
+string getResultsString(const vector<VkResult>& results)
+{
+ using ::std::ostringstream;
+
+ ostringstream output;
+
+ output << "results[" << results.size() << "]={ ";
+
+ if (!results.empty())
+ {
+ output << results[0];
+ }
+
+ for (size_t i = 1; i < results.size(); ++i)
+ {
+ output << ", " << results[i];
+ }
+
+ output << " }";
+
+ return output.str();
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Cast a pointer to an the expected SPIRV type
+ *//*--------------------------------------------------------------------*/
+template <typename _t>
+inline const deUint32* shader_cast(const _t* ptr)
+{
+ return reinterpret_cast<const deUint32*>(ptr);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Capture a container of Vulkan handles into Move<> types
+ *//*--------------------------------------------------------------------*/
+template <typename input_container_t,
+ typename handle_t = typename input_container_t::value_type,
+ typename move_t = Move<handle_t>,
+ typename deleter_t = Deleter<handle_t>,
+ typename output_t = vector<move_t>>
+output_t wrapHandles(const DeviceInterface& vk,
+ VkDevice device,
+ const input_container_t& input,
+ const VkAllocationCallbacks* allocator = DE_NULL)
+{
+ using ::std::begin;
+ using ::std::end;
+ using ::std::transform;
+
+ auto output = output_t{};
+ output.resize(input.size());
+
+ struct Predicate
+ {
+ deleter_t deleter;
+ move_t operator()(handle_t v)
+ {
+ return (v != VK_NULL_HANDLE) ? move_t{check(v), deleter} : move_t{};
+ }
+ };
+
+ const auto wrapHandle = Predicate{deleter_t{vk, device, allocator}};
+
+ transform(begin(input), end(input), begin(output), wrapHandle);
+
+ return output;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief create vkPipelineCache for test params
+ *//*--------------------------------------------------------------------*/
+Move<VkPipelineCache> createPipelineCache(const DeviceInterface& vk, VkDevice device, const TestParams& params)
+{
+ if (params.cacheType != TestParams::EXPLICIT_CACHE)
+ {
+ return {};
+ }
+
+ static constexpr auto cacheInfo = VkPipelineCacheCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, //sType
+ DE_NULL, //pNext
+ VkPipelineCacheCreateFlags{}, //flags
+ deUintptr{0}, //initialDataSize
+ DE_NULL //pInitialData
+ };
+
+ return createPipelineCache(vk, device, &cacheInfo);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief create VkPipelineLayout with descriptor sets from test parameters
+ *//*--------------------------------------------------------------------*/
+Move<VkPipelineLayout> createPipelineLayout(const DeviceInterface& vk,
+ VkDevice device,
+ const vector<VkDescriptorSetLayout>& setLayouts,
+ const TestParams&)
+{
+ const auto layoutCreateInfo = VkPipelineLayoutCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineLayoutCreateFlags{}, // flags
+ static_cast<deUint32>(setLayouts.size()), // setLayoutCount
+ setLayouts.data(), // pSetLayouts
+ deUint32{0u}, // pushConstantRangeCount
+ DE_NULL, // pPushConstantRanges
+ };
+
+ return createPipelineLayout(vk, device, &layoutCreateInfo);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief create basic VkPipelineLayout from test parameters
+ *//*--------------------------------------------------------------------*/
+Move<VkPipelineLayout> createPipelineLayout(const DeviceInterface& vk, VkDevice device, const TestParams&)
+{
+ static constexpr auto layoutCreateInfo = VkPipelineLayoutCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineLayoutCreateFlags{}, // flags
+ deUint32{0u}, // setLayoutCount
+ DE_NULL, // pSetLayouts
+ deUint32{0u}, // pushConstantRangeCount
+ DE_NULL, // pPushConstantRanges
+ };
+
+ return createPipelineLayout(vk, device, &layoutCreateInfo);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Create array of shader modules
+ *//*--------------------------------------------------------------------*/
+vector<UniqueShaderModule> createShaderModules(const DeviceInterface& vk,
+ VkDevice device,
+ const BinaryCollection& collection,
+ const vector<const char*>& names)
+{
+ auto output = vector<UniqueShaderModule>{};
+ output.reserve(names.size());
+
+ for (const auto& name : names)
+ {
+ const auto& binary = collection.get(name);
+ const auto createInfo = VkShaderModuleCreateInfo{
+ VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkShaderModuleCreateFlags{}, // flags
+ binary.getSize(), // codeSize
+ shader_cast(binary.getBinary()) // pCode
+ };
+
+ output.push_back(createShaderModule(vk, device, &createInfo));
+ }
+
+ return output;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Create array of shader binding stages
+ *//*--------------------------------------------------------------------*/
+vector<VkPipelineShaderStageCreateInfo> createShaderStages(const vector<Move<VkShaderModule>>& modules,
+ const vector<VkShaderStageFlagBits>& stages)
+{
+ DE_ASSERT(modules.size() == stages.size());
+
+ auto output = vector<VkPipelineShaderStageCreateInfo>{};
+ output.reserve(modules.size());
+
+ int i = 0;
+
+ for (const auto& module : modules)
+ {
+ const auto stageInfo = VkPipelineShaderStageCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineShaderStageCreateFlags{}, // flags
+ stages[i++], // stage
+ *module, // module
+ "main", // pName
+ DE_NULL // pSpecializationInfo
+ };
+
+ output.push_back(stageInfo);
+ }
+
+ return output;
+}
+
+} // namespace test_common
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Graphics pipeline specific testing
+ *//*--------------------------------------------------------------------*/
+namespace graphics_tests
+{
+using namespace test_common;
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Common graphics pipeline create info initialization
+ *//*--------------------------------------------------------------------*/
+VkGraphicsPipelineCreateInfo getPipelineCreateInfoCommon()
+{
+ static constexpr auto VERTEX_BINDING = VkVertexInputBindingDescription{
+ deUint32{0u}, // binding
+ sizeof(float[4]), // stride
+ VK_VERTEX_INPUT_RATE_VERTEX // inputRate
+ };
+
+ static constexpr auto VERTEX_ATTRIBUTE = VkVertexInputAttributeDescription{
+ deUint32{0u}, // location
+ deUint32{0u}, // binding
+ VK_FORMAT_R32G32B32A32_SFLOAT, // format
+ deUint32{0u} // offset
+ };
+
+ static constexpr auto VERTEX_INPUT_STATE = VkPipelineVertexInputStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineVertexInputStateCreateFlags{}, // flags
+ deUint32{1u}, // vertexBindingDescriptionCount
+ &VERTEX_BINDING, // pVertexBindingDescriptions
+ deUint32{1u}, // vertexAttributeDescriptionCount
+ &VERTEX_ATTRIBUTE // pVertexAttributeDescriptions
+ };
+
+ static constexpr auto IA_STATE = VkPipelineInputAssemblyStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineInputAssemblyStateCreateFlags{}, // flags
+ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // topology
+ VK_TRUE // primitiveRestartEnable
+ };
+
+ static constexpr auto TESSALATION_STATE = VkPipelineTessellationStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineTessellationStateCreateFlags{}, // flags
+ deUint32{0u} // patchControlPoints
+ };
+
+ static constexpr auto VIEWPORT = VkViewport{
+ 0.f, // x
+ 0.f, // y
+ 1.f, // width
+ 1.f, // height
+ 0.f, // minDepth
+ 1.f // maxDept
+ };
+
+ static constexpr auto SCISSOR_RECT = VkRect2D{
+ {0, 0}, // offset
+ {256, 256} // extent
+ };
+
+ static constexpr auto VIEWPORT_STATE = VkPipelineViewportStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineViewportStateCreateFlags{}, // flags
+ deUint32{1u}, // viewportCount
+ &VIEWPORT, // pViewports
+ deUint32{1u}, // scissorCount
+ &SCISSOR_RECT // pScissors
+ };
+
+ static constexpr auto RASTERIZATION_STATE = VkPipelineRasterizationStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineRasterizationStateCreateFlags{}, // flags
+ VK_TRUE, // depthClampEnable
+ VK_TRUE, // rasterizerDiscardEnable
+ VK_POLYGON_MODE_FILL, // polygonMode
+ VK_CULL_MODE_NONE, // cullMode
+ VK_FRONT_FACE_CLOCKWISE, // frontFace
+ VK_FALSE, // depthBiasEnable
+ 0.f, // depthBiasConstantFactor
+ 0.f, // depthBiasClamp
+ 0.f, // depthBiasSlopeFactor
+ 1.f // lineWidth
+ };
+
+ static constexpr auto SAMPLE_MASK = VkSampleMask{};
+
+ static constexpr auto MULTISAMPLE_STATE = VkPipelineMultisampleStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineMultisampleStateCreateFlags{}, // flags
+ VK_SAMPLE_COUNT_1_BIT, // rasterizationSamples
+ VK_FALSE, // sampleShadingEnable
+ 0.f, // minSampleShading
+ &SAMPLE_MASK, // pSampleMask
+ VK_FALSE, // alphaToCoverageEnable
+ VK_FALSE // alphaToOneEnable
+ };
+
+ static constexpr auto STENCIL_OP_STATE = VkStencilOpState{
+ VK_STENCIL_OP_ZERO, // failOp
+ VK_STENCIL_OP_ZERO, // passOp
+ VK_STENCIL_OP_ZERO, // depthFailOp
+ VK_COMPARE_OP_ALWAYS, // compareOp
+ deUint32{0u}, // compareMask
+ deUint32{0u}, // writeMask
+ deUint32{0u} // reference
+ };
+
+ static constexpr auto DEPTH_STENCIL_STATE = VkPipelineDepthStencilStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineDepthStencilStateCreateFlags{}, // flags
+ VK_FALSE, // depthTestEnable
+ VK_FALSE, // depthWriteEnable
+ VK_COMPARE_OP_ALWAYS, // depthCompareOp
+ VK_FALSE, // depthBoundsTestEnable
+ VK_FALSE, // stencilTestEnable
+ STENCIL_OP_STATE, // front
+ STENCIL_OP_STATE, // back
+ 0.f, // minDepthBounds
+ 1.f // maxDepthBounds
+ };
+
+ static constexpr auto COLOR_FLAGS_ALL = VkColorComponentFlags{VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |
+ VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT};
+
+ static constexpr auto COLOR_BLEND_ATTACH_STATE = VkPipelineColorBlendAttachmentState{
+ VK_FALSE, // blendEnable
+ VK_BLEND_FACTOR_ONE, // srcColorBlendFactor
+ VK_BLEND_FACTOR_ZERO, // dstColorBlendFactor
+ VK_BLEND_OP_ADD, // colorBlendOp
+ VK_BLEND_FACTOR_ONE, // srcAlphaBlendFactor
+ VK_BLEND_FACTOR_ZERO, // dstAlphaBlendFactor
+ VK_BLEND_OP_ADD, // alphaBlendOp
+ COLOR_FLAGS_ALL // colorWriteMask
+ };
+
+ static constexpr auto COLOR_BLEND_STATE = VkPipelineColorBlendStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineColorBlendStateCreateFlags{}, // flags
+ VK_FALSE, // logicOpEnable
+ VK_LOGIC_OP_SET, // logicOp
+ deUint32{1u}, // attachmentCount
+ &COLOR_BLEND_ATTACH_STATE, // pAttachments
+ {0.f, 0.f, 0.f, 0.f} // blendConstants[4]
+ };
+
+ static constexpr auto DYNAMIC_STATE = VkPipelineDynamicStateCreateInfo{
+ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // sType;
+ DE_NULL, // pNext;
+ VkPipelineDynamicStateCreateFlags{}, // flags;
+ deUint32{0u}, // dynamicStateCount;
+ DE_NULL // pDynamicStates;
+ };
+
+ return VkGraphicsPipelineCreateInfo{
+ VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineCreateFlags{}, // flags
+ deUint32{0u}, // stageCount
+ DE_NULL, // pStages
+ &VERTEX_INPUT_STATE, // pVertexInputState
+ &IA_STATE, // pInputAssemblyState
+ &TESSALATION_STATE, // pTessellationState
+ &VIEWPORT_STATE, // pViewportState
+ &RASTERIZATION_STATE, // pRasterizationState
+ &MULTISAMPLE_STATE, // pMultisampleState
+ &DEPTH_STENCIL_STATE, // pDepthStencilState
+ &COLOR_BLEND_STATE, // pColorBlendState
+ &DYNAMIC_STATE, // pDynamicState
+ VK_NULL_HANDLE, // layout
+ VK_NULL_HANDLE, // renderPass
+ deUint32{0u}, // subpass
+ VK_NULL_HANDLE, // basePipelineHandle
+ deInt32{-1} // basePipelineIndex
+ };
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief create VkGraphicsPipelineCreateInfo structs from test iteration
+ *//*--------------------------------------------------------------------*/
+vector<VkGraphicsPipelineCreateInfo> createPipelineCreateInfos(const TestParams::Iteration& iteration,
+ const VkGraphicsPipelineCreateInfo& base,
+ VkPipeline basePipeline,
+ const TestParams& testParameter)
+{
+ auto output = vector<VkGraphicsPipelineCreateInfo>{};
+ output.reserve(iteration.variants.size());
+
+ deInt32 count = 0;
+ deInt32 basePipelineIndex = -1;
+
+ for (VkPipelineCreateFlags flags : iteration.variants)
+ {
+ const auto curIndex = count++;
+ auto createInfo = base;
+
+ if (testParameter.cacheType == TestParams::DERIVATIVE_INDEX)
+ {
+ if (flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT)
+ {
+ if (basePipelineIndex != -1)
+ {
+ flags |= VK_PIPELINE_CREATE_DERIVATIVE_BIT;
+ }
+ }
+ else
+ {
+ flags |= VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT;
+
+ if (basePipelineIndex == -1)
+ {
+ basePipelineIndex = curIndex;
+ }
+ }
+ }
+
+ createInfo.flags = flags;
+ createInfo.basePipelineHandle = basePipeline;
+ createInfo.basePipelineIndex = basePipelineIndex;
+
+ output.push_back(createInfo);
+ }
+
+ return output;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief create VkRenderPass object for Graphics test
+ *//*--------------------------------------------------------------------*/
+Move<VkRenderPass> createRenderPass(const DeviceInterface& vk, VkDevice device, const TestParams&)
+{
+ static constexpr auto COLOR_FORMAT = VK_FORMAT_R8G8B8A8_UNORM;
+
+ static constexpr auto COLOR_ATTACHMENT_REF = VkAttachmentReference{
+ deUint32{0u}, // attachment
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // layout
+ };
+
+ static constexpr auto SUBPASS = VkSubpassDescription{
+ VkSubpassDescriptionFlags{}, // flags
+ VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint
+ deUint32{0u}, // inputAttachmentCount
+ DE_NULL, // pInputAttachments
+ deUint32{1u}, // colorAttachmentCount
+ &COLOR_ATTACHMENT_REF, // pColorAttachments
+ DE_NULL, // pResolveAttachments
+ DE_NULL, // pDepthStencilAttachment
+ deUint32{0u}, // preserveAttachmentCount
+ DE_NULL // pPreserveAttachments
+ };
+
+ static constexpr auto COLOR_ATTACHMENT = VkAttachmentDescription{
+ VkAttachmentDescriptionFlags{}, // flags
+ COLOR_FORMAT, // format
+ VK_SAMPLE_COUNT_1_BIT, // samples
+ VK_ATTACHMENT_LOAD_OP_CLEAR, // loadOp
+ VK_ATTACHMENT_STORE_OP_STORE, // storeOp
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, // stencilLoadOp
+ VK_ATTACHMENT_STORE_OP_DONT_CARE, // stencilStoreOp
+ VK_IMAGE_LAYOUT_UNDEFINED, // initialLayout
+ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR // finalLayout
+ };
+
+ static constexpr auto RENDER_PASS_CREATE_INFO = VkRenderPassCreateInfo{
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkRenderPassCreateFlags{}, // flags
+ deUint32{1u}, // attachmentCount
+ &COLOR_ATTACHMENT, // pAttachments
+ deUint32{1u}, // subpassCount
+ &SUBPASS, // pSubpasses
+ deUint32{0u}, // dependencyCount
+ DE_NULL // pDependencies
+ };
+
+ return createRenderPass(vk, device, &RENDER_PASS_CREATE_INFO);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Initialize shader programs
+ *//*--------------------------------------------------------------------*/
+void initPrograms(SourceCollections& dst, const TestParams&)
+{
+ using ::glu::FragmentSource;
+ using ::glu::VertexSource;
+
+ // Vertex Shader
+ static const StringTemplate VS_TEXT = {"#version 310 es\n"
+ "layout(location = 0) in vec4 position;\n"
+ "layout(location = 0) out vec3 vertColor;\n"
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = position;\n"
+ " vertColor = vec3(${0}, ${1}, ${2});\n"
+ "}\n"};
+
+ // Fragment Shader
+ static const StringTemplate FS_TEXT = {"#version 310 es\n"
+ "precision highp float;\n"
+ "layout(location = 0) in vec3 vertColor;\n"
+ "layout(location = 0) out vec4 outColor;\n"
+ "void main (void)\n"
+ "{\n"
+ " const vec3 fragColor = vec3(${0}, ${1}, ${2});\n"
+ " outColor = vec4((fragColor + vertColor) * 0.5, 1.0);\n"
+ "}\n"};
+
+ dst.glslSources.add("vertex") << VertexSource{VS_TEXT.format(randomFloat(), randomFloat(), randomFloat())};
+ dst.glslSources.add("fragment") << FragmentSource{FS_TEXT.format(randomFloat(), randomFloat(), randomFloat())};
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief return both result and elapsed time from pipeline creation
+ *//*--------------------------------------------------------------------*/
+template <typename create_infos_t, typename pipelines_t>
+TimedResult timePipelineCreation(const DeviceInterface& vk,
+ const VkDevice device,
+ const VkPipelineCache cache,
+ const create_infos_t& createInfos,
+ pipelines_t& pipelines,
+ const VkAllocationCallbacks* pAllocator = DE_NULL)
+{
+ DE_ASSERT(createInfos.size() <= pipelines.size());
+
+ const auto timeStart = high_resolution_clock::now();
+ const auto result = vk.createGraphicsPipelines(
+ device, cache, static_cast<deUint32>(createInfos.size()), createInfos.data(), pAllocator, pipelines.data());
+ const auto elapsed = high_resolution_clock::now() - timeStart;
+ return {result, elapsed};
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Test instance function
+ *//*--------------------------------------------------------------------*/
+TestStatus testInstance(Context& context, const TestParams& testParameter)
+{
+ const auto& vk = context.getDeviceInterface();
+ const auto device = context.getDevice();
+ const auto pipelineCache = createPipelineCache(vk, device, testParameter);
+ const auto layout = createPipelineLayout(vk, device, testParameter);
+ const auto renderPass = createRenderPass(vk, device, testParameter);
+ const auto modules = createShaderModules(vk, device, context.getBinaryCollection(), {"vertex", "fragment"});
+ const auto shaderStages = createShaderStages(modules, {VK_SHADER_STAGE_VERTEX_BIT, VK_SHADER_STAGE_FRAGMENT_BIT});
+
+ // Placeholder for base pipeline if using cacheType == DERIVATIVE_HANDLE
+ auto basePipeline = UniquePipeline{};
+
+ auto baseCreateInfo = getPipelineCreateInfoCommon();
+ baseCreateInfo.layout = layout.get();
+ baseCreateInfo.renderPass = renderPass.get();
+ baseCreateInfo.stageCount = static_cast<deUint32>(shaderStages.size());
+ baseCreateInfo.pStages = shaderStages.data();
+
+ auto results = vector<VkResult>{};
+ results.reserve(testParameter.iterations.size());
+
+ for (const auto& i : testParameter.iterations)
+ {
+ const auto createInfos = createPipelineCreateInfos(i, baseCreateInfo, basePipeline.get(), testParameter);
+ auto created = vector<VkPipeline>{};
+ created.resize(createInfos.size());
+
+ const auto timedResult = timePipelineCreation(vk, device, pipelineCache.get(), createInfos, created);
+ auto pipelines = wrapHandles(vk, device, created);
+
+ const auto status = validateResults(timedResult.result, pipelines, timedResult.elapsed, i.validators);
+ if (status.getCode() != QP_TEST_RESULT_PASS)
+ {
+ return status;
+ }
+
+ if ((testParameter.cacheType == TestParams::DERIVATIVE_HANDLE) && (*basePipeline == VK_NULL_HANDLE))
+ {
+ for (auto& pipeline : pipelines)
+ {
+ if (*pipeline != VK_NULL_HANDLE)
+ {
+ basePipeline = pipeline;
+ break;
+ }
+ }
+ }
+
+ results.push_back(timedResult.result);
+ }
+
+ static const StringTemplate PASS_MSG = {"Test Passed. ${0}"};
+ return TestStatus::pass(PASS_MSG.format(getResultsString(results)));
+}
+
+} // namespace graphics_tests
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Compute pipeline specific testing
+ *//*--------------------------------------------------------------------*/
+namespace compute_tests
+{
+using namespace test_common;
+
+/*--------------------------------------------------------------------*//*!
+ * \brief create VkComputePipelineCreateInfo structs from test iteration
+ *//*--------------------------------------------------------------------*/
+vector<VkComputePipelineCreateInfo> createPipelineCreateInfos(const TestParams::Iteration& iteration,
+ const VkComputePipelineCreateInfo& base,
+ VkPipeline basePipeline,
+ const TestParams& testParameter)
+{
+ auto output = vector<VkComputePipelineCreateInfo>{};
+ output.reserve(iteration.variants.size());
+
+ deInt32 count = 0;
+ deInt32 basePipelineIndex = -1;
+
+ for (VkPipelineCreateFlags flags : iteration.variants)
+ {
+ const auto curIndex = count++;
+ auto createInfo = base;
+
+ if (testParameter.cacheType == TestParams::DERIVATIVE_INDEX)
+ {
+ if (flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT)
+ {
+ if (basePipelineIndex != -1)
+ {
+ flags |= VK_PIPELINE_CREATE_DERIVATIVE_BIT;
+ }
+ }
+ else
+ {
+ flags |= VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT;
+
+ if (basePipelineIndex == -1)
+ {
+ basePipelineIndex = curIndex;
+ }
+ }
+ }
+
+ createInfo.flags = flags;
+ createInfo.basePipelineHandle = basePipeline;
+ createInfo.basePipelineIndex = basePipelineIndex;
+
+ output.push_back(createInfo);
+ }
+
+ return output;
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief create compute descriptor set layout
+ *//*--------------------------------------------------------------------*/
+Move<VkDescriptorSetLayout> createDescriptorSetLayout(const DeviceInterface& vk, VkDevice device, const TestParams&)
+{
+ static constexpr auto DESCRIPTOR_SET_LAYOUT_BINDING = VkDescriptorSetLayoutBinding{
+ deUint32{0u}, // binding
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // descriptorType
+ deUint32{1u}, // descriptorCount
+ VK_SHADER_STAGE_COMPUTE_BIT, // stageFlags
+ DE_NULL // pImmutableSamplers
+ };
+
+ static constexpr auto DESCRIPTOR_SET_LAYOUT_CREATE_INFO = VkDescriptorSetLayoutCreateInfo{
+ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkDescriptorSetLayoutCreateFlags{}, // flags
+ deUint32{1u}, // bindingCount
+ &DESCRIPTOR_SET_LAYOUT_BINDING // pBindings
+ };
+
+ return createDescriptorSetLayout(vk, device, &DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Initialize shader programs
+ *//*--------------------------------------------------------------------*/
+void initPrograms(SourceCollections& dst, const TestParams&)
+{
+ using ::glu::ComputeSource;
+
+ static const StringTemplate CS_TEXT = {"#version 450\n"
+ "precision highp float;\n"
+ "layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;\n"
+ "layout (std140, binding = 0) buffer buf { vec3 data[]; };\n"
+ "void main (void)\n"
+ "{\n"
+ " data[gl_GlobalInvocationID.x] = vec3(${0}, ${1}, ${2});\n"
+ "}\n"};
+
+ dst.glslSources.add("compute")
+ << ComputeSource{CS_TEXT.format(randomFloat(), randomFloat(), randomFloat())};
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief return both result and elapsed time from pipeline creation
+ *//*--------------------------------------------------------------------*/
+template <typename create_infos_t, typename pipelines_t>
+TimedResult timePipelineCreation(const DeviceInterface& vk,
+ const VkDevice device,
+ const VkPipelineCache cache,
+ const create_infos_t& createInfos,
+ pipelines_t& pipelines,
+ const VkAllocationCallbacks* pAllocator = DE_NULL)
+{
+ DE_ASSERT(createInfos.size() <= pipelines.size());
+
+ const auto timeStart = high_resolution_clock::now();
+ const auto result = vk.createComputePipelines(
+ device, cache, static_cast<deUint32>(createInfos.size()), createInfos.data(), pAllocator, pipelines.data());
+ const auto elapsed = high_resolution_clock::now() - timeStart;
+ return {result, elapsed};
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Test instance function
+ *//*--------------------------------------------------------------------*/
+TestStatus testInstance(Context& context, const TestParams& testParameter)
+{
+ const auto& vk = context.getDeviceInterface();
+ const auto device = context.getDevice();
+ const auto pipelineCache = createPipelineCache(vk, device, testParameter);
+ const auto descriptorSetLayout = createDescriptorSetLayout(vk, device, testParameter);
+ const auto pipelineLayout = createPipelineLayout(vk, device, {descriptorSetLayout.get()}, testParameter);
+ const auto modules = createShaderModules(vk, device, context.getBinaryCollection(), {"compute"});
+ const auto shaderStages = createShaderStages(modules, {VK_SHADER_STAGE_COMPUTE_BIT});
+
+ // Placeholder for base pipeline if using cacheType == DERIVATIVE_HANDLE
+ auto basePipeline = UniquePipeline{};
+
+ const auto baseCreateInfo = VkComputePipelineCreateInfo{
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // sType
+ DE_NULL, // pNext
+ VkPipelineCreateFlags{}, // flags
+ shaderStages[0], // stage
+ pipelineLayout.get(), // layout
+ VK_NULL_HANDLE, // basePipelineHandle
+ deInt32{-1} // basePipelineIndex
+ };
+
+ auto results = vector<VkResult>{};
+ results.reserve(testParameter.iterations.size());
+
+ for (const auto& i : testParameter.iterations)
+ {
+ const auto createInfos = createPipelineCreateInfos(i, baseCreateInfo, basePipeline.get(), testParameter);
+ auto created = vector<VkPipeline>{};
+ created.resize(createInfos.size());
+
+ const auto timedResult = timePipelineCreation(vk, device, pipelineCache.get(), createInfos, created);
+ auto pipelines = wrapHandles(vk, device, created);
+
+ const auto status = validateResults(timedResult.result, pipelines, timedResult.elapsed, i.validators);
+ if (status.getCode() != QP_TEST_RESULT_PASS)
+ {
+ return status;
+ }
+
+ if ((testParameter.cacheType == TestParams::DERIVATIVE_HANDLE) && (*basePipeline == VK_NULL_HANDLE))
+ {
+ for (auto& pipeline : pipelines)
+ {
+ if (*pipeline != VK_NULL_HANDLE)
+ {
+ basePipeline = pipeline;
+ break;
+ }
+ }
+ }
+
+ results.push_back(timedResult.result);
+ }
+
+ static const StringTemplate PASS_MSG = {"Test Passed. ${0}"};
+ return TestStatus::pass(PASS_MSG.format(getResultsString(results)));
+}
+
+} // namespace compute_tests
+
+using namespace test_common;
+
+// Disable formatting on this next block for readability
+// clang-format off
+/*--------------------------------------------------------------------*//*!
+ * \brief Duplicate single pipeline recreation with explicit caching
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams DUPLICATE_SINGLE_RECREATE_EXPLICIT_CACHING =
+{
+ "duplicate_single_recreate_explicit_caching",
+ "Duplicate single pipeline recreation with explicit caching",
+ TestParams::EXPLICIT_CACHE,
+ TestParams::IterationArray
+ {
+ TestParams::Iteration{
+ // Iteration [0]: Force compilation of pipeline
+ TestParams::Iteration::SINGLE_NORMAL,
+ ValidatorArray{
+ // Fail if result is not VK_SUCCESS
+ checkResult<VK_SUCCESS>,
+ // Fail if pipeline is not valid
+ checkPipelineMustBeValid<0>
+ }
+ },
+ TestParams::Iteration{
+ // Iteration [1]: Request compilation of same pipeline without compile
+ TestParams::Iteration::SINGLE_NOCOMPILE,
+ ValidatorArray{
+ // Warn if result is not VK_SUCCESS
+ checkResult<VK_SUCCESS, QP_TEST_RESULT_COMPATIBILITY_WARNING>,
+ // Warn if pipeline is not valid
+ checkPipelineMustBeValid<0, QP_TEST_RESULT_COMPATIBILITY_WARNING>,
+ // Warn if pipeline took too long
+ checkElapsedTime<ELAPSED_TIME_FAST, QP_TEST_RESULT_QUALITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Duplicate single pipeline recreation with no explicit cache
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams DUPLICATE_SINGLE_RECREATE_NO_CACHING =
+{
+ "duplicate_single_recreate_no_caching",
+ "Duplicate single pipeline recreation with no explicit cache",
+ TestParams::NO_CACHE,
+ TestParams::IterationArray{
+ TestParams::Iteration{
+ // Iteration [0]: Force compilation of pipeline
+ TestParams::Iteration::SINGLE_NORMAL,
+ ValidatorArray{
+ // Fail if result is not VK_SUCCESS
+ checkResult<VK_SUCCESS>,
+ // Fail if pipeline is not valid
+ checkPipelineMustBeValid<0>
+ }
+ },
+ TestParams::Iteration{
+ // Iteration [1]: Request compilation of same pipeline without compile
+ TestParams::Iteration::SINGLE_NOCOMPILE,
+ ValidatorArray{
+ // Warn if pipeline took too long
+ checkElapsedTime<ELAPSED_TIME_FAST, QP_TEST_RESULT_QUALITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Duplicate single pipeline recreation using derivative pipelines
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams DUPLICATE_SINGLE_RECREATE_DERIVATIVE =
+{
+ "duplicate_single_recreate_derivative",
+ "Duplicate single pipeline recreation using derivative pipelines",
+ TestParams::DERIVATIVE_HANDLE,
+ TestParams::IterationArray{
+ TestParams::Iteration{
+ // Iteration [0]: Force compilation of pipeline
+ TestParams::Iteration::SINGLE_NORMAL,
+ ValidatorArray{
+ // Fail if result is not VK_SUCCESS
+ checkResult<VK_SUCCESS>,
+ // Fail if pipeline is not valid
+ checkPipelineMustBeValid<0>
+ }
+ },
+ TestParams::Iteration{
+ // Iteration [1]: Request compilation of same pipeline without compile
+ TestParams::Iteration::SINGLE_NOCOMPILE,
+ ValidatorArray{
+ // Warn if pipeline took too long
+ checkElapsedTime<ELAPSED_TIME_FAST, QP_TEST_RESULT_QUALITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Single creation of never before seen pipeline without compile
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams SINGLE_PIPELINE_NO_COMPILE =
+{
+ "single_pipeline_no_compile",
+ "Single creation of never before seen pipeline without compile",
+ TestParams::NO_CACHE,
+ TestParams::IterationArray{
+ TestParams::Iteration{
+ TestParams::Iteration::SINGLE_NOCOMPILE,
+ ValidatorArray{
+ // Warn if pipeline took too long
+ checkElapsedTime<ELAPSED_TIME_IMMEDIATE, QP_TEST_RESULT_QUALITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Batch creation of duplicate pipelines with explicit caching
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams DUPLICATE_BATCH_PIPELINES_EXPLICIT_CACHE =
+{
+ "duplicate_batch_pipelines_explicit_cache",
+ "Batch creation of duplicate pipelines with explicit caching",
+ TestParams::EXPLICIT_CACHE,
+ TestParams::IterationArray{
+ TestParams::Iteration{
+ TestParams::Iteration::BATCH_NOCOMPILE_COMPILE_NOCOMPILE,
+ ValidatorArray{
+ // Fail if pipeline[1] is not valid
+ checkPipelineMustBeValid<1>,
+ // Warn if result is not VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT
+ checkResult<VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT, QP_TEST_RESULT_COMPATIBILITY_WARNING>,
+ // Warn if pipelines[0] is not VK_NULL_HANDLE
+ checkPipelineMustBeNull<0, QP_TEST_RESULT_COMPATIBILITY_WARNING>,
+ // Warn if pipelines[2] is not valid
+ checkPipelineMustBeValid<2, QP_TEST_RESULT_COMPATIBILITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Batch creation of duplicate pipelines with no caching
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams DUPLICATE_BATCH_PIPELINES_NO_CACHE =
+{
+ "duplicate_batch_pipelines_no_cache",
+ "Batch creation of duplicate pipelines with no caching",
+ TestParams::EXPLICIT_CACHE,
+ TestParams::IterationArray{
+ TestParams::Iteration{
+ TestParams::Iteration::BATCH_NOCOMPILE_COMPILE_NOCOMPILE,
+ ValidatorArray{
+ // Fail if pipeline[1] is not valid
+ checkPipelineMustBeValid<1>,
+ // Warn if result is not VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT
+ checkResult<VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT, QP_TEST_RESULT_COMPATIBILITY_WARNING>,
+ // Warn if pipelines[0] is not VK_NULL_HANDLE
+ checkPipelineMustBeNull<0, QP_TEST_RESULT_COMPATIBILITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Batch creation of duplicate pipelines with derivative pipeline index
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams DUPLICATE_BATCH_PIPELINES_DERIVATIVE_INDEX =
+{
+ "duplicate_batch_pipelines_derivative_index",
+ "Batch creation of duplicate pipelines with derivative pipeline index",
+ TestParams::DERIVATIVE_INDEX,
+ TestParams::IterationArray{
+ TestParams::Iteration{
+ TestParams::Iteration::BATCH_NOCOMPILE_COMPILE_NOCOMPILE,
+ ValidatorArray{
+ // Fail if pipeline[1] is not valid
+ checkPipelineMustBeValid<1>,
+ // Warn if result is not VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT
+ checkResult<VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT, QP_TEST_RESULT_COMPATIBILITY_WARNING>,
+ // Warn if pipelines[0] is not VK_NULL_HANDLE
+ checkPipelineMustBeNull<0, QP_TEST_RESULT_COMPATIBILITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Batch creation of pipelines with early return
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams BATCH_PIPELINES_EARLY_RETURN =
+{
+ "batch_pipelines_early_return",
+ "Batch creation of pipelines with early return",
+ TestParams::NO_CACHE,
+ TestParams::IterationArray{
+ TestParams::Iteration{
+ TestParams::Iteration::BATCH_RETURN_COMPILE_NOCOMPILE,
+ ValidatorArray{
+ // fail if a valid pipeline follows the early-return failure
+ checkPipelineNullAfterIndex<0>,
+ // Warn if return was not immediate
+ checkElapsedTime<ELAPSED_TIME_IMMEDIATE, QP_TEST_RESULT_QUALITY_WARNING>,
+ // Warn if pipelines[0] is not VK_NULL_HANDLE
+ checkPipelineMustBeNull<0, QP_TEST_RESULT_COMPATIBILITY_WARNING>,
+ // Warn if result is not VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT
+ checkResult<VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT, QP_TEST_RESULT_COMPATIBILITY_WARNING>
+ }
+ }
+ }
+};
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Full array of test cases
+ *//*--------------------------------------------------------------------*/
+static constexpr TestParams TEST_CASES[] =
+{
+ SINGLE_PIPELINE_NO_COMPILE,
+ BATCH_PIPELINES_EARLY_RETURN,
+ DUPLICATE_SINGLE_RECREATE_EXPLICIT_CACHING,
+ DUPLICATE_SINGLE_RECREATE_NO_CACHING,
+ DUPLICATE_SINGLE_RECREATE_DERIVATIVE,
+ DUPLICATE_BATCH_PIPELINES_EXPLICIT_CACHE,
+ DUPLICATE_BATCH_PIPELINES_NO_CACHE,
+ DUPLICATE_BATCH_PIPELINES_DERIVATIVE_INDEX
+};
+// clang-format on
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Variadic version of de::newMovePtr
+ *//*--------------------------------------------------------------------*/
+template <typename T, typename... args_t>
+inline de::MovePtr<T> newMovePtr(args_t&&... args)
+{
+ return de::MovePtr<T>(new T(::std::forward<args_t>(args)...));
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Make test group consisting of graphics pipeline tests
+ *//*--------------------------------------------------------------------*/
+void addGraphicsPipelineTests(TestCaseGroup& group)
+{
+ using namespace graphics_tests;
+
+ auto tests = newMovePtr<TestCaseGroup>(
+ group.getTestContext(), "graphics_pipelines", "Test pipeline creation cache control with graphics pipelines");
+
+ for (const auto& params : TEST_CASES)
+ {
+ addFunctionCaseWithPrograms<const TestParams&>(
+ tests.get(), params.name, params.description, checkSupport, initPrograms, testInstance, params);
+ }
+
+ group.addChild(tests.release());
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Make test group consisting of compute pipeline tests
+ *//*--------------------------------------------------------------------*/
+void addComputePipelineTests(TestCaseGroup& group)
+{
+ using namespace compute_tests;
+
+ auto tests = newMovePtr<TestCaseGroup>(
+ group.getTestContext(), "compute_pipelines", "Test pipeline creation cache control with compute pipelines");
+
+ for (const auto& params : TEST_CASES)
+ {
+ addFunctionCaseWithPrograms<const TestParams&>(
+ tests.get(), params.name, params.description, checkSupport, initPrograms, testInstance, params);
+ }
+
+ group.addChild(tests.release());
+}
+
+} // namespace
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Make pipeline creation cache control test group
+ *//*--------------------------------------------------------------------*/
+TestCaseGroup* createCacheControlTests(TestContext& testCtx)
+{
+ auto tests = newMovePtr<TestCaseGroup>(testCtx, "creation_cache_control", "pipeline creation cache control tests");
+
+ addGraphicsPipelineTests(*tests);
+ addComputePipelineTests(*tests);
+
+ return tests.release();
+}
+
+} // namespace pipeline
+
+} // namespace vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationCacheControlTests.hpp
similarity index 68%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationCacheControlTests.hpp
index 1a85ebf..c10707a 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineCreationCacheControlTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTPIPELINECREATIONCACHECONTROLTESTS_HPP
+#define _VKTPIPELINECREATIONCACHECONTROLTESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020, Advanced Micro Devices, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,20 +21,19 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Pipeline Creation Cache Control Tests
*//*--------------------------------------------------------------------*/
-#include "tcuDefs.hpp"
-#include "tcuTestCase.hpp"
+#include "vktTestCase.hpp"
namespace vkt
{
namespace pipeline
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createCacheControlTests (tcu::TestContext& testCtx);
} // pipeline
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTPIPELINECREATIONCACHECONTROLTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp
index f8bb349..9f10947 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp
@@ -67,12 +67,18 @@
return (value ? VK_TRUE : VK_FALSE);
}
+// Test versions
+constexpr deUint32 TEST_VERSION_extended_dynamic_state = 1;
+constexpr deUint32 TEST_VERSION_vertex_input_dynamic_state = 2;
+constexpr deUint32 TEST_VERSION_extended_dynamic_state2 = 3;
+
// Framebuffer size.
constexpr deUint32 kFramebufferWidth = 64u;
constexpr deUint32 kFramebufferHeight = 64u;
// Image formats.
constexpr vk::VkFormat kColorFormat = vk::VK_FORMAT_R8G8B8A8_UNORM;
+constexpr vk::VkFormat kIntColorFormat = vk::VK_FORMAT_R8G8B8A8_UINT;
const tcu::Vec4 kColorThreshold (0.005f); // 1/255 < 0.005 < 2/255.
struct DepthStencilFormat
@@ -87,21 +93,165 @@
{ vk::VK_FORMAT_D24_UNORM_S8_UINT, 1.0e-07f }, // 1/(2**24-1) < 1.0e-07f < 2/(2**24-1)
};
-// Vertices in buffers will have 2 components and a padding to properly test the stride.
-struct GeometryVertex
+// We will use several data types in vertex bindings. Each type will need to define a few things.
+class GeometryVertex
{
+public:
+ // For GLSL.
+
+ // Vertex input attribute declarations in GLSL form. One sentence per element.
+ virtual std::vector<std::string> getAttributeDeclarations() const = 0;
+
+ // Get statements to calculate a vec2 called "vertexCoords" using the vertex input attributes.
+ virtual std::vector<std::string> getVertexCoordCalc() const = 0;
+
+
+ // For the pipeline.
+
+ // Vertex attributes for VkPipelineVertexInputStateCreateInfo.
+ virtual std::vector<vk::VkVertexInputAttributeDescription> getAttributeDescriptions(deUint32 offset) const = 0;
+
+ // Size of each vertex.
+ virtual size_t getVertexDataSize() const = 0;
+
+ // Array of bytes containing vertex data. .size() should match getVertexDataSize().
+ virtual std::vector<deUint8> getVertexData() const = 0;
+
+ // Offset to the coords data.
+ virtual size_t getCoordsOffset() const = 0;
+
+ // Offset to the padding data.
+ virtual size_t getPaddingOffset() const = 0;
+};
+
+// Vertices in buffers will have 2 components and a padding to properly test the stride.
+// This is the vertex type that will be used normally.
+class VertexWithPadding : public GeometryVertex
+{
+protected:
tcu::Vec2 coords;
tcu::Vec2 padding;
- GeometryVertex (const tcu::Vec2& coords_)
+public:
+ VertexWithPadding (const tcu::Vec2& coords_)
: coords (coords_)
- , padding (0.0f)
+ , padding (0.0f, 0.0f)
+ {}
+
+ virtual std::vector<std::string> getAttributeDeclarations() const override
{
+ std::vector<std::string> declarations;
+ declarations.push_back("layout(location=0) in vec2 position;");
+ return declarations;
+ }
+
+ virtual std::vector<std::string> getVertexCoordCalc() const override
+ {
+ std::vector<std::string> statements;
+ statements.push_back("vec2 vertexCoords = position;");
+ return statements;
+ }
+
+ virtual std::vector<vk::VkVertexInputAttributeDescription> getAttributeDescriptions(deUint32 offset) const override
+ {
+ std::vector<vk::VkVertexInputAttributeDescription> descriptions;
+ descriptions.push_back(vk::makeVertexInputAttributeDescription(0u, 0u, vk::VK_FORMAT_R32G32_SFLOAT, offset));
+ return descriptions;
+ }
+
+ virtual size_t getVertexDataSize() const override
+ {
+ return sizeof(coords) + sizeof(padding);
+ }
+
+ virtual std::vector<deUint8> getVertexData() const override
+ {
+ const auto dataSize = getVertexDataSize();
+ std::vector<deUint8> vertexData (dataSize);
+
+ deMemcpy(&vertexData[0], &coords, sizeof(coords));
+ deMemcpy(&vertexData[sizeof(coords)], &padding, sizeof(padding));
+ return vertexData;
+ }
+
+ virtual size_t getCoordsOffset() const override
+ {
+ return 0;
+ }
+
+ virtual size_t getPaddingOffset() const override
+ {
+ return sizeof coords;
}
};
-constexpr auto kVertexStride = static_cast<vk::VkDeviceSize>(sizeof(GeometryVertex));
-constexpr auto kCoordsSize = static_cast<vk::VkDeviceSize>(sizeof(GeometryVertex::coords));
+class VertexWithExtraAttributes : public GeometryVertex
+{
+protected:
+ tcu::Vec2 coords;
+ tcu::Vec2 padding[10];
+ tcu::Vec2 ones;
+
+public:
+ VertexWithExtraAttributes (const tcu::Vec2& coords_)
+ : coords (coords_)
+ , ones (1.0f, 1.0f)
+ {
+ deMemset(padding, 0, sizeof(padding));
+ }
+
+ virtual std::vector<std::string> getAttributeDeclarations() const override
+ {
+ std::vector<std::string> declarations;
+ declarations.push_back("layout(location=0) in vec2 position;");
+ declarations.push_back("layout(location=1) in vec2 ones;");
+ return declarations;
+ }
+
+ virtual std::vector<std::string> getVertexCoordCalc() const override
+ {
+ std::vector<std::string> statements;
+ statements.push_back("vec2 vertexCoords = position;");
+ statements.push_back("vertexCoords = vertexCoords * ones;");
+ return statements;
+ }
+
+ virtual std::vector<vk::VkVertexInputAttributeDescription> getAttributeDescriptions(deUint32 offset) const override
+ {
+ std::vector<vk::VkVertexInputAttributeDescription> descriptions;
+ descriptions.push_back(vk::makeVertexInputAttributeDescription(0u, 0u, vk::VK_FORMAT_R32G32_SFLOAT, offset));
+ descriptions.push_back(vk::makeVertexInputAttributeDescription(1u, 0u, vk::VK_FORMAT_R32G32_SFLOAT, static_cast<deUint32>(sizeof(coords) + sizeof(padding))));
+ return descriptions;
+ }
+
+ virtual size_t getVertexDataSize() const override
+ {
+ return sizeof(coords) + sizeof(padding) + sizeof(ones);
+ }
+
+ virtual std::vector<deUint8> getVertexData() const override
+ {
+ const auto dataSize = getVertexDataSize();
+ std::vector<deUint8> vertexData (dataSize);
+
+ deMemcpy(&vertexData[0], &coords, sizeof(coords));
+ deMemcpy(&vertexData[sizeof(coords)], &padding, sizeof(padding));
+ deMemcpy(&vertexData[sizeof(coords) + sizeof(padding)], &ones, sizeof(ones));
+ return vertexData;
+ }
+
+ virtual size_t getCoordsOffset() const override
+ {
+ return 0;
+ }
+
+ virtual size_t getPaddingOffset() const override
+ {
+ return sizeof coords;
+ }
+};
+
+constexpr auto kCoordsSize = static_cast<vk::VkDeviceSize>(sizeof(tcu::Vec2));
// Stencil Operation parameters, as used in vkCmdSetStencilOpEXT().
struct StencilOpParams
@@ -172,9 +322,17 @@
using DepthBoundsTestEnableConfig = BooleanFlagConfig;
using StencilTestEnableConfig = BooleanFlagConfig;
using StencilOpConfig = StaticAndDynamicPair<StencilOpVec>; // At least one element.
+using VertexInputConfig = StaticAndDynamicPair<deUint32>;
+using DepthBiasEnableConfig = BooleanFlagConfig;
+using RastDiscardEnableConfig = BooleanFlagConfig;
+using PrimRestartEnableConfig = BooleanFlagConfig;
+using LogicOpConfig = StaticAndDynamicPair<vk::VkLogicOp>;
+using PatchControlPointsConfig = StaticAndDynamicPair<deUint8>;
const tcu::Vec4 kDefaultTriangleColor (0.0f, 0.0f, 1.0f, 1.0f); // Opaque blue.
const tcu::Vec4 kDefaultClearColor (0.0f, 0.0f, 0.0f, 1.0f); // Opaque black.
+const tcu::Vec4 kGreenClearColor (0.0f, 1.0f, 0.0f, 1.0f); // Opaque green.
+const tcu::Vec4 kCyanColor (0.0f, 1.0f, 1.0f, 1.0f); // Opaque cyan
struct MeshParams
{
@@ -267,6 +425,18 @@
const tcu::Vec4 m_bottom;
};
+using VertexFactory = de::MovePtr<GeometryVertex> (*)(const tcu::Vec2&);
+
+de::MovePtr<GeometryVertex> getVertexWithPadding(const tcu::Vec2& coords)
+{
+ return de::MovePtr<GeometryVertex>(new VertexWithPadding(coords));
+}
+
+de::MovePtr<GeometryVertex> getVertexWithExtraAttributes(const tcu::Vec2& coords)
+{
+ return de::MovePtr<GeometryVertex>(new VertexWithExtraAttributes(coords));
+}
+
struct TestConfig
{
// Main sequence ordering.
@@ -293,6 +463,23 @@
// Force inclusion of passthrough geometry shader or not.
bool forceGeometryShader;
+ // Version 1 = VK_EXT_extended_dynamic_state
+ // Version 2 = VK_EXT_vertex_input_dynamic_state
+ // Version 3 = VK_EXT_extended_dynamic_state2
+ deUint32 testExtendedDynamicStateVersion;
+
+ // For VK_EXT_extended_dynamic_state2
+ bool testExtendedDynamicState2LogicOp;
+ bool testExtendedDynamicState2PatchControlPoints;
+
+ // Use index buffer for rendering
+ bool useIndexBuffer;
+
+ bool useTessellation;
+
+ // Vertex factory function.
+ VertexFactory vertexFactory;
+
// Offset and extra room after the vertex buffer data.
vk::VkDeviceSize vertexDataOffset;
vk::VkDeviceSize vertexDataExtraBytes;
@@ -310,9 +497,15 @@
DepthBoundsTestEnableConfig depthBoundsTestEnableConfig;
StencilTestEnableConfig stencilTestEnableConfig;
StencilOpConfig stencilOpConfig;
+ VertexInputConfig vertexInputConfig;
+ DepthBiasEnableConfig depthBiasEnableConfig;
+ RastDiscardEnableConfig rastDiscardEnableConfig;
+ PrimRestartEnableConfig primRestartEnableConfig;
+ LogicOpConfig logicOpConfig;
+ PatchControlPointsConfig patchControlPointsConfig;
// Sane defaults.
- TestConfig (SequenceOrdering ordering)
+ TestConfig (SequenceOrdering ordering, VertexFactory vertexFactory_ = getVertexWithPadding)
: sequenceOrdering (ordering)
, meshParams (1u, MeshParams())
, referenceStencil (0u)
@@ -325,6 +518,12 @@
, minDepthBounds (0.0f)
, maxDepthBounds (1.0f)
, forceGeometryShader (false)
+ , testExtendedDynamicStateVersion(TEST_VERSION_extended_dynamic_state)
+ , testExtendedDynamicState2LogicOp(false)
+ , testExtendedDynamicState2PatchControlPoints(false)
+ , useIndexBuffer (false)
+ , useTessellation (false)
+ , vertexFactory (vertexFactory_)
, vertexDataOffset (0ull)
, vertexDataExtraBytes (0ull)
, cullModeConfig (static_cast<vk::VkCullModeFlags>(vk::VK_CULL_MODE_NONE))
@@ -333,13 +532,20 @@
, topologyConfig (vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN)
, viewportConfig (ViewportVec(1u, vk::makeViewport(kFramebufferWidth, kFramebufferHeight)))
, scissorConfig (ScissorVec(1u, vk::makeRect2D(kFramebufferWidth, kFramebufferHeight)))
- , strideConfig (kVertexStride)
+ // By default, the vertex stride is the size of a vertex according to the chosen vertex type.
+ , strideConfig (static_cast<vk::VkDeviceSize>(vertexFactory(tcu::Vec2(0.0f, 0.0f))->getVertexDataSize()))
, depthTestEnableConfig (false)
, depthWriteEnableConfig (false)
, depthCompareOpConfig (vk::VK_COMPARE_OP_NEVER)
, depthBoundsTestEnableConfig (false)
, stencilTestEnableConfig (false)
, stencilOpConfig (StencilOpVec(1u, kDefaultStencilOpParams))
+ , vertexInputConfig (static_cast<deUint32>(vertexFactory(tcu::Vec2(0.0f, 0.0f))->getCoordsOffset()))
+ , depthBiasEnableConfig (false)
+ , rastDiscardEnableConfig (false)
+ , primRestartEnableConfig (false)
+ , logicOpConfig (vk::VK_LOGIC_OP_CLEAR)
+ , patchControlPointsConfig (1)
, m_swappedValues (false)
{
}
@@ -387,6 +593,12 @@
depthBoundsTestEnableConfig.swapValues();
stencilTestEnableConfig.swapValues();
stencilOpConfig.swapValues();
+ vertexInputConfig.swapValues();
+ depthBiasEnableConfig.swapValues();
+ rastDiscardEnableConfig.swapValues();
+ primRestartEnableConfig.swapValues();
+ logicOpConfig.swapValues();
+ patchControlPointsConfig.swapValues();
m_swappedValues = !m_swappedValues;
}
@@ -531,7 +743,8 @@
staticTopologyClass == getTopologyClass(testConfig.topologyConfig.dynamicValue.get()));
// Supported topology classes for these tests.
- DE_ASSERT(staticTopologyClass == TopologyClass::LINE || staticTopologyClass == TopologyClass::TRIANGLE);
+ DE_ASSERT(staticTopologyClass == TopologyClass::LINE || staticTopologyClass == TopologyClass::TRIANGLE
+ || staticTopologyClass == TopologyClass::PATCH);
}
void ExtendedDynamicStateTest::checkSupport (Context& context) const
@@ -539,22 +752,37 @@
const auto& vki = context.getInstanceInterface();
const auto physicalDevice = context.getPhysicalDevice();
- // This is always required.
- context.requireDeviceFunctionality("VK_EXT_extended_dynamic_state");
+ if (m_testConfig.testExtendedDynamicStateVersion == TEST_VERSION_extended_dynamic_state)
+ context.requireDeviceFunctionality("VK_EXT_extended_dynamic_state");
+
+ if (m_testConfig.testExtendedDynamicStateVersion == TEST_VERSION_vertex_input_dynamic_state)
+ context.requireDeviceFunctionality("VK_EXT_vertex_input_dynamic_state");
+
+ // Needed for extended state included as part of VK_EXT_extended_dynamic_state2
+ if (m_testConfig.testExtendedDynamicStateVersion == TEST_VERSION_extended_dynamic_state2) {
+ context.requireDeviceFunctionality("VK_EXT_extended_dynamic_state2");
+
+ const vk::VkPhysicalDeviceExtendedDynamicState2FeaturesEXT& extendedDynamicState2Features = context.getExtendedDynamicState2FeaturesEXT();
+
+ if (m_testConfig.testExtendedDynamicState2LogicOp && extendedDynamicState2Features.extendedDynamicState2LogicOp == DE_FALSE)
+ TCU_THROW(NotSupportedError, "VK_EXT_extended_dynamic_state2 : changing LogicOp dynamically is not supported");
+
+ if (m_testConfig.testExtendedDynamicState2PatchControlPoints && extendedDynamicState2Features.extendedDynamicState2PatchControlPoints == DE_FALSE)
+ TCU_THROW(NotSupportedError, "VK_EXT_extended_dynamic_state2 : changing patch control points dynamically is not supported");
+ }
// Check the number of viewports needed and the corresponding limits.
const auto& viewportConfig = m_testConfig.viewportConfig;
- auto numViews = viewportConfig.staticValue.size();
+ auto numViewports = viewportConfig.staticValue.size();
if (viewportConfig.dynamicValue)
- numViews = std::max(numViews, viewportConfig.dynamicValue.get().size());
+ numViewports = std::max(numViewports, viewportConfig.dynamicValue.get().size());
- if (numViews > 1)
+ if (numViewports > 1)
{
- context.requireDeviceFunctionality("VK_KHR_multiview");
const auto properties = vk::getPhysicalDeviceProperties(vki, physicalDevice);
- if (numViews > static_cast<decltype(numViews)>(properties.limits.maxViewports))
- TCU_THROW(NotSupportedError, "Number of viewports not supported (" + de::toString(numViews) + ")");
+ if (numViewports > static_cast<decltype(numViewports)>(properties.limits.maxViewports))
+ TCU_THROW(NotSupportedError, "Number of viewports not supported (" + de::toString(numViewports) + ")");
}
const auto& dbTestEnable = m_testConfig.depthBoundsTestEnableConfig;
@@ -570,11 +798,18 @@
// Check geometry shader support.
if (m_testConfig.needsGeometryShader() && !features.geometryShader)
TCU_THROW(NotSupportedError, "Geometry shader not supported");
+
+ // Check tessellation support
+ if (m_testConfig.useTessellation && !features.tessellationShader)
+ TCU_THROW(NotSupportedError, "Tessellation feature not supported");
}
// Check color image format support (depth/stencil will be chosen at runtime).
const vk::VkFormatFeatureFlags kColorFeatures = (vk::VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | vk::VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
- const auto colorProperties = vk::getPhysicalDeviceFormatProperties(vki, physicalDevice, kColorFormat);
+
+ // Pick int color format for logic op
+ vk::VkFormat colorFormat = m_testConfig.logicOpConfig.dynamicValue ? kIntColorFormat : kColorFormat;
+ const auto colorProperties = vk::getPhysicalDeviceFormatProperties(vki, physicalDevice, colorFormat);
if ((colorProperties.optimalTilingFeatures & kColorFeatures) != kColorFeatures)
TCU_THROW(NotSupportedError, "Required color image features not supported");
@@ -586,6 +821,8 @@
std::ostringstream vertSource;
std::ostringstream fragSource;
std::ostringstream geomSource;
+ std::ostringstream tescSource;
+ std::ostringstream teseSource;
pushSource
<< "layout(push_constant, std430) uniform PushConstantsBlock {\n"
@@ -600,16 +837,29 @@
;
const auto pushConstants = pushSource.str();
+ const auto dummyVertex = m_testConfig.vertexFactory(tcu::Vec2(0.0f, 0.0f));
+ const auto attribDecls = dummyVertex->getAttributeDeclarations();
+ const auto coordCalcs = dummyVertex->getVertexCoordCalc();
+ std::ostringstream attributes;
+ std::ostringstream calculations;
+
+ for (const auto& decl : attribDecls)
+ attributes << decl << "\n";
+
+ for (const auto& statement : coordCalcs)
+ calculations << " " << statement << "\n";
+
vertSource
<< "#version 450\n"
<< pushConstants
- << "layout(location=0) in vec2 position;\n"
+ << attributes.str()
<< "out gl_PerVertex\n"
<< "{\n"
<< " vec4 gl_Position;\n"
<< "};\n"
<< "void main() {\n"
- << " gl_Position = vec4(position.x * pushConstants.scaleX + pushConstants.offsetX, position.y * pushConstants.scaleY + pushConstants.offsetY, pushConstants.depthValue, 1.0);\n"
+ << calculations.str()
+ << " gl_Position = vec4(vertexCoords.x * pushConstants.scaleX + pushConstants.offsetX, vertexCoords.y * pushConstants.scaleY + pushConstants.offsetY, pushConstants.depthValue, 1.0);\n"
<< "}\n"
;
@@ -659,10 +909,46 @@
;
}
+ if (m_testConfig.useTessellation)
+ {
+ tescSource
+ << "#version 450\n"
+ << "#extension GL_EXT_tessellation_shader : require\n"
+ << "layout(vertices=3) out;\n"
+ << "in gl_PerVertex\n"
+ << "{\n"
+ << " vec4 gl_Position;\n"
+ << "} gl_in[];\n"
+ << "void main() {\n"
+ << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+ << " gl_TessLevelOuter[0] = 3.0;\n"
+ << " gl_TessLevelOuter[1] = 3.0;\n"
+ << " gl_TessLevelOuter[2] = 3.0;\n"
+ << " gl_TessLevelInner[0] = 3.0;\n"
+ << "}\n"
+ ;
+ teseSource
+ << "#version 450\n"
+ << "#extension GL_EXT_tessellation_shader : require\n"
+ << "layout(triangles) in;\n"
+ << "void main() {\n"
+ << " gl_Position = (gl_in[0].gl_Position * gl_TessCoord.x + \n"
+ << " gl_in[1].gl_Position * gl_TessCoord.y + \n"
+ << " gl_in[2].gl_Position * gl_TessCoord.z);\n"
+ << "}\n";
+ ;
+ }
+
+
programCollection.glslSources.add("vert") << glu::VertexSource(vertSource.str());
programCollection.glslSources.add("frag") << glu::FragmentSource(fragSource.str());
if (m_testConfig.needsGeometryShader())
programCollection.glslSources.add("geom") << glu::GeometrySource(geomSource.str());
+ if (m_testConfig.useTessellation)
+ {
+ programCollection.glslSources.add("tesc") << glu::TessellationControlSource(tescSource.str());
+ programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(teseSource.str());
+ }
}
TestInstance* ExtendedDynamicStateTest::createInstance (Context& context) const
@@ -710,6 +996,26 @@
vk::flushAlloc(vkd, device, alloc);
}
+std::vector<deUint8> concatenateVertexData(const std::vector<GeometryVertex*>& vertices)
+{
+ std::vector<deUint8> concatenatedData;
+
+ if (vertices.empty())
+ return concatenatedData;
+
+ const auto dataSize = vertices.size() * vertices[0]->getVertexDataSize();
+ concatenatedData.reserve(dataSize);
+
+ auto backInserter = std::back_inserter(concatenatedData);
+ for (const auto ptr : vertices)
+ {
+ const auto singleData = ptr->getVertexData();
+ std::copy(begin(singleData), end(singleData), backInserter);
+ }
+
+ return concatenatedData;
+}
+
// Sets values for dynamic states if needed according to the test configuration.
void setDynamicStates(const TestConfig& testConfig, const vk::DeviceInterface& vkd, vk::VkCommandBuffer cmdBuffer)
{
@@ -749,11 +1055,49 @@
if (testConfig.stencilTestEnableConfig.dynamicValue)
vkd.cmdSetStencilTestEnableEXT(cmdBuffer, makeVkBool32(testConfig.stencilTestEnableConfig.dynamicValue.get()));
+ if (testConfig.depthBiasEnableConfig.dynamicValue)
+ vkd.cmdSetDepthBiasEnableEXT(cmdBuffer, makeVkBool32(testConfig.depthBiasEnableConfig.dynamicValue.get()));
+
+ if (testConfig.rastDiscardEnableConfig.dynamicValue)
+ vkd.cmdSetRasterizerDiscardEnableEXT(cmdBuffer, makeVkBool32(testConfig.rastDiscardEnableConfig.dynamicValue.get()));
+
+ if (testConfig.primRestartEnableConfig.dynamicValue)
+ vkd.cmdSetPrimitiveRestartEnableEXT(cmdBuffer, makeVkBool32(testConfig.primRestartEnableConfig.dynamicValue.get()));
+
+ if (testConfig.logicOpConfig.dynamicValue)
+ vkd.cmdSetLogicOpEXT(cmdBuffer, testConfig.logicOpConfig.dynamicValue.get());
+
+ if (testConfig.patchControlPointsConfig.dynamicValue)
+ vkd.cmdSetPatchControlPointsEXT(cmdBuffer, testConfig.patchControlPointsConfig.dynamicValue.get());
+
if (testConfig.stencilOpConfig.dynamicValue)
{
for (const auto& params : testConfig.stencilOpConfig.dynamicValue.get())
vkd.cmdSetStencilOpEXT(cmdBuffer, params.faceMask, params.failOp, params.passOp, params.depthFailOp, params.compareOp);
}
+
+ if (testConfig.vertexInputConfig.dynamicValue)
+ {
+ const vk::VkVertexInputBindingDescription2EXT vertexBinding =
+ {
+ vk::VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT, // VkStructureType sType;
+ nullptr, // void* pNext;
+ 0u, // deUint32 binding;
+ static_cast<deUint32>(testConfig.strideConfig.staticValue), // deUint32 stride;
+ vk::VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate;
+ 1u, // deUint32 divisor;
+ };
+ const vk::VkVertexInputAttributeDescription2EXT vertexAttribute =
+ {
+ vk::VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT, // VkStructureType sType;
+ nullptr, // void* pNext;
+ 0u, // deUint32 location;
+ 0u, // deUint32 binding;
+ vk::VK_FORMAT_R32G32_SFLOAT, // VkFormat format;
+ static_cast<deUint32>(testConfig.vertexInputConfig.dynamicValue.get()), // deUint32 offset;
+ };
+ vkd.cmdSetVertexInputEXT(cmdBuffer, 1, &vertexBinding, 1, &vertexAttribute);
+ }
}
// Bind the appropriate vertex buffer with a dynamic stride if the test configuration needs a dynamic stride.
@@ -803,6 +1147,9 @@
const vk::VkImageUsageFlags kDSUsage = (vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
const vk::VkFormatFeatureFlags kDSFeatures = (vk::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | vk::VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
+ // Pick int color format for logic op
+ vk::VkFormat colorFormat = m_testConfig.logicOpConfig.dynamicValue ? kIntColorFormat : kColorFormat;
+
// Choose depth/stencil format.
const DepthStencilFormat* dsFormatInfo = nullptr;
@@ -836,7 +1183,7 @@
nullptr, // const void* pNext;
0u, // VkImageCreateFlags flags;
vk::VK_IMAGE_TYPE_2D, // VkImageType imageType;
- kColorFormat, // VkFormat format;
+ colorFormat, // VkFormat format;
kFramebufferExtent, // VkExtent3D extent;
1u, // deUint32 mipLevels;
1u, // deUint32 arrayLayers;
@@ -879,14 +1226,15 @@
ImageViewVec dsImageViews;
for (const auto& img : colorImages)
- colorImageViews.emplace_back(vk::makeImageView(vkd, device, img->get(), vk::VK_IMAGE_VIEW_TYPE_2D, kColorFormat, colorSubresourceRange));
+ colorImageViews.emplace_back(vk::makeImageView(vkd, device, img->get(), vk::VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresourceRange));
for (const auto& img : dsImages)
dsImageViews.emplace_back(vk::makeImageView(vkd, device, img->get(), vk::VK_IMAGE_VIEW_TYPE_2D, dsFormatInfo->imageFormat, dsSubresourceRange));
// Vertex buffer.
- const auto topologyClass = getTopologyClass(m_testConfig.topologyConfig.staticValue);
- std::vector<GeometryVertex> vertices;
+ const auto topologyClass = getTopologyClass(m_testConfig.topologyConfig.staticValue);
+ std::vector<de::MovePtr<GeometryVertex>> vertexPtrs;
+ std::vector<deUint32> indices{ 0, 1, 2, 3, 0xFFFFFFFF, 4, 5, 0, 3 };
if (topologyClass == TopologyClass::TRIANGLE)
{
@@ -903,12 +1251,22 @@
// | XXX |
// +-------+-------+
// 5 0 1
- vertices.push_back(GeometryVertex(tcu::Vec2( 0.0f, 1.0f)));
- vertices.push_back(GeometryVertex(tcu::Vec2( 1.0f, 1.0f)));
- vertices.push_back(GeometryVertex(tcu::Vec2( 1.0f, -1.0f)));
- vertices.push_back(GeometryVertex(tcu::Vec2( 0.0f, -1.0f)));
- vertices.push_back(GeometryVertex(tcu::Vec2(-1.0f, -1.0f)));
- vertices.push_back(GeometryVertex(tcu::Vec2(-1.0f, 1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2( 0.0f, 1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2( 1.0f, 1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2( 1.0f, -1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2( 0.0f, -1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(-1.0f, -1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(-1.0f, 1.0f)));
+ }
+ else if (topologyClass == TopologyClass::PATCH)
+ {
+ // 2 triangles making a quad
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(-1.0f, 1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(1.0f, 1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(1.0f, -1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(1.0f, -1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(-1.0f, -1.0f)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(-1.0f, 1.0f)));
}
else // TopologyClass::LINE
{
@@ -918,16 +1276,25 @@
{
// Offset of 0.5 pixels + one line per row from -1 to 1.
const float yCoord = (lineHeight / 2.0f) + lineHeight * static_cast<float>(rowIdx) - 1.0f;
- vertices.push_back(GeometryVertex(tcu::Vec2(-1.0f, yCoord)));
- vertices.push_back(GeometryVertex(tcu::Vec2(-0.5f, yCoord)));
- vertices.push_back(GeometryVertex(tcu::Vec2( 0.5f, yCoord)));
- vertices.push_back(GeometryVertex(tcu::Vec2( 1.0f, yCoord)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(-1.0f, yCoord)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2(-0.5f, yCoord)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2( 0.5f, yCoord)));
+ vertexPtrs.push_back(m_testConfig.vertexFactory(tcu::Vec2( 1.0f, yCoord)));
}
}
+ std::vector<GeometryVertex*> vertexRawPtrs;
+ vertexRawPtrs.reserve(vertexPtrs.size());
+ std::transform(begin(vertexPtrs), end(vertexPtrs), std::back_inserter(vertexRawPtrs),
+ [](const de::MovePtr<GeometryVertex>& p) { return p.get(); });
+
// Reversed vertices, except for the first one (0, 5, 4, 3, 2, 1): clockwise mesh for triangles. Not to be used with lines.
- std::vector<GeometryVertex> reversedVertices(1u, vertices[0]);
- std::copy_n(vertices.rbegin(), vertices.size() - 1u, std::back_inserter(reversedVertices));
+ std::vector<GeometryVertex*> reversedVertexRawPtrs;
+ reversedVertexRawPtrs.push_back(vertexRawPtrs[0]);
+ if (topologyClass == TopologyClass::TRIANGLE)
+ {
+ std::copy_n(vertexRawPtrs.rbegin(), vertexRawPtrs.size() - 1u, std::back_inserter(reversedVertexRawPtrs));
+ }
if (topologyClass == TopologyClass::LINE)
{
@@ -938,16 +1305,24 @@
}
}
- const auto vertDataSize = static_cast<vk::VkDeviceSize>(vertices.size() * sizeof(decltype(vertices)::value_type));
+ DE_ASSERT(!vertexRawPtrs.empty());
+ const auto vertDataSize = static_cast<vk::VkDeviceSize>(vertexRawPtrs.size() * vertexRawPtrs[0]->getVertexDataSize());
const auto vertBufferSize = m_testConfig.vertexDataOffset + vertDataSize + m_testConfig.vertexDataExtraBytes;
const auto vertBufferInfo = vk::makeBufferCreateInfo(vertBufferSize, vk::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
vk::BufferWithMemory vertBuffer (vkd, device, allocator, vertBufferInfo, vk::MemoryRequirement::HostVisible);
vk::BufferWithMemory rvertBuffer (vkd, device, allocator, vertBufferInfo, vk::MemoryRequirement::HostVisible);
- // Copy data to vertex buffers and flush allocations.
+
+ const auto indexDataSize = static_cast<vk::VkDeviceSize>(indices.size() * sizeof(deUint32));
+ const auto indexBufferInfo = vk::makeBufferCreateInfo(indexDataSize, vk::VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+ vk::BufferWithMemory indexBuffer(vkd, device, allocator, indexBufferInfo, vk::MemoryRequirement::HostVisible);
+
+
+ // Copy data to vertex/index buffers and flush allocations.
{
- const GeometryVertex offScreenVertex (tcu::Vec2(0.0f, 3.0f));
- const auto offScreenVertexSz = sizeof(offScreenVertex);
+ const auto offScreenVertexPtr = m_testConfig.vertexFactory(tcu::Vec2(0.0f, 3.0f));
+ const auto offScreenVertex = offScreenVertexPtr->getVertexData();
+ const auto offScreenVertexSz = offScreenVertex.size();
const auto dataSize = static_cast<size_t>(vertDataSize);
const auto offset = static_cast<size_t>(m_testConfig.vertexDataOffset);
const auto extraSize = static_cast<size_t>(m_testConfig.vertexDataExtraBytes);
@@ -956,12 +1331,17 @@
for (auto b : buffersToFill)
{
// Fill bytes surrounding vertex data with the offScreenVertex.
- fillWithPattern(*b, 0u, offset, &offScreenVertex, offScreenVertexSz);
- fillWithPattern(*b, offset + dataSize, extraSize, &offScreenVertex, offScreenVertexSz);
+ fillWithPattern(*b, 0u, offset, offScreenVertex.data(), offScreenVertexSz);
+ fillWithPattern(*b, offset + dataSize, extraSize, offScreenVertex.data(), offScreenVertexSz);
}
+ // Create vectors with all vertex data and all reversed vertex data concatenated in order to fill the buffers.
+ const auto vertices = concatenateVertexData(vertexRawPtrs);
+ const auto reversedVertices = concatenateVertexData(reversedVertexRawPtrs);
+
copyAndFlush(vkd, device, vertBuffer, offset, vertices.data(), static_cast<size_t>(vertices.size() * sizeof(vertices[0])));
copyAndFlush(vkd, device, rvertBuffer, offset, reversedVertices.data(), static_cast<size_t>(reversedVertices.size() * sizeof(reversedVertices[0])));
+ copyAndFlush(vkd, device, indexBuffer, 0, indices.data(), static_cast<size_t>(indexDataSize));
}
// Descriptor set layout.
@@ -1024,7 +1404,7 @@
attachmentDescriptions.push_back(vk::VkAttachmentDescription
{
0u, // VkAttachmentDescriptionFlags flags;
- kColorFormat, // VkFormat format;
+ colorFormat, // VkFormat format;
vk::VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
vk::VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
vk::VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
@@ -1095,6 +1475,15 @@
if (m_testConfig.needsGeometryShader())
geomModule = vk::createShaderModule(vkd, device, m_context.getBinaryCollection().get("geom"), 0u);
+ vk::Move<vk::VkShaderModule> tescModule;
+ vk::Move<vk::VkShaderModule> teseModule;
+
+ if (m_testConfig.useTessellation)
+ {
+ tescModule = vk::createShaderModule(vkd, device, m_context.getBinaryCollection().get("tesc"), 0u);
+ teseModule = vk::createShaderModule(vkd, device, m_context.getBinaryCollection().get("tese"), 0u);
+ }
+
// Shader stages.
std::vector<vk::VkPipelineShaderStageCreateInfo> shaderStages;
@@ -1121,9 +1510,21 @@
shaderStages.push_back(shaderStageCreateInfo);
}
+ if (m_testConfig.useTessellation)
+ {
+ shaderStageCreateInfo.stage = vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
+ shaderStageCreateInfo.module = tescModule.get();
+ shaderStages.push_back(shaderStageCreateInfo);
+
+ shaderStageCreateInfo.stage = vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
+ shaderStageCreateInfo.module = teseModule.get();
+ shaderStages.push_back(shaderStageCreateInfo);
+ }
+
// Input state.
+ DE_ASSERT(!vertexRawPtrs.empty());
const auto vertexBinding = vk::makeVertexInputBindingDescription(0u, static_cast<deUint32>(m_testConfig.strideConfig.staticValue), vk::VK_VERTEX_INPUT_RATE_VERTEX);
- const auto vertexAttribute = vk::makeVertexInputAttributeDescription(0u, 0u, vk::VK_FORMAT_R32G32_SFLOAT, 0u);
+ const auto vertexAttributes = vertexRawPtrs[0]->getAttributeDescriptions(static_cast<deUint32>(m_testConfig.vertexInputConfig.staticValue));
const vk::VkPipelineVertexInputStateCreateInfo vertexInputStateCreateInfo =
{
@@ -1132,8 +1533,8 @@
0u, // VkPipelineVertexInputStateCreateFlags flags;
1u, // deUint32 vertexBindingDescriptionCount;
&vertexBinding, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
- 1u, // deUint32 vertexAttributeDescriptionCount;
- &vertexAttribute, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
+ static_cast<deUint32>(vertexAttributes.size()), // deUint32 vertexAttributeDescriptionCount;
+ vertexAttributes.data(), // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
};
// Input assembly.
@@ -1143,7 +1544,7 @@
nullptr, // const void* pNext;
0u, // VkPipelineInputAssemblyStateCreateFlags flags;
m_testConfig.topologyConfig.staticValue, // VkPrimitiveTopology topology;
- VK_FALSE, // VkBool32 primitiveRestartEnable;
+ makeVkBool32(m_testConfig.primRestartEnableConfig.staticValue), // VkBool32 primitiveRestartEnable;
};
// Viewport state.
@@ -1196,19 +1597,20 @@
};
// Rasterization state.
- const vk::VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
+ vk::VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
{
vk::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
nullptr, // const void* pNext;
0u, // VkPipelineRasterizationStateCreateFlags flags;
VK_FALSE, // VkBool32 depthClampEnable;
- VK_FALSE, // VkBool32 rasterizerDiscardEnable;
+ makeVkBool32(m_testConfig.rastDiscardEnableConfig.staticValue), // VkBool32 rasterizerDiscardEnable;
vk::VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
m_testConfig.cullModeConfig.staticValue, // VkCullModeFlags cullMode;
m_testConfig.frontFaceConfig.staticValue, // VkFrontFace frontFace;
- VK_FALSE, // VkBool32 depthBiasEnable;
- 0.0f, // float depthBiasConstantFactor;
- 0.0f, // float depthBiasClamp;
+ makeVkBool32(m_testConfig.depthBiasEnableConfig.staticValue), // VkBool32 depthBiasEnable;
+ // Change the depth bias parameters if depth bias is dynamic
+ m_testConfig.depthBiasEnableConfig.dynamicValue ? 2e7f : 0.0f, // float depthBiasConstantFactor;
+ m_testConfig.depthBiasEnableConfig.dynamicValue ? 0.25f : 0.0f, // float depthBiasClamp;
0.0f, // float depthBiasSlopeFactor;
1.0f, // float lineWidth;
};
@@ -1290,6 +1692,12 @@
if (m_testConfig.depthBoundsTestEnableConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT);
if (m_testConfig.stencilTestEnableConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT);
if (m_testConfig.stencilOpConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_STENCIL_OP_EXT);
+ if (m_testConfig.vertexInputConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_VERTEX_INPUT_EXT);
+ if (m_testConfig.depthBiasEnableConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT);
+ if (m_testConfig.rastDiscardEnableConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT);
+ if (m_testConfig.primRestartEnableConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT);
+ if (m_testConfig.logicOpConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_LOGIC_OP_EXT);
+ if (m_testConfig.patchControlPointsConfig.dynamicValue) dynamicStates.push_back(vk::VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT);
const vk::VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo =
{
@@ -1320,13 +1728,21 @@
vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType
nullptr, // const void* pNext
0u, // VkPipelineColorBlendStateCreateFlags flags
- VK_FALSE, // VkBool32 logicOpEnable
- vk::VK_LOGIC_OP_CLEAR, // VkLogicOp logicOp
+ m_testConfig.logicOpConfig.dynamicValue ? VK_TRUE : VK_FALSE, // VkBool32 logicOpEnable
+ m_testConfig.logicOpConfig.staticValue, // VkLogicOp logicOp
1u, // deUint32 attachmentCount
&colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments
{ 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]
};
+ const vk::VkPipelineTessellationStateCreateInfo pipelineTessellationStateCreateInfo =
+ {
+ vk::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, // VkStructureType sType
+ nullptr, // const void* pNext
+ 0u, // VkPipelineTessellationStateCreateFlags flags
+ m_testConfig.patchControlPointsConfig.staticValue, // uint32_t patchControlPoints
+ };
+
const vk::VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfoTemplate =
{
vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
@@ -1336,8 +1752,8 @@
shaderStages.data(), // const VkPipelineShaderStageCreateInfo* pStages;
&vertexInputStateCreateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
&inputAssemblyStateCreateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
- nullptr, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
- nullptr, // const VkPipelineViewportStateCreateInfo* pViewportState;
+ m_testConfig.useTessellation ? &pipelineTessellationStateCreateInfo : nullptr, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
+ nullptr, // const VkPipelineViewportStateCreateInfo * pViewportState;
&rasterizationStateCreateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState;
&multisampleStateCreateInfo, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
&depthStencilStateCreateInfo, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
@@ -1378,8 +1794,10 @@
const auto cmdBufferPtr = vk::allocateCommandBuffer(vkd , device, cmdPool.get(), vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY);
const auto cmdBuffer = cmdBufferPtr.get();
- // Clear values.
+ // Clear values, clear to green for dynamic logicOp
std::vector<vk::VkClearValue> clearValues;
+ if (m_testConfig.logicOpConfig.dynamicValue)
+ m_testConfig.clearColorValue = kGreenClearColor;
clearValues.push_back(vk::makeClearValueColor(m_testConfig.clearColorValue));
clearValues.push_back(vk::makeClearValueDepthStencil(m_testConfig.clearDepthValue, m_testConfig.clearStencilValue));
@@ -1466,10 +1884,27 @@
// Bind vertex buffer with static stride if needed and draw.
if (!(boundInAdvance || boundBeforeDraw))
+ {
vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, (m_testConfig.meshParams[meshIdx].reversed ? &rvertBuffer.get() : &vertBuffer.get()), &m_testConfig.vertexDataOffset);
-
+ if (m_testConfig.useIndexBuffer)
+ {
+ vkd.cmdBindIndexBuffer(cmdBuffer, indexBuffer.get(), 0, vk::VK_INDEX_TYPE_UINT32);
+ }
+ }
// Draw mesh.
- vkd.cmdDraw(cmdBuffer, static_cast<deUint32>(vertices.size()), 1u, 0u, 0u);
+ if (m_testConfig.useIndexBuffer) {
+ deUint32 numIndices = static_cast<deUint32>(indices.size());
+ // For SequenceOrdering::TWO_DRAWS_DYNAMIC and TWO_DRAWS_STATIC cases, the first draw does not have primitive restart enabled
+ // So, draw without using the invalid (0xFFFFFFFF) index, the second draw with primitive restart enabled will replace the results
+ // using all indices.
+ if (iteration == 0u &&
+ (m_testConfig.sequenceOrdering == SequenceOrdering::TWO_DRAWS_DYNAMIC ||
+ m_testConfig.sequenceOrdering == SequenceOrdering::TWO_DRAWS_STATIC))
+ numIndices = 3u;
+ vkd.cmdDrawIndexed(cmdBuffer, numIndices, 1u, 0u, 0u, 0u);
+ }
+ else
+ vkd.cmdDraw(cmdBuffer, static_cast<deUint32>(vertexPtrs.size()), 1u, 0u, 0u);
}
}
@@ -1483,7 +1918,7 @@
// Read result image aspects from the last used framebuffer.
const tcu::UVec2 renderSize (kFramebufferWidth, kFramebufferHeight);
- const auto colorBuffer = readColorAttachment(vkd, device, queue, queueIndex, allocator, colorImages.back()->get(), kColorFormat, renderSize);
+ const auto colorBuffer = readColorAttachment(vkd, device, queue, queueIndex, allocator, colorImages.back()->get(), colorFormat, renderSize);
const auto depthBuffer = readDepthAttachment(vkd, device, queue, queueIndex, allocator, dsImages.back()->get(), dsFormatInfo->imageFormat, renderSize);
const auto stencilBuffer = readStencilAttachment(vkd, device, queue, queueIndex, allocator, dsImages.back()->get(), dsFormatInfo->imageFormat, renderSize, vk::VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
const auto colorAccess = colorBuffer->getAccess();
@@ -1494,7 +1929,7 @@
const int kHeight = static_cast<int>(kFramebufferHeight);
// Generate reference color buffer.
- const auto tcuColorFormat = vk::mapVkFormat(kColorFormat);
+ const auto tcuColorFormat = vk::mapVkFormat(colorFormat);
tcu::TextureLevel referenceColorLevel (tcuColorFormat, kWidth, kHeight);
tcu::PixelBufferAccess referenceColorAccess = referenceColorLevel.getAccess();
m_testConfig.referenceColor(referenceColorAccess);
@@ -1520,8 +1955,15 @@
for (int y = 0; y < kHeight; ++y)
for (int x = 0; x < kWidth; ++x)
{
- const auto colorPixel = colorAccess.getPixel(x, y);
- const auto expectedPixel = referenceColorAccess.getPixel(x, y);
+ auto colorPixel = colorAccess.getPixel(x, y);
+ auto expectedPixel = referenceColorAccess.getPixel(x, y);
+
+ // The logic OP must have ORed the colors to cyan
+ if (m_testConfig.logicOpConfig.dynamicValue)
+ {
+ // Multiply by 255.0f as the color is in R8G8B8A8 format
+ expectedPixel = kCyanColor * 255.0f;
+ }
match = tcu::boolAll(tcu::lessThan(tcu::absDiff(colorPixel, expectedPixel), kColorThreshold));
colorErrorAccess.setPixel((match ? kGood : kBad), x, y);
@@ -1695,6 +2137,59 @@
orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "front_face_ccw_reversed", "Dynamically set front face to counter-clockwise with a clockwise mesh", config));
}
+ // Rasterizer discard
+ {
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_extended_dynamic_state2;
+ config.rastDiscardEnableConfig.staticValue = false;
+ config.rastDiscardEnableConfig.dynamicValue = tcu::just(true);
+ config.referenceColor = SingleColorGenerator(kDefaultClearColor);
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "disable_raster", "Dynamically disable rasterizer", config));
+ }
+ {
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_extended_dynamic_state2;
+ config.rastDiscardEnableConfig.staticValue = true;
+ config.rastDiscardEnableConfig.dynamicValue = tcu::just(false);
+ config.referenceColor = SingleColorGenerator(kDefaultTriangleColor);
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "enable_raster", "Dynamically enable rasterizer", config));
+ }
+
+ // Logic op
+ {
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_extended_dynamic_state2;
+ config.testExtendedDynamicState2LogicOp = true;
+ config.logicOpConfig.staticValue = vk::VK_LOGIC_OP_CLEAR;
+ config.logicOpConfig.dynamicValue = tcu::just<vk::VkLogicOp>(vk::VK_LOGIC_OP_OR);
+ config.referenceColor = SingleColorGenerator(kDefaultTriangleColor);
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "logic_op_or", "Dynamically change logic op to VK_LOGIC_OP_OR", config));
+ }
+
+ // Dynamically enable primitive restart
+ {
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_extended_dynamic_state2;
+ config.useIndexBuffer = true;
+ config.primRestartEnableConfig.staticValue = false;
+ config.primRestartEnableConfig.dynamicValue = tcu::just(true);
+ config.referenceColor = SingleColorGenerator(kDefaultTriangleColor);
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "prim_restart_enable", "Dynamically enable primitiveRestart", config));
+ }
+
+ // Dynamically change the number of primitive control points
+ {
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_extended_dynamic_state2;
+ config.testExtendedDynamicState2PatchControlPoints = true;
+ config.useTessellation = true;
+ config.topologyConfig.staticValue = vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
+ config.patchControlPointsConfig.staticValue = 1;
+ config.patchControlPointsConfig.dynamicValue = 3;
+ config.referenceColor = SingleColorGenerator(kDefaultTriangleColor);
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "patch_control_points", "Dynamically change patch control points", config));
+ }
+
// Dynamic topology.
{
TestConfig baseConfig(kOrdering);
@@ -1825,32 +2320,59 @@
// Stride.
{
- TestConfig config(kOrdering);
- config.strideConfig.staticValue = kCoordsSize;
- config.strideConfig.dynamicValue = kVertexStride;
- orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "stride", "Dynamically set stride", config));
- }
- {
- TestConfig config(kOrdering);
- config.strideConfig.staticValue = kCoordsSize;
- config.strideConfig.dynamicValue = kVertexStride;
- config.vertexDataOffset = static_cast<vk::VkDeviceSize>(sizeof(GeometryVertex));
- orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "stride_with_offset", "Dynamically set stride using a nonzero vertex data offset", config));
- }
- {
- TestConfig config(kOrdering);
- config.strideConfig.staticValue = kCoordsSize;
- config.strideConfig.dynamicValue = kVertexStride;
- config.vertexDataOffset = static_cast<vk::VkDeviceSize>(sizeof(GeometryVertex));
- config.vertexDataExtraBytes = config.vertexDataOffset;
+ struct
+ {
+ VertexFactory factory;
+ const std::string prefix;
+ } strideCases[] =
+ {
+ { getVertexWithPadding, "stride" },
+ { getVertexWithExtraAttributes, "large_stride" },
+ };
- // Make the mesh cover the top half only. If the implementation reads data outside the vertex data it should read the
- // offscreen vertex and draw something in the bottom half.
- config.referenceColor = HorizontalSplitGenerator(kDefaultTriangleColor, kDefaultClearColor);
- config.meshParams[0].scaleY = 0.5f;
- config.meshParams[0].offsetY = -0.5f;
+ for (int strideCaseIndex = 0; strideCaseIndex < DE_LENGTH_OF_ARRAY(strideCases); ++strideCaseIndex)
+ {
+ const auto factory = strideCases[strideCaseIndex].factory;
+ const auto& prefix = strideCases[strideCaseIndex].prefix;
+ const auto dummyVertex = factory(tcu::Vec2(0.0f, 0.0f));
+ const auto vertexStride = static_cast<vk::VkDeviceSize>(dummyVertex->getVertexDataSize());
- orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "stride_with_offset_and_padding", "Dynamically set stride using a nonzero vertex data offset and extra bytes", config));
+ if (factory == getVertexWithExtraAttributes && kOrdering == SequenceOrdering::TWO_DRAWS_STATIC)
+ {
+ // This case is invalid because it breaks VUID-vkCmdBindVertexBuffers2EXT-pStrides-03363 due to the dynamic
+ // stride being less than the extent of the binding for the second attribute.
+ continue;
+ }
+
+ {
+ TestConfig config(kOrdering, factory);
+ config.strideConfig.staticValue = kCoordsSize;
+ config.strideConfig.dynamicValue = vertexStride;
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, prefix, "Dynamically set stride", config));
+ }
+ {
+ TestConfig config(kOrdering, factory);
+ config.strideConfig.staticValue = kCoordsSize;
+ config.strideConfig.dynamicValue = vertexStride;
+ config.vertexDataOffset = static_cast<vk::VkDeviceSize>(sizeof(GeometryVertex));
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, prefix + "_with_offset", "Dynamically set stride using a nonzero vertex data offset", config));
+ }
+ {
+ TestConfig config(kOrdering, factory);
+ config.strideConfig.staticValue = kCoordsSize;
+ config.strideConfig.dynamicValue = vertexStride;
+ config.vertexDataOffset = static_cast<vk::VkDeviceSize>(sizeof(GeometryVertex));
+ config.vertexDataExtraBytes = config.vertexDataOffset;
+
+ // Make the mesh cover the top half only. If the implementation reads data outside the vertex data it should read the
+ // offscreen vertex and draw something in the bottom half.
+ config.referenceColor = HorizontalSplitGenerator(kDefaultTriangleColor, kDefaultClearColor);
+ config.meshParams[0].scaleY = 0.5f;
+ config.meshParams[0].offsetY = -0.5f;
+
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, prefix + "_with_offset_and_padding", "Dynamically set stride using a nonzero vertex data offset and extra bytes", config));
+ }
+ }
}
// Depth test enable.
@@ -1904,6 +2426,50 @@
orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "depth_write_disable", "Dynamically disable writes to the depth buffer", config));
}
+ // Depth bias enable.
+ {
+ {
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_extended_dynamic_state2;
+
+ // Enable depth test and write 1.0f
+ config.depthTestEnableConfig.staticValue = true;
+ config.depthWriteEnableConfig.staticValue = true;
+ config.depthCompareOpConfig.staticValue = vk::VK_COMPARE_OP_ALWAYS;
+ // Clear depth buffer to 0.25f
+ config.clearDepthValue = 0.25f;
+ // Write depth to 0.5f
+ config.meshParams[0].depth = 0.5f;
+
+ // Enable dynamic depth bias and expect the depth value to be clamped to 0.75f based on depthBiasConstantFactor and depthBiasClamp
+ config.depthBiasEnableConfig.staticValue = false;
+ config.depthBiasEnableConfig.dynamicValue = tcu::just(true);
+ config.expectedDepth = 0.75f;
+
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "depth_bias_enable", "Dynamically enable the depth bias", config));
+ }
+ {
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_extended_dynamic_state2;
+
+ // Enable depth test and write 1.0f
+ config.depthTestEnableConfig.staticValue = true;
+ config.depthWriteEnableConfig.staticValue = true;
+ config.depthCompareOpConfig.staticValue = vk::VK_COMPARE_OP_ALWAYS;
+ // Clear depth buffer to 0.25f
+ config.clearDepthValue = 0.25f;
+ // Write depth to 0.5f
+ config.meshParams[0].depth = 0.5f;
+
+ // Disable dynamic depth bias and expect the depth value to remain at 0.5f based on written value
+ config.depthBiasEnableConfig.staticValue = true;
+ config.depthBiasEnableConfig.dynamicValue = tcu::just(false);
+ config.expectedDepth = 0.5f;
+
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "depth_bias_disable", "Dynamically disable the depth bias", config));
+ }
+ }
+
// Depth compare op.
{
TestConfig baseConfig(kOrdering);
@@ -2288,6 +2854,19 @@
}
}
+ // Vertex input.
+ {
+ const auto dummyVertex = getVertexWithPadding(tcu::Vec2(0.0f, 0.0f));
+
+ TestConfig config(kOrdering);
+ config.testExtendedDynamicStateVersion = TEST_VERSION_vertex_input_dynamic_state;
+ config.vertexInputConfig.staticValue = static_cast<deUint32>(dummyVertex->getPaddingOffset());
+ config.vertexInputConfig.dynamicValue = static_cast<deUint32>(dummyVertex->getCoordsOffset());
+ config.strideConfig.staticValue = kCoordsSize;
+ config.strideConfig.dynamicValue = static_cast<vk::VkDeviceSize>(dummyVertex->getVertexDataSize());
+ orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "vertex_input", "Dynamically set vertex input", config));
+ }
+
extendedDynamicStateGroup->addChild(orderingGroup.release());
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp
index 50d6856..7d8a71f 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineFramebufferAttachmentTests.cpp
@@ -1151,7 +1151,7 @@
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
DE_NULL, // const void* pNext;
VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask;
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask;
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout;
VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
index 46ef651..1eae7a0 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp
@@ -325,6 +325,20 @@
if (params.allocationKind == ALLOCATION_KIND_DEDICATED)
context.requireDeviceFunctionality("VK_KHR_dedicated_allocation");
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset"))
+ {
+ const auto portabilitySubsetFeatures = context.getPortabilitySubsetFeatures();
+ const auto componentMapping = params.componentMapping;
+ if (!portabilitySubsetFeatures.imageViewFormatSwizzle &&
+ ((componentMapping.r != VK_COMPONENT_SWIZZLE_IDENTITY) ||
+ (componentMapping.g != VK_COMPONENT_SWIZZLE_IDENTITY) ||
+ (componentMapping.b != VK_COMPONENT_SWIZZLE_IDENTITY) ||
+ (componentMapping.a != VK_COMPONENT_SWIZZLE_IDENTITY)))
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Implementation does not support remapping format components");
+ }
+ }
}
ImageSamplingInstance::ImageSamplingInstance (Context& context,
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp
index 3b18883..7d48508 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp
@@ -987,7 +987,7 @@
void TestTexture::fillWithGradient (const tcu::PixelBufferAccess& levelAccess)
{
const tcu::TextureFormatInfo formatInfo = tcu::getTextureFormatInfo(levelAccess.getFormat());
- tcu::fillWithComponentGradients(levelAccess, formatInfo.valueMin, formatInfo.valueMax);
+ tcu::fillWithComponentGradients2(levelAccess, formatInfo.valueMin, formatInfo.valueMax);
}
// TestTexture1D
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp
index 22382a5..a128548 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineImageViewTests.cpp
@@ -719,6 +719,13 @@
VK_FORMAT_R8G8B8_UINT,
VK_FORMAT_R8G8B8_SINT,
VK_FORMAT_R8G8B8_SRGB,
+ VK_FORMAT_B8G8R8_UNORM,
+ VK_FORMAT_B8G8R8_SNORM,
+ VK_FORMAT_B8G8R8_USCALED,
+ VK_FORMAT_B8G8R8_SSCALED,
+ VK_FORMAT_B8G8R8_UINT,
+ VK_FORMAT_B8G8R8_SINT,
+ VK_FORMAT_B8G8R8_SRGB,
VK_FORMAT_R8G8B8A8_UNORM,
VK_FORMAT_R8G8B8A8_SNORM,
VK_FORMAT_R8G8B8A8_USCALED,
@@ -726,6 +733,13 @@
VK_FORMAT_R8G8B8A8_UINT,
VK_FORMAT_R8G8B8A8_SINT,
VK_FORMAT_R8G8B8A8_SRGB,
+ VK_FORMAT_B8G8R8A8_UNORM,
+ VK_FORMAT_B8G8R8A8_SNORM,
+ VK_FORMAT_B8G8R8A8_USCALED,
+ VK_FORMAT_B8G8R8A8_SSCALED,
+ VK_FORMAT_B8G8R8A8_UINT,
+ VK_FORMAT_B8G8R8A8_SINT,
+ VK_FORMAT_B8G8R8A8_SRGB,
VK_FORMAT_A2R10G10B10_UNORM_PACK32,
VK_FORMAT_A2R10G10B10_UINT_PACK32,
VK_FORMAT_A2B10G10R10_USCALED_PACK32,
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp
index 9af8969..1eee007 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineInputAssemblyTests.cpp
@@ -244,6 +244,13 @@
default:
break;
}
+
+ if (m_primitiveTopology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
}
TestInstance* InputAssemblyTest::createInstance (Context& context) const
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineLogicOpTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineLogicOpTests.cpp
new file mode 100644
index 0000000..9f0568b
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineLogicOpTests.cpp
@@ -0,0 +1,561 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
+ *
+ * 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 Logic Operators Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineLogicOpTests.hpp"
+#include "vktPipelineImageUtil.hpp"
+
+#include "vkQueryUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkMemUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkImageWithMemory.hpp"
+
+#include "tcuVectorUtil.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuTestLog.hpp"
+
+#include <string>
+#include <limits>
+
+namespace vkt
+{
+namespace pipeline
+{
+
+using namespace vk;
+
+namespace
+{
+
+bool isSupportedColorAttachmentFormat (const InstanceInterface& instanceInterface,
+ VkPhysicalDevice device,
+ VkFormat format)
+{
+ VkFormatProperties formatProps;
+ instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps);
+
+ // Format also needs to be INT, UINT, or SINT but as we are the ones setting the
+ // color attachment format we only need to check that it is a valid color attachment
+ // format here.
+ return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
+}
+
+struct TestParams
+{
+ VkLogicOp logicOp; // Operation.
+ tcu::UVec4 fbColor; // Framebuffer color.
+ tcu::UVec4 quadColor; // Geometry color.
+ VkFormat format; // Framebuffer format.
+ std::string name; // Logic operator test name.
+};
+
+deUint32 calcOpResult(VkLogicOp op, deUint32 src, deUint32 dst)
+{
+ // See section 29.2 "Logical Operations" in the spec.
+ //
+ // AND: SRC & DST = 1010 & 1100 = 1000 = 0x8
+ // AND_REVERSE: SRC & ~DST = 0011 & 1010 = 0010 = 0x2
+ // COPY: SRC = 1010 = 1010 = 0xa
+ // AND_INVERTED: ~SRC & DST = 0101 & 1100 = 0100 = 0x4
+ // NO_OP: DST = 1010 = 1010 = 0xa
+ // XOR: SRC ^ DST = 1010 ^ 1100 = 0110 = 0x6
+ // OR: SRC | DST = 1010 | 1100 = 1110 = 0xe
+ // NOR: ~(SRC | DST) = ~(1010 | 1100) = 0001 = 0x1
+ // EQUIVALENT: ~(SRC ^ DST) = ~(1010 ^ 1100) = 1001 = 0x9
+ // INVERT: ~DST = ~1100 = 0011 = 0x3
+ // OR_REVERSE: SRC | ~DST = 1010 | 0011 = 1011 = 0xb
+ // COPY_INVERTED: ~SRC = 0101 = 0101 = 0x5
+ // OR_INVERTED: ~SRC | DST = 0101 | 1100 = 1101 = 0xd
+ // NAND: ~(SRC & DST) = ~(1010 &1100) = 0111 = 0x7
+ // SET: = 1111 = 1111 = 0xf (sets all bits)
+
+ switch (op)
+ {
+ case VK_LOGIC_OP_CLEAR: return (0u);
+ case VK_LOGIC_OP_AND: return (src & dst);
+ case VK_LOGIC_OP_AND_REVERSE: return (src & ~dst);
+ case VK_LOGIC_OP_COPY: return (src);
+ case VK_LOGIC_OP_AND_INVERTED: return (~src & dst);
+ case VK_LOGIC_OP_NO_OP: return (dst);
+ case VK_LOGIC_OP_XOR: return (src ^ dst);
+ case VK_LOGIC_OP_OR: return (src | dst);
+ case VK_LOGIC_OP_NOR: return (~(src | dst));
+ case VK_LOGIC_OP_EQUIVALENT: return (~(src ^ dst));
+ case VK_LOGIC_OP_INVERT: return (~dst);
+ case VK_LOGIC_OP_OR_REVERSE: return (src | ~dst);
+ case VK_LOGIC_OP_COPY_INVERTED: return (~src);
+ case VK_LOGIC_OP_OR_INVERTED: return (~src | dst);
+ case VK_LOGIC_OP_NAND: return (~(src & dst));
+ case VK_LOGIC_OP_SET: return (std::numeric_limits<deUint32>::max());
+ default: DE_ASSERT(false); break;
+ }
+
+ DE_ASSERT(false);
+ return 0u;
+}
+
+// Gets a bitmask to filter out unused bits according to the channel size (e.g. 0xFFu for 8-bit channels).
+// channelSize in bytes.
+deUint32 getChannelMask (int channelSize)
+{
+ DE_ASSERT(channelSize >= 1 && channelSize <= 4);
+
+ deUint64 mask = 1u;
+ mask <<= (channelSize * 8);
+ --mask;
+
+ return static_cast<deUint32>(mask);
+}
+
+class LogicOpTest : public vkt::TestCase
+{
+public:
+ LogicOpTest (tcu::TestContext& testCtx,
+ const std::string& name,
+ const std::string& description,
+ const TestParams &testParams);
+ virtual ~LogicOpTest (void);
+ virtual void initPrograms (SourceCollections& sourceCollections) const;
+ virtual void checkSupport (Context& context) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+private:
+ TestParams m_params;
+};
+
+LogicOpTest::LogicOpTest (tcu::TestContext& testCtx,
+ const std::string& name,
+ const std::string& description,
+ const TestParams& testParams)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (testParams)
+{
+ DE_ASSERT(m_params.format != VK_FORMAT_UNDEFINED);
+}
+
+LogicOpTest::~LogicOpTest (void)
+{
+}
+
+void LogicOpTest::checkSupport (Context &ctx) const
+{
+ const auto& features = ctx.getDeviceFeatures();
+
+ if (!features.logicOp)
+ TCU_THROW(NotSupportedError, "Logic operations not supported");
+
+ if (!isSupportedColorAttachmentFormat(ctx.getInstanceInterface(), ctx.getPhysicalDevice(), m_params.format))
+ TCU_THROW(NotSupportedError, "Unsupported color attachment format: " + std::string(getFormatName(m_params.format)));
+}
+
+void LogicOpTest::initPrograms (SourceCollections& sourceCollections) const
+{
+ sourceCollections.glslSources.add("color_vert") << glu::VertexSource(
+ "#version 430\n"
+ "vec2 vdata[] = vec2[] (\n"
+ "vec2(-1.0, -1.0),\n"
+ "vec2(1.0, -1.0),\n"
+ "vec2(-1.0, 1.0),\n"
+ "vec2(1.0, 1.0));\n"
+ "void main (void)\n"
+ "{\n"
+ " gl_Position = vec4(vdata[gl_VertexIndex], 0.0, 1.0);\n"
+ "}\n");
+
+ sourceCollections.glslSources.add("color_frag") << glu::FragmentSource(
+ "#version 430\n"
+ "layout(push_constant) uniform quadColor {\n"
+ " uvec4 val;\n"
+ "} QUAD_COLOR;\n"
+ "layout(location = 0) out uvec4 fragColor;\n"
+ "void main (void)\n"
+ "{\n"
+ " fragColor = QUAD_COLOR.val;\n"
+ "}\n");
+}
+
+class LogicOpTestInstance : public vkt::TestInstance
+{
+public:
+ LogicOpTestInstance(Context& context,
+ const TestParams& params);
+ ~LogicOpTestInstance(void);
+ virtual tcu::TestStatus iterate(void);
+
+private:
+ tcu::TestStatus verifyImage(void);
+
+ TestParams m_params;
+
+ // Derived from m_params.
+ const tcu::TextureFormat m_tcuFormat;
+ const int m_numChannels;
+ const int m_channelSize;
+ const deUint32 m_channelMask;
+
+ const tcu::UVec2 m_renderSize;
+
+ VkImageCreateInfo m_colorImageCreateInfo;
+ de::MovePtr<ImageWithMemory> m_colorImage;
+ Move<VkImageView> m_colorAttachmentView;
+
+ Move<VkRenderPass> m_renderPass;
+ Move<VkFramebuffer> m_framebuffer;
+
+ Move<VkShaderModule> m_vertexShaderModule;
+ Move<VkShaderModule> m_fragmentShaderModule;
+
+ Move<VkPipelineLayout> m_pipelineLayout;
+ Move<VkPipeline> m_graphicsPipeline;
+
+ Move<VkCommandPool> m_cmdPool;
+ Move<VkCommandBuffer> m_cmdBuffer;
+};
+
+LogicOpTestInstance::LogicOpTestInstance (Context &ctx, const TestParams &testParams)
+ : vkt::TestInstance (ctx)
+ , m_params (testParams)
+ , m_tcuFormat (mapVkFormat(m_params.format))
+ , m_numChannels (tcu::getNumUsedChannels(m_tcuFormat.order))
+ , m_channelSize (tcu::getChannelSize(m_tcuFormat.type))
+ , m_channelMask (getChannelMask(m_channelSize))
+ , m_renderSize (32u, 32u)
+{
+ DE_ASSERT(isUintFormat(m_params.format));
+
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ Allocator& memAlloc = m_context.getDefaultAllocator();
+ constexpr auto kPushConstantSize = static_cast<deUint32>(sizeof(m_params.quadColor));
+
+ // create color image
+ {
+ const VkImageCreateInfo colorImageParams =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ m_params.format, // VkFormat format;
+ { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 1u, // deUint32 queueFamilyIndexCount;
+ &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
+ };
+
+ m_colorImageCreateInfo = colorImageParams;
+ m_colorImage = de::MovePtr<ImageWithMemory>(new ImageWithMemory(vk, vkDevice, memAlloc, m_colorImageCreateInfo, MemoryRequirement::Any));
+
+ // create color attachment view
+ const VkImageViewCreateInfo colorAttachmentViewParams =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkImageViewCreateFlags flags;
+ m_colorImage->get(), // VkImage image;
+ VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
+ m_params.format, // VkFormat format;
+ { VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY },
+ { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange;
+ };
+
+ m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams);
+ }
+
+ m_renderPass = makeRenderPass(vk, vkDevice, m_params.format);
+ m_framebuffer = makeFramebuffer(vk, vkDevice, *m_renderPass, m_colorAttachmentView.get(), m_renderSize.x(), m_renderSize.y());
+
+ // create pipeline layout
+ {
+ const VkPushConstantRange pcRange =
+ {
+ VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlags stageFlags;
+ 0u, // deUint32 offset;
+ kPushConstantSize, // deUint32 size;
+ };
+
+ const VkPipelineLayoutCreateInfo pipelineLayoutParams =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ 0u, // VkPipelineLayoutCreateFlags flags;
+ 0u, // deUint32 setLayoutCount;
+ DE_NULL, // const VkDescriptorSetLayout* pSetLayouts;
+ 1u, // deUint32 pushConstantRangeCount;
+ &pcRange, // const VkPushConstantRange* pPushConstantRanges;
+ };
+
+ m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
+ }
+
+ m_vertexShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_vert"), 0);
+ m_fragmentShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_frag"), 0);
+
+ // create pipeline
+ {
+ const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = initVulkanStructure();
+
+ const std::vector<VkViewport> viewports (1, makeViewport(m_renderSize));
+ const std::vector<VkRect2D> scissors (1, makeRect2D(m_renderSize));
+
+ VkColorComponentFlags colorWriteMask = VK_COLOR_COMPONENT_R_BIT |
+ VK_COLOR_COMPONENT_G_BIT |
+ VK_COLOR_COMPONENT_B_BIT |
+ VK_COLOR_COMPONENT_A_BIT;
+
+ const VkPipelineColorBlendAttachmentState blendAttachmentState =
+ {
+ VK_FALSE, // VkBool32 blendEnable;
+ (VkBlendFactor) 0, // VkBlendFactor srcColorBlendFactor;
+ (VkBlendFactor) 0, // VkBlendFactor dstColorBlendFactor;
+ (VkBlendOp) 0, // VkBlendOp colorBlendOp;
+ (VkBlendFactor) 0, // VkBlendFactor srcAlphaBlendFactor;
+ (VkBlendFactor) 0, // VkBlendFactor dstAlphaBlendFactor;
+ (VkBlendOp) 0, // VkBlendOp alphaBlendOp;
+ colorWriteMask, // VkColorComponentFlags colorWriteMask;
+ };
+
+ const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ DE_NULL, // VkPipelineColorBlendStateCreateFlags flags;
+ VK_TRUE, // VkBool32 logicOpEnable;
+ m_params.logicOp, // VkLogicOp logicOp;
+ 1u, // uint32_t attachmentCount;
+ &blendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments;
+ { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConstants[4];
+ };
+
+ m_graphicsPipeline = makeGraphicsPipeline(vk,
+ vkDevice, // const VkDevice device
+ *m_pipelineLayout, // const VkPipelineLayout pipelineLayout
+ *m_vertexShaderModule, // const VkShaderModule vertexShaderModule
+ DE_NULL, // const VkShaderModule tessellationControlModule
+ DE_NULL, // const VkShaderModule tessellationEvalModule
+ DE_NULL, // const VkShaderModule geometryShaderModule
+ *m_fragmentShaderModule, // const VkShaderModule fragmentShaderModule
+ *m_renderPass, // const VkRenderPass renderPass
+ viewports, // const std::vector<VkViewport>& viewports
+ scissors, // const std::vector<VkRect2D>& scissors
+ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, // const VkPrimitiveTopology topology
+ 0u, // const deUint32 subpass
+ 0u, // const deUint32 patchControlPoints
+ &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* vertexInputStateCreateInfo
+ DE_NULL, // const VkPipelineRasterizationStateCreateInfo* rasterizationStateCreateInfo
+ DE_NULL, // const VkPipelineMultisampleStateCreateInfo* multisampleStateCreateInfo
+ DE_NULL, // const VkPipelineDepthStencilStateCreateInfo* depthStencilStateCreateInfo
+ &colorBlendStateParams); // const VkPipelineColorBlendStateCreateInfo* colorBlendStateCreateInfo
+ }
+
+ // create command pool
+ m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
+
+ // allocate and record command buffer
+ {
+ // Prepare clear color value and quad color taking into account the channel mask.
+ VkClearValue attachmentClearValue;
+ tcu::UVec4 quadColor(0u, 0u, 0u, 0u);
+
+ deMemset(&attachmentClearValue.color, 0, sizeof(attachmentClearValue.color));
+ for (int c = 0; c < m_numChannels; ++c)
+ attachmentClearValue.color.uint32[c] = (m_params.fbColor[c] & m_channelMask);
+
+ for (int c = 0; c < m_numChannels; ++c)
+ quadColor[c] = (m_params.quadColor[c] & m_channelMask);
+
+ m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ beginCommandBuffer(vk, *m_cmdBuffer, 0u);
+ beginRenderPass(vk, *m_cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, m_renderSize.x(), m_renderSize.y()), attachmentClearValue);
+
+ // Update push constant values
+ vk.cmdPushConstants(*m_cmdBuffer, *m_pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0u, kPushConstantSize, &quadColor);
+
+ vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipeline);
+ vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u);
+ endRenderPass(vk, *m_cmdBuffer);
+ endCommandBuffer(vk, *m_cmdBuffer);
+ }
+}
+
+LogicOpTestInstance::~LogicOpTestInstance (void)
+{
+}
+
+tcu::TestStatus LogicOpTestInstance::iterate (void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+
+ submitCommandsAndWait(vk, vkDevice, queue, m_cmdBuffer.get());
+ return verifyImage();
+}
+
+tcu::TestStatus LogicOpTestInstance::verifyImage (void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice vkDevice = m_context.getDevice();
+ const VkQueue queue = m_context.getUniversalQueue();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ auto& log = m_context.getTestContext().getLog();
+
+ const auto result = readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, m_colorImage->get(), m_params.format, m_renderSize).release();
+ const auto resultAccess = result->getAccess();
+ const int iWidth = static_cast<int>(m_renderSize.x());
+ const int iHeight = static_cast<int>(m_renderSize.y());
+ tcu::UVec4 expectedColor (0u, 0u, 0u, 0u); // Overwritten below.
+ tcu::TextureLevel referenceTexture (m_tcuFormat, iWidth, iHeight);
+ auto referenceAccess = referenceTexture.getAccess();
+ tcu::UVec4 threshold (0u, 0u, 0u, 0u); // Exact results.
+
+ // Calculate proper expected color values.
+ for (int c = 0; c < m_numChannels; ++c)
+ {
+ expectedColor[c] = calcOpResult(m_params.logicOp, m_params.quadColor[c], m_params.fbColor[c]);
+ expectedColor[c] &= m_channelMask;
+ }
+
+ for (int y = 0; y < iHeight; ++y)
+ for (int x = 0; x < iWidth; ++x)
+ referenceAccess.setPixel(expectedColor, x, y);
+
+ // Check result.
+ bool resultOk = tcu::intThresholdCompare(log, "TestResults", "Test Result Images", referenceAccess, resultAccess, threshold, tcu::COMPARE_LOG_ON_ERROR);
+
+ if (!resultOk)
+ TCU_FAIL("Result does not match expected values; check log for details");
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+TestInstance *LogicOpTest::createInstance (Context& context) const
+{
+ return new LogicOpTestInstance(context, m_params);
+}
+
+std::string getSimpleFormatName (VkFormat format)
+{
+ return de::toLower(std::string(getFormatName(format)).substr(std::string("VK_FORMAT_").size()));
+}
+
+} // anonymous namespace
+
+tcu::TestCaseGroup* createLogicOpTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> logicOpTests (new tcu::TestCaseGroup(testCtx, "logic_op", "Logical Operations tests"));
+
+ // 4 bits are enough to check all possible combinations of logical operation inputs at once, for example s AND d:
+ //
+ // 1 0 1 0
+ // AND 1 1 0 0
+ // ------------
+ // 1 0 0 0
+ //
+ // However, we will choose color values such that both higher bits and lower bits are used, and the implementation will not be
+ // able to mix channels by mistake.
+ //
+ // 0011 0101 1010 1100
+ // 3 5 a c
+ // 0101 0011 1100 1010
+ // 5 3 c a
+
+ const tcu::UVec4 kQuadColor = { 0x35acU, 0x5ac3U, 0xac35U, 0xc35aU };
+ const tcu::UVec4 kFbColor = { 0x53caU, 0x3ca5U, 0xca53U, 0xa53cU };
+
+ // Note: the format will be chosen and changed later.
+ std::vector<TestParams> logicOpTestParams =
+ {
+ { VK_LOGIC_OP_CLEAR, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "clear" },
+ { VK_LOGIC_OP_AND, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "and" },
+ { VK_LOGIC_OP_AND_REVERSE, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "and_reverse" },
+ { VK_LOGIC_OP_COPY, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "copy" },
+ { VK_LOGIC_OP_AND_INVERTED, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "and_inverted" },
+ { VK_LOGIC_OP_NO_OP, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "no_op" },
+ { VK_LOGIC_OP_XOR, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "xor" },
+ { VK_LOGIC_OP_OR, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "or" },
+ { VK_LOGIC_OP_NOR, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "nor" },
+ { VK_LOGIC_OP_EQUIVALENT, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "equivalent" },
+ { VK_LOGIC_OP_INVERT, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "invert" },
+ { VK_LOGIC_OP_OR_REVERSE, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "or_reverse" },
+ { VK_LOGIC_OP_COPY_INVERTED, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "copy_inverted" },
+ { VK_LOGIC_OP_OR_INVERTED, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "or_inverted" },
+ { VK_LOGIC_OP_NAND, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "nand" },
+ { VK_LOGIC_OP_SET, kFbColor, kQuadColor, VK_FORMAT_UNDEFINED, "set" },
+ };
+
+ const VkFormat formatList[] =
+ {
+ VK_FORMAT_R8_UINT,
+ VK_FORMAT_R8G8_UINT,
+ VK_FORMAT_R8G8B8_UINT,
+ VK_FORMAT_B8G8R8_UINT,
+ VK_FORMAT_R8G8B8A8_UINT,
+ VK_FORMAT_B8G8R8A8_UINT,
+ VK_FORMAT_R16_UINT,
+ VK_FORMAT_R16G16_UINT,
+ VK_FORMAT_R16G16B16_UINT,
+ VK_FORMAT_R16G16B16A16_UINT,
+ VK_FORMAT_R32_UINT,
+ VK_FORMAT_R32G32_UINT,
+ VK_FORMAT_R32G32B32_UINT,
+ VK_FORMAT_R32G32B32A32_UINT,
+ };
+
+ for (int formatIdx = 0; formatIdx < DE_LENGTH_OF_ARRAY(formatList); ++formatIdx)
+ {
+ const auto& format = formatList[formatIdx];
+ const auto formatName = getSimpleFormatName(format);
+ const auto formatDesc = "Logical operator tests with format " + formatName;
+
+ de::MovePtr<tcu::TestCaseGroup> formatGroup (new tcu::TestCaseGroup(testCtx, formatName.c_str(), formatDesc.c_str()));
+
+ for (auto& params : logicOpTestParams)
+ {
+ params.format = format;
+ formatGroup->addChild(new LogicOpTest(testCtx, params.name, "Tests the " + params.name + " logical operator", params));
+ }
+
+ logicOpTests->addChild(formatGroup.release());
+ }
+
+ return logicOpTests.release();
+}
+
+} // pipeline namespace
+} // vkt namespace
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineLogicOpTests.hpp
similarity index 68%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/pipeline/vktPipelineLogicOpTests.hpp
index 1a85ebf..94a2fa8 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineLogicOpTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTPIPELINELOGICOPTESTS_HPP
+#define _VKTPIPELINELOGICOPTESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,20 +21,19 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Logical Operations Tests
*//*--------------------------------------------------------------------*/
-#include "tcuDefs.hpp"
-#include "tcuTestCase.hpp"
+#include "vktTestCase.hpp"
namespace vkt
{
namespace pipeline
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createLogicOpTests (tcu::TestContext& testCtx);
} // pipeline
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTPIPELINELOGICOPTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMiscTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMiscTests.cpp
new file mode 100644
index 0000000..0a9e53c
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMiscTests.cpp
@@ -0,0 +1,108 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2019 Google LLC
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Tests using only vertex shader in a graphics pipeline
+ *//*--------------------------------------------------------------------*/
+
+#include <string>
+
+#include "vktTestGroupUtil.hpp"
+#include "vktAmberTestCase.hpp"
+#include "vktPipelineMiscTests.hpp"
+
+namespace vkt
+{
+namespace pipeline
+{
+namespace
+{
+
+enum AmberFeatureBits
+{
+ AMBER_FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS = (1 << 0),
+ AMBER_FEATURE_TESSELATION_SHADER = (1 << 1),
+ AMBER_FEATURE_GEOMETRY_SHADER = (1 << 2),
+};
+
+using AmberFeatureFlags = deUint32;
+
+std::vector<std::string> getFeatureList (AmberFeatureFlags flags)
+{
+ std::vector<std::string> requirements;
+
+ if (flags & AMBER_FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS)
+ requirements.push_back("Features.vertexPipelineStoresAndAtomics");
+
+ if (flags & AMBER_FEATURE_TESSELATION_SHADER)
+ requirements.push_back("Features.tessellationShader");
+
+ if (flags & AMBER_FEATURE_GEOMETRY_SHADER)
+ requirements.push_back("Features.geometryShader");
+
+ return requirements;
+}
+
+void addTests (tcu::TestCaseGroup* tests, const char* data_dir)
+{
+ tcu::TestContext& testCtx = tests->getTestContext();
+
+ // Shader test files are saved in <path>/external/vulkancts/data/vulkan/amber/<data_dir>/<basename>.amber
+ struct Case {
+ const char* basename;
+ const char* description;
+ AmberFeatureFlags flags;
+ };
+
+ const Case cases[] =
+ {
+ {
+ "position_to_ssbo",
+ "Write position data into ssbo using only the vertex shader in a pipeline",
+ (AMBER_FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS),
+ },
+ {
+ "primitive_id_from_tess",
+ "Read primitive id from tessellation shaders without a geometry shader",
+ (AMBER_FEATURE_TESSELATION_SHADER | AMBER_FEATURE_GEOMETRY_SHADER),
+ },
+ };
+
+ for (unsigned i = 0; i < DE_LENGTH_OF_ARRAY(cases) ; ++i)
+ {
+ std::string file = std::string(cases[i].basename) + ".amber";
+ std::vector<std::string> requirements = getFeatureList(cases[i].flags);
+ cts_amber::AmberTestCase *testCase = cts_amber::createAmberTestCase(testCtx, cases[i].basename, cases[i].description, data_dir, file, requirements);
+
+ tests->addChild(testCase);
+ }
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createMiscTests (tcu::TestContext& testCtx)
+{
+ // Location of the Amber script files under the data/vulkan/amber source tree.
+ const char* data_dir = "pipeline";
+ return createTestGroup(testCtx, "misc", "Miscellaneous pipeline tests", addTests, data_dir);
+}
+
+} // SpirVAssembly
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMiscTests.hpp
similarity index 84%
rename from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
rename to external/vulkancts/modules/vulkan/pipeline/vktPipelineMiscTests.hpp
index 1a85ebf..0b72c0d 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMiscTests.hpp
@@ -1,5 +1,5 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTPIPELINEMISCTESTS_HPP
+#define _VKTPIPELINEMISCTESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
@@ -32,9 +32,9 @@
namespace pipeline
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createMiscTests (tcu::TestContext& testCtx);
} // pipeline
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTPIPELINEMISCTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp
index 67046b7..7483b86 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolve.cpp
@@ -44,6 +44,17 @@
tcu::TestStatus MSInstanceBaseResolve::iterate (void)
{
+ // cases creating this tests are defined using templates and we do not have easy access
+ // to image type - to do this check in checkSupport bigger reffactoring would be needed
+ if (m_context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !m_context.getPortabilitySubsetFeatures().multisampleArrayImage &&
+ (m_imageType == IMAGE_TYPE_2D_ARRAY) &&
+ (m_imageMSParams.numSamples != VK_SAMPLE_COUNT_1_BIT) &&
+ (m_imageMSParams.imageSize.z() != 1))
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Implementation does not support image array with multiple samples per texel");
+ }
+
const InstanceInterface& instance = m_context.getInstanceInterface();
const DeviceInterface& deviceInterface = m_context.getDeviceInterface();
const VkDevice device = m_context.getDevice();
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp
index 453fa03..012844a 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBaseResolveAndPerSampleFetch.cpp
@@ -258,7 +258,7 @@
}
std::vector<VkSubpassDescription> subpasses(1u + numSamples);
- std::vector<VkSubpassDependency> subpassDependencies(numSamples);
+ std::vector<VkSubpassDependency> subpassDependencies;
const VkSubpassDescription firstSubpassDesc =
{
@@ -305,7 +305,23 @@
0u, // VkDependencyFlags dependencyFlags;
};
- subpassDependencies[sampleNdx] = subpassDependency;
+ subpassDependencies.push_back(subpassDependency);
+ }
+ // now handle the very last sample pass, which must synchronize with all prior subpasses
+ for (deUint32 sampleNdx = 0u; sampleNdx < (numSamples - 1); ++sampleNdx)
+ {
+ const VkSubpassDependency subpassDependency =
+ {
+ 1u + sampleNdx, // uint32_t srcSubpass;
+ numSamples, // uint32_t dstSubpass;
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask;
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask;
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask;
+ 0u, // VkDependencyFlags dependencyFlags;
+ };
+
+ subpassDependencies.push_back(subpassDependency);
}
const VkRenderPassCreateInfo renderPassInfo =
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp
index ef4efb3..62c33d0 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.cpp
@@ -69,6 +69,7 @@
int numLayers;
VkFormat colorFormat;
VkSampleCountFlagBits numSamples;
+ bool colorSamples;
};
template<typename T>
@@ -616,6 +617,117 @@
return std::vector<Vertex4RGBA>(data, data + DE_LENGTH_OF_ARRAY(data));
}
+Vec4 sampleIndexToColor (deUint32 index)
+{
+ Vec4 res = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
+
+ if (index & 0x01) res += Vec4(0.5f, 0.0f, 0.0f, 0.0f);
+ if (index & 0x02) res += Vec4(0.0f, 0.5f, 0.0f, 0.0f);
+ if (index & 0x04) res += Vec4(0.0f, 0.0f, 0.5f, 0.0f);
+
+ if (index & 0x08) res += Vec4(0.5f, 0.0f, 0.0f, 0.0f);
+ if (index & 0x10) res += Vec4(0.0f, 0.5f, 0.0f, 0.0f);
+ if (index & 0x20) res += Vec4(0.0f, 0.0f, 0.5f, 0.0f);
+
+ return res;
+}
+
+float* getStandardSampleLocations (VkSampleCountFlagBits samples)
+{
+ static float standardSampleLocations_1[1 * 2] = {
+ 0.5f, 0.5f,
+ };
+
+ static float standardSampleLocations_2[2 * 2] = {
+ 0.75f, 0.75f,
+ 0.25f, 0.25f,
+ };
+
+ static float standardSampleLocations_4[4 * 2] = {
+ 0.375f, 0.125f,
+ 0.875f, 0.375f,
+ 0.125f, 0.625f,
+ 0.625f, 0.875f,
+ };
+
+ static float standardSampleLocations_8[8 * 2] = {
+ 0.5625f, 0.3125f,
+ 0.4375f, 0.6875f,
+ 0.8125f, 0.5625f,
+ 0.3125f, 0.1875f,
+ 0.1875f, 0.8125f,
+ 0.0625f, 0.4375f,
+ 0.6875f, 0.9375f,
+ 0.9375f, 0.0625f,
+ };
+
+ static float standardSampleLocations_16[16 * 2] = {
+ 0.5625f, 0.5625f,
+ 0.4375f, 0.3125f,
+ 0.3125f, 0.625f,
+ 0.75f, 0.4375f,
+ 0.1875f, 0.375f,
+ 0.625f, 0.8125f,
+ 0.8125f, 0.6875f,
+ 0.6875f, 0.1875f,
+ 0.375f, 0.875f,
+ 0.5f, 0.0625f,
+ 0.25f, 0.125f,
+ 0.125f, 0.75f,
+ 0.0f, 0.5f,
+ 0.9375f, 0.25f,
+ 0.875f, 0.9375f,
+ 0.0625f, 0.0f,
+ };
+
+ switch (samples)
+ {
+ case VK_SAMPLE_COUNT_1_BIT:
+ return standardSampleLocations_1;
+ case VK_SAMPLE_COUNT_2_BIT:
+ return standardSampleLocations_2;
+ case VK_SAMPLE_COUNT_4_BIT:
+ return standardSampleLocations_4;
+ case VK_SAMPLE_COUNT_8_BIT:
+ return standardSampleLocations_8;
+ case VK_SAMPLE_COUNT_16_BIT:
+ return standardSampleLocations_16;
+ default:
+ TCU_THROW(InternalError, "Unknown multisample bit configuration requested");
+ }
+}
+
+//! A flat-colored shapes plotted at standard sample points.
+std::vector<Vertex4RGBA> genPerSampleTriangleVertices (VkSampleCountFlagBits samples)
+{
+ float* coordinates = getStandardSampleLocations(samples);
+ const float triangleSize = 1.0f / (static_cast<float>(samples) * 2.0f);
+ std::vector<Vertex4RGBA> res;
+
+ for (deUint32 i = 0; i < static_cast<deUint32>(samples); i++)
+ {
+ Vertex4RGBA data[] =
+ {
+ {
+ Vec4(0 + coordinates[i * 2 + 0] * 2 - 1, -triangleSize + coordinates[i * 2 + 1] * 2 - 1, 0.0f, 1.0f),
+ sampleIndexToColor(i),
+ },
+ {
+ Vec4(-triangleSize + coordinates[i * 2 + 0] * 2 - 1, triangleSize + coordinates[i * 2 + 1] * 2 - 1, 0.0f, 1.0f),
+ sampleIndexToColor(i),
+ },
+ {
+ Vec4(triangleSize + coordinates[i * 2 + 0] * 2 - 1, triangleSize + coordinates[i * 2 + 1] * 2 - 1, 0.0f, 1.0f),
+ sampleIndexToColor(i),
+ },
+ };
+ res.push_back(data[0]);
+ res.push_back(data[1]);
+ res.push_back(data[2]);
+ }
+ return res;
+}
+
//! A full-viewport quad. Use with TRIANGLE_STRIP topology.
std::vector<Vertex4RGBA> genFullQuadVertices (void)
{
@@ -770,7 +882,7 @@
}
// Vertex buffer
- const std::vector<Vertex4RGBA> vertices = genTriangleVertices();
+ const std::vector<Vertex4RGBA> vertices = caseDef.colorSamples ? genPerSampleTriangleVertices(caseDef.numSamples) : genTriangleVertices();
const VkDeviceSize vertexBufferSize = sizeInBytes(vertices);
const Unique<VkBuffer> vertexBuffer (makeBuffer(vk, device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
@@ -805,7 +917,6 @@
vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE);
vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[layerNdx]);
-
vk.cmdDraw(*cmdBuffer, static_cast<deUint32>(vertices.size()), 1u, 0u, 0u);
}
@@ -900,6 +1011,13 @@
const VkImageUsageFlags colorImageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
checkImageFormatRequirements(context.getInstanceInterface(), context.getPhysicalDevice(), caseDef.numSamples, caseDef.colorFormat, colorImageUsage);
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().multisampleArrayImage &&
+ (caseDef.numSamples != VK_SAMPLE_COUNT_1_BIT) && (caseDef.numLayers != 1))
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Implementation does not support image array with multiple samples per texel");
+ }
}
tcu::TestStatus test (Context& context, const CaseDef caseDef)
@@ -1380,6 +1498,237 @@
} // StorageImage ns
+
+namespace StandardSamplePosition
+{
+
+void initPrograms (SourceCollections& programCollection, const CaseDef caseDef)
+{
+ // Pass 1: Render to texture
+
+ addSimpleVertexAndFragmentPrograms(programCollection, caseDef);
+
+ // Pass 2: Sample texture
+
+ // Vertex shader
+ {
+ std::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("sample_vert") << glu::VertexSource(src.str());
+ }
+
+ // Fragment shader
+ {
+ std::ostringstream src;
+ src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+ << "\n"
+ << "layout(location = 0) out uint o_status;\n"
+ << "\n"
+ << "layout(set = 0, binding = 0) uniform sampler2DMS colorTexture;\n"
+ << "\n"
+ << "void main(void)\n"
+ << "{\n"
+ << " uint result = 0;\n"
+ << " vec4 a, b;\n\n"
+ << "\n";
+
+ for (deUint32 sampleNdx = 0; sampleNdx < (deUint32)caseDef.numSamples; sampleNdx++)
+ {
+ Vec4 expectedColor = sampleIndexToColor(sampleNdx);
+
+ src << " a = texelFetch(colorTexture, ivec2(0,0), " << sampleNdx << ");\n"
+ " b = vec4(" << expectedColor.x() << ", " << expectedColor.y() << ", " << expectedColor.z() << ", 1.0);\n"
+ " if (abs(a.x - b.x) > 0.1 || abs(a.y - b.y) > 0.1 || abs(a.z - b.z) > 0.1) result++;\n";
+ }
+
+ src << "\n"
+ << " o_status = result;\n"
+ << "}\n";
+
+ programCollection.glslSources.add("sample_frag") << glu::FragmentSource(src.str());
+ }
+}
+
+void checkSupport (Context& context, const CaseDef caseDef)
+{
+ const VkImageUsageFlags colorImageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+ const VkPhysicalDeviceProperties props = getPhysicalDeviceProperties(context.getInstanceInterface(), context.getPhysicalDevice());
+
+ checkImageFormatRequirements(context.getInstanceInterface(), context.getPhysicalDevice(), caseDef.numSamples, caseDef.colorFormat, colorImageUsage);
+
+ if (!props.limits.standardSampleLocations)
+ TCU_THROW(NotSupportedError, "Device does not support standard sample locations.");
+
+ if (caseDef.numSamples == VK_SAMPLE_COUNT_32_BIT ||
+ caseDef.numSamples == VK_SAMPLE_COUNT_64_BIT)
+ {
+ TCU_THROW(InternalError, "Standard does not define sample positions for 32x or 64x multisample modes");
+ }
+
+}
+
+tcu::TestStatus test (Context& context, const CaseDef caseDef)
+{
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice device = context.getDevice();
+ const VkQueue queue = context.getUniversalQueue();
+ const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ Allocator& allocator = context.getDefaultAllocator();
+
+ const VkImageUsageFlags colorImageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+
+ {
+ tcu::TestLog& log = context.getTestContext().getLog();
+ log << tcu::LogSection("Description", "")
+ << tcu::TestLog::Message << "Rendering to a multisampled image. Expecting samples to have specified colors." << tcu::TestLog::EndMessage
+ << tcu::TestLog::Message << "Sampling from the texture with texelFetch (OpImageFetch)." << tcu::TestLog::EndMessage
+ << tcu::TestLog::EndSection;
+ }
+
+ // Multisampled color image
+ const Unique<VkImage> colorImage (makeImage(vk, device, caseDef.colorFormat, caseDef.renderSize, caseDef.numLayers, caseDef.numSamples, colorImageUsage));
+ const UniquePtr<Allocation> colorImageAlloc (bindImage(vk, device, allocator, *colorImage, MemoryRequirement::Any));
+
+ const Unique<VkCommandPool> cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
+ const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
+
+ // Step 1: Render to texture
+ {
+ renderMultisampledImage(context, caseDef, *colorImage);
+ }
+
+ // Step 2: Sample texture
+ {
+ // Color image view
+ const VkImageViewType colorImageViewType = (caseDef.numLayers == 1 ? VK_IMAGE_VIEW_TYPE_2D : VK_IMAGE_VIEW_TYPE_2D_ARRAY);
+ const Unique<VkImageView> colorImageView (makeImageView(vk, device, *colorImage, colorImageViewType, caseDef.colorFormat, makeColorSubresourceRange(0, caseDef.numLayers)));
+ const Unique<VkSampler> colorSampler (makeSampler(vk, device));
+
+ // Checksum image
+ const VkFormat checksumFormat = VK_FORMAT_R8_UINT;
+ const Unique<VkImage> checksumImage (makeImage(vk, device, checksumFormat, caseDef.renderSize, 1u, VK_SAMPLE_COUNT_1_BIT,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT));
+ const UniquePtr<Allocation> checksumImageAlloc (bindImage(vk, device, allocator, *checksumImage, MemoryRequirement::Any));
+ const Unique<VkImageView> checksumImageView (makeImageView(vk, device, *checksumImage, VK_IMAGE_VIEW_TYPE_2D, checksumFormat, makeColorSubresourceRange(0, 1)));
+
+ // Checksum buffer (for host reading)
+ const VkDeviceSize checksumBufferSize = caseDef.renderSize.x() * caseDef.renderSize.y() * tcu::getPixelSize(mapVkFormat(checksumFormat));
+ const Unique<VkBuffer> checksumBuffer (makeBuffer(vk, device, checksumBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
+ const UniquePtr<Allocation> checksumBufferAlloc (bindBuffer(vk, device, allocator, *checksumBuffer, MemoryRequirement::HostVisible));
+
+ zeroBuffer(vk, device, *checksumBufferAlloc, checksumBufferSize);
+
+ // Vertex buffer
+ const std::vector<Vertex4RGBA> vertices = genFullQuadVertices();
+ const VkDeviceSize vertexBufferSize = sizeInBytes(vertices);
+ const Unique<VkBuffer> vertexBuffer (makeBuffer(vk, device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+ const UniquePtr<Allocation> vertexBufferAlloc (bindBuffer(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
+
+ {
+ deMemcpy(vertexBufferAlloc->getHostPtr(), &vertices[0], static_cast<std::size_t>(vertexBufferSize));
+ flushAlloc(vk, device, *vertexBufferAlloc);
+ }
+
+ // Descriptors
+ // \note OpImageFetch doesn't use a sampler, but in GLSL texelFetch needs a sampler2D which translates to a combined image sampler in Vulkan.
+
+ const Unique<VkDescriptorSetLayout> descriptorSetLayout(DescriptorSetLayoutBuilder()
+ .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, &colorSampler.get())
+ .build(vk, device));
+
+ const Unique<VkDescriptorPool> descriptorPool(DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
+ .build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
+
+ const Unique<VkDescriptorSet> descriptorSet (makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
+ const VkDescriptorImageInfo imageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, *colorImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+
+ DescriptorSetUpdateBuilder()
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imageDescriptorInfo)
+ .update(vk, device);
+
+ const Unique<VkShaderModule> vertexModule (createShaderModule (vk, device, context.getBinaryCollection().get("sample_vert"), 0u));
+ const Unique<VkShaderModule> fragmentModule (createShaderModule (vk, device, context.getBinaryCollection().get("sample_frag"), 0u));
+ const Unique<VkRenderPass> renderPass (makeSimpleRenderPass (vk, device, checksumFormat));
+ const Unique<VkFramebuffer> framebuffer (makeFramebuffer (vk, device, *renderPass, 1u, &checksumImageView.get(),
+ static_cast<deUint32>(caseDef.renderSize.x()), static_cast<deUint32>(caseDef.renderSize.y())));
+ const Unique<VkPipelineLayout> pipelineLayout (makePipelineLayout (vk, device, *descriptorSetLayout));
+ const std::vector<PipelineSp> pipelines (makeGraphicsPipelines (vk, device, 1u, *pipelineLayout, *renderPass, *vertexModule, *fragmentModule,
+ caseDef.renderSize, VK_SAMPLE_COUNT_1_BIT, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
+
+ beginCommandBuffer(vk, *cmdBuffer);
+
+ // Prepare for sampling in the fragment shader
+ {
+ const VkImageMemoryBarrier barriers[] =
+ {
+ {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags outputMask;
+ VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags inputMask;
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout newLayout;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
+ VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex;
+ *colorImage, // VkImage image;
+ makeColorSubresourceRange(0, caseDef.numLayers), // VkImageSubresourceRange subresourceRange;
+ },
+ };
+
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u,
+ 0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(barriers), barriers);
+ }
+
+ beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(0, 0, caseDef.renderSize.x(), caseDef.renderSize.y()), tcu::UVec4(0u));
+
+ vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines.back());
+ vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
+ {
+ const VkDeviceSize vertexBufferOffset = 0ull;
+ vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &vertexBuffer.get(), &vertexBufferOffset);
+ }
+
+ vk.cmdDraw(*cmdBuffer, static_cast<deUint32>(vertices.size()), 1u, 0u, 0u);
+ endRenderPass(vk, *cmdBuffer);
+
+ copyImageToBuffer(vk, *cmdBuffer, *checksumImage, *checksumBuffer, caseDef.renderSize);
+
+ endCommandBuffer(vk, *cmdBuffer);
+ submitCommandsAndWait(vk, device, queue, *cmdBuffer);
+
+ // Verify result
+
+ {
+ invalidateAlloc(vk, device, *checksumBufferAlloc);
+
+ const tcu::ConstPixelBufferAccess access (mapVkFormat(checksumFormat), caseDef.renderSize.x(), caseDef.renderSize.y(), 1, checksumBufferAlloc->getHostPtr());
+
+ deUint32 result = access.getPixelUint(0, 0).x();
+
+ if (result)
+ return tcu::TestStatus::fail(std::to_string(result) + " multisamples have unexpected color.");
+ }
+ }
+
+ return tcu::TestStatus::pass("OK");
+}
+
+} // StandardSamplePosition ns
+
+
std::string getSizeLayerString (const IVec2& size, const int numLayers)
{
std::ostringstream str;
@@ -1442,6 +1791,7 @@
numLayers[layerNdx], // int numLayers;
format[formatNdx], // VkFormat colorFormat;
samples[samplesNdx], // VkSampleCountFlagBits numSamples;
+ false, // bool colorQuad;
};
addFunctionCaseWithPrograms(formatGroup.get(), caseName.str(), "", checkSupport, initPrograms, testFunc, caseDef);
@@ -1452,6 +1802,49 @@
}
}
+void addStandardSamplePositionTestCasesWithFunctions (tcu::TestCaseGroup* group,
+ FunctionSupport1<CaseDef>::Function checkSupport,
+ FunctionPrograms1<CaseDef>::Function initPrograms,
+ FunctionInstance1<CaseDef>::Function testFunc)
+{
+ const VkSampleCountFlagBits samples[] =
+ {
+ VK_SAMPLE_COUNT_2_BIT,
+ VK_SAMPLE_COUNT_4_BIT,
+ VK_SAMPLE_COUNT_8_BIT,
+ VK_SAMPLE_COUNT_16_BIT,
+ VK_SAMPLE_COUNT_32_BIT,
+ VK_SAMPLE_COUNT_64_BIT,
+ };
+ const VkFormat format[] =
+ {
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_FORMAT_R32G32B32A32_SFLOAT,
+ };
+
+ for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(format); ++formatNdx)
+ {
+ MovePtr<tcu::TestCaseGroup> formatGroup(new tcu::TestCaseGroup(group->getTestContext(), getFormatString(format[formatNdx]).c_str(), ""));
+ for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); ++samplesNdx)
+ {
+ std::ostringstream caseName;
+ caseName << "samples_" << getNumSamples(samples[samplesNdx]);
+
+ const CaseDef caseDef =
+ {
+ IVec2(1,1), // IVec2 renderSize;
+ 1, // int numLayers;
+ format[formatNdx], // VkFormat colorFormat;
+ samples[samplesNdx], // VkSampleCountFlagBits numSamples;
+ true, // bool colorQuad;
+ };
+
+ addFunctionCaseWithPrograms(formatGroup.get(), caseName.str(), "", checkSupport, initPrograms, testFunc, caseDef);
+ }
+ group->addChild(formatGroup.release());
+ }
+}
+
void createSampledImageTestsInGroup (tcu::TestCaseGroup* group)
{
addTestCasesWithFunctions(group, SampledImage::checkSupport, SampledImage::initPrograms, SampledImage::test);
@@ -1462,6 +1855,11 @@
addTestCasesWithFunctions(group, StorageImage::checkSupport, StorageImage::initPrograms, StorageImage::test);
}
+void createStandardSamplePositionTestsInGroup (tcu::TestCaseGroup* group)
+{
+ addStandardSamplePositionTestCasesWithFunctions(group, StandardSamplePosition::checkSupport, StandardSamplePosition::initPrograms, StandardSamplePosition::test);
+}
+
} // anonymous ns
//! Render to a multisampled image and sample from it in a fragment shader.
@@ -1476,5 +1874,11 @@
return createTestGroup(testCtx, "storage_image", "Multisampled image draw and read/write in compute shader", createStorageImageTestsInGroup);
}
+//! Render to a multisampled image and verify standard multisample positions.
+tcu::TestCaseGroup* createMultisampleStandardSamplePositionTests (tcu::TestContext& testCtx)
+{
+ return createTestGroup(testCtx, "standardsampleposition", "Multisampled image standard sample position tests", createStandardSamplePositionTestsInGroup);
+}
+
} // pipeline
} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.hpp
index caec2d7..cf8d1e9 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleImageTests.hpp
@@ -32,6 +32,7 @@
tcu::TestCaseGroup* createMultisampleSampledImageTests (tcu::TestContext& testCtx);
tcu::TestCaseGroup* createMultisampleStorageImageTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createMultisampleStandardSamplePositionTests(tcu::TestContext& testCtx);
} // pipeline
} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
index e3ed15f..60c183f 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleInterpolationTests.cpp
@@ -87,7 +87,7 @@
void init (void);
void initPrograms (vk::SourceCollections& programCollection) const;
- virtual void checkSupport (Context&) const {}
+ void checkSupport (Context& context) const;
TestInstance* createInstance (Context& context) const;
static MultisampleCaseBase* createCase (tcu::TestContext& testCtx,
const std::string& name,
@@ -95,6 +95,18 @@
};
template <typename CaseClassName>
+void MSCase<CaseClassName>::checkSupport (Context& context) const
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().shaderSampleRateInterpolationFunctions)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Shader sample rate interpolation functions are not supported by this implementation");
+ }
+
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
+}
+
+template <typename CaseClassName>
MultisampleCaseBase* MSCase<CaseClassName>::createCase (tcu::TestContext& testCtx, const std::string& name, const ImageMSParams& imageMSParams)
{
return new MSCase<CaseClassName>(testCtx, name, imageMSParams);
@@ -291,11 +303,6 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
-template<> void MSCase<MSCaseInterpolateAtSampleDistinctValues>::checkSupport (Context& context) const
-{
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
-}
-
template<> TestInstance* MSCase<MSCaseInterpolateAtSampleDistinctValues>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceDistinctValues>(context, m_imageMSParams);
@@ -418,11 +425,6 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
-template<> void MSCase<MSCaseInterpolateAtSampleSingleSample>::checkSupport (Context& context) const
-{
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
-}
-
template<> TestInstance* MSCase<MSCaseInterpolateAtSampleSingleSample>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
@@ -492,11 +494,6 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
-template<> void MSCase<MSCaseInterpolateAtSampleIgnoresCentroid>::checkSupport (Context& context) const
-{
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
-}
-
template<> TestInstance* MSCase<MSCaseInterpolateAtSampleIgnoresCentroid>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
@@ -601,11 +598,6 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
-template<> void MSCase<MSCaseInterpolateAtSampleConsistency>::checkSupport (Context& context) const
-{
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
-}
-
template<> TestInstance* MSCase<MSCaseInterpolateAtSampleConsistency>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
@@ -710,11 +702,6 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
-template<> void MSCase<MSCaseInterpolateAtCentroidConsistency>::checkSupport (Context& context) const
-{
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
-}
-
template<> TestInstance* MSCase<MSCaseInterpolateAtCentroidConsistency>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
@@ -790,11 +777,6 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
-template<> void MSCase<MSCaseInterpolateAtOffsetPixelCenter>::checkSupport (Context& context) const
-{
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
-}
-
template<> TestInstance* MSCase<MSCaseInterpolateAtOffsetPixelCenter>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
@@ -901,11 +883,6 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
-template<> void MSCase<MSCaseInterpolateAtOffsetSamplePosition>::checkSupport (Context& context) const
-{
- context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_SAMPLE_RATE_SHADING);
-}
-
template<> TestInstance* MSCase<MSCaseInterpolateAtOffsetSamplePosition>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceInterpolateScreenPosition>(context, m_imageMSParams);
@@ -1020,6 +997,10 @@
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());
}
+template<> void MSCase<MSCaseCentroidQualifierInsidePrimitive>::checkSupport (Context&) const
+{
+}
+
template<> TestInstance* MSCase<MSCaseCentroidQualifierInsidePrimitive>::createInstance (Context& context) const
{
return new MSInstance<MSInstanceInterpolateBarycentricCoordinates>(context, m_imageMSParams);
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp
index 80861fa..12687fe 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleSampleLocationsExtTests.cpp
@@ -814,6 +814,17 @@
subpassDependencies.push_back(dependency);
}
}
+ // add a final dependency to synchronize results for the copy commands that will follow the renderpass
+ const VkSubpassDependency finalDependency = {
+ numSubpasses - 1, // uint32_t srcSubpass;
+ VK_SUBPASS_EXTERNAL, // uint32_t dstSubpass;
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, // VkPipelineStageFlags srcStageMask;
+ VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask;
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
+ VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
+ (VkDependencyFlags)0, // VkDependencyFlags dependencyFlags;
+ };
+ subpassDependencies.push_back(finalDependency);
const VkRenderPassCreateInfo renderPassInfo =
{
@@ -1535,16 +1546,6 @@
vk.cmdDraw(*cmdBuffer, m_numVertices, 1u, 0u, 0u);
endRenderPass(vk, *cmdBuffer);
- // Resolve image -> host buffer
- recordImageBarrier(vk, *cmdBuffer, *m_resolveImage,
- VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspect,
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask,
- VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask,
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask,
- VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout oldLayout,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); // VkImageLayout newLayout)
-
recordCopyImageToBuffer(vk, *cmdBuffer, m_renderSize, *m_resolveImage, *m_colorBuffer);
endCommandBuffer(vk, *cmdBuffer);
@@ -1795,6 +1796,12 @@
// Are we allowed to modify the sample pattern within the same subpass?
if (params.drawIn == TEST_DRAW_IN_SAME_SUBPASS && ((params.options & TEST_OPTION_SAME_PATTERN_BIT) == 0) && !getSampleLocationsPropertiesEXT(context).variableSampleLocations)
TCU_THROW(NotSupportedError, "VkPhysicalDeviceSampleLocationsPropertiesEXT: variableSampleLocations not supported");
+
+ if (TEST_OPTION_WAIT_EVENTS_BIT & params.options &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
+ }
}
const char* getString (const TestImageAspect aspect)
@@ -2216,16 +2223,6 @@
endRenderPass(vk, *cmdBuffer);
- // Resolve image -> host buffer
- recordImageBarrier(vk, *cmdBuffer, *m_resolveImage,
- VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspect,
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask,
- VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask,
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask,
- VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout oldLayout,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); // VkImageLayout newLayout)
-
recordCopyImageToBuffer(vk, *cmdBuffer, m_renderSize, *m_resolveImage, *m_colorBuffer);
endCommandBuffer(vk, *cmdBuffer);
@@ -2561,15 +2558,6 @@
}
// Resolve image -> host buffer
- recordImageBarrier(vk, currentCmdBuffer, *m_resolveImage,
- VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspect,
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask,
- VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask,
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask,
- VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout oldLayout,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); // VkImageLayout newLayout)
-
recordCopyImageToBuffer(vk, currentCmdBuffer, m_renderSize, *m_resolveImage, *m_colorBuffer);
endCommandBuffer(vk, currentCmdBuffer);
@@ -2802,15 +2790,6 @@
endRenderPass(vk, *cmdBuffer);
// Resolve image -> host buffer
- recordImageBarrier(vk, *cmdBuffer, *m_resolveImage,
- VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspect,
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask,
- VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask,
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask,
- VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout oldLayout,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); // VkImageLayout newLayout)
-
recordCopyImageToBuffer(vk, *cmdBuffer, m_renderSize, *m_resolveImage, *m_colorBuffer);
endCommandBuffer(vk, *cmdBuffer);
@@ -2957,15 +2936,6 @@
endRenderPass(vk, *cmdBuffer);
// Resolve image -> host buffer
- recordImageBarrier(vk, *cmdBuffer, *m_resolveImage,
- VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspect,
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask,
- VK_PIPELINE_STAGE_TRANSFER_BIT, // VkPipelineStageFlags dstStageMask,
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask,
- VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout oldLayout,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); // VkImageLayout newLayout)
-
recordCopyImageToBuffer(vk, *cmdBuffer, m_renderSize, *m_resolveImage, *m_colorBuffer);
endCommandBuffer(vk, *cmdBuffer);
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp
index 3db404c..6615ada 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleTests.cpp
@@ -2977,6 +2977,21 @@
};
subpassDependencies.push_back(copySampleSubpassDependency);
}
+ // the very last sample pass must synchronize with all prior subpasses
+ for (size_t i = 0; i < (m_perSampleImages.size() - 1); ++i)
+ {
+ const VkSubpassDependency storeSubpassDependency =
+ {
+ 1u + static_cast<deUint32>(i), // deUint32 srcSubpass
+ static_cast<deUint32>(m_perSampleImages.size()), // deUint32 dstSubpass
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask
+ 0u, // VkDependencyFlags dependencyFlags
+ };
+ subpassDependencies.push_back(storeSubpassDependency);
+ }
}
}
@@ -4586,6 +4601,11 @@
multisampleTests->addChild(createMultisampleStorageImageTests(testCtx));
}
+ // Sampling from a multisampled image texture (texelFetch), checking supersample positions
+ {
+ multisampleTests->addChild(createMultisampleStandardSamplePositionTests(testCtx));
+ }
+
// VK_EXT_sample_locations
{
multisampleTests->addChild(createMultisampleSampleLocationsExtTests(testCtx));
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp
new file mode 100644
index 0000000..f90eec4
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.cpp
@@ -0,0 +1,782 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
+ *
+ * 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 with shaders that do not write to the Position built-in.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktPipelineNoPositionTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkQueryUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vktPipelineImageUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkBuilderUtil.hpp"
+
+#include "tcuVector.hpp"
+#include "tcuTestLog.hpp"
+
+#include "deUniquePtr.hpp"
+
+#include <vector>
+#include <set>
+#include <sstream>
+#include <array>
+
+namespace vkt
+{
+namespace pipeline
+{
+
+namespace
+{
+
+using namespace vk;
+
+enum ShaderStageBits
+{
+ STAGE_VERTEX = (1 << 0),
+ STAGE_TESS_CONTROL = (1 << 1),
+ STAGE_TESS_EVALUATION = (1 << 2),
+ STAGE_GEOMETRY = (1 << 3),
+ STAGE_MASK_COUNT = (1 << 4),
+};
+
+using ShaderStageFlags = deUint32;
+
+constexpr deUint32 kStageCount = 4u;
+
+static_assert((1u << kStageCount) == static_cast<deUint32>(STAGE_MASK_COUNT),
+ "Total stage count does not match stage mask bits");
+
+struct TestParams
+{
+ ShaderStageFlags selectedStages; // Stages that will be present in the pipeline.
+ ShaderStageFlags writeStages; // Subset of selectedStages that will write to the Position built-in.
+ deUint32 numViews; // Number of views for multiview.
+ bool explicitDeclarations; // Explicitly declare the input and output blocks or not.
+ bool useSSBO; // Write to an SSBO from the selected stages.
+
+ // Commonly used checks.
+ bool tessellation (void) const { return (selectedStages & (STAGE_TESS_CONTROL | STAGE_TESS_EVALUATION)); }
+ bool geometry (void) const { return (selectedStages & STAGE_GEOMETRY); }
+};
+
+// Generates the combinations list of stage flags for writeStages when a given subset of stages are selected.
+std::vector<ShaderStageFlags> getWriteSubCases (ShaderStageFlags selectedStages)
+{
+ std::set<ShaderStageFlags> uniqueCases;
+ for (ShaderStageFlags stages = 0; stages < STAGE_MASK_COUNT; ++stages)
+ uniqueCases.insert(stages & selectedStages);
+ return std::vector<ShaderStageFlags>(begin(uniqueCases), end(uniqueCases));
+}
+
+class NoPositionCase : public vkt::TestCase
+{
+public:
+ NoPositionCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~NoPositionCase (void) {}
+
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
+ static tcu::Vec4 getBackGroundColor (void) { return tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f); }
+ static VkFormat getImageFormat (void) { return VK_FORMAT_R8G8B8A8_UNORM; }
+ static VkExtent3D getImageExtent (void) { return makeExtent3D(64u, 64u, 1u); }
+
+private:
+ TestParams m_params;
+};
+
+class NoPositionInstance : public vkt::TestInstance
+{
+public:
+ NoPositionInstance (Context& context, const TestParams& params);
+ virtual ~NoPositionInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+private:
+ TestParams m_params;
+};
+
+NoPositionCase::NoPositionCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (params)
+{
+ DE_ASSERT(params.numViews >= 1u);
+}
+
+void NoPositionCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ // Add shaders for the selected stages and write to gl_Position in the subset of stages marked for writing.
+
+ // Optional writes, extensions and declarations.
+ std::string ssboDecl;
+ std::string extensions;
+ std::string vertSSBOWrite;
+ std::string tescSSBOWrite;
+ std::string teseSSBOWrite;
+ std::string geomSSBOWrite;
+
+ const bool multiview = (m_params.numViews > 1u);
+
+ if (multiview)
+ extensions = "#extension GL_EXT_multiview : require\n";
+
+ if (m_params.useSSBO)
+ {
+ const auto stageCountStr = de::toString(kStageCount);
+ const auto ssboElementCount = kStageCount * m_params.numViews;
+ ssboDecl = "layout (set=0, binding=0, std430) buffer StorageBlock { uint counters[" + de::toString(ssboElementCount) + "]; } ssbo;\n";
+
+ const std::array<std::string*, kStageCount> writeStrings = {{ &vertSSBOWrite, &tescSSBOWrite, &teseSSBOWrite, &geomSSBOWrite }};
+ for (size_t i = 0; i < writeStrings.size(); ++i)
+ *writeStrings[i] = " atomicAdd(ssbo.counters[" + de::toString(i) + (multiview ? (" + uint(gl_ViewIndex) * " + stageCountStr) : "") + "], 1u);\n";
+ }
+
+ if (m_params.selectedStages & STAGE_VERTEX)
+ {
+ std::ostringstream vert;
+ vert
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (location=0) in vec4 in_pos;\n"
+ << (m_params.explicitDeclarations ?
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "};\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << ((m_params.writeStages & STAGE_VERTEX) ? " gl_Position = in_pos;\n" : "")
+ << vertSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vert.str());
+ }
+
+ if (m_params.selectedStages & STAGE_TESS_CONTROL)
+ {
+ std::ostringstream tesc;
+ tesc
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (vertices = 3) out;\n"
+ << (m_params.explicitDeclarations ?
+ "in gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_in[gl_MaxPatchVertices];\n"
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_out[];\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << " gl_TessLevelInner[0] = 1.0;\n"
+ << " gl_TessLevelInner[1] = 1.0;\n"
+ << " gl_TessLevelOuter[0] = 1.0;\n"
+ << " gl_TessLevelOuter[1] = 1.0;\n"
+ << " gl_TessLevelOuter[2] = 1.0;\n"
+ << " gl_TessLevelOuter[3] = 1.0;\n"
+ << "\n"
+ << ((m_params.writeStages & STAGE_TESS_CONTROL) ? " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n" : "")
+ << tescSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("tesc") << glu::TessellationControlSource(tesc.str());
+ }
+
+ if (m_params.selectedStages & STAGE_TESS_EVALUATION)
+ {
+ std::ostringstream tese;
+ tese
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (triangles, fractional_odd_spacing, cw) in;\n"
+ << (m_params.explicitDeclarations ?
+ "in gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_in[gl_MaxPatchVertices];\n"
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "};\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << ((m_params.writeStages & STAGE_TESS_EVALUATION) ?
+ " gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +\n"
+ " (gl_TessCoord.y * gl_in[1].gl_Position) +\n"
+ " (gl_TessCoord.z * gl_in[2].gl_Position);\n"
+ : "")
+ << teseSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(tese.str());
+ }
+
+ if (m_params.selectedStages & STAGE_GEOMETRY)
+ {
+ std::ostringstream geom;
+ geom
+ << "#version 450\n"
+ << extensions
+ << ssboDecl
+ << "layout (triangles) in;\n"
+ << "layout (triangle_strip, max_vertices=3) out;\n"
+ << (m_params.explicitDeclarations ?
+ "in gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "} gl_in[3];\n"
+ "out gl_PerVertex\n"
+ "{\n"
+ " vec4 gl_Position;\n"
+ " float gl_PointSize;\n"
+ " float gl_ClipDistance[];\n"
+ " float gl_CullDistance[];\n"
+ "};\n"
+ : "")
+ << "void main (void)\n"
+ << "{\n"
+ << " for (int i = 0; i < 3; i++)\n"
+ << " {\n"
+ << ((m_params.writeStages & STAGE_GEOMETRY) ? " gl_Position = gl_in[i].gl_Position;\n" : "")
+ << " EmitVertex();\n"
+ << " }\n"
+ << geomSSBOWrite
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("geom") << glu::GeometrySource(geom.str());
+ }
+
+ {
+ const auto backgroundColor = getBackGroundColor();
+
+ std::ostringstream colorStr;
+ colorStr << "vec4(" << backgroundColor.x() << ", " << backgroundColor.y() << ", " << backgroundColor.z() << ", " << backgroundColor.w() << ")";
+
+ std::ostringstream frag;
+ frag
+ << "#version 450\n"
+ << "layout (location=0) out vec4 out_color;\n"
+ << "void main (void)\n"
+ << "{\n"
+ << " out_color = " << colorStr.str() << ";\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("frag") << glu::FragmentSource(frag.str());
+ }
+}
+
+TestInstance* NoPositionCase::createInstance (Context& context) const
+{
+ return new NoPositionInstance (context, m_params);
+}
+
+void NoPositionCase::checkSupport (Context& context) const
+{
+ const auto features = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice());
+ const bool hasTess = m_params.tessellation();
+ const bool hasGeom = m_params.geometry();
+
+ if (hasTess && !features.tessellationShader)
+ TCU_THROW(NotSupportedError, "Tessellation shaders not supported");
+
+ if (hasGeom && !features.geometryShader)
+ TCU_THROW(NotSupportedError, "Geometry shaders not supported");
+
+ if (m_params.numViews > 1u)
+ {
+ context.requireDeviceFunctionality("VK_KHR_multiview");
+ const auto& multiviewFeatures = context.getMultiviewFeatures();
+
+ if (!multiviewFeatures.multiview)
+ TCU_THROW(NotSupportedError, "Multiview not supported");
+
+ if (hasTess && !multiviewFeatures.multiviewTessellationShader)
+ TCU_THROW(NotSupportedError, "Multiview not supported with tessellation shaders");
+
+ if (hasGeom && !multiviewFeatures.multiviewGeometryShader)
+ TCU_THROW(NotSupportedError, "Multiview not supported with geometry shaders");
+ }
+
+ if (m_params.useSSBO)
+ {
+ if (!features.vertexPipelineStoresAndAtomics)
+ TCU_THROW(NotSupportedError, "Vertex pipeline stores and atomics not supported");
+ }
+}
+
+NoPositionInstance::NoPositionInstance (Context& context, const TestParams& params)
+ : vkt::TestInstance (context)
+ , m_params (params)
+{}
+
+tcu::TestStatus NoPositionInstance::iterate (void)
+{
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ const auto queue = m_context.getUniversalQueue();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto format = NoPositionCase::getImageFormat();
+ const auto extent = NoPositionCase::getImageExtent();
+ const auto color = NoPositionCase::getBackGroundColor();
+ const VkImageUsageFlags usage = (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+ const bool tess = m_params.tessellation();
+ VkShaderStageFlags stageFlags = 0u;
+
+ // Shader modules.
+ Move<VkShaderModule> vert;
+ Move<VkShaderModule> tesc;
+ Move<VkShaderModule> tese;
+ Move<VkShaderModule> geom;
+ Move<VkShaderModule> frag;
+
+ if (m_params.selectedStages & STAGE_VERTEX)
+ {
+ vert = createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0u);
+ stageFlags |= VK_SHADER_STAGE_VERTEX_BIT;
+ }
+ if (m_params.selectedStages & STAGE_TESS_CONTROL)
+ {
+ tesc = createShaderModule(vkd, device, m_context.getBinaryCollection().get("tesc"), 0u);
+ stageFlags |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
+ }
+ if (m_params.selectedStages & STAGE_TESS_EVALUATION)
+ {
+ tese = createShaderModule(vkd, device, m_context.getBinaryCollection().get("tese"), 0u);
+ stageFlags |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
+ }
+ if (m_params.selectedStages & STAGE_GEOMETRY)
+ {
+ geom = createShaderModule(vkd, device, m_context.getBinaryCollection().get("geom"), 0u);
+ stageFlags |= VK_SHADER_STAGE_GEOMETRY_BIT;
+ }
+
+ frag = createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0u);
+ stageFlags |= VK_SHADER_STAGE_FRAGMENT_BIT;
+
+ // Color attachment.
+ const VkImageCreateInfo colorImageInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ format, // VkFormat format;
+ extent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ m_params.numViews, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ usage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0u, // deUint32 queueFamilyIndexCount;
+ nullptr, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+ ImageWithMemory colorImage (vkd, device, alloc, colorImageInfo, MemoryRequirement::Any);
+
+ const auto subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, m_params.numViews);
+ const auto colorImageView = makeImageView(vkd, device, colorImage.get(), VK_IMAGE_VIEW_TYPE_2D, format, subresourceRange);
+
+ // Vertices and vertex buffer.
+ std::vector<tcu::Vec4> vertices =
+ {
+ tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f),
+ tcu::Vec4( 0.5f, 0.5f, 0.0f, 1.0f),
+ tcu::Vec4(-0.5f, 0.5f, 0.0f, 1.0f),
+ };
+
+ const auto vertexBufferSize = static_cast<VkDeviceSize>(vertices.size() * sizeof(decltype(vertices)::value_type));
+ const auto vertexBufferInfo = makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ const auto vertexBufferOffset = static_cast<VkDeviceSize>(0);
+ BufferWithMemory vertexBuffer (vkd, device, alloc, vertexBufferInfo, MemoryRequirement::HostVisible);
+
+ auto& vertexBufferAlloc = vertexBuffer.getAllocation();
+ void* vertexBufferPtr = vertexBufferAlloc.getHostPtr();
+ deMemcpy(vertexBufferPtr, vertices.data(), static_cast<size_t>(vertexBufferSize));
+ flushAlloc(vkd, device, vertexBufferAlloc);
+
+ // Render pass.
+ const VkAttachmentDescription colorAttachment =
+ {
+ 0u, // VkAttachmentDescriptionFlags flags;
+ format, // VkFormat format;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
+ VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
+ VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
+ };
+
+ const VkAttachmentReference colorAttachmentReference =
+ {
+ 0u, // deUint32 attachment;
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
+ };
+
+ const VkSubpassDescription subpassDescription =
+ {
+ 0u, // VkSubpassDescriptionFlags flags;
+ VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
+ 0u, // deUint32 inputAttachmentCount;
+ nullptr, // const VkAttachmentReference* pInputAttachments;
+ 1u, // deUint32 colorAttachmentCount;
+ &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments;
+ 0u, // const VkAttachmentReference* pResolveAttachments;
+ nullptr, // const VkAttachmentReference* pDepthStencilAttachment;
+ 0u, // deUint32 preserveAttachmentCount;
+ nullptr, // const deUint32* pPreserveAttachments;
+ };
+
+ de::MovePtr<VkRenderPassMultiviewCreateInfo> multiviewInfo;
+ deUint32 viewMask = 0u;
+ deUint32 correlationMask = 0u;
+
+ if (m_params.numViews > 1u)
+ {
+ for (deUint32 viewIdx = 0u; viewIdx < m_params.numViews; ++viewIdx)
+ {
+ viewMask |= (1 << viewIdx);
+ correlationMask |= (1 << viewIdx);
+ }
+
+ multiviewInfo = de::MovePtr<VkRenderPassMultiviewCreateInfo>(new VkRenderPassMultiviewCreateInfo
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 1u, // deUint32 subpassCount;
+ &viewMask, // const deUint32* pViewMasks;
+ 0u, // deUint32 dependencyCount;
+ nullptr, // const deInt32* pViewOffsets;
+ 1u, // deUint32 correlationMaskCount;
+ &correlationMask, // const deUint32* pCorrelationMasks;
+ });
+ }
+
+ const VkRenderPassCreateInfo renderPassInfo =
+ {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
+ multiviewInfo.get(), // const void* pNext;
+ 0u, // VkRenderPassCreateFlags flags;
+ 1u, // deUint32 attachmentCount;
+ &colorAttachment, // const VkAttachmentDescription* pAttachments;
+ 1u, // deUint32 subpassCount;
+ &subpassDescription, // const VkSubpassDescription* pSubpasses;
+ 0u, // deUint32 dependencyCount;
+ nullptr, // const VkSubpassDependency* pDependencies;
+ };
+
+ const auto renderPass = createRenderPass(vkd, device, &renderPassInfo);
+
+ // Framebuffer.
+ const auto framebuffer = makeFramebuffer(vkd, device, renderPass.get(), colorImageView.get(), extent.width, extent.height);
+
+ // Descriptor set layout and pipeline layout.
+ DescriptorSetLayoutBuilder layoutBuilder;
+ if (m_params.useSSBO)
+ {
+ layoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageFlags);
+ }
+ const auto descriptorSetLayout = layoutBuilder.build(vkd, device);
+ const auto pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+
+ // Pipeline.
+ const std::vector<VkViewport> viewports (1u, makeViewport(extent));
+ const std::vector<VkRect2D> scissors (1u, makeRect2D(extent));
+
+ const deUint32 patchControlPoints = (tess ? 3u : 0u);
+ const auto primitiveTopology = (tess ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
+
+ const auto pipeline = makeGraphicsPipeline(
+ vkd, device, pipelineLayout.get(),
+ vert.get(), tesc.get(), tese.get(), geom.get(), frag.get(),
+ renderPass.get(), viewports, scissors, primitiveTopology,
+ 0u /* Subpass */, patchControlPoints);
+
+ // Descriptor set and output SSBO if needed.
+ Move<VkDescriptorPool> descriptorPool;
+ Move<VkDescriptorSet> descriptorSet;
+ de::MovePtr<BufferWithMemory> ssboBuffer;
+ const auto ssboElementCount = kStageCount * m_params.numViews;
+ const auto ssboBufferSize = static_cast<VkDeviceSize>(ssboElementCount * sizeof(deUint32));
+
+ if (m_params.useSSBO)
+ {
+ // Output SSBO.
+ const auto ssboBufferInfo = makeBufferCreateInfo(ssboBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ ssboBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, alloc, ssboBufferInfo, MemoryRequirement::HostVisible));
+ auto& ssboBufferAlloc = ssboBuffer->getAllocation();
+
+ deMemset(ssboBufferAlloc.getHostPtr(), 0, static_cast<size_t>(ssboBufferSize));
+ flushAlloc(vkd, device, ssboBufferAlloc);
+
+ // Descriptor pool.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+
+ // Descriptor set.
+ descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayout.get());
+ const auto ssboWriteInfo = makeDescriptorBufferInfo(ssboBuffer->get(), 0ull, ssboBufferSize);
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &ssboWriteInfo);
+ updateBuilder.update(vkd, device);
+ }
+
+ // Output verification buffer.
+ const auto tcuFormat = mapVkFormat(format);
+ const auto pixelSize = static_cast<deUint32>(tcu::getPixelSize(tcuFormat));
+ const auto layerPixels = extent.width * extent.height;
+ const auto layerBytes = layerPixels * pixelSize;
+ const auto totalPixels = layerPixels * m_params.numViews;
+ const auto totalBytes = totalPixels * pixelSize;
+
+ const auto verificationBufferInfo = makeBufferCreateInfo(totalBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ BufferWithMemory verificationBuffer(vkd, device, alloc, verificationBufferInfo, MemoryRequirement::HostVisible);
+
+ // Command pool and buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ // Render triangle.
+ beginCommandBuffer(vkd, cmdBuffer);
+ beginRenderPass(vkd, cmdBuffer, renderPass.get(), framebuffer.get(), scissors.front(), color);
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.get());
+ vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, &vertexBuffer.get(), &vertexBufferOffset);
+ if (m_params.useSSBO)
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdDraw(cmdBuffer, static_cast<deUint32>(vertices.size()), 1u, 0u, 0u);
+ endRenderPass(vkd, cmdBuffer);
+
+ // Copy output image to verification buffer.
+ const auto preTransferBarrier = makeImageMemoryBarrier(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, colorImage.get(), subresourceRange);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &preTransferBarrier);
+
+ const auto subresourceLayers = makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, m_params.numViews);
+ const VkBufferImageCopy copyRegion =
+ {
+ 0ull, // VkDeviceSize bufferOffset;
+ 0u, // deUint32 bufferRowLength;
+ 0u, // deUint32 bufferImageHeight;
+ subresourceLayers, // VkImageSubresourceLayers imageSubresource;
+ makeOffset3D(0, 0, 0), // VkOffset3D imageOffset;
+ extent, // VkExtent3D imageExtent;
+ };
+ vkd.cmdCopyImageToBuffer(cmdBuffer, colorImage.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, verificationBuffer.get(), 1u, ©Region);
+
+ const auto postTransferBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &postTransferBarrier, 0u, nullptr, 0u, nullptr);
+
+ // Output SSBO to host barrier.
+ if (m_params.useSSBO)
+ {
+ const auto ssboBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &ssboBarrier, 0u, nullptr, 0u, nullptr);
+ }
+
+ // Submit commands.
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify the image has the background color.
+ auto& verificationBufferAlloc = verificationBuffer.getAllocation();
+ auto verificationBufferPtr = reinterpret_cast<const char*>(verificationBufferAlloc.getHostPtr());
+ invalidateAlloc(vkd, device, verificationBufferAlloc);
+
+ const auto iWidth = static_cast<int>(extent.width);
+ const auto iHeight = static_cast<int>(extent.height);
+ const auto iDepth = static_cast<int>(extent.depth);
+
+ for (deUint32 layer = 0u; layer < m_params.numViews; ++layer)
+ {
+ const auto pixels = tcu::ConstPixelBufferAccess(tcuFormat, iWidth, iHeight, iDepth, reinterpret_cast<const void*>(verificationBufferPtr + layer * layerBytes));
+
+ for (int y = 0; y < iHeight; ++y)
+ for (int x = 0; x < iWidth; ++x)
+ {
+ const auto pixel = pixels.getPixel(x, y);
+ if (pixel != color)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected color found at pixel (" << x << ", " << y << ") in layer " << layer;
+
+ auto& log = m_context.getTestContext().getLog();
+ log << tcu::TestLog::Message << msg.str() << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::Image("Result", "Result Image", pixels);
+ TCU_FAIL(msg.str());
+ }
+ }
+ }
+
+ // Verify SSBO if used.
+ if (m_params.useSSBO)
+ {
+ // Get stored counters.
+ const auto ssboBufferSizeSz = static_cast<size_t>(ssboBufferSize);
+ auto& ssboAlloc = ssboBuffer->getAllocation();
+ invalidateAlloc(vkd, device, ssboAlloc);
+
+ std::vector<deUint32> ssboCounters;
+ ssboCounters.resize(ssboElementCount);
+ DE_ASSERT(ssboBufferSizeSz == ssboCounters.size() * sizeof(decltype(ssboCounters)::value_type));
+ deMemcpy(ssboCounters.data(), ssboAlloc.getHostPtr(), ssboBufferSizeSz);
+
+ // Minimum accepted counter values.
+ // Vertex, Tesellation Evaluation, Tessellation Control, Geometry.
+ deUint32 expectedCounters[kStageCount] = { 3u, 3u, 3u, 1u };
+
+ // Verify.
+ for (deUint32 viewIdx = 0u; viewIdx < m_params.numViews; ++viewIdx)
+ for (deUint32 stageIdx = 0u; stageIdx < kStageCount; ++stageIdx)
+ {
+ // If the stage is not selected, the expected value is exactly zero. Otherwise, it must be at least as expectedCounters.
+ const deUint32 minVal = ((m_params.selectedStages & (1u << stageIdx)) ? expectedCounters[stageIdx] : 0u);
+ const deUint32 storedVal = ssboCounters[stageIdx + viewIdx * kStageCount];
+ const bool ok = ((minVal == 0u) ? (storedVal == minVal) : (storedVal >= minVal));
+
+ if (!ok)
+ {
+ const char* stageNames[kStageCount] =
+ {
+ "vertex",
+ "tessellation evaluation",
+ "tessellation control",
+ "geometry",
+ };
+
+ std::ostringstream msg;
+ msg << "Unexpected SSBO counter value in view " << viewIdx
+ << " for the " << stageNames[stageIdx] << " shader:"
+ << " got " << storedVal << " but expected " << minVal;
+ TCU_FAIL(msg.str());
+ }
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createNoPositionTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "no_position", "Tests with shaders that do not write to the Position built-in"));
+
+ for (int aux = 0; aux < 2; ++aux)
+ {
+ const bool explicitDeclarations = (aux == 1);
+ const std::string declGroupName (explicitDeclarations ? "explicit_declarations" : "implicit_declarations");
+ de::MovePtr<tcu::TestCaseGroup> declGroup (new tcu::TestCaseGroup(testCtx, declGroupName.c_str(), ""));
+
+ for (int aux2 = 0; aux2 < 2; ++aux2)
+ {
+ const bool useSSBO = (aux2 == 1);
+ const std::string ssboGroupName (useSSBO ? "ssbo_writes" : "basic");
+ de::MovePtr<tcu::TestCaseGroup> ssboGroup (new tcu::TestCaseGroup(testCtx, ssboGroupName.c_str(), ""));
+
+ for (deUint32 viewCount = 1u; viewCount <= 2u; ++viewCount)
+ {
+ const std::string viewGroupName ((viewCount == 1u) ? "single_view" : "multiview");
+ de::MovePtr<tcu::TestCaseGroup> viewGroup (new tcu::TestCaseGroup(testCtx, viewGroupName.c_str(), ""));
+
+ for (ShaderStageFlags stages = 0u; stages < STAGE_MASK_COUNT; ++stages)
+ {
+ // Vertex must always be present.
+ if (! (stages & STAGE_VERTEX))
+ continue;
+
+ // Tessellation stages must both be present or none must be.
+ if (static_cast<bool>(stages & STAGE_TESS_CONTROL) != static_cast<bool>(stages & STAGE_TESS_EVALUATION))
+ continue;
+
+ const auto writeMaskCases = getWriteSubCases(stages);
+ for (const auto writeMask : writeMaskCases)
+ {
+ std::string testName;
+ if (stages & STAGE_VERTEX) testName += (testName.empty() ? "" : "_") + std::string("v") + ((writeMask & STAGE_VERTEX) ? "1" : "0");
+ if (stages & STAGE_TESS_CONTROL) testName += (testName.empty() ? "" : "_") + std::string("c") + ((writeMask & STAGE_TESS_CONTROL) ? "1" : "0");
+ if (stages & STAGE_TESS_EVALUATION) testName += (testName.empty() ? "" : "_") + std::string("e") + ((writeMask & STAGE_TESS_EVALUATION) ? "1" : "0");
+ if (stages & STAGE_GEOMETRY) testName += (testName.empty() ? "" : "_") + std::string("g") + ((writeMask & STAGE_GEOMETRY) ? "1" : "0");
+
+ TestParams params = { stages, writeMask, viewCount, explicitDeclarations, true };
+ viewGroup->addChild(new NoPositionCase(testCtx, testName, "", params));
+ }
+ }
+
+ ssboGroup->addChild(viewGroup.release());
+ }
+
+ declGroup->addChild(ssboGroup.release());
+ }
+
+ group->addChild(declGroup.release());
+ }
+
+ return group.release();
+}
+
+} // pipeline
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.hpp
similarity index 72%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.hpp
index 1a85ebf..b5a2ca6 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineNoPositionTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
+#ifndef _VKTPIPELINENOPOSITIONTESTS_HPP
+#define _VKTPIPELINENOPOSITIONTESTS_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Tests with shaders that do not write to the Position built-in.
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -32,9 +32,9 @@
namespace pipeline
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createNoPositionTests (tcu::TestContext& testCtx);
} // pipeline
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTPIPELINENOPOSITIONTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushConstantTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushConstantTests.cpp
index 2c4f5a3..0e4fd6d 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushConstantTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushConstantTests.cpp
@@ -27,6 +27,7 @@
#include "vktPipelineImageUtil.hpp"
#include "vktPipelineVertexUtil.hpp"
#include "vktPipelineReferenceRenderer.hpp"
+
#include "vktTestCase.hpp"
#include "vkImageUtil.hpp"
#include "vkMemUtil.hpp"
@@ -38,12 +39,17 @@
#include "vkTypeUtil.hpp"
#include "vkCmdUtil.hpp"
#include "vkObjUtil.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkBarrierUtil.hpp"
+
#include "tcuImageCompare.hpp"
+#include "tcuTestLog.hpp"
+
#include "deMemory.h"
#include "deRandom.hpp"
#include "deStringUtil.hpp"
#include "deUniquePtr.hpp"
-#include "tcuTestLog.hpp"
#include <algorithm>
#include <sstream>
@@ -97,7 +103,7 @@
struct PushConstantData
{
struct PushConstantRange
-{
+ {
VkShaderStageFlags shaderStage;
deUint32 offset;
deUint32 size;
@@ -2595,6 +2601,338 @@
return tcu::TestStatus::pass("Result image matches reference");
}
+// The overwrite-values cases will use a 2x2 storage image and 4 separate draws or dispatches to store the color of each pixel in
+// the image. The color will be calculated as baseColor*multiplier+colorOffset, and the base color, multiplier, color component
+// offsets and coords will be changed with multiple push commands before each draw/dispatch, to verify overwriting multiple ranges
+// works as expected.
+
+struct OverwritePushConstants
+{
+ tcu::IVec4 coords; // We will only use the first two components, but an IVec4 eases matching alignments.
+ tcu::UVec4 baseColor;
+ tcu::UVec4 multiplier;
+ deUint32 colorOffsets[4];
+ tcu::UVec4 transparentGreen;
+};
+
+struct OverwriteTestParams
+{
+ OverwritePushConstants pushConstantValues[4];
+ VkPipelineBindPoint bindPoint;
+};
+
+class OverwriteTestCase : public vkt::TestCase
+{
+public:
+ OverwriteTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const OverwriteTestParams& params);
+ virtual ~OverwriteTestCase (void) {}
+
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+protected:
+ OverwriteTestParams m_params;
+};
+
+class OverwriteTestInstance : public vkt::TestInstance
+{
+public:
+ OverwriteTestInstance (Context& context, const OverwriteTestParams& params);
+ virtual ~OverwriteTestInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ OverwriteTestParams m_params;
+};
+
+OverwriteTestCase::OverwriteTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const OverwriteTestParams& params)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+void OverwriteTestCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ std::ostringstream shader;
+
+ shader
+ << "#version 450\n"
+ << "layout (push_constant, std430) uniform PushConstants {\n"
+ << " ivec4 coords;\n" // Note we will only use the .xy swizzle.
+ << " uvec4 baseColor;\n"
+ << " uvec4 multiplier;\n"
+ << " uint colorOffsets[4];\n"
+ << " uvec4 transparentGreen;\n"
+ << "} pc;\n"
+ << "layout(rgba8ui, set=0, binding=0) uniform uimage2D simage;\n"
+ << "void main() {\n"
+ << " uvec4 colorOffsets = uvec4(pc.colorOffsets[0], pc.colorOffsets[1], pc.colorOffsets[2], pc.colorOffsets[3]);\n"
+ << " uvec4 finalColor = pc.baseColor * pc.multiplier + colorOffsets + pc.transparentGreen;\n"
+ << " imageStore(simage, pc.coords.xy, finalColor);\n"
+ << "}\n"
+ ;
+
+ if (m_params.bindPoint == VK_PIPELINE_BIND_POINT_COMPUTE)
+ {
+ programCollection.glslSources.add("comp") << glu::ComputeSource(shader.str());
+ }
+ else if (m_params.bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS)
+ {
+ std::ostringstream vert;
+ vert
+ << "#version 450\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ // Full-screen clockwise triangle fan with 4 vertices.
+ << " const float x = (-1.0+2.0*(((gl_VertexIndex+1)&2)>>1));\n"
+ << " const float y = (-1.0+2.0*(( gl_VertexIndex &2)>>1));\n"
+ << " gl_Position = vec4(x, y, 0.0, 1.0);\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vert.str());
+ programCollection.glslSources.add("frag") << glu::FragmentSource(shader.str());
+ }
+ else
+ DE_ASSERT(false);
+}
+
+TestInstance* OverwriteTestCase::createInstance (Context& context) const
+{
+ return new OverwriteTestInstance(context, m_params);
+}
+
+OverwriteTestInstance::OverwriteTestInstance (Context& context, const OverwriteTestParams& params)
+ : vkt::TestInstance (context)
+ , m_params (params)
+{}
+
+tcu::TestStatus OverwriteTestInstance::iterate (void)
+{
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto queue = m_context.getUniversalQueue();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const bool isComp = (m_params.bindPoint == VK_PIPELINE_BIND_POINT_COMPUTE);
+
+ const VkShaderStageFlags stageFlags = (isComp ? VK_SHADER_STAGE_COMPUTE_BIT : VK_SHADER_STAGE_FRAGMENT_BIT);
+ const VkPipelineStageFlags writeStages = (isComp ? VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT : VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
+ const auto imageFormat = VK_FORMAT_R8G8B8A8_UINT;
+ const auto imageExtent = makeExtent3D(2u, 2u, 1u);
+
+ // Storage image.
+ const VkImageCreateInfo imageCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ imageFormat, // VkFormat format;
+ imageExtent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ (VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT), // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0u, // deUint32 queueFamilyIndexCount;
+ nullptr, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+ ImageWithMemory storageImage (vkd, device, alloc, imageCreateInfo, MemoryRequirement::Any);
+ const auto subresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ const auto storageImageView = makeImageView(vkd, device, storageImage.get(), VK_IMAGE_VIEW_TYPE_2D, imageFormat, subresourceRange);
+
+ // Buffer to copy output pixels to.
+ const auto tcuFormat = mapVkFormat(imageFormat);
+ const auto pixelSize = static_cast<VkDeviceSize>(tcu::getPixelSize(tcuFormat));
+ const auto bufferSize = pixelSize * imageExtent.width * imageExtent.height * imageExtent.depth;
+
+ const auto bufferCreateInfo = makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ BufferWithMemory transferBuffer (vkd, device, alloc, bufferCreateInfo, MemoryRequirement::HostVisible);
+
+ // Descriptor set layout and pipeline layout.
+ DescriptorSetLayoutBuilder layoutBuilder;
+ layoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, stageFlags);
+ const auto descriptorSetLayout = layoutBuilder.build(vkd, device);
+
+ const VkPushConstantRange pcRange =
+ {
+ stageFlags, // VkShaderStageFlags stageFlags;
+ 0u, // deUint32 offset;
+ static_cast<deUint32>(sizeof(OverwritePushConstants)), // deUint32 size;
+ };
+ const auto pipelineLayout = makePipelineLayout(vkd, device, 1u, &descriptorSetLayout.get(), 1u, &pcRange);
+
+ // Descriptor pool and set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE);
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayout.get());
+
+ DescriptorSetUpdateBuilder updateBuilder;
+ const auto descriptorImageInfo = makeDescriptorImageInfo(DE_NULL, storageImageView.get(), VK_IMAGE_LAYOUT_GENERAL);
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorImageInfo);
+ updateBuilder.update(vkd, device);
+
+ // Command pool and set.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ // Pipeline.
+ const std::vector<VkViewport> viewports (1, makeViewport(imageExtent));
+ const std::vector<VkRect2D> scissors (1, makeRect2D(imageExtent));
+
+ Move<VkShaderModule> vertModule;
+ Move<VkShaderModule> fragModule;
+ Move<VkShaderModule> compModule;
+
+ Move<VkRenderPass> renderPass;
+ Move<VkFramebuffer> framebuffer;
+ Move<VkPipeline> pipeline;
+
+ if (isComp)
+ {
+ compModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0u);
+ pipeline = makeComputePipeline(vkd, device, pipelineLayout.get(), 0u, compModule.get(), 0u, nullptr);
+ }
+ else
+ {
+ vertModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("vert"), 0u);
+ fragModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("frag"), 0u);
+
+ const VkPipelineVertexInputStateCreateInfo inputState =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType
+ nullptr, // const void* pNext
+ 0u, // VkPipelineVertexInputStateCreateFlags flags
+ 0u, // deUint32 vertexBindingDescriptionCount
+ nullptr, // const VkVertexInputBindingDescription* pVertexBindingDescriptions
+ 0u, // deUint32 vertexAttributeDescriptionCount
+ nullptr, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions
+ };
+ renderPass = makeRenderPass(vkd, device);
+ framebuffer = makeFramebuffer(vkd, device, renderPass.get(), 0u, nullptr, imageExtent.width, imageExtent.height);
+ pipeline = makeGraphicsPipeline(vkd, device, pipelineLayout.get(),
+ vertModule.get(), DE_NULL, DE_NULL, DE_NULL, fragModule.get(), renderPass.get(),
+ viewports, scissors, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, 0u, 0u, &inputState);
+ }
+
+ // Offsets and sizes.
+ const struct
+ {
+ size_t offset;
+ size_t size;
+ } pcPush[] =
+ {
+ // Push members doing some back-and-forth in the range.
+ { offsetof(OverwritePushConstants, baseColor), sizeof(OverwritePushConstants::baseColor) },
+ { offsetof(OverwritePushConstants, coords), sizeof(OverwritePushConstants::coords) },
+ { offsetof(OverwritePushConstants, colorOffsets), sizeof(OverwritePushConstants::colorOffsets) },
+ { offsetof(OverwritePushConstants, multiplier), sizeof(OverwritePushConstants::multiplier) },
+ { offsetof(OverwritePushConstants, transparentGreen), sizeof(OverwritePushConstants::transparentGreen) },
+ };
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Transition layout for storage image.
+ const auto preImageBarrier = makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, storageImage.get(), subresourceRange);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, writeStages, 0u, 0u, nullptr, 0u, nullptr, 1u, &preImageBarrier);
+
+ vkd.cmdBindDescriptorSets(cmdBuffer, m_params.bindPoint, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdBindPipeline(cmdBuffer, m_params.bindPoint, pipeline.get());
+
+ if (!isComp)
+ beginRenderPass(vkd, cmdBuffer, renderPass.get(), framebuffer.get(), scissors[0]);
+
+ for (int pcIndex = 0; pcIndex < DE_LENGTH_OF_ARRAY(m_params.pushConstantValues); ++pcIndex)
+ {
+ const auto& pc = m_params.pushConstantValues[pcIndex];
+
+ // Push all structure members separately.
+ for (int pushIdx = 0; pushIdx < DE_LENGTH_OF_ARRAY(pcPush); ++pushIdx)
+ {
+ const auto& push = pcPush[pushIdx];
+ const void* dataPtr = reinterpret_cast<const void*>(reinterpret_cast<const char*>(&pc) + push.offset);
+ vkd.cmdPushConstants(cmdBuffer, pipelineLayout.get(), stageFlags, static_cast<deUint32>(push.offset), static_cast<deUint32>(push.size), dataPtr);
+ }
+
+ // Draw or dispatch.
+ if (isComp)
+ vkd.cmdDispatch(cmdBuffer, 1u, 1u, 1u);
+ else
+ vkd.cmdDraw(cmdBuffer, 4u, 1u, 0u, 0u);
+ }
+
+ if (!isComp)
+ endRenderPass(vkd, cmdBuffer);
+
+ // Copy storage image to output buffer.
+ const auto postImageBarrier = makeImageMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, storageImage.get(), subresourceRange);
+ vkd.cmdPipelineBarrier(cmdBuffer, writeStages, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &postImageBarrier);
+
+ const auto copyRegion = makeBufferImageCopy(imageExtent, makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u));
+ vkd.cmdCopyImageToBuffer(cmdBuffer, storageImage.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, transferBuffer.get(), 1u, ©Region);
+
+ const auto bufferBarrier = makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, transferBuffer.get(), 0ull, bufferSize);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 0u, nullptr, 1u, &bufferBarrier, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify output colors match.
+ auto& bufferAlloc = transferBuffer.getAllocation();
+ const void* bufferHostPtr = bufferAlloc.getHostPtr();
+ invalidateAlloc(vkd, device, bufferAlloc);
+
+ const int iWidth = static_cast<int>(imageExtent.width);
+ const int iHeight = static_cast<int>(imageExtent.height);
+ const int iDepth = static_cast<int>(imageExtent.depth);
+
+ tcu::ConstPixelBufferAccess outputAccess (tcuFormat, iWidth, iHeight, iDepth, bufferHostPtr);
+
+ for (int pixelIdx = 0; pixelIdx < DE_LENGTH_OF_ARRAY(m_params.pushConstantValues); ++pixelIdx)
+ {
+ const auto& pc = m_params.pushConstantValues[pixelIdx];
+ const tcu::UVec4 expectedValue = pc.baseColor * pc.multiplier + tcu::UVec4(pc.colorOffsets[0], pc.colorOffsets[1], pc.colorOffsets[2], pc.colorOffsets[3]) + pc.transparentGreen;
+ const tcu::UVec4 outputValue = outputAccess.getPixelUint(pc.coords.x(), pc.coords.y());
+
+ if (expectedValue != outputValue)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected value in output image at coords " << pc.coords << ": found " << outputValue << " and expected " << expectedValue;
+ TCU_FAIL(msg.str());
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+void addOverwriteCase (tcu::TestCaseGroup* group, tcu::TestContext& testCtx, VkPipelineBindPoint bindPoint)
+{
+ const OverwritePushConstants pushConstants[4] =
+ {
+ // coords baseColor multiplier colorOffsets transparentGreen
+ { tcu::IVec4(0, 0, 0, 0), tcu::UVec4(1u, 0u, 0u, 0u), tcu::UVec4( 2u, 2u, 2u, 2u), { 128u, 129u, 130u, 131u }, tcu::UVec4(0u, 1u, 0u, 0u) },
+ { tcu::IVec4(0, 1, 0, 0), tcu::UVec4(0u, 1u, 0u, 0u), tcu::UVec4( 4u, 4u, 4u, 4u), { 132u, 133u, 134u, 135u }, tcu::UVec4(0u, 1u, 0u, 0u) },
+ { tcu::IVec4(1, 0, 0, 0), tcu::UVec4(0u, 0u, 1u, 0u), tcu::UVec4( 8u, 8u, 8u, 8u), { 136u, 137u, 138u, 139u }, tcu::UVec4(0u, 1u, 0u, 0u) },
+ { tcu::IVec4(1, 1, 0, 0), tcu::UVec4(0u, 0u, 0u, 1u), tcu::UVec4(16u, 16u, 16u, 16u), { 140u, 141u, 142u, 143u }, tcu::UVec4(0u, 1u, 0u, 0u) },
+ };
+
+ OverwriteTestParams testParams;
+
+ DE_ASSERT(DE_LENGTH_OF_ARRAY(pushConstants) == DE_LENGTH_OF_ARRAY(testParams.pushConstantValues));
+ for (int pixelIdx = 0; pixelIdx < DE_LENGTH_OF_ARRAY(pushConstants); ++pixelIdx)
+ testParams.pushConstantValues[pixelIdx] = pushConstants[pixelIdx];
+
+ testParams.bindPoint = bindPoint;
+
+ group->addChild(new OverwriteTestCase(testCtx, "overwrite", "Test push constant range overwrites", testParams));
+}
+
} // anonymous
tcu::TestCaseGroup* createPushConstantTests (tcu::TestContext& testCtx)
@@ -2944,10 +3282,12 @@
{
graphicsTests->addChild(new PushConstantGraphicsOverlapTest(testCtx, overlapGraphicsParams[ndx].name, overlapGraphicsParams[ndx].description, overlapGraphicsParams[ndx].count, overlapGraphicsParams[ndx].range));
}
+ addOverwriteCase(graphicsTests.get(), testCtx, VK_PIPELINE_BIND_POINT_GRAPHICS);
pushConstantTests->addChild(graphicsTests.release());
de::MovePtr<tcu::TestCaseGroup> computeTests (new tcu::TestCaseGroup(testCtx, "compute_pipeline", "compute pipeline"));
computeTests->addChild(new PushConstantComputeTest(testCtx, computeParams[0].name, computeParams[0].description, computeParams[0].range));
+ addOverwriteCase(computeTests.get(), testCtx, VK_PIPELINE_BIND_POINT_COMPUTE);
pushConstantTests->addChild(computeTests.release());
de::MovePtr<tcu::TestCaseGroup> lifetimeTests (new tcu::TestCaseGroup(testCtx, "lifetime", "lifetime tests"));
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp
index bfeb035..7cd1c08 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelinePushDescriptorTests.cpp
@@ -76,10 +76,11 @@
deUint32 numCalls; // Number of draw or dispatch calls
};
-VkDeviceSize calcItemSize (const InstanceInterface& vki, VkPhysicalDevice physicalDevice)
+VkDeviceSize calcItemSize (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, deUint32 numElements = 1u)
{
- const auto minAlignment = getPhysicalDeviceProperties(vki, physicalDevice).limits.minStorageBufferOffsetAlignment;
- return de::lcm(de::max(VkDeviceSize{1}, minAlignment), kSizeofVec4);
+ const auto minAlignment = getPhysicalDeviceProperties(vki, physicalDevice).limits.minStorageBufferOffsetAlignment;
+ const auto lcm = de::lcm(de::max(VkDeviceSize{1}, minAlignment), kSizeofVec4);
+ return de::roundUp(kSizeofVec4 * numElements, lcm);
}
void checkAllSupported (const Extensions& supportedExtensions, const vector<string>& requiredExtensions)
@@ -1897,6 +1898,8 @@
const Unique<VkDevice> m_device;
const DeviceDriver m_vkd;
const VkQueue m_queue;
+ const VkDeviceSize m_itemSize;
+ const VkDeviceSize m_blockSize;
SimpleAllocator m_allocator;
const tcu::UVec2 m_textureSize;
const VkFormat m_colorFormat;
@@ -1929,6 +1932,8 @@
, m_device (createDeviceWithPushDescriptor(context, m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex))
, m_vkd (m_vkp, m_instance, *m_device)
, m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
+ , m_itemSize (calcItemSize(m_vki, m_physicalDevice, 2u))
+ , m_blockSize (kSizeofVec4 * 2u)
, m_allocator (m_vkd, *m_device, getPhysicalDeviceMemoryProperties(m_vki, m_physicalDevice))
, m_textureSize (32, 32)
, m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
@@ -2232,12 +2237,14 @@
// Create output buffer
{
+ DE_ASSERT(m_params.numCalls <= 2u);
+
const VkBufferCreateInfo bufferCreateInfo =
{
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
0u, // VkBufferCreateFlags flags
- 64u, // VkDeviceSize size;
+ m_itemSize * 2u, // VkDeviceSize size;
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, // VkBufferUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1u, // deUint32 queueFamilyCount;
@@ -2362,9 +2369,9 @@
const VkDescriptorBufferInfo descriptorBufferInfoOutput =
{
- *m_outputBuffer, // VkBuffer buffer;
- 32u * dispatchNdx, // VkDeviceSize offset;
- 32u // VkDeviceSize range;
+ *m_outputBuffer, // VkBuffer buffer;
+ m_itemSize * dispatchNdx, // VkDeviceSize offset;
+ m_blockSize, // VkDeviceSize range;
};
// Write output buffer descriptor set
@@ -2407,7 +2414,9 @@
tcu::TestStatus PushDescriptorImageComputeTestInstance::verifyOutput (void)
{
- float ref[16];
+ const auto floatsPerDispatch = 8u; // 8 floats (2 vec4s) per dispatch.
+ std::vector<float> ref (floatsPerDispatch * 2u);
+
invalidateAlloc(m_vkd, *m_device, *m_outputBufferAlloc);
switch(m_params.descriptorType)
@@ -2504,17 +2513,36 @@
};
// Verify result
- if (deMemCmp((void*)ref, m_outputBufferAlloc->getHostPtr(), (size_t)(32u * m_params.numCalls)))
+ const auto bufferDataPtr = reinterpret_cast<const char*>(m_outputBufferAlloc->getHostPtr());
+ const auto blockSize = static_cast<size_t>(m_blockSize);
+
+ for (deUint32 dispatchNdx = 0u; dispatchNdx < m_params.numCalls; ++dispatchNdx)
{
- const float* ptr = (float*)m_outputBufferAlloc->getHostPtr();
- std::string debugMsg = "Output buffer contents:\n";
+ const auto refIdx = floatsPerDispatch * dispatchNdx;
+ const auto bufferOffset = m_itemSize * dispatchNdx; // Each dispatch uses m_itemSize bytes in the buffer to meet alignment reqs.
- for (deUint32 i = 0; i < m_params.numCalls * 8; i++)
- debugMsg += de::toString(ptr[i]) + " vs " + de::toString(ref[i]) + "\n";
+ if (deMemCmp(&ref[refIdx], bufferDataPtr + bufferOffset, blockSize) != 0)
+ {
+ std::vector<float> buffferValues (floatsPerDispatch);
+ std::vector<float> refValues (floatsPerDispatch);
- m_context.getTestContext().getLog() << tcu::TestLog::Message << debugMsg << tcu::TestLog::EndMessage;
- return tcu::TestStatus::fail("Output mismatch");
+ deMemcpy(refValues.data(), &ref[refIdx], blockSize);
+ deMemcpy(buffferValues.data(), bufferDataPtr + bufferOffset, blockSize);
+
+ std::ostringstream msg;
+ msg << "Output mismatch at dispatch " << dispatchNdx << ": Reference ";
+ for (deUint32 i = 0; i < floatsPerDispatch; ++i)
+ msg << ((i == 0) ? "[" : ", ") << refValues[i];
+ msg << "]; Buffer ";
+ for (deUint32 i = 0; i < floatsPerDispatch; ++i)
+ msg << ((i == 0) ? "[" : ", ") << buffferValues[i];
+ msg << "]";
+
+ m_context.getTestContext().getLog() << tcu::TestLog::Message << msg.str() << tcu::TestLog::EndMessage;
+ return tcu::TestStatus::fail("Output mismatch");
+ }
}
+
return tcu::TestStatus::pass("Output matches expected values");
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp
index c858f98..a13b8df 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp
@@ -1219,7 +1219,15 @@
void checkImageViewTypeRequirements (Context& context, const VkImageViewType viewType)
{
if (viewType == VK_IMAGE_VIEW_TYPE_3D)
+ {
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().imageView2DOn3DImage)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Implementation does not support 2D or 2D array image view to be created on a 3D VkImage");
+ }
+
context.requireDeviceFunctionality("VK_KHR_maintenance1");
+ }
if (viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_IMAGE_CUBE_ARRAY);
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp
index 526a56e..7496122 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineSamplerTests.cpp
@@ -223,6 +223,7 @@
bool separateStencilUsage);
virtual ~SamplerLodTest (void) {}
virtual VkSamplerCreateInfo getSamplerCreateInfo (void) const;
+ virtual void checkSupport (Context& context) const;
private:
VkSamplerMipmapMode m_mipmapMode;
@@ -231,6 +232,17 @@
float m_mipLodBias;
};
+void SamplerLodTest::checkSupport (Context& context) const
+{
+ SamplerTest::checkSupport(context);
+
+ if (m_mipLodBias != 0.0f && context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().samplerMipLodBias)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Sampler mipmap LOD bias is not supported by this implementation");
+ }
+}
+
class SamplerAddressModesTest : public SamplerTest
{
public:
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp
index 6837dbb..1937f31 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineStencilTests.cpp
@@ -291,6 +291,9 @@
if (m_separateDepthStencilLayouts && !context.isDeviceFunctionalitySupported("VK_KHR_separate_depth_stencil_layouts"))
TCU_THROW(NotSupportedError, "VK_KHR_separate_depth_stencil_layouts is not supported");
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().separateStencilMaskRef)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Separate stencil mask references are not supported by this implementation");
}
TestInstance* StencilTest::createInstance (Context& context) const
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
index e00f23f..17ef252 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
@@ -28,6 +28,7 @@
#include "vktPipelineDepthTests.hpp"
#include "vktPipelineDynamicOffsetTests.hpp"
#include "vktPipelineEarlyDestroyTests.hpp"
+#include "vktPipelineLogicOpTests.hpp"
#include "vktPipelineImageTests.hpp"
#include "vktPipelineInputAssemblyTests.hpp"
#include "vktPipelineSamplerTests.hpp"
@@ -49,10 +50,14 @@
#include "vktPipelineCreationFeedbackTests.hpp"
#include "vktPipelineDepthRangeUnrestrictedTests.hpp"
#include "vktPipelineExecutablePropertiesTests.hpp"
-#include "vktPipelineVertexOnlyTests.hpp"
+#include "vktPipelineMiscTests.hpp"
#include "vktPipelineMaxVaryingsTests.hpp"
#include "vktPipelineBlendOperationAdvancedTests.hpp"
#include "vktPipelineExtendedDynamicStateTests.hpp"
+#include "vktPipelineCreationCacheControlTests.hpp"
+#include "vktPipelineNoPositionTests.hpp"
+#include "vktPipelineBindPointTests.hpp"
+#include "vktPipelineColorWriteEnableTests.hpp"
#include "vktTestGroupUtil.hpp"
namespace vkt
@@ -75,6 +80,7 @@
pipelineTests->addChild(createImageTests (testCtx));
pipelineTests->addChild(createSamplerTests (testCtx));
pipelineTests->addChild(createImageViewTests (testCtx));
+ pipelineTests->addChild(createLogicOpTests (testCtx));
pipelineTests->addChild(createPushConstantTests (testCtx));
pipelineTests->addChild(createPushDescriptorTests (testCtx));
pipelineTests->addChild(createSpecConstantTests (testCtx));
@@ -93,10 +99,14 @@
pipelineTests->addChild(createCreationFeedbackTests (testCtx));
pipelineTests->addChild(createDepthRangeUnrestrictedTests (testCtx));
pipelineTests->addChild(createExecutablePropertiesTests (testCtx));
- pipelineTests->addChild(createVertexOnlyTests (testCtx));
+ pipelineTests->addChild(createMiscTests (testCtx));
pipelineTests->addChild(createMaxVaryingsTests (testCtx));
pipelineTests->addChild(createBlendOperationAdvancedTests (testCtx));
pipelineTests->addChild(createExtendedDynamicStateTests (testCtx));
+ pipelineTests->addChild(createCacheControlTests (testCtx));
+ pipelineTests->addChild(createNoPositionTests (testCtx));
+ pipelineTests->addChild(createBindPointTests (testCtx));
+ pipelineTests->addChild(createColorWriteEnableTests (testCtx));
}
} // anonymous
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp
index 292ad90..7ff3c87 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp
+++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineTimestampTests.cpp
@@ -2407,6 +2407,16 @@
vk.cmdClearColorImage(*m_cmdBuffer, *m_srcImage, VK_IMAGE_LAYOUT_GENERAL, &srcClearValue, 1u, &subRangeColor);
vk.cmdClearColorImage(*m_cmdBuffer, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, &dstClearValue, 1u, &subRangeColor);
+ // synchronize the Clear commands before starting any copy
+ const vk::VkMemoryBarrier barrier =
+ {
+ vk::VK_STRUCTURE_TYPE_MEMORY_BARRIER, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
+ vk::VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask;
+ };
+ vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1u, &barrier, 0u, DE_NULL, 0u, DE_NULL);
+
if (!m_hostQueryReset)
vk.cmdResetQueryPool(*m_cmdBuffer, *m_queryPool, 0u, TimestampTest::ENTRY_COUNT);
@@ -2427,21 +2437,6 @@
{
case TRANSFER_METHOD_COPY_BUFFER:
{
- const vk::VkBufferMemoryBarrier bufferBarrier =
- {
- vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
- DE_NULL, // const void* pNext;
- vk::VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
- vk::VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask;
- VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
- VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
- *m_dstBuffer, // VkBuffer buffer;
- 0ull, // VkDeviceSize offset;
- VK_WHOLE_SIZE // VkDeviceSize size;
- };
-
- vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL);
-
const VkBufferCopy copyBufRegion =
{
0u, // VkDeviceSize srcOffset;
@@ -2586,6 +2581,7 @@
initialImageTransition(*m_cmdBuffer, *m_msImage, subRangeColor, VK_IMAGE_LAYOUT_GENERAL);
vk.cmdClearColorImage(*m_cmdBuffer, *m_msImage, VK_IMAGE_LAYOUT_GENERAL, &srcClearValue, 1u, &subRangeColor);
+ vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1u, &barrier, 0u, DE_NULL, 0u, DE_NULL);
vk.cmdResolveImage(*m_cmdBuffer, *m_msImage, VK_IMAGE_LAYOUT_GENERAL, *m_dstImage, VK_IMAGE_LAYOUT_GENERAL, 1u, &imageResolve);
break;
}
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.cpp
deleted file mode 100644
index 295d2f7..0000000
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*------------------------------------------------------------------------
- * Vulkan Conformance Tests
- * ------------------------
- *
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *//*!
- * \file
- * \brief Tests using only vertex shader in a graphics pipeline
- *//*--------------------------------------------------------------------*/
-
-#include <string>
-
-#include "vktTestGroupUtil.hpp"
-#include "vktAmberTestCase.hpp"
-#include "vktPipelineVertexOnlyTests.hpp"
-
-namespace vkt
-{
-namespace pipeline
-{
-namespace
-{
-
-void addTests (tcu::TestCaseGroup* tests, const char* data_dir)
-{
- tcu::TestContext& testCtx = tests->getTestContext();
-
- // Shader test files are saved in <path>/external/vulkancts/data/vulkan/amber/<data_dir>/<basename>.amber
- struct Case {
- const char* basename;
- const char* description;
- };
- const Case cases[] =
- {
- { "position_to_ssbo", "Write position data into ssbo" }
- };
-
- for (unsigned i = 0; i < DE_LENGTH_OF_ARRAY(cases) ; ++i)
- {
- std::string file = std::string(cases[i].basename) + ".amber";
- std::vector<std::string> requirements = std::vector<std::string>(1, "Features.vertexPipelineStoresAndAtomics");
- cts_amber::AmberTestCase *testCase = cts_amber::createAmberTestCase(testCtx, cases[i].basename, cases[i].description, data_dir, file, requirements);
-
- tests->addChild(testCase);
- }
-}
-
-} // anonymous
-
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx)
-{
- // Location of the Amber script files under the data/vulkan/amber source tree.
- const char* data_dir = "pipeline/vertex_only";
- return createTestGroup(testCtx, "vertex_only", "Tests using only vertex shader in a pipeline", addTests, data_dir);
-}
-
-} // SpirVAssembly
-} // vkt
diff --git a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemYCbCrConversionTests.cpp b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemYCbCrConversionTests.cpp
index 8ef3c0d..8025950 100644
--- a/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemYCbCrConversionTests.cpp
+++ b/external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemYCbCrConversionTests.cpp
@@ -1421,6 +1421,12 @@
vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,
vk::VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,
vk::VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
+
+ // Extended YCbCr formats
+ vk::VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT,
+ vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT,
+ vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT,
+ vk::VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT,
};
for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(testFormats); formatNdx++)
diff --git a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp
index 258f7d2..2e80f51 100644
--- a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp
+++ b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolStatisticsTests.cpp
@@ -2603,6 +2603,16 @@
m_data.push_back(GraphicBasicTestInstance::VertexData(tcu::Vec4( 1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::gray().toVec()));
}
+ void checkSupport (vkt::Context& context) const
+ {
+ if (m_parametersGraphic.primitiveTopology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
+ }
+
vkt::TestInstance* createInstance (vkt::Context& context) const
{
return new Instance(context, m_data, m_parametersGraphic, m_drawRepeats);
diff --git a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationFragShaderSideEffectsTests.cpp b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationFragShaderSideEffectsTests.cpp
index 9c9d4f1..bfefbb6 100644
--- a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationFragShaderSideEffectsTests.cpp
+++ b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationFragShaderSideEffectsTests.cpp
@@ -59,6 +59,7 @@
{
KILL,
DEMOTE,
+ TERMINATE_INVOCATION,
SAMPLE_MASK_BEFORE,
SAMPLE_MASK_AFTER,
ALPHA_COVERAGE_BEFORE,
@@ -166,6 +167,10 @@
{
context.requireDeviceFunctionality("VK_EXT_shader_demote_to_helper_invocation");
}
+ else if (m_params.caseType == CaseType::TERMINATE_INVOCATION)
+ {
+ context.requireDeviceFunctionality("VK_KHR_shader_terminate_invocation");
+ }
const auto colorFormatProperties = vk::getPhysicalDeviceFormatProperties(vki, physicalDevice, kColorFormat);
if ((colorFormatProperties.optimalTilingFeatures & kNeededColorFeatures) != kNeededColorFeatures)
@@ -219,6 +224,10 @@
headers << "#extension GL_EXT_demote_to_helper_invocation : enable\n";
after << " demote;\n";
break;
+ case CaseType::TERMINATE_INVOCATION:
+ headers << "#extension GL_EXT_terminate_invocation : enable\n";
+ after << " terminateInvocation;\n";
+ break;
case CaseType::SAMPLE_MASK_BEFORE:
before << " gl_SampleMask[0] = 0;\n";
break;
@@ -697,6 +706,10 @@
colorOrderGroup->addChild(new FragSideEffectsTestCase(testCtx, "demote", "OpDemoteToHelperInvocation after SSBO write", params));
}
{
+ TestParams params(CaseType::TERMINATE_INVOCATION, kDefaultClearColor, kDefaultDrawColor, colorAtEnd, kDefaultDepthBoundsParams);
+ colorOrderGroup->addChild(new FragSideEffectsTestCase(testCtx, "terminate_invocation", "OpTerminateInvocation after SSBO write", params));
+ }
+ {
TestParams params(CaseType::SAMPLE_MASK_BEFORE, kDefaultClearColor, kDefaultDrawColor, colorAtEnd, kDefaultDepthBoundsParams);
colorOrderGroup->addChild(new FragSideEffectsTestCase(testCtx, "sample_mask_before", "Set sample mask to zero before SSBO write", params));
}
diff --git a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
index 80fc096..6eb39d7 100644
--- a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
+++ b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
@@ -34,6 +34,7 @@
#include "tcuStringTemplate.hpp"
#include "tcuTextureUtil.hpp"
#include "tcuResultCollector.hpp"
+#include "tcuFloatFormat.hpp"
#include "vkImageUtil.hpp"
#include "deStringUtil.hpp"
#include "deRandom.hpp"
@@ -90,6 +91,7 @@
"{\n"
" fragColor = v_color;\n"
"}\n";
+
enum InterpolationCaseFlags
{
INTERPOLATIONFLAGS_NONE = 0,
@@ -132,6 +134,7 @@
PRIMITIVESTRICTNESS_LAST
};
+
class BaseRenderingTestCase : public TestCase
{
public:
@@ -176,7 +179,7 @@
protected:
void addImageTransitionBarrier (VkCommandBuffer commandBuffer, VkImage image, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout) const;
- void drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& vertexData, VkPrimitiveTopology primitiveTopology);
+ virtual void drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& vertexData, VkPrimitiveTopology primitiveTopology);
void drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& vertexData, const std::vector<tcu::Vec4>& coloDrata, VkPrimitiveTopology primitiveTopology);
void drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& positionData, const std::vector<tcu::Vec4>& colorData, VkPrimitiveTopology primitiveTopology,
VkImage image, VkImage resolvedImage, VkFramebuffer frameBuffer, const deUint32 renderSize, VkBuffer resultBuffer, const Allocation& resultBufferMemory);
@@ -188,7 +191,10 @@
const VkPipelineRasterizationStateCreateInfo* getRasterizationStateCreateInfo (void) const;
virtual
- VkPipelineRasterizationLineStateCreateInfoEXT* getLineRasterizationStateCreateInfo (void);
+ VkPipelineRasterizationLineStateCreateInfoEXT initLineRasterizationStateCreateInfo (void) const;
+
+ virtual
+ const VkPipelineRasterizationLineStateCreateInfoEXT* getLineRasterizationStateCreateInfo (void) const;
virtual
const VkPipelineColorBlendStateCreateInfo* getColorBlendStateCreateInfo (void) const;
@@ -236,6 +242,9 @@
const VkDeviceSize m_additionalResultBufferSize;
VkPipelineRasterizationLineStateCreateInfoEXT m_lineRasterizationStateInfo;
+
+private:
+ virtual int getIteration (void) const { TCU_THROW(InternalError, "Iteration undefined in the base class"); }
};
BaseRenderingTestInstance::BaseRenderingTestInstance (Context& context, VkSampleCountFlagBits sampleCount, deUint32 renderSize, VkFormat imageFormat, deUint32 additionalRenderSize)
@@ -250,6 +259,7 @@
, m_resultBufferSize (renderSize * renderSize * m_textureFormat.getPixelSize())
, m_additionalRenderSize(additionalRenderSize)
, m_additionalResultBufferSize(additionalRenderSize * additionalRenderSize * m_textureFormat.getPixelSize())
+ , m_lineRasterizationStateInfo (initLineRasterizationStateCreateInfo())
{
const DeviceInterface& vkd = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
@@ -729,7 +739,10 @@
VkPipelineRasterizationStateCreateInfo rasterizationStateInfo = *getRasterizationStateCreateInfo();
- rasterizationStateInfo.pNext = getLineRasterizationStateCreateInfo();
+ const VkPipelineRasterizationLineStateCreateInfoEXT* lineRasterizationStateInfo = getLineRasterizationStateCreateInfo();
+
+ if (lineRasterizationStateInfo != DE_NULL)
+ appendStructurePtrToVulkanChain(&rasterizationStateInfo.pNext, lineRasterizationStateInfo);
VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo =
{
@@ -883,9 +896,9 @@
return &rasterizationStateCreateInfo;
}
-VkPipelineRasterizationLineStateCreateInfoEXT* BaseRenderingTestInstance::getLineRasterizationStateCreateInfo (void)
+VkPipelineRasterizationLineStateCreateInfoEXT BaseRenderingTestInstance::initLineRasterizationStateCreateInfo (void) const
{
- m_lineRasterizationStateInfo =
+ VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -895,6 +908,11 @@
0xFFFF, // uint16_t lineStipplePattern;
};
+ return lineRasterizationStateInfo;
+}
+
+const VkPipelineRasterizationLineStateCreateInfoEXT* BaseRenderingTestInstance::getLineRasterizationStateCreateInfo (void) const
+{
return &m_lineRasterizationStateInfo;
}
@@ -938,11 +956,18 @@
class BaseTriangleTestInstance : public BaseRenderingTestInstance
{
public:
- BaseTriangleTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, VkSampleCountFlagBits sampleCount);
+ BaseTriangleTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, VkSampleCountFlagBits sampleCount, deUint32 renderSize = RESOLUTION_POT);
virtual tcu::TestStatus iterate (void);
+protected:
+ int getIteration (void) const { return m_iteration; }
+ int getIterationCount (void) const { return m_iterationCount; }
+
private:
virtual void generateTriangles (int iteration, std::vector<tcu::Vec4>& outData, std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles) = DE_NULL;
+ virtual bool compareAndVerify (std::vector<TriangleSceneSpec::SceneTriangle>& triangles,
+ tcu::Surface& resultImage,
+ std::vector<tcu::Vec4>& drawBuffer);
int m_iteration;
const int m_iterationCount;
@@ -950,8 +975,8 @@
bool m_allIterationsPassed;
};
-BaseTriangleTestInstance::BaseTriangleTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, VkSampleCountFlagBits sampleCount)
- : BaseRenderingTestInstance (context, sampleCount)
+BaseTriangleTestInstance::BaseTriangleTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, VkSampleCountFlagBits sampleCount, deUint32 renderSize)
+ : BaseRenderingTestInstance (context, sampleCount, renderSize)
, m_iteration (0)
, m_iterationCount (3)
, m_primitiveTopology (primitiveTopology)
@@ -974,21 +999,7 @@
// compare
{
- bool compareOk;
- RasterizationArguments args;
- TriangleSceneSpec scene;
-
- tcu::IVec4 colorBits = tcu::getTextureFormatBitDepth(getTextureFormat());
-
- args.numSamples = m_multisampling ? 1 : 0;
- args.subpixelBits = m_subpixelBits;
- args.redBits = colorBits[0];
- args.greenBits = colorBits[1];
- args.blueBits = colorBits[2];
-
- scene.triangles.swap(triangles);
-
- compareOk = verifyTriangleGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog());
+ const bool compareOk = compareAndVerify(triangles, resultImage, drawBuffer);
if (!compareOk)
m_allIterationsPassed = false;
@@ -1006,6 +1017,24 @@
return tcu::TestStatus::incomplete();
}
+bool BaseTriangleTestInstance::compareAndVerify (std::vector<TriangleSceneSpec::SceneTriangle>& triangles, tcu::Surface& resultImage, std::vector<tcu::Vec4>&)
+{
+ RasterizationArguments args;
+ TriangleSceneSpec scene;
+
+ tcu::IVec4 colorBits = tcu::getTextureFormatBitDepth(getTextureFormat());
+
+ args.numSamples = m_multisampling ? 1 : 0;
+ args.subpixelBits = m_subpixelBits;
+ args.redBits = colorBits[0];
+ args.greenBits = colorBits[1];
+ args.blueBits = colorBits[2];
+
+ scene.triangles.swap(triangles);
+
+ return verifyTriangleGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog());
+}
+
class BaseLineTestInstance : public BaseRenderingTestInstance
{
public:
@@ -1016,17 +1045,29 @@
VkSampleCountFlagBits sampleCount,
LineStipple stipple,
VkLineRasterizationModeEXT lineRasterizationMode,
- const deUint32 additionalRenderSize = 0);
+ const deUint32 additionalRenderSize = 0,
+ const deUint32 renderSize = RESOLUTION_POT,
+ const float narrowLineWidth = 1.0f);
virtual tcu::TestStatus iterate (void);
virtual float getLineWidth (void) const;
bool getLineStippleEnable (void) const { return m_stipple != LINESTIPPLE_DISABLED; }
virtual bool getLineStippleDynamic (void) const { return m_stipple == LINESTIPPLE_DYNAMIC; };
virtual
- VkPipelineRasterizationLineStateCreateInfoEXT* getLineRasterizationStateCreateInfo (void);
+ VkPipelineRasterizationLineStateCreateInfoEXT initLineRasterizationStateCreateInfo (void) const;
+
+ virtual
+ const VkPipelineRasterizationLineStateCreateInfoEXT* getLineRasterizationStateCreateInfo (void) const;
+
+protected:
+ int getIteration (void) const { return m_iteration; }
+ int getIterationCount (void) const { return m_iterationCount; }
private:
virtual void generateLines (int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines) = DE_NULL;
+ virtual bool compareAndVerify (std::vector<LineSceneSpec::SceneLine>& lines,
+ tcu::Surface& resultImage,
+ std::vector<tcu::Vec4>& drawBuffer);
bool resultHasAlpha (tcu::Surface& result);
@@ -1059,8 +1100,10 @@
VkSampleCountFlagBits sampleCount,
LineStipple stipple,
VkLineRasterizationModeEXT lineRasterizationMode,
- const deUint32 additionalRenderSize)
- : BaseRenderingTestInstance (context, sampleCount, RESOLUTION_POT, VK_FORMAT_R8G8B8A8_UNORM, additionalRenderSize)
+ const deUint32 additionalRenderSize,
+ const deUint32 renderSize,
+ const float narrowLineWidth)
+ : BaseRenderingTestInstance (context, sampleCount, renderSize, VK_FORMAT_R8G8B8A8_UNORM, additionalRenderSize)
, m_iteration (0)
, m_iterationCount (3)
, m_primitiveTopology (primitiveTopology)
@@ -1074,6 +1117,8 @@
{
DE_ASSERT(m_primitiveWideness < PRIMITIVEWIDENESS_LAST);
+ m_lineRasterizationStateInfo = initLineRasterizationStateCreateInfo();
+
if (m_lineRasterizationMode != VK_LINE_RASTERIZATION_MODE_EXT_LAST)
{
if (context.isDeviceFunctionalitySupported("VK_EXT_line_rasterization"))
@@ -1098,7 +1143,11 @@
// create line widths
if (m_primitiveWideness == PRIMITIVEWIDENESS_NARROW)
{
- m_lineWidths.resize(m_iterationCount, 1.0f);
+ m_lineWidths.resize(m_iterationCount, narrowLineWidth);
+
+ // Bump up m_maxLineWidth for conservative rasterization
+ if (narrowLineWidth > m_maxLineWidth)
+ m_maxLineWidth = narrowLineWidth;
}
else if (m_primitiveWideness == PRIMITIVEWIDENESS_WIDE)
{
@@ -1305,7 +1354,6 @@
const tcu::ScopedLogSection section (m_context.getTestContext().getLog(), iterationDescription, iterationDescription);
const float lineWidth = getLineWidth();
tcu::Surface resultImage (m_renderSize, m_renderSize);
- tcu::Surface additionalResultImage (m_additionalRenderSize, m_additionalRenderSize);
std::vector<tcu::Vec4> drawBuffer;
std::vector<LineSceneSpec::SceneLine> lines;
@@ -1319,99 +1367,12 @@
drawPrimitives(resultImage, drawBuffer, m_primitiveTopology);
// compare
- RasterizationArguments args;
- LineSceneSpec scene;
- tcu::IVec4 colorBits = tcu::getTextureFormatBitDepth(getTextureFormat());
- bool strict = m_primitiveStrictness == PRIMITIVESTRICTNESS_STRICT;
-
- args.numSamples = m_multisampling ? 1 : 0;
- args.subpixelBits = m_subpixelBits;
- args.redBits = colorBits[0];
- args.greenBits = colorBits[1];
- args.blueBits = colorBits[2];
-
- scene.lines.swap(lines);
- scene.lineWidth = lineWidth;
- scene.stippleEnable = getLineStippleEnable();
- scene.stippleFactor = getLineStippleEnable() ? lineStippleFactor : 1;
- scene.stipplePattern = getLineStippleEnable() ? lineStipplePattern : 0xFFFF;
- scene.isStrip = m_primitiveTopology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
- scene.isSmooth = m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT;
-
- // Choose verification mode. Smooth lines assume mostly over-rasterization (bloated lines with a falloff).
- // Stippled lines lose some precision across segments in a strip, so need a weaker threshold than normal
- // lines. For simple cases, check for an exact match (STRICT).
- if (scene.isSmooth)
- scene.verificationMode = tcu::VERIFICATIONMODE_SMOOTH;
- else if (scene.stippleEnable)
- scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
- else
- scene.verificationMode = tcu::VERIFICATIONMODE_STRICT;
-
- if (m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT)
{
- // bresenham is "no AA" in GL, so set numSamples to zero.
- args.numSamples = 0;
- if (!verifyLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog()))
+ const bool compareOk = compareAndVerify(lines, resultImage, drawBuffer);
+
+ if (!compareOk)
m_allIterationsPassed = false;
}
- else
- {
- if (scene.isSmooth)
- {
- // Smooth lines get the fractional coverage multiplied into the alpha component,
- // so do a sanity check to validate that there is at least one pixel in the image
- // with a fractional opacity.
- bool hasAlpha = resultHasAlpha(resultImage);
- if (!hasAlpha)
- {
- m_context.getTestContext().getLog() << tcu::TestLog::Message << "Missing alpha transparency (failed)." << tcu::TestLog::EndMessage;
- m_allIterationsPassed = false;
- }
- }
-
- if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
- {
- // Retry with weaker verification. If it passes, consider it a quality warning.
- scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
- if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), false, strict))
- m_allIterationsPassed = false;
- else
- m_qualityWarning = true;
- }
-
- if (m_additionalRenderSize != 0)
- {
- const std::vector<tcu::Vec4> colorData(drawBuffer.size(), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
-
- if (scene.isSmooth)
- scene.verificationMode = tcu::VERIFICATIONMODE_SMOOTH;
- else if (scene.stippleEnable)
- scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
- else
- scene.verificationMode = tcu::VERIFICATIONMODE_STRICT;
-
- drawPrimitives(additionalResultImage, drawBuffer, colorData, m_primitiveTopology, *m_additionalImage, *m_additionalResolvedImage, *m_additionalFrameBuffer, m_additionalRenderSize, *m_additionalResultBuffer, *m_additionalResultBufferMemory);
-
- // Compare
- if (!verifyRelaxedLineGroupRasterization(additionalResultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
- {
- if (strict)
- {
- m_allIterationsPassed = false;
- }
- else
- {
- // Retry with weaker verification. If it passes, consider it a quality warning.
- scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
- if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
- m_allIterationsPassed = false;
- else
- m_qualityWarning = true;
- }
- }
- }
- }
}
else
m_context.getTestContext().getLog() << tcu::TestLog::Message << "Line width " << lineWidth << " not supported, skipping iteration." << tcu::TestLog::EndMessage;
@@ -1430,18 +1391,116 @@
return tcu::TestStatus::incomplete();
}
+bool BaseLineTestInstance::compareAndVerify (std::vector<LineSceneSpec::SceneLine>& lines, tcu::Surface& resultImage, std::vector<tcu::Vec4>& drawBuffer)
+{
+ const float lineWidth = getLineWidth();
+ bool result = true;
+ tcu::Surface additionalResultImage (m_additionalRenderSize, m_additionalRenderSize);
+ RasterizationArguments args;
+ LineSceneSpec scene;
+ tcu::IVec4 colorBits = tcu::getTextureFormatBitDepth(getTextureFormat());
+ bool strict = m_primitiveStrictness == PRIMITIVESTRICTNESS_STRICT;
+
+ args.numSamples = m_multisampling ? 1 : 0;
+ args.subpixelBits = m_subpixelBits;
+ args.redBits = colorBits[0];
+ args.greenBits = colorBits[1];
+ args.blueBits = colorBits[2];
+
+ scene.lines.swap(lines);
+ scene.lineWidth = lineWidth;
+ scene.stippleEnable = getLineStippleEnable();
+ scene.stippleFactor = getLineStippleEnable() ? lineStippleFactor : 1;
+ scene.stipplePattern = getLineStippleEnable() ? lineStipplePattern : 0xFFFF;
+ scene.isStrip = m_primitiveTopology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
+ scene.isSmooth = m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT;
+
+ // Choose verification mode. Smooth lines assume mostly over-rasterization (bloated lines with a falloff).
+ // Stippled lines lose some precision across segments in a strip, so need a weaker threshold than normal
+ // lines. For simple cases, check for an exact match (STRICT).
+ if (scene.isSmooth)
+ scene.verificationMode = tcu::VERIFICATIONMODE_SMOOTH;
+ else if (scene.stippleEnable)
+ scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
+ else
+ scene.verificationMode = tcu::VERIFICATIONMODE_STRICT;
+
+ if (m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT)
+ {
+ // bresenham is "no AA" in GL, so set numSamples to zero.
+ args.numSamples = 0;
+ if (!verifyLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog()))
+ result = false;
+ }
+ else
+ {
+ if (scene.isSmooth)
+ {
+ // Smooth lines get the fractional coverage multiplied into the alpha component,
+ // so do a sanity check to validate that there is at least one pixel in the image
+ // with a fractional opacity.
+ bool hasAlpha = resultHasAlpha(resultImage);
+ if (!hasAlpha)
+ {
+ m_context.getTestContext().getLog() << tcu::TestLog::Message << "Missing alpha transparency (failed)." << tcu::TestLog::EndMessage;
+ result = false;
+ }
+ }
+
+ if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
+ {
+ // Retry with weaker verification. If it passes, consider it a quality warning.
+ scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
+ if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), false, strict))
+ result = false;
+ else
+ m_qualityWarning = true;
+ }
+
+ if (m_additionalRenderSize != 0)
+ {
+ const std::vector<tcu::Vec4> colorData(drawBuffer.size(), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
+
+ if (scene.isSmooth)
+ scene.verificationMode = tcu::VERIFICATIONMODE_SMOOTH;
+ else if (scene.stippleEnable)
+ scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
+ else
+ scene.verificationMode = tcu::VERIFICATIONMODE_STRICT;
+
+ drawPrimitives(additionalResultImage, drawBuffer, colorData, m_primitiveTopology, *m_additionalImage, *m_additionalResolvedImage, *m_additionalFrameBuffer, m_additionalRenderSize, *m_additionalResultBuffer, *m_additionalResultBufferMemory);
+
+ // Compare
+ if (!verifyRelaxedLineGroupRasterization(additionalResultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
+ {
+ if (strict)
+ {
+ result = false;
+ }
+ else
+ {
+ // Retry with weaker verification. If it passes, consider it a quality warning.
+ scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
+ if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
+ result = false;
+ else
+ m_qualityWarning = true;
+ }
+ }
+ }
+ }
+
+ return result;
+}
float BaseLineTestInstance::getLineWidth (void) const
{
return m_lineWidths[m_iteration];
}
-VkPipelineRasterizationLineStateCreateInfoEXT* BaseLineTestInstance::getLineRasterizationStateCreateInfo (void)
+VkPipelineRasterizationLineStateCreateInfoEXT BaseLineTestInstance::initLineRasterizationStateCreateInfo (void) const
{
- if (m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_EXT_LAST)
- return DE_NULL;
-
- m_lineRasterizationStateInfo =
+ VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo =
{
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -1453,10 +1512,18 @@
if (m_stipple == LINESTIPPLE_STATIC)
{
- m_lineRasterizationStateInfo.lineStippleFactor = lineStippleFactor;
- m_lineRasterizationStateInfo.lineStipplePattern = lineStipplePattern;
+ lineRasterizationStateInfo.lineStippleFactor = lineStippleFactor;
+ lineRasterizationStateInfo.lineStipplePattern = lineStipplePattern;
}
+ return lineRasterizationStateInfo;
+}
+
+const VkPipelineRasterizationLineStateCreateInfoEXT* BaseLineTestInstance::getLineRasterizationStateCreateInfo (void) const
+{
+ if (m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_EXT_LAST)
+ return DE_NULL;
+
return &m_lineRasterizationStateInfo;
}
@@ -1469,12 +1536,21 @@
VkSampleCountFlagBits sampleCount,
LineStipple stipple, // ignored
VkLineRasterizationModeEXT lineRasterizationMode, // ignored
- deUint32 renderSize); // ignored
+ deUint32 additionalRenderSize, // ignored
+ deUint32 renderSize = RESOLUTION_POT,
+ float pointSizeNarrow = 1.0f);
virtual tcu::TestStatus iterate (void);
virtual float getPointSize (void) const;
+protected:
+ int getIteration (void) const { return m_iteration; }
+ int getIterationCount (void) const { return m_iterationCount; }
+
private:
virtual void generatePoints (int iteration, std::vector<tcu::Vec4>& outData, std::vector<PointSceneSpec::ScenePoint>& outPoints);
+ virtual bool compareAndVerify (std::vector<PointSceneSpec::ScenePoint>& points,
+ tcu::Surface& resultImage,
+ std::vector<tcu::Vec4>& drawBuffer);
int m_iteration;
const int m_iterationCount;
@@ -1490,23 +1566,25 @@
VkSampleCountFlagBits sampleCount,
LineStipple stipple,
VkLineRasterizationModeEXT lineRasterizationMode,
- deUint32 renderSize)
- : BaseRenderingTestInstance (context, sampleCount)
+ deUint32 additionalRenderSize,
+ deUint32 renderSize,
+ float pointSizeNarrow)
+ : BaseRenderingTestInstance (context, sampleCount, renderSize)
, m_iteration (0)
, m_iterationCount (3)
, m_primitiveWideness (wideness)
, m_allIterationsPassed (true)
- , m_maxPointSize (1.0f)
+ , m_maxPointSize (pointSizeNarrow)
{
DE_UNREF(strictness);
DE_UNREF(stipple);
DE_UNREF(lineRasterizationMode);
- DE_UNREF(renderSize);
+ DE_UNREF(additionalRenderSize);
// create point sizes
if (m_primitiveWideness == PRIMITIVEWIDENESS_NARROW)
{
- m_pointSizes.resize(m_iterationCount, 1.0f);
+ m_pointSizes.resize(m_iterationCount, pointSizeNarrow);
}
else if (m_primitiveWideness == PRIMITIVEWIDENESS_WIDE)
{
@@ -1548,21 +1626,7 @@
// compare
{
- bool compareOk;
- RasterizationArguments args;
- PointSceneSpec scene;
-
- tcu::IVec4 colorBits = tcu::getTextureFormatBitDepth(getTextureFormat());
-
- args.numSamples = m_multisampling ? 1 : 0;
- args.subpixelBits = m_subpixelBits;
- args.redBits = colorBits[0];
- args.greenBits = colorBits[1];
- args.blueBits = colorBits[2];
-
- scene.points.swap(points);
-
- compareOk = verifyPointGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog());
+ const bool compareOk = compareAndVerify(points, resultImage, drawBuffer);
if (!compareOk)
m_allIterationsPassed = false;
@@ -1583,6 +1647,28 @@
return tcu::TestStatus::incomplete();
}
+bool PointTestInstance::compareAndVerify (std::vector<PointSceneSpec::ScenePoint>& points,
+ tcu::Surface& resultImage,
+ std::vector<tcu::Vec4>& drawBuffer)
+{
+ RasterizationArguments args;
+ PointSceneSpec scene;
+
+ tcu::IVec4 colorBits = tcu::getTextureFormatBitDepth(getTextureFormat());
+
+ args.numSamples = m_multisampling ? 1 : 0;
+ args.subpixelBits = m_subpixelBits;
+ args.redBits = colorBits[0];
+ args.greenBits = colorBits[1];
+ args.blueBits = colorBits[2];
+
+ scene.points.swap(points);
+
+ DE_UNREF(drawBuffer);
+
+ return verifyPointGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog());
+}
+
float PointTestInstance::getPointSize (void) const
{
return m_pointSizes[m_iteration];
@@ -2174,6 +2260,2152 @@
}
}
+struct ConservativeTestConfig
+{
+ VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ float extraOverestimationSize;
+ VkPrimitiveTopology primitiveTopology;
+ bool degeneratePrimitives;
+ float lineWidth;
+ deUint32 resolution;
+};
+
+float getExtraOverestimationSize (const float overestimationSizeDesired, const VkPhysicalDeviceConservativeRasterizationPropertiesEXT& conservativeRasterizationProperties)
+{
+ const float extraOverestimationSize = overestimationSizeDesired == TCU_INFINITY ? conservativeRasterizationProperties.maxExtraPrimitiveOverestimationSize
+ : overestimationSizeDesired == -TCU_INFINITY ? conservativeRasterizationProperties.extraPrimitiveOverestimationSizeGranularity
+ : overestimationSizeDesired;
+
+ return extraOverestimationSize;
+}
+
+template <typename ConcreteTestInstance>
+class ConservativeTestCase : public BaseRenderingTestCase
+{
+public:
+ ConservativeTestCase (tcu::TestContext& context,
+ const std::string& name,
+ const std::string& description,
+ const ConservativeTestConfig& conservativeTestConfig,
+ VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT)
+ : BaseRenderingTestCase (context, name, description, sampleCount)
+ , m_conservativeTestConfig (conservativeTestConfig)
+ {}
+
+ virtual void checkSupport (Context& context) const;
+
+ virtual TestInstance* createInstance (Context& context) const
+ {
+ return new ConcreteTestInstance(context, m_conservativeTestConfig, m_sampleCount);
+ }
+
+protected:
+ bool isUseLineSubPixel (Context& context) const;
+ deUint32 getSubPixelResolution (Context& context) const;
+
+ const ConservativeTestConfig m_conservativeTestConfig;
+};
+
+template <typename ConcreteTestInstance>
+bool ConservativeTestCase<ConcreteTestInstance>::isUseLineSubPixel (Context& context) const
+{
+ return (isPrimitiveTopologyLine(m_conservativeTestConfig.primitiveTopology) && context.isDeviceFunctionalitySupported("VK_EXT_line_rasterization"));
+}
+
+template <typename ConcreteTestInstance>
+deUint32 ConservativeTestCase<ConcreteTestInstance>::getSubPixelResolution (Context& context) const
+{
+ if (isUseLineSubPixel(context))
+ {
+ const VkPhysicalDeviceLineRasterizationPropertiesEXT lineRasterizationPropertiesEXT = context.getLineRasterizationPropertiesEXT();
+
+ return lineRasterizationPropertiesEXT.lineSubPixelPrecisionBits;
+ }
+ else
+ {
+ return context.getDeviceProperties().limits.subPixelPrecisionBits;
+ }
+}
+
+template <typename ConcreteTestInstance>
+void ConservativeTestCase<ConcreteTestInstance>::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_EXT_conservative_rasterization");
+
+ const VkPhysicalDeviceConservativeRasterizationPropertiesEXT conservativeRasterizationProperties = context.getConservativeRasterizationPropertiesEXT();
+ const deUint32 subPixelPrecisionBits = getSubPixelResolution(context);
+ const deUint32 subPixelPrecision = 1<<subPixelPrecisionBits;
+ const bool linesPrecision = isUseLineSubPixel(context);
+ const float primitiveOverestimationSizeMult = float(subPixelPrecision) * conservativeRasterizationProperties.primitiveOverestimationSize;
+ const bool topologyLineOrPoint = isPrimitiveTopologyLine(m_conservativeTestConfig.primitiveTopology) || isPrimitiveTopologyPoint(m_conservativeTestConfig.primitiveTopology);
+
+ DE_ASSERT(subPixelPrecisionBits < sizeof(deUint32) * 8);
+
+ context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "maxExtraPrimitiveOverestimationSize=" << conservativeRasterizationProperties.maxExtraPrimitiveOverestimationSize << '\n'
+ << "extraPrimitiveOverestimationSizeGranularity=" << conservativeRasterizationProperties.extraPrimitiveOverestimationSizeGranularity << '\n'
+ << "degenerateLinesRasterized=" << conservativeRasterizationProperties.degenerateLinesRasterized << '\n'
+ << "degenerateTrianglesRasterized=" << conservativeRasterizationProperties.degenerateTrianglesRasterized << '\n'
+ << "primitiveOverestimationSize=" << conservativeRasterizationProperties.primitiveOverestimationSize << " (==" << primitiveOverestimationSizeMult << '/' << subPixelPrecision << ")\n"
+ << "subPixelPrecisionBits=" << subPixelPrecisionBits << (linesPrecision ? " (using VK_EXT_line_rasterization)" : " (using limits)") << '\n'
+ << tcu::TestLog::EndMessage;
+
+ if (conservativeRasterizationProperties.extraPrimitiveOverestimationSizeGranularity > conservativeRasterizationProperties.maxExtraPrimitiveOverestimationSize)
+ TCU_FAIL("Granularity cannot be greater than maximum extra size");
+
+ if (topologyLineOrPoint)
+ {
+ if (!conservativeRasterizationProperties.conservativePointAndLineRasterization)
+ TCU_THROW(NotSupportedError, "Conservative line and point rasterization is not supported");
+ }
+
+ if (m_conservativeTestConfig.conservativeRasterizationMode == VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT)
+ {
+ if (conservativeRasterizationProperties.primitiveUnderestimation == DE_FALSE)
+ TCU_THROW(NotSupportedError, "Underestimation is not supported");
+
+ if (isPrimitiveTopologyLine(m_conservativeTestConfig.primitiveTopology))
+ {
+ const float testLineWidth = m_conservativeTestConfig.lineWidth;
+
+ if (testLineWidth != 1.0f)
+ {
+ const VkPhysicalDeviceLimits& limits = context.getDeviceProperties().limits;
+ const float lineWidthRange[2] = { limits.lineWidthRange[0], limits.lineWidthRange[1] };
+ const float lineWidthGranularity = limits.lineWidthGranularity;
+
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_WIDE_LINES);
+
+ if (lineWidthGranularity == 0.0f)
+ TCU_THROW(NotSupportedError, "Wide lines required for test, but are not supported");
+
+ DE_ASSERT(lineWidthGranularity > 0.0f && lineWidthRange[0] > 0.0f && lineWidthRange[1] >= lineWidthRange[0]);
+
+ if (!de::inBounds(testLineWidth, lineWidthRange[0], lineWidthRange[1]))
+ TCU_THROW(NotSupportedError, "Tested line width is not supported");
+
+ const float n = (testLineWidth - lineWidthRange[0]) / lineWidthGranularity;
+
+ if (deFloatFrac(n) != 0.0f || n * lineWidthGranularity + lineWidthRange[0] != testLineWidth)
+ TCU_THROW(NotSupportedError, "Exact match of line width is required for the test");
+ }
+ }
+ else if (isPrimitiveTopologyPoint(m_conservativeTestConfig.primitiveTopology))
+ {
+ const float testPointSize = m_conservativeTestConfig.lineWidth;
+
+ if (testPointSize != 1.0f)
+ {
+ const VkPhysicalDeviceLimits& limits = context.getDeviceProperties().limits;
+ const float pointSizeRange[2] = { limits.pointSizeRange[0], limits.pointSizeRange[1] };
+ const float pointSizeGranularity = limits.pointSizeGranularity;
+
+ context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_LARGE_POINTS);
+
+ if (pointSizeGranularity == 0.0f)
+ TCU_THROW(NotSupportedError, "Large points required for test, but are not supported");
+
+ DE_ASSERT(pointSizeGranularity > 0.0f && pointSizeRange[0] > 0.0f && pointSizeRange[1] >= pointSizeRange[0]);
+
+ if (!de::inBounds(testPointSize, pointSizeRange[0], pointSizeRange[1]))
+ TCU_THROW(NotSupportedError, "Tested point size is not supported");
+
+ const float n = (testPointSize - pointSizeRange[0]) / pointSizeGranularity;
+
+ if (deFloatFrac(n) != 0.0f || n * pointSizeGranularity + pointSizeRange[0] != testPointSize)
+ TCU_THROW(NotSupportedError, "Exact match of point size is required for the test");
+ }
+ }
+ }
+ else if (m_conservativeTestConfig.conservativeRasterizationMode == VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT)
+ {
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, conservativeRasterizationProperties);
+
+ if (extraOverestimationSize > conservativeRasterizationProperties.maxExtraPrimitiveOverestimationSize)
+ TCU_THROW(NotSupportedError, "Specified overestimation size is not supported");
+
+ if (topologyLineOrPoint)
+ {
+ if (!conservativeRasterizationProperties.conservativePointAndLineRasterization)
+ TCU_THROW(NotSupportedError, "Conservative line and point rasterization is not supported");
+ }
+
+ if (isPrimitiveTopologyTriangle(m_conservativeTestConfig.primitiveTopology))
+ {
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ {
+ // Enforce specification minimum required limit to avoid division by zero
+ DE_ASSERT(subPixelPrecisionBits >= 4);
+
+ // Make sure float precision of 22 bits is enough, i.e. resoultion in subpixel quarters less than float precision
+ if (m_conservativeTestConfig.resolution * (1<<(subPixelPrecisionBits + 2)) > (1<<21))
+ TCU_THROW(NotSupportedError, "Subpixel resolution is too high to generate degenerate primitives");
+ }
+ }
+ }
+ else
+ TCU_THROW(InternalError, "Non-conservative mode tests are not supported by this class");
+}
+
+class ConservativeTraingleTestInstance : public BaseTriangleTestInstance
+{
+public:
+ ConservativeTraingleTestInstance (Context& context,
+ ConservativeTestConfig conservativeTestConfig,
+ VkSampleCountFlagBits sampleCount)
+ : BaseTriangleTestInstance (context,
+ conservativeTestConfig.primitiveTopology,
+ sampleCount,
+ conservativeTestConfig.resolution)
+ , m_conservativeTestConfig (conservativeTestConfig)
+ , m_conservativeRasterizationProperties (context.getConservativeRasterizationPropertiesEXT())
+ , m_rasterizationConservativeStateCreateInfo (initRasterizationConservativeStateCreateInfo())
+ , m_rasterizationStateCreateInfo (initRasterizationStateCreateInfo())
+ {}
+
+ void generateTriangles (int iteration,
+ std::vector<tcu::Vec4>& outData,
+ std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles);
+ const VkPipelineRasterizationStateCreateInfo* getRasterizationStateCreateInfo (void) const;
+
+protected:
+ virtual const VkPipelineRasterizationLineStateCreateInfoEXT* getLineRasterizationStateCreateInfo (void) const;
+
+ virtual bool compareAndVerify (std::vector<TriangleSceneSpec::SceneTriangle>& triangles,
+ tcu::Surface& resultImage,
+ std::vector<tcu::Vec4>& drawBuffer);
+ virtual bool compareAndVerifyOverestimatedNormal (std::vector<TriangleSceneSpec::SceneTriangle>& triangles,
+ tcu::Surface& resultImage);
+ virtual bool compareAndVerifyOverestimatedDegenerate (std::vector<TriangleSceneSpec::SceneTriangle>& triangles,
+ tcu::Surface& resultImage);
+ virtual bool compareAndVerifyUnderestimatedNormal (std::vector<TriangleSceneSpec::SceneTriangle>& triangles,
+ tcu::Surface& resultImage);
+ virtual bool compareAndVerifyUnderestimatedDegenerate (std::vector<TriangleSceneSpec::SceneTriangle>& triangles,
+ tcu::Surface& resultImage);
+ void generateNormalTriangles (int iteration,
+ std::vector<tcu::Vec4>& outData,
+ std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles);
+ void generateDegenerateTriangles (int iteration,
+ std::vector<tcu::Vec4>& outData,
+ std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles);
+ void drawPrimitives (tcu::Surface& result,
+ const std::vector<tcu::Vec4>& vertexData,
+ VkPrimitiveTopology primitiveTopology);
+
+private:
+ const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> initRasterizationConservativeStateCreateInfo (void);
+ const std::vector<VkPipelineRasterizationStateCreateInfo> initRasterizationStateCreateInfo (void);
+
+ const ConservativeTestConfig m_conservativeTestConfig;
+ const VkPhysicalDeviceConservativeRasterizationPropertiesEXT m_conservativeRasterizationProperties;
+ const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> m_rasterizationConservativeStateCreateInfo;
+ const std::vector<VkPipelineRasterizationStateCreateInfo> m_rasterizationStateCreateInfo;
+};
+
+void ConservativeTraingleTestInstance::generateTriangles (int iteration, std::vector<tcu::Vec4>& outData, std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles)
+{
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ generateDegenerateTriangles(iteration, outData, outTriangles);
+ else
+ generateNormalTriangles(iteration, outData, outTriangles);
+}
+
+void ConservativeTraingleTestInstance::generateNormalTriangles (int iteration, std::vector<tcu::Vec4>& outData, std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles)
+{
+ const float halfPixel = 1.0f / float(m_renderSize);
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ const float overestimate = 2.0f * halfPixel * (m_conservativeRasterizationProperties.primitiveOverestimationSize + extraOverestimationSize);
+ const float overestimateMargin = overestimate;
+ const float underestimateMargin = 0.0f;
+ const bool isOverestimate = m_conservativeTestConfig.conservativeRasterizationMode == VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
+ const float margin = isOverestimate ? overestimateMargin : underestimateMargin;
+ const char* overestimateIterationComments[] = { "Corner touch", "Any portion pixel coverage", "Edge touch" };
+
+ outData.resize(6);
+
+ switch (iteration)
+ {
+ case 0:
+ {
+ // Corner touch
+ const float edge = 2 * halfPixel + margin;
+ const float left = -1.0f + edge;
+ const float right = +1.0f - edge;
+ const float up = -1.0f + edge;
+ const float down = +1.0f - edge;
+
+ outData[0] = tcu::Vec4( left, down, 0.0f, 1.0f);
+ outData[1] = tcu::Vec4( left, up, 0.0f, 1.0f);
+ outData[2] = tcu::Vec4(right, down, 0.0f, 1.0f);
+
+ outData[3] = tcu::Vec4( left, up, 0.0f, 1.0f);
+ outData[4] = tcu::Vec4(right, down, 0.0f, 1.0f);
+ outData[5] = tcu::Vec4(right, up, 0.0f, 1.0f);
+
+ break;
+ }
+
+ case 1:
+ {
+ // Partial coverage
+ const float eps = halfPixel / 32.0f;
+ const float edge = 4.0f * halfPixel + margin - eps;
+ const float left = -1.0f + edge;
+ const float right = +1.0f - edge;
+ const float up = -1.0f + edge;
+ const float down = +1.0f - edge;
+
+ outData[0] = tcu::Vec4( left, down, 0.0f, 1.0f);
+ outData[1] = tcu::Vec4( left, up, 0.0f, 1.0f);
+ outData[2] = tcu::Vec4(right, down, 0.0f, 1.0f);
+
+ outData[3] = tcu::Vec4( left, up, 0.0f, 1.0f);
+ outData[4] = tcu::Vec4(right, down, 0.0f, 1.0f);
+ outData[5] = tcu::Vec4(right, up, 0.0f, 1.0f);
+
+ break;
+ }
+
+ case 2:
+ {
+ // Edge touch
+ const float edge = 6.0f * halfPixel + margin;
+ const float left = -1.0f + edge;
+ const float right = +1.0f - edge;
+ const float up = -1.0f + edge;
+ const float down = +1.0f - edge;
+
+ outData[0] = tcu::Vec4( left, down, 0.0f, 1.0f);
+ outData[1] = tcu::Vec4( left, up, 0.0f, 1.0f);
+ outData[2] = tcu::Vec4(right, down, 0.0f, 1.0f);
+
+ outData[3] = tcu::Vec4( left, up, 0.0f, 1.0f);
+ outData[4] = tcu::Vec4(right, down, 0.0f, 1.0f);
+ outData[5] = tcu::Vec4(right, up, 0.0f, 1.0f);
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unexpected iteration");
+ }
+
+ outTriangles.resize(outData.size() / 3);
+
+ for (size_t ndx = 0; ndx < outTriangles.size(); ++ndx)
+ {
+ outTriangles[ndx].positions[0] = outData[3 * ndx + 0]; outTriangles[ndx].sharedEdge[0] = false;
+ outTriangles[ndx].positions[1] = outData[3 * ndx + 1]; outTriangles[ndx].sharedEdge[1] = false;
+ outTriangles[ndx].positions[2] = outData[3 * ndx + 2]; outTriangles[ndx].sharedEdge[2] = false;
+ }
+
+ // log
+ if (isOverestimate)
+ {
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Testing " << overestimateIterationComments[iteration] << " "
+ << "with rendering " << outTriangles.size() << " triangle(s):"
+ << tcu::TestLog::EndMessage;
+ }
+ else
+ {
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Rendering " << outTriangles.size() << " triangle(s):"
+ << tcu::TestLog::EndMessage;
+ }
+
+ for (size_t ndx = 0; ndx < outTriangles.size(); ++ndx)
+ {
+ const deUint32 multiplier = m_renderSize / 2;
+
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Triangle " << (ndx + 1) << ":"
+ << "\n\t" << outTriangles[ndx].positions[0] << " == " << (float(multiplier) * outTriangles[ndx].positions[0]) << "/" << multiplier
+ << "\n\t" << outTriangles[ndx].positions[1] << " == " << (float(multiplier) * outTriangles[ndx].positions[1]) << "/" << multiplier
+ << "\n\t" << outTriangles[ndx].positions[2] << " == " << (float(multiplier) * outTriangles[ndx].positions[2]) << "/" << multiplier
+ << tcu::TestLog::EndMessage;
+ }
+}
+
+void ConservativeTraingleTestInstance::generateDegenerateTriangles (int iteration, std::vector<tcu::Vec4>& outData, std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles)
+{
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ const float pixelSize = 2.0f / float(m_renderSize);
+ const deUint32 subPixels = 1u << m_context.getDeviceProperties().limits.subPixelPrecisionBits;
+ const float subPixelSize = pixelSize / float(subPixels);
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ const float totalOverestimate = m_conservativeRasterizationProperties.primitiveOverestimationSize + extraOverestimationSize;
+ const float totalOverestimateInSubPixels = deFloatCeil(totalOverestimate * float(subPixels));
+ const float overestimate = subPixelSize * totalOverestimateInSubPixels;
+ const float overestimateSafetyMargin = subPixelSize * 0.125f;
+ const float overestimateMargin = overestimate + overestimateSafetyMargin;
+ const float underestimateMargin = 0.0f;
+ const bool isOverestimate = m_conservativeTestConfig.conservativeRasterizationMode == VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
+ const float margin = isOverestimate ? overestimateMargin : underestimateMargin;
+ const char* overestimateIterationComments[] = { "Backfacing", "Generate pixels", "Use provoking vertex" };
+
+ if (pixelSize < 2 * overestimateMargin)
+ TCU_THROW(NotSupportedError, "Could not generate degenerate triangle for such overestimate parameters");
+
+ outData.clear();
+
+ switch (iteration)
+ {
+ case 0:
+ case 1:
+ case 2:
+ {
+ for (int rowNdx = 0; rowNdx < 3; ++rowNdx)
+ for (int colNdx = 0; colNdx < 4; ++colNdx)
+ {
+ const float offsetX = -1.0f + float(4 * (colNdx + 1)) * pixelSize;
+ const float offsetY = -1.0f + float(4 * (rowNdx + 1)) * pixelSize;
+ const float left = offsetX + margin;
+ const float right = offsetX + margin + 0.25f * subPixelSize;
+ const float up = offsetY + margin;
+ const float down = offsetY + margin + 0.25f * subPixelSize;
+ const bool luPresent = (rowNdx & 1) == 0;
+ const bool rdPresent = (rowNdx & 2) == 0;
+ const bool luCW = (colNdx & 1) == 0;
+ const bool rdCW = (colNdx & 2) == 0;
+
+ DE_ASSERT(left < right);
+ DE_ASSERT(up < down);
+
+ if (luPresent)
+ {
+ if (luCW)
+ {
+ // CW triangle left up
+ outData.push_back(tcu::Vec4( left, down, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( left, up, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(right, up, 0.0f, 1.0f));
+ }
+ else
+ {
+ // CCW triangle left up
+ outData.push_back(tcu::Vec4(right, up, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( left, up, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( left, down, 0.0f, 1.0f));
+ }
+ }
+
+ if (rdPresent)
+ {
+ if (rdCW)
+ {
+ // CW triangle right down
+ outData.push_back(tcu::Vec4(right, up, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(right, down, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( left, down, 0.0f, 1.0f));
+ }
+ else
+ {
+ // CCW triangle right down
+ outData.push_back(tcu::Vec4( left, down, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(right, down, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(right, up, 0.0f, 1.0f));
+ }
+ }
+ }
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unexpected iteration");
+ }
+
+ outTriangles.resize(outData.size() / 3);
+
+ for (size_t ndx = 0; ndx < outTriangles.size(); ++ndx)
+ {
+ outTriangles[ndx].positions[0] = outData[3 * ndx + 0]; outTriangles[ndx].sharedEdge[0] = false;
+ outTriangles[ndx].positions[1] = outData[3 * ndx + 1]; outTriangles[ndx].sharedEdge[1] = false;
+ outTriangles[ndx].positions[2] = outData[3 * ndx + 2]; outTriangles[ndx].sharedEdge[2] = false;
+ }
+
+ // log
+ if (isOverestimate)
+ {
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Testing " << overestimateIterationComments[iteration] << " "
+ << "with rendering " << outTriangles.size() << " triangle(s):"
+ << tcu::TestLog::EndMessage;
+ }
+ else
+ {
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Rendering " << outTriangles.size() << " triangle(s):"
+ << tcu::TestLog::EndMessage;
+ }
+
+ for (int ndx = 0; ndx < (int)outTriangles.size(); ++ndx)
+ {
+ const deUint32 multiplierInt = m_renderSize / 2;
+ const deUint32 multiplierFrac = subPixels;
+ std::string coordsString;
+
+ for (size_t vertexNdx = 0; vertexNdx < 3; ++vertexNdx)
+ {
+ const tcu::Vec4& pos = outTriangles[ndx].positions[vertexNdx];
+ std::ostringstream coordsFloat;
+ std::ostringstream coordsNatural;
+
+ for (int coordNdx = 0; coordNdx < 2; ++coordNdx)
+ {
+ const char* sep = (coordNdx < 1) ? "," : "";
+ const float coord = pos[coordNdx];
+ const char sign = deSign(coord) < 0 ? '-' : '+';
+ const float m = deFloatFloor(float(multiplierInt) * deFloatAbs(coord));
+ const float r = deFloatFrac(float(multiplierInt) * deFloatAbs(coord)) * float(multiplierFrac);
+
+ coordsFloat << std::fixed << std::setw(13) << std::setprecision(10) << coord << sep;
+ coordsNatural << sign << '(' << m << '+' << r << '/' << multiplierFrac << ')' << sep;
+ }
+
+ coordsString += "\n\t[" + coordsFloat.str() + "] == [" + coordsNatural.str() + "] / " + de::toString(multiplierInt);
+ }
+
+ log << tcu::TestLog::Message
+ << "Triangle " << (ndx + 1) << ':'
+ << coordsString
+ << tcu::TestLog::EndMessage;
+ }
+}
+
+void ConservativeTraingleTestInstance::drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& vertexData, VkPrimitiveTopology primitiveTopology)
+{
+ if (m_conservativeTestConfig.degeneratePrimitives && getIteration() == 2)
+ {
+ // Set provoking vertex color to white
+ tcu::Vec4 colorProvoking (1.0f, 1.0f, 1.0f, 1.0f);
+ tcu::Vec4 colorOther (0.0f, 1.0f, 1.0f, 1.0f);
+ std::vector<tcu::Vec4> colorData;
+
+ colorData.reserve(vertexData.size());
+
+ for (size_t vertexNdx = 0; vertexNdx < vertexData.size(); ++vertexNdx)
+ if (vertexNdx % 3 == 0)
+ colorData.push_back(colorProvoking);
+ else
+ colorData.push_back(colorOther);
+
+ BaseRenderingTestInstance::drawPrimitives(result, vertexData, colorData, primitiveTopology);
+ }
+ else
+ BaseRenderingTestInstance::drawPrimitives(result, vertexData, primitiveTopology);
+}
+
+bool ConservativeTraingleTestInstance::compareAndVerify (std::vector<TriangleSceneSpec::SceneTriangle>& triangles, tcu::Surface& resultImage, std::vector<tcu::Vec4>& drawBuffer)
+{
+ DE_UNREF(drawBuffer);
+
+ switch (m_conservativeTestConfig.conservativeRasterizationMode)
+ {
+ case VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT:
+ {
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ return compareAndVerifyOverestimatedDegenerate(triangles, resultImage);
+ else
+ return compareAndVerifyOverestimatedNormal(triangles, resultImage);
+
+ break;
+ }
+
+ case VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT:
+ {
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ return compareAndVerifyUnderestimatedDegenerate(triangles, resultImage);
+ else
+ return compareAndVerifyUnderestimatedNormal(triangles, resultImage);
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unknown conservative rasterization mode");
+ }
+}
+
+bool ConservativeTraingleTestInstance::compareAndVerifyOverestimatedNormal (std::vector<TriangleSceneSpec::SceneTriangle>& triangles, tcu::Surface& resultImage)
+{
+ DE_UNREF(triangles);
+
+ const int start = getIteration() + 1;
+ const int end = resultImage.getHeight() - start;
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ int errX = 0;
+ int errY = 0;
+ deUint32 errValue = 0;
+ bool result = true;
+
+ DE_ASSERT(resultImage.getHeight() == resultImage.getWidth());
+
+ for (int y = start; result && y < end; ++y)
+ for (int x = start; result && x < end; ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != foregroundColor.getPacked())
+ {
+ result = false;
+ errX = x;
+ errY = y;
+ errValue = resultImage.getPixel(x,y).getPacked();
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+ tcu::Surface expectedImage (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ errorMask.setPixel(x, y, backgroundColor);
+ expectedImage.setPixel(x, y, backgroundColor);
+ }
+
+ for (int y = start; y < end; ++y)
+ for (int x = start; x < end; ++x)
+ {
+ expectedImage.setPixel(x, y, foregroundColor);
+
+ if (resultImage.getPixel(x, y).getPacked() != foregroundColor.getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found starting at " << errX << "," << errY << " value=0x" << std::hex << errValue
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Expected", "Expected", expectedImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+bool ConservativeTraingleTestInstance::compareAndVerifyOverestimatedDegenerate (std::vector<TriangleSceneSpec::SceneTriangle>& triangles, tcu::Surface& resultImage)
+{
+ DE_UNREF(triangles);
+
+ const char* iterationComments[] = { "Cull back face triangles", "Cull front face triangles", "Cull none" };
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ bool result = true;
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ if (m_conservativeRasterizationProperties.degenerateTrianglesRasterized)
+ {
+ if (getIteration() != 0)
+ {
+ log << tcu::TestLog::Message << "Triangles expected to be rasterized with at least one pixel of white color each" << tcu::TestLog::EndMessage;
+
+ for (int rowNdx = 0; rowNdx < 3; ++rowNdx)
+ for (int colNdx = 0; colNdx < 4; ++colNdx)
+ {
+ referenceImage.setPixel(4 * (colNdx + 1), 4 * (rowNdx + 1), foregroundColor);
+
+ // Allow implementations that need to be extra conservative with degenerate triangles,
+ // which may cause extra coverage.
+ if (resultImage.getPixel(4 * (colNdx + 1) - 1, 4 * (rowNdx + 1) - 1) == foregroundColor)
+ referenceImage.setPixel(4 * (colNdx + 1) - 1, 4 * (rowNdx + 1) - 1, foregroundColor);
+ if (resultImage.getPixel(4 * (colNdx + 1) - 1, 4 * (rowNdx + 1)) == foregroundColor)
+ referenceImage.setPixel(4 * (colNdx + 1) - 1, 4 * (rowNdx + 1), foregroundColor);
+ if (resultImage.getPixel(4 * (colNdx + 1), 4 * (rowNdx + 1) - 1) == foregroundColor)
+ referenceImage.setPixel(4 * (colNdx + 1), 4 * (rowNdx + 1) - 1, foregroundColor);
+ }
+ }
+ else
+ log << tcu::TestLog::Message << "Triangles expected to be culled due to backfacing culling and all degenerate triangles assumed to be backfacing" << tcu::TestLog::EndMessage;
+ }
+ else
+ log << tcu::TestLog::Message << "Triangles expected to be culled due to degenerateTrianglesRasterized=false" << tcu::TestLog::EndMessage;
+
+ for (int y = 0; result && y < resultImage.getHeight(); ++y)
+ for (int x = 0; result && x < resultImage.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != referenceImage.getPixel(x,y).getPacked())
+ {
+ result = false;
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ else
+ errorMask.setPixel(x, y, backgroundColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found for mode '" << iterationComments[getIteration()] << "'"
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Reference", "Reference", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+bool ConservativeTraingleTestInstance::compareAndVerifyUnderestimatedNormal (std::vector<TriangleSceneSpec::SceneTriangle>& triangles, tcu::Surface& resultImage)
+{
+ DE_UNREF(triangles);
+
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ const tcu::IVec2 viewportSize = tcu::IVec2(resultImage.getWidth(), resultImage.getHeight());
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ int errX = -1;
+ int errY = -1;
+ deUint32 errValue = 0;
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+ bool result = true;
+
+ DE_ASSERT(resultImage.getHeight() == resultImage.getWidth());
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ for (size_t triangleNdx = 0; triangleNdx < triangles.size(); ++triangleNdx)
+ {
+ const tcu::Vec4& p0 = triangles[triangleNdx].positions[0];
+ const tcu::Vec4& p1 = triangles[triangleNdx].positions[1];
+ const tcu::Vec4& p2 = triangles[triangleNdx].positions[2];
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ {
+ if (calculateUnderestimateTriangleCoverage(p0, p1, p2, tcu::IVec2(x,y), m_subpixelBits, viewportSize) == tcu::COVERAGE_FULL)
+ referenceImage.setPixel(x, y, foregroundColor);
+ }
+ }
+
+ for (int y = 0; result && y < resultImage.getHeight(); ++y)
+ for (int x = 0; result && x < resultImage.getWidth(); ++x)
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ {
+ result = false;
+ errX = x;
+ errY = y;
+ errValue = resultImage.getPixel(x,y).getPacked();
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != referenceImage.getPixel(x,y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ else
+ errorMask.setPixel(x, y, backgroundColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found starting at " << errX << "," << errY << " value=0x" << std::hex << errValue
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Refernce", "Refernce", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+bool ConservativeTraingleTestInstance::compareAndVerifyUnderestimatedDegenerate (std::vector<TriangleSceneSpec::SceneTriangle>& triangles, tcu::Surface& resultImage)
+{
+ DE_UNREF(triangles);
+
+ const char* iterationComments[] = { "Cull back face triangles", "Cull front face triangles", "Cull none" };
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ int errX = 0;
+ int errY = 0;
+ deUint32 errValue = 0;
+ bool result = true;
+
+ if (m_conservativeRasterizationProperties.degenerateTrianglesRasterized)
+ {
+ if (getIteration() != 0)
+ log << tcu::TestLog::Message << "Triangles expected to be not rendered due to no one triangle can fully cover fragment" << tcu::TestLog::EndMessage;
+ else
+ log << tcu::TestLog::Message << "Triangles expected to be culled due to backfacing culling and all degenerate triangles assumed to be backfacing" << tcu::TestLog::EndMessage;
+ }
+ else
+ log << tcu::TestLog::Message << "Triangles expected to be culled due to degenerateTrianglesRasterized=false" << tcu::TestLog::EndMessage;
+
+ for (int y = 0; result && y < resultImage.getHeight(); ++y)
+ for (int x = 0; result && x < resultImage.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != backgroundColor.getPacked())
+ {
+ result = false;
+ errX = x;
+ errY = y;
+ errValue = resultImage.getPixel(x,y).getPacked();
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ else
+ errorMask.setPixel(x, y, backgroundColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found for mode '" << iterationComments[getIteration()] << "' starting at " << errX << "," << errY << " value=0x" << std::hex << errValue
+ << tcu::TestLog::EndMessage;
+
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Reference", "Reference", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> ConservativeTraingleTestInstance::initRasterizationConservativeStateCreateInfo (void)
+{
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> result;
+
+ result.reserve(getIterationCount());
+
+ for (int iteration = 0; iteration < getIterationCount(); ++iteration)
+ {
+ const VkPipelineRasterizationConservativeStateCreateInfoEXT rasterizationConservativeStateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (VkPipelineRasterizationConservativeStateCreateFlagsEXT)0, // VkPipelineRasterizationConservativeStateCreateFlagsEXT flags;
+ m_conservativeTestConfig.conservativeRasterizationMode, // VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ extraOverestimationSize // float extraPrimitiveOverestimationSize;
+ };
+
+ result.push_back(rasterizationConservativeStateCreateInfo);
+ }
+
+ return result;
+}
+
+const std::vector<VkPipelineRasterizationStateCreateInfo> ConservativeTraingleTestInstance::initRasterizationStateCreateInfo (void)
+{
+ std::vector<VkPipelineRasterizationStateCreateInfo> result;
+
+ result.reserve(getIterationCount());
+
+ for (int iteration = 0; iteration < getIterationCount(); ++iteration)
+ {
+ const VkCullModeFlags cullModeFlags = (!m_conservativeTestConfig.degeneratePrimitives) ? VK_CULL_MODE_NONE
+ : (iteration == 0) ? VK_CULL_MODE_BACK_BIT
+ : (iteration == 1) ? VK_CULL_MODE_FRONT_BIT
+ : VK_CULL_MODE_NONE;
+
+ const VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
+ &m_rasterizationConservativeStateCreateInfo[iteration], // const void* pNext;
+ 0, // VkPipelineRasterizationStateCreateFlags flags;
+ false, // VkBool32 depthClampEnable;
+ false, // VkBool32 rasterizerDiscardEnable;
+ VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
+ cullModeFlags, // VkCullModeFlags cullMode;
+ VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
+ VK_FALSE, // VkBool32 depthBiasEnable;
+ 0.0f, // float depthBiasConstantFactor;
+ 0.0f, // float depthBiasClamp;
+ 0.0f, // float depthBiasSlopeFactor;
+ getLineWidth(), // float lineWidth;
+ };
+
+ result.push_back(rasterizationStateCreateInfo);
+ }
+
+ return result;
+}
+
+const VkPipelineRasterizationStateCreateInfo* ConservativeTraingleTestInstance::getRasterizationStateCreateInfo (void) const
+{
+ return &m_rasterizationStateCreateInfo[getIteration()];
+}
+
+const VkPipelineRasterizationLineStateCreateInfoEXT* ConservativeTraingleTestInstance::getLineRasterizationStateCreateInfo (void) const
+{
+ return DE_NULL;
+}
+
+
+class ConservativeLineTestInstance : public BaseLineTestInstance
+{
+public:
+ ConservativeLineTestInstance (Context& context,
+ ConservativeTestConfig conservativeTestConfig,
+ VkSampleCountFlagBits sampleCount);
+
+ void generateLines (int iteration,
+ std::vector<tcu::Vec4>& outData,
+ std::vector<LineSceneSpec::SceneLine>& outLines);
+ const VkPipelineRasterizationStateCreateInfo* getRasterizationStateCreateInfo (void) const;
+
+protected:
+ virtual const VkPipelineRasterizationLineStateCreateInfoEXT* getLineRasterizationStateCreateInfo (void) const;
+
+ virtual bool compareAndVerify (std::vector<LineSceneSpec::SceneLine>& lines,
+ tcu::Surface& resultImage,
+ std::vector<tcu::Vec4>& drawBuffer);
+ virtual bool compareAndVerifyOverestimatedNormal (std::vector<LineSceneSpec::SceneLine>& lines,
+ tcu::Surface& resultImage);
+ virtual bool compareAndVerifyOverestimatedDegenerate (std::vector<LineSceneSpec::SceneLine>& lines,
+ tcu::Surface& resultImage);
+ virtual bool compareAndVerifyUnderestimatedNormal (std::vector<LineSceneSpec::SceneLine>& lines,
+ tcu::Surface& resultImage);
+ virtual bool compareAndVerifyUnderestimatedDegenerate (std::vector<LineSceneSpec::SceneLine>& lines,
+ tcu::Surface& resultImage);
+ void generateNormalLines (int iteration,
+ std::vector<tcu::Vec4>& outData,
+ std::vector<LineSceneSpec::SceneLine>& outLines);
+ void generateDegenerateLines (int iteration,
+ std::vector<tcu::Vec4>& outData,
+ std::vector<LineSceneSpec::SceneLine>& outLines);
+ void drawPrimitives (tcu::Surface& result,
+ const std::vector<tcu::Vec4>& vertexData,
+ VkPrimitiveTopology primitiveTopology);
+
+private:
+ const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> initRasterizationConservativeStateCreateInfo (void);
+ const std::vector<VkPipelineRasterizationStateCreateInfo> initRasterizationStateCreateInfo (void);
+
+ const ConservativeTestConfig m_conservativeTestConfig;
+ const VkPhysicalDeviceConservativeRasterizationPropertiesEXT m_conservativeRasterizationProperties;
+ const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> m_rasterizationConservativeStateCreateInfo;
+ const std::vector<VkPipelineRasterizationStateCreateInfo> m_rasterizationStateCreateInfo;
+};
+
+ConservativeLineTestInstance::ConservativeLineTestInstance (Context& context,
+ ConservativeTestConfig conservativeTestConfig,
+ VkSampleCountFlagBits sampleCount)
+ : BaseLineTestInstance (
+ context,
+ conservativeTestConfig.primitiveTopology,
+ PRIMITIVEWIDENESS_NARROW,
+ PRIMITIVESTRICTNESS_IGNORE,
+ sampleCount,
+ LINESTIPPLE_DISABLED,
+ VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT,
+ 0,
+ conservativeTestConfig.resolution,
+ conservativeTestConfig.lineWidth
+ )
+ , m_conservativeTestConfig (conservativeTestConfig)
+ , m_conservativeRasterizationProperties (context.getConservativeRasterizationPropertiesEXT())
+ , m_rasterizationConservativeStateCreateInfo (initRasterizationConservativeStateCreateInfo())
+ , m_rasterizationStateCreateInfo (initRasterizationStateCreateInfo())
+{
+}
+
+void ConservativeLineTestInstance::generateLines (int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines)
+{
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ generateDegenerateLines(iteration, outData, outLines);
+ else
+ generateNormalLines(iteration, outData, outLines);
+}
+
+void ConservativeLineTestInstance::generateNormalLines (int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines)
+{
+ const char* iterationComment = "";
+ const float halfPixel = 1.0f / float(m_renderSize);
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ const float overestimate = 2.0f * halfPixel * (m_conservativeRasterizationProperties.primitiveOverestimationSize + extraOverestimationSize);
+ const float overestimateMargin = overestimate;
+ const float underestimateMargin = 0.0f;
+ const bool isOverestimate = m_conservativeTestConfig.conservativeRasterizationMode == VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
+ const float margin = isOverestimate ? overestimateMargin : underestimateMargin;
+ const float edge = 4 * halfPixel + margin;
+ const float left = -1.0f + edge;
+ const float right = +1.0f - edge;
+ const float up = -1.0f + edge;
+ const float down = +1.0f - edge;
+
+ outData.reserve(2);
+
+ if (isOverestimate)
+ {
+ const char* iterationComments[] = { "Horizontal up line", "Vertical line", "Horizontal down line" };
+
+ iterationComment = iterationComments[iteration];
+
+ switch (iteration)
+ {
+ case 0:
+ {
+ outData.push_back(tcu::Vec4( left, up + halfPixel, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( right, up + halfPixel, 0.0f, 1.0f));
+
+ break;
+ }
+
+ case 1:
+ {
+ outData.push_back(tcu::Vec4( left + halfPixel, up, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( left + halfPixel, down, 0.0f, 1.0f));
+
+ break;
+ }
+
+ case 2:
+ {
+ outData.push_back(tcu::Vec4( left, down - halfPixel, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( right, down - halfPixel, 0.0f, 1.0f));
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unexpected iteration");
+ }
+ }
+ else
+ {
+ const char* iterationComments[] = { "Horizontal lines", "Vertical lines", "Diagonal lines" };
+ const deUint32 subPixels = 1u << m_subpixelBits;
+ const float subPixelSize = 2.0f * halfPixel / float(subPixels);
+ const float blockStep = 16.0f * 2.0f * halfPixel;
+ const float lineWidth = 2.0f * halfPixel * getLineWidth();
+ const float offsets[] =
+ {
+ float(1) * blockStep,
+ float(2) * blockStep + halfPixel,
+ float(3) * blockStep + 0.5f * lineWidth + 2.0f * subPixelSize,
+ float(4) * blockStep + 0.5f * lineWidth - 2.0f * subPixelSize,
+ };
+
+ iterationComment = iterationComments[iteration];
+
+ outData.reserve(DE_LENGTH_OF_ARRAY(offsets));
+
+ switch (iteration)
+ {
+ case 0:
+ {
+ for (size_t lineNdx = 0; lineNdx < DE_LENGTH_OF_ARRAY(offsets); ++lineNdx)
+ {
+ outData.push_back(tcu::Vec4( left + halfPixel, up + offsets[lineNdx], 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(right - halfPixel, up + offsets[lineNdx], 0.0f, 1.0f));
+ }
+
+ break;
+ }
+
+ case 1:
+ {
+ for (size_t lineNdx = 0; lineNdx < DE_LENGTH_OF_ARRAY(offsets); ++lineNdx)
+ {
+ outData.push_back(tcu::Vec4(left + offsets[lineNdx], up + halfPixel, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(left + offsets[lineNdx], down - halfPixel, 0.0f, 1.0f));
+ }
+
+ break;
+ }
+
+ case 2:
+ {
+ for (size_t lineNdx = 0; lineNdx < DE_LENGTH_OF_ARRAY(offsets); ++lineNdx)
+ {
+ outData.push_back(tcu::Vec4(left + offsets[lineNdx], up + halfPixel, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( right - halfPixel, down - offsets[lineNdx], 0.0f, 1.0f));
+ }
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unexpected iteration");
+ }
+ }
+
+ DE_ASSERT(outData.size() % 2 == 0);
+ outLines.resize(outData.size() / 2);
+ for(size_t lineNdx = 0; lineNdx < outLines.size(); ++lineNdx)
+ {
+ outLines[lineNdx].positions[0] = outData[2 * lineNdx + 0];
+ outLines[lineNdx].positions[1] = outData[2 * lineNdx + 1];
+ }
+
+ // log
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Testing " << iterationComment << " "
+ << "with rendering " << outLines.size() << " line(s):"
+ << tcu::TestLog::EndMessage;
+
+ for (int ndx = 0; ndx < (int)outLines.size(); ++ndx)
+ {
+ const deUint32 multiplier = m_renderSize / 2;
+
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Line " << (ndx+1) << ":"
+ << "\n\t" << outLines[ndx].positions[0] << " == " << (float(multiplier) * outLines[ndx].positions[0]) << "/" << multiplier
+ << "\n\t" << outLines[ndx].positions[1] << " == " << (float(multiplier) * outLines[ndx].positions[1]) << "/" << multiplier
+ << tcu::TestLog::EndMessage;
+ }
+}
+
+void ConservativeLineTestInstance::generateDegenerateLines (int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines)
+{
+ const bool isOverestimate = m_conservativeTestConfig.conservativeRasterizationMode == VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
+ const float pixelSize = 2.0f / float(m_renderSize);
+ const deUint32 subPixels = 1u << m_context.getDeviceProperties().limits.subPixelPrecisionBits;
+ const float subPixelSize = pixelSize / float(subPixels);
+ const char* iterationComments[] = { "Horizontal line", "Vertical line", "Diagonal line" };
+
+ outData.clear();
+
+ if (isOverestimate)
+ {
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ const float totalOverestimate = m_conservativeRasterizationProperties.primitiveOverestimationSize + extraOverestimationSize;
+ const float totalOverestimateInSubPixels = deFloatCeil(totalOverestimate * float(subPixels));
+ const float overestimate = subPixelSize * totalOverestimateInSubPixels;
+ const float overestimateSafetyMargin = subPixelSize * 0.125f;
+ const float margin = overestimate + overestimateSafetyMargin;
+ const float originOffset = -1.0f + 1 * pixelSize;
+ const float originLeft = originOffset + margin;
+ const float originRight = originOffset + margin + 0.25f * subPixelSize;
+ const float originUp = originOffset + margin;
+ const float originDown = originOffset + margin + 0.25f * subPixelSize;
+
+ switch (iteration)
+ {
+ case 0:
+ {
+ outData.push_back(tcu::Vec4( originLeft, originUp, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(originRight, originUp, 0.0f, 1.0f));
+
+ break;
+ }
+
+ case 1:
+ {
+ outData.push_back(tcu::Vec4( originLeft, originUp, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4( originLeft, originDown, 0.0f, 1.0f));
+
+ break;
+ }
+
+ case 2:
+ {
+ outData.push_back(tcu::Vec4( originLeft, originUp, 0.0f, 1.0f));
+ outData.push_back(tcu::Vec4(originRight, originDown, 0.0f, 1.0f));
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unexpected iteration");
+ }
+ }
+ else
+ {
+ size_t rowStart = 3 * getIteration();
+ size_t rowEnd = 3 * (getIteration() + 1);
+
+ for (size_t rowNdx = rowStart; rowNdx < rowEnd; ++rowNdx)
+ for (size_t colNdx = 0; colNdx < 3 * 3; ++colNdx)
+ {
+ const float originOffsetY = -1.0f + float(4 * (1 + rowNdx)) * pixelSize;
+ const float originOffsetX = -1.0f + float(4 * (1 + colNdx)) * pixelSize;
+ const float x0 = float(rowNdx % 3);
+ const float y0 = float(rowNdx / 3);
+ const float x1 = float(colNdx % 3);
+ const float y1 = float(colNdx / 3);
+ const tcu::Vec4 p0 = tcu::Vec4(originOffsetX + x0 * pixelSize / 2.0f, originOffsetY + y0 * pixelSize / 2.0f, 0.0f, 1.0f);
+ const tcu::Vec4 p1 = tcu::Vec4(originOffsetX + x1 * pixelSize / 2.0f, originOffsetY + y1 * pixelSize / 2.0f, 0.0f, 1.0f);
+
+ if (x0 == x1 && y0 == y1)
+ continue;
+
+ outData.push_back(p0);
+ outData.push_back(p1);
+ }
+ }
+
+ outLines.resize(outData.size() / 2);
+
+ for (size_t ndx = 0; ndx < outLines.size(); ++ndx)
+ {
+ outLines[ndx].positions[0] = outData[2 * ndx + 0];
+ outLines[ndx].positions[1] = outData[2 * ndx + 1];
+ }
+
+ // log
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Testing " << iterationComments[iteration] << " "
+ << "with rendering " << outLines.size() << " line(s):"
+ << tcu::TestLog::EndMessage;
+
+ for (int ndx = 0; ndx < (int)outLines.size(); ++ndx)
+ {
+ const deUint32 multiplierInt = m_renderSize / 2;
+ const deUint32 multiplierFrac = subPixels;
+ std::string coordsString;
+
+ for (size_t vertexNdx = 0; vertexNdx < 2; ++vertexNdx)
+ {
+ const tcu::Vec4& pos = outLines[ndx].positions[vertexNdx];
+ std::ostringstream coordsFloat;
+ std::ostringstream coordsNatural;
+
+ for (int coordNdx = 0; coordNdx < 2; ++coordNdx)
+ {
+ const char* sep = (coordNdx < 1) ? "," : "";
+ const float coord = pos[coordNdx];
+ const char sign = deSign(coord) < 0 ? '-' : '+';
+ const float m = deFloatFloor(float(multiplierInt) * deFloatAbs(coord));
+ const float r = deFloatFrac(float(multiplierInt) * deFloatAbs(coord)) * float(multiplierFrac);
+
+ coordsFloat << std::fixed << std::setw(13) << std::setprecision(10) << coord << sep;
+ coordsNatural << sign << '(' << m << '+' << r << '/' << multiplierFrac << ')' << sep;
+ }
+
+ coordsString += "\n\t[" + coordsFloat.str() + "] == [" + coordsNatural.str() + "] / " + de::toString(multiplierInt);
+ }
+
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Line " << (ndx + 1) << ':'
+ << coordsString
+ << tcu::TestLog::EndMessage;
+ }
+}
+
+void ConservativeLineTestInstance::drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& vertexData, VkPrimitiveTopology primitiveTopology)
+{
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ {
+ // Set provoking vertex color to white
+ tcu::Vec4 colorProvoking (1.0f, 1.0f, 1.0f, 1.0f);
+ tcu::Vec4 colorOther (0.0f, 1.0f, 1.0f, 1.0f);
+ std::vector<tcu::Vec4> colorData;
+
+ colorData.reserve(vertexData.size());
+
+ for (size_t vertexNdx = 0; vertexNdx < vertexData.size(); ++vertexNdx)
+ if (vertexNdx % 2 == 0)
+ colorData.push_back(colorProvoking);
+ else
+ colorData.push_back(colorOther);
+
+ BaseRenderingTestInstance::drawPrimitives(result, vertexData, colorData, primitiveTopology);
+ }
+ else
+ BaseRenderingTestInstance::drawPrimitives(result, vertexData, primitiveTopology);
+}
+
+bool ConservativeLineTestInstance::compareAndVerify (std::vector<LineSceneSpec::SceneLine>& lines, tcu::Surface& resultImage, std::vector<tcu::Vec4>& drawBuffer)
+{
+ DE_UNREF(drawBuffer);
+
+ switch (m_conservativeTestConfig.conservativeRasterizationMode)
+ {
+ case VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT:
+ {
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ return compareAndVerifyOverestimatedDegenerate(lines, resultImage);
+ else
+ return compareAndVerifyOverestimatedNormal(lines, resultImage);
+
+ break;
+ }
+ case VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT:
+ {
+ if (m_conservativeTestConfig.degeneratePrimitives)
+ return compareAndVerifyUnderestimatedDegenerate(lines, resultImage);
+ else
+ return compareAndVerifyUnderestimatedNormal(lines, resultImage);
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unknown conservative rasterization mode");
+ }
+}
+
+bool ConservativeLineTestInstance::compareAndVerifyOverestimatedNormal (std::vector<LineSceneSpec::SceneLine>& lines, tcu::Surface& resultImage)
+{
+ DE_UNREF(lines);
+
+ const int b = 3; // bar width
+ const int w = resultImage.getWidth() - 1;
+ const int h = resultImage.getHeight() - 1;
+ const int xStarts[] = { 1, 1, 1 };
+ const int xEnds[] = { w - 1, b, w - 1 };
+ const int yStarts[] = { 1, 1, h - b };
+ const int yEnds[] = { b, h - 1, h - 1 };
+ const int xStart = xStarts[getIteration()];
+ const int xEnd = xEnds[getIteration()];
+ const int yStart = yStarts[getIteration()];
+ const int yEnd = yEnds[getIteration()];
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ int errX = 0;
+ int errY = 0;
+ deUint32 errValue = 0;
+ bool result = true;
+
+ DE_ASSERT(resultImage.getHeight() == resultImage.getWidth());
+
+ for (int y = yStart; result && y < yEnd; ++y)
+ for (int x = xStart; result && x < xEnd; ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != foregroundColor.getPacked())
+ {
+ result = false;
+ errX = x;
+ errY = y;
+ errValue = resultImage.getPixel(x,y).getPacked();
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ errorMask.setPixel(x, y, backgroundColor);
+
+ for (int y = yStart; y < yEnd; ++y)
+ for (int x = xStart; x < xEnd; ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != foregroundColor.getPacked())
+ errorMask.setPixel(x,y, unexpectedPixelColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found starting at " << errX << "," << errY << " value=0x" << std::hex << errValue
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+bool ConservativeLineTestInstance::compareAndVerifyOverestimatedDegenerate (std::vector<LineSceneSpec::SceneLine>& lines, tcu::Surface& resultImage)
+{
+ DE_UNREF(lines);
+
+ const char* iterationComments[] = { "Horizontal line", "Vertical line", "Diagonal line" };
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ bool result = true;
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ if (m_conservativeRasterizationProperties.degenerateLinesRasterized)
+ {
+ log << tcu::TestLog::Message << "Lines expected to be rasterized with white color" << tcu::TestLog::EndMessage;
+
+ // This pixel will alway be covered due to the placement of the line.
+ referenceImage.setPixel(1, 1, foregroundColor);
+
+ // Additional pixels will be covered based on the extra bloat added to the primitive.
+ const float extraOverestimation = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ const int xExtent = 1 + int((extraOverestimation * 2.0f) + 0.5f);
+ const int yExtent = xExtent;
+
+ for (int y = 0; y <= yExtent; ++y)
+ for (int x = 0; x <= xExtent; ++x)
+ referenceImage.setPixel(x, y, foregroundColor);
+ }
+ else
+ log << tcu::TestLog::Message << "Lines expected to be culled" << tcu::TestLog::EndMessage;
+
+ for (int y = 0; result && y < resultImage.getHeight(); ++y)
+ for (int x = 0; result && x < resultImage.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ {
+ result = false;
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ else
+ errorMask.setPixel(x, y, backgroundColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found for mode " << iterationComments[getIteration()]
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Reference", "Reference", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+bool ConservativeLineTestInstance::compareAndVerifyUnderestimatedNormal (std::vector<LineSceneSpec::SceneLine>& lines, tcu::Surface& resultImage)
+{
+ DE_UNREF(lines);
+
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ int errX = -1;
+ int errY = -1;
+ tcu::RGBA errValue;
+ bool result = true;
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+
+ DE_ASSERT(resultImage.getHeight() == resultImage.getWidth());
+
+ for (int y = 0; y < referenceImage.getHeight(); ++y)
+ for (int x = 0; x < referenceImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ if (getLineWidth() > 1.0f)
+ {
+ const tcu::IVec2 viewportSize(resultImage.getWidth(), resultImage.getHeight());
+
+ for (size_t lineNdx = 0; lineNdx < lines.size(); ++lineNdx)
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ {
+ if (calculateUnderestimateLineCoverage(lines[lineNdx].positions[0], lines[lineNdx].positions[1], getLineWidth(), tcu::IVec2(x,y), viewportSize) == tcu::COVERAGE_FULL)
+ referenceImage.setPixel(x, y, foregroundColor);
+ }
+ }
+
+ for (int y = 0; result && y < resultImage.getHeight(); ++y)
+ for (int x = 0; result && x < resultImage.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != referenceImage.getPixel(x,y).getPacked())
+ {
+ result = false;
+ errX = x;
+ errY = y;
+ errValue = resultImage.getPixel(x,y);
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ errorMask.setPixel(x, y, backgroundColor);
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != referenceImage.getPixel(x,y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found starting at " << errX << "," << errY << " errValue=" << errValue
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Reference", "Reference", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+bool ConservativeLineTestInstance::compareAndVerifyUnderestimatedDegenerate (std::vector<LineSceneSpec::SceneLine>& lines, tcu::Surface& resultImage)
+{
+ DE_UNREF(lines);
+
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ bool result = true;
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ log << tcu::TestLog::Message << "No lines expected to be rasterized" << tcu::TestLog::EndMessage;
+
+ for (int y = 0; result && y < resultImage.getHeight(); ++y)
+ for (int x = 0; result && x < resultImage.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != referenceImage.getPixel(x,y).getPacked())
+ {
+ result = false;
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ else
+ errorMask.setPixel(x, y, backgroundColor);
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found" << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Reference", "Reference", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> ConservativeLineTestInstance::initRasterizationConservativeStateCreateInfo (void)
+{
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> result;
+
+ result.reserve(getIterationCount());
+
+ for (int iteration = 0; iteration < getIterationCount(); ++iteration)
+ {
+ const VkPipelineRasterizationConservativeStateCreateInfoEXT rasterizationConservativeStateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (VkPipelineRasterizationConservativeStateCreateFlagsEXT)0, // VkPipelineRasterizationConservativeStateCreateFlagsEXT flags;
+ m_conservativeTestConfig.conservativeRasterizationMode, // VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ extraOverestimationSize // float extraPrimitiveOverestimationSize;
+ };
+
+ result.push_back(rasterizationConservativeStateCreateInfo);
+ }
+
+ return result;
+}
+
+const std::vector<VkPipelineRasterizationStateCreateInfo> ConservativeLineTestInstance::initRasterizationStateCreateInfo (void)
+{
+ std::vector<VkPipelineRasterizationStateCreateInfo> result;
+
+ result.reserve(getIterationCount());
+
+ for (int iteration = 0; iteration < getIterationCount(); ++iteration)
+ {
+ const VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
+ &m_rasterizationConservativeStateCreateInfo[iteration], // const void* pNext;
+ 0, // VkPipelineRasterizationStateCreateFlags flags;
+ false, // VkBool32 depthClampEnable;
+ false, // VkBool32 rasterizerDiscardEnable;
+ VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
+ VK_CULL_MODE_NONE, // VkCullModeFlags cullMode;
+ VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
+ VK_FALSE, // VkBool32 depthBiasEnable;
+ 0.0f, // float depthBiasConstantFactor;
+ 0.0f, // float depthBiasClamp;
+ 0.0f, // float depthBiasSlopeFactor;
+ getLineWidth(), // float lineWidth;
+ };
+
+ result.push_back(rasterizationStateCreateInfo);
+ }
+
+ return result;
+}
+
+const VkPipelineRasterizationStateCreateInfo* ConservativeLineTestInstance::getRasterizationStateCreateInfo (void) const
+{
+ return &m_rasterizationStateCreateInfo[getIteration()];
+}
+
+const VkPipelineRasterizationLineStateCreateInfoEXT* ConservativeLineTestInstance::getLineRasterizationStateCreateInfo (void) const
+{
+ return DE_NULL;
+}
+
+
+class ConservativePointTestInstance : public PointTestInstance
+{
+public:
+ ConservativePointTestInstance (Context& context,
+ ConservativeTestConfig conservativeTestConfig,
+ VkSampleCountFlagBits sampleCount)
+ : PointTestInstance (
+ context,
+ PRIMITIVEWIDENESS_NARROW,
+ PRIMITIVESTRICTNESS_IGNORE,
+ sampleCount,
+ LINESTIPPLE_DISABLED,
+ VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT,
+ 0,
+ conservativeTestConfig.resolution,
+ conservativeTestConfig.lineWidth
+ )
+ , m_conservativeTestConfig (conservativeTestConfig)
+ , m_conservativeRasterizationProperties (context.getConservativeRasterizationPropertiesEXT())
+ , m_rasterizationConservativeStateCreateInfo (initRasterizationConservativeStateCreateInfo())
+ , m_rasterizationStateCreateInfo (initRasterizationStateCreateInfo())
+ , m_renderStart ()
+ , m_renderEnd ()
+ {}
+
+ void generatePoints (int iteration,
+ std::vector<tcu::Vec4>& outData,
+ std::vector<PointSceneSpec::ScenePoint>& outPoints);
+ const VkPipelineRasterizationStateCreateInfo* getRasterizationStateCreateInfo (void) const;
+
+protected:
+ virtual const VkPipelineRasterizationLineStateCreateInfoEXT* getLineRasterizationStateCreateInfo (void) const;
+
+ virtual bool compareAndVerify (std::vector<PointSceneSpec::ScenePoint>& points,
+ tcu::Surface& resultImage,
+ std::vector<tcu::Vec4>& drawBuffer);
+ virtual bool compareAndVerifyOverestimated (std::vector<PointSceneSpec::ScenePoint>& points,
+ tcu::Surface& resultImage);
+ virtual bool compareAndVerifyUnderestimated (std::vector<PointSceneSpec::ScenePoint>& points,
+ tcu::Surface& resultImage);
+
+private:
+ const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> initRasterizationConservativeStateCreateInfo (void);
+ const std::vector<VkPipelineRasterizationStateCreateInfo> initRasterizationStateCreateInfo (void);
+
+ const ConservativeTestConfig m_conservativeTestConfig;
+ const VkPhysicalDeviceConservativeRasterizationPropertiesEXT m_conservativeRasterizationProperties;
+ const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> m_rasterizationConservativeStateCreateInfo;
+ const std::vector<VkPipelineRasterizationStateCreateInfo> m_rasterizationStateCreateInfo;
+ std::vector<int> m_renderStart;
+ std::vector<int> m_renderEnd;
+};
+
+void ConservativePointTestInstance::generatePoints (int iteration, std::vector<tcu::Vec4>& outData, std::vector<PointSceneSpec::ScenePoint>& outPoints)
+{
+ const float pixelSize = 2.0f / float(m_renderSize);
+ const bool isOverestimate = m_conservativeTestConfig.conservativeRasterizationMode == VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
+
+ m_renderStart.clear();
+ m_renderEnd.clear();
+
+ if (isOverestimate)
+ {
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ const float overestimate = m_conservativeRasterizationProperties.primitiveOverestimationSize + extraOverestimationSize;
+ const float halfRenderAreaSize = overestimate + 0.5f;
+ const float pointCenterOffset = 2.0f + 0.5f * float(iteration) + halfRenderAreaSize;
+ const float pointEdgeStart = pointCenterOffset - halfRenderAreaSize;
+ const float pointEdgeEnd = pointEdgeStart + 2 * halfRenderAreaSize;
+ const int renderStart = int(deFloatFloor(pointEdgeStart)) + int((deFloatFrac(pointEdgeStart) > 0.0f) ? 0 : -1);
+ const int renderEnd = int(deFloatCeil(pointEdgeEnd)) + int((deFloatFrac(pointEdgeEnd) > 0.0f) ? 0 : 1);
+
+ outData.push_back(tcu::Vec4(-1.0f + pixelSize * pointCenterOffset, -1.0f + pixelSize * pointCenterOffset, 0.0f, 1.0f));
+
+ m_renderStart.push_back(renderStart);
+ m_renderEnd.push_back(renderEnd);
+ }
+ else
+ {
+ const float pointSize = m_conservativeTestConfig.lineWidth;
+ const float halfRenderAreaSize = pointSize / 2.0f;
+
+ switch (iteration)
+ {
+ case 0:
+ {
+ const float pointCenterOffset = (pointSize + 1.0f + deFloatFrac(pointSize)) / 2.0f;
+ const float pointEdgeStart = pointCenterOffset - halfRenderAreaSize;
+ const float pointEdgeEnd = pointEdgeStart + 2.0f * halfRenderAreaSize;
+ const int renderStart = (m_renderSize / 2) + int(deFloatCeil(pointEdgeStart));
+ const int renderEnd = (m_renderSize / 2) + int(deFloatFloor(pointEdgeEnd));
+
+ outData.push_back(tcu::Vec4(pixelSize * pointCenterOffset, pixelSize * pointCenterOffset, 0.0f, 1.0f));
+
+ m_renderStart.push_back(renderStart);
+ m_renderEnd.push_back(renderEnd);
+
+ break;
+ }
+
+ case 1:
+ {
+ const float subPixelSize = 1.0f / float(1u<<(m_subpixelBits - 1));
+ const float pointBottomLeft = 1.0f - subPixelSize;
+ const float pointCenterOffset = pointBottomLeft + pointSize / 2.0f;
+ const float pointEdgeStart = pointCenterOffset - halfRenderAreaSize;
+ const float pointEdgeEnd = pointEdgeStart + 2.0f * halfRenderAreaSize;
+ const int renderStart = (m_renderSize / 2) + int(deFloatCeil(pointEdgeStart));
+ const int renderEnd = (m_renderSize / 2) + int(deFloatFloor(pointEdgeEnd));
+
+ outData.push_back(tcu::Vec4(pixelSize * pointCenterOffset, pixelSize * pointCenterOffset, 0.0f, 1.0f));
+
+ m_renderStart.push_back(renderStart);
+ m_renderEnd.push_back(renderEnd);
+
+ break;
+ }
+
+ case 2:
+ {
+ // Edges of a point are considered not covered. Top-left coverage rule is not applicable for underestimate rasterization.
+ const float pointCenterOffset = (pointSize + deFloatFrac(pointSize)) / 2.0f;
+ const float pointEdgeStart = pointCenterOffset - halfRenderAreaSize;
+ const float pointEdgeEnd = pointEdgeStart + 2.0f * halfRenderAreaSize;
+ const int renderStart = (m_renderSize / 2) + int(deFloatCeil(pointEdgeStart)) + 1;
+ const int renderEnd = (m_renderSize / 2) + int(deFloatFloor(pointEdgeEnd)) - 1;
+
+ outData.push_back(tcu::Vec4(pixelSize * pointCenterOffset, pixelSize * pointCenterOffset, 0.0f, 1.0f));
+
+ m_renderStart.push_back(renderStart);
+ m_renderEnd.push_back(renderEnd);
+
+ break;
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unexpected iteration");
+ }
+ }
+
+ outPoints.resize(outData.size());
+ for (size_t ndx = 0; ndx < outPoints.size(); ++ndx)
+ {
+ outPoints[ndx].position = outData[ndx];
+ outPoints[ndx].pointSize = getPointSize();
+ }
+
+ // log
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Testing conservative point rendering "
+ << "with rendering " << outPoints.size() << " points(s):"
+ << tcu::TestLog::EndMessage;
+ for (int ndx = 0; ndx < (int)outPoints.size(); ++ndx)
+ {
+ const deUint32 multiplier = m_renderSize / 2;
+
+ m_context.getTestContext().getLog()
+ << tcu::TestLog::Message
+ << "Point " << (ndx+1) << ":"
+ << "\n\t" << outPoints[ndx].position << " == " << (float(multiplier) * outPoints[ndx].position) << "/" << multiplier
+ << tcu::TestLog::EndMessage;
+ }
+}
+
+bool ConservativePointTestInstance::compareAndVerify (std::vector<PointSceneSpec::ScenePoint>& points, tcu::Surface& resultImage, std::vector<tcu::Vec4>& drawBuffer)
+{
+ DE_UNREF(drawBuffer);
+
+ switch (m_conservativeTestConfig.conservativeRasterizationMode)
+ {
+ case VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT:
+ {
+ return compareAndVerifyOverestimated(points, resultImage);
+ }
+ case VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT:
+ {
+ return compareAndVerifyUnderestimated(points, resultImage);
+ }
+
+ default:
+ TCU_THROW(InternalError, "Unknown conservative rasterization mode");
+ }
+}
+
+bool ConservativePointTestInstance::compareAndVerifyOverestimated (std::vector<PointSceneSpec::ScenePoint>& points, tcu::Surface& resultImage)
+{
+ DE_UNREF(points);
+
+ const char* iterationComments[] = { "Edges and corners", "Partial coverage", "Edges and corners" };
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ int errX = 0;
+ int errY = 0;
+ deUint32 errValue = 0;
+ bool result = true;
+
+ log << tcu::TestLog::Message << "Points expected to be rasterized with white color" << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::Message << "Testing " << iterationComments[getIteration()] << tcu::TestLog::EndMessage;
+
+ for (size_t renderAreaNdx = 0; result && renderAreaNdx < m_renderStart.size(); ++renderAreaNdx)
+ {
+ const int renderStart = m_renderStart[renderAreaNdx];
+ const int renderEnd = m_renderEnd[renderAreaNdx];
+
+ for (int y = renderStart; result && y < renderEnd; ++y)
+ for (int x = renderStart; result && x < renderEnd; ++x)
+ {
+ if (resultImage.getPixel(x,y).getPacked() != foregroundColor.getPacked())
+ {
+ result = false;
+ errX = x;
+ errY = y;
+ errValue = resultImage.getPixel(x, y).getPacked();
+
+ break;
+ }
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+ std::ostringstream css;
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ for (size_t renderAreaNdx = 0; result && renderAreaNdx < m_renderStart.size(); ++renderAreaNdx)
+ {
+ const int renderStart = m_renderStart[renderAreaNdx];
+ const int renderEnd = m_renderEnd[renderAreaNdx];
+
+ for (int y = renderStart; y < renderEnd; ++y)
+ for (int x = renderStart; x < renderEnd; ++x)
+ referenceImage.setPixel(x, y, foregroundColor);
+ }
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ else
+ errorMask.setPixel(x, y, backgroundColor);
+ }
+
+ css << std::endl;
+ for (size_t renderAreaNdx = 0; result && renderAreaNdx < m_renderStart.size(); ++renderAreaNdx)
+ {
+ const int renderStart = m_renderStart[renderAreaNdx];
+ const int renderEnd = m_renderEnd[renderAreaNdx];
+
+ css << "[" << renderStart << "," << renderEnd << ") x [" << renderStart << "," << renderEnd << ")" << std::endl;
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found starting at " << errX << "," << errY << " value=0x" << std::hex << errValue
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::Message << "Expected area(s) to be filled:" << css.str()
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Reference", "Reference", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+bool ConservativePointTestInstance::compareAndVerifyUnderestimated (std::vector<PointSceneSpec::ScenePoint>& points, tcu::Surface& resultImage)
+{
+ DE_UNREF(points);
+
+ const char* iterationComments[] = { "Full coverage", "Full coverage with subpixel", "Exact coverage" };
+ const tcu::RGBA backgroundColor = tcu::RGBA(0, 0, 0, 255);
+ const tcu::RGBA foregroundColor = tcu::RGBA(255, 255, 255, 255);
+ const tcu::RGBA unexpectedPixelColor = tcu::RGBA(255, 0, 0, 255);
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ int errX = 0;
+ int errY = 0;
+ deUint32 errValue = 0;
+ bool result = true;
+ tcu::Surface referenceImage (resultImage.getWidth(), resultImage.getHeight());
+
+ log << tcu::TestLog::Message << "Points expected to be rasterized with white color" << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::Message << "Testing " << iterationComments[getIteration()] << tcu::TestLog::EndMessage;
+
+ for (int y = 0; y < resultImage.getHeight(); ++y)
+ for (int x = 0; x < resultImage.getWidth(); ++x)
+ referenceImage.setPixel(x, y, backgroundColor);
+
+ for (size_t renderAreaNdx = 0; result && renderAreaNdx < m_renderStart.size(); ++renderAreaNdx)
+ {
+ const int renderStart = m_renderStart[renderAreaNdx];
+ const int renderEnd = m_renderEnd[renderAreaNdx];
+
+ for (int y = renderStart; y < renderEnd; ++y)
+ for (int x = renderStart; x < renderEnd; ++x)
+ referenceImage.setPixel(x, y, foregroundColor);
+ }
+
+ for (int y = 0; result && y < resultImage.getHeight(); ++y)
+ for (int x = 0; result && x < resultImage.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ {
+ result = false;
+ errX = x;
+ errY = y;
+ errValue = resultImage.getPixel(x, y).getPacked();
+
+ break;
+ }
+ }
+
+ if (!result)
+ {
+ tcu::Surface errorMask (resultImage.getWidth(), resultImage.getHeight());
+ std::ostringstream css;
+
+ for (int y = 0; y < errorMask.getHeight(); ++y)
+ for (int x = 0; x < errorMask.getWidth(); ++x)
+ {
+ if (resultImage.getPixel(x, y).getPacked() != referenceImage.getPixel(x, y).getPacked())
+ errorMask.setPixel(x, y, unexpectedPixelColor);
+ else
+ errorMask.setPixel(x, y, backgroundColor);
+ }
+
+ css << std::endl;
+ for (size_t renderAreaNdx = 0; result && renderAreaNdx < m_renderStart.size(); ++renderAreaNdx)
+ {
+ const int renderStart = m_renderStart[renderAreaNdx];
+ const int renderEnd = m_renderEnd[renderAreaNdx];
+
+ css << "[" << renderStart << "," << renderEnd << ") x [" << renderStart << "," << renderEnd << ")" << std::endl;
+ }
+
+ log << tcu::TestLog::Message << "Invalid pixels found starting at " << errX << "," << errY << " value=0x" << std::hex << errValue
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::Message << "Expected area(s) to be filled:" << css.str()
+ << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::Image("Reference", "Reference", referenceImage)
+ << tcu::TestLog::Image("ErrorMask", "ErrorMask", errorMask)
+ << tcu::TestLog::EndImageSet;
+ }
+ else
+ {
+ log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+ << tcu::TestLog::Image("Result", "Result", resultImage)
+ << tcu::TestLog::EndImageSet;
+ }
+
+ return result;
+}
+
+const std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> ConservativePointTestInstance::initRasterizationConservativeStateCreateInfo (void)
+{
+ const float extraOverestimationSize = getExtraOverestimationSize(m_conservativeTestConfig.extraOverestimationSize, m_conservativeRasterizationProperties);
+ std::vector<VkPipelineRasterizationConservativeStateCreateInfoEXT> result;
+
+ result.reserve(getIterationCount());
+
+ for (int iteration = 0; iteration < getIterationCount(); ++iteration)
+ {
+ const VkPipelineRasterizationConservativeStateCreateInfoEXT rasterizationConservativeStateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ (VkPipelineRasterizationConservativeStateCreateFlagsEXT)0, // VkPipelineRasterizationConservativeStateCreateFlagsEXT flags;
+ m_conservativeTestConfig.conservativeRasterizationMode, // VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ extraOverestimationSize // float extraPrimitiveOverestimationSize;
+ };
+
+ result.push_back(rasterizationConservativeStateCreateInfo);
+ }
+
+ return result;
+}
+
+const std::vector<VkPipelineRasterizationStateCreateInfo> ConservativePointTestInstance::initRasterizationStateCreateInfo (void)
+{
+ std::vector<VkPipelineRasterizationStateCreateInfo> result;
+
+ result.reserve(getIterationCount());
+
+ for (int iteration = 0; iteration < getIterationCount(); ++iteration)
+ {
+ const VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
+ &m_rasterizationConservativeStateCreateInfo[iteration], // const void* pNext;
+ 0, // VkPipelineRasterizationStateCreateFlags flags;
+ false, // VkBool32 depthClampEnable;
+ false, // VkBool32 rasterizerDiscardEnable;
+ VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode;
+ VK_CULL_MODE_NONE, // VkCullModeFlags cullMode;
+ VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
+ VK_FALSE, // VkBool32 depthBiasEnable;
+ 0.0f, // float depthBiasConstantFactor;
+ 0.0f, // float depthBiasClamp;
+ 0.0f, // float depthBiasSlopeFactor;
+ 0.0f, // float lineWidth;
+ };
+
+ result.push_back(rasterizationStateCreateInfo);
+ }
+
+ return result;
+}
+
+const VkPipelineRasterizationStateCreateInfo* ConservativePointTestInstance::getRasterizationStateCreateInfo (void) const
+{
+ return &m_rasterizationStateCreateInfo[getIteration()];
+}
+
+const VkPipelineRasterizationLineStateCreateInfoEXT* ConservativePointTestInstance::getLineRasterizationStateCreateInfo (void) const
+{
+ return DE_NULL;
+}
+
+
template <typename ConcreteTestInstance>
class WidenessTestCase : public BaseRenderingTestCase
{
@@ -3017,6 +5249,7 @@
{
return new CullingTestInstance(context, m_cullMode, m_primitiveTopology, m_frontFace, m_polygonMode);
}
+ void checkSupport (Context& context) const;
protected:
const VkCullModeFlags m_cullMode;
const VkPrimitiveTopology m_primitiveTopology;
@@ -3024,6 +5257,18 @@
const VkPolygonMode m_polygonMode;
};
+void CullingTestCase::checkSupport (Context& context) const
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset"))
+ {
+ const VkPhysicalDevicePortabilitySubsetFeaturesKHR& subsetFeatures = context.getPortabilitySubsetFeatures();
+ if (m_polygonMode == VK_POLYGON_MODE_POINT && !subsetFeatures.pointPolygons)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Point polygons are not supported by this implementation");
+ if (m_primitiveTopology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN && !subsetFeatures.triangleFans)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
+}
+
class DiscardTestInstance : public BaseRenderingTestInstance
{
public:
@@ -3041,7 +5286,7 @@
void extractTriangles (std::vector<TriangleSceneSpec::SceneTriangle>& outTriangles, const std::vector<tcu::Vec4>& vertices) const;
void extractLines (std::vector<LineSceneSpec::SceneLine>& outLines, const std::vector<tcu::Vec4>& vertices) const;
void extractPoints (std::vector<PointSceneSpec::ScenePoint>& outPoints, const std::vector<tcu::Vec4>& vertices) const;
- void drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& positionData, VkPrimitiveTopology primitiveTopology, Move<VkQueryPool>& queryPool);
+ void drawPrimitivesDiscard (tcu::Surface& result, const std::vector<tcu::Vec4>& positionData, VkPrimitiveTopology primitiveTopology, Move<VkQueryPool>& queryPool);
const VkPrimitiveTopology m_primitiveTopology;
const deBool m_queryFragmentShaderInvocations;
@@ -3095,7 +5340,7 @@
{
Move<VkQueryPool> queryPool = createQueryPool(vkd, vkDevice, &queryPoolCreateInfo);
- drawPrimitives(resultImage, drawBuffer, m_primitiveTopology, queryPool);
+ drawPrimitivesDiscard(resultImage, drawBuffer, m_primitiveTopology, queryPool);
vkd.getQueryPoolResults(vkDevice, *queryPool, 0u, 1u, sizeof(deUint64), &queryResult, 0u, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
}
else
@@ -3293,7 +5538,7 @@
return &rasterizationStateCreateInfo;
}
-void DiscardTestInstance::drawPrimitives (tcu::Surface& result, const std::vector<tcu::Vec4>& positionData, VkPrimitiveTopology primitiveTopology, Move<VkQueryPool>& queryPool)
+void DiscardTestInstance::drawPrimitivesDiscard (tcu::Surface& result, const std::vector<tcu::Vec4>& positionData, VkPrimitiveTopology primitiveTopology, Move<VkQueryPool>& queryPool)
{
const DeviceInterface& vkd = m_context.getDeviceInterface();
const VkDevice vkDevice = m_context.getDevice();
@@ -3494,6 +5739,11 @@
{
if (m_queryFragmentShaderInvocations)
context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_PIPELINE_STATISTICS_QUERY);
+
+ if (m_primitiveTopology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
}
protected:
@@ -3733,6 +5983,16 @@
{
return new TriangleInterpolationTestInstance(context, m_primitiveTopology, m_flags, m_sampleCount);
}
+
+ virtual void checkSupport (Context& context) const
+ {
+ if (m_primitiveTopology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
+ }
protected:
const VkPrimitiveTopology m_primitiveTopology;
const int m_flags;
@@ -4521,6 +6781,277 @@
rasterizationTests->addChild(discard);
}
+ // .conservative
+ {
+ typedef struct
+ {
+ float size;
+ const char* name;
+ } overestimateSizes;
+
+ const overestimateSizes overestimateNormalSizes[] =
+ {
+ { 0.00f, "0_00" },
+ { 0.25f, "0_25" },
+ { 0.50f, "0_50" },
+ { 0.75f, "0_75" },
+ { 1.00f, "1_00" },
+ { 2.00f, "2_00" },
+ { 4.00f, "4_00" },
+ { -TCU_INFINITY, "min" },
+ { TCU_INFINITY, "max" },
+ };
+ const overestimateSizes overestimateDegenerate[] =
+ {
+ { 0.00f, "0_00" },
+ { 0.25f, "0_25" },
+ { -TCU_INFINITY, "min" },
+ { TCU_INFINITY, "max" },
+ };
+ const overestimateSizes underestimateLineWidths[] =
+ {
+ { 0.50f, "0_50" },
+ { 1.00f, "1_00" },
+ { 1.50f, "1_50" },
+ };
+ const overestimateSizes underestimatePointSizes[] =
+ {
+ { 1.00f, "1_00" },
+ { 1.50f, "1_50" },
+ { 2.00f, "2_00" },
+ { 3.00f, "3_00" },
+ { 4.00f, "4_00" },
+ { 8.00f, "8_00" },
+ };
+ const struct PrimitiveType
+ {
+ VkPrimitiveTopology type;
+ const char* name;
+ }
+ primitiveTypes[] =
+ {
+ { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, "triangles" },
+ { VK_PRIMITIVE_TOPOLOGY_LINE_LIST, "lines" },
+ { VK_PRIMITIVE_TOPOLOGY_POINT_LIST, "points" }
+ };
+ const VkSampleCountFlagBits samples[] =
+ {
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_SAMPLE_COUNT_2_BIT,
+ VK_SAMPLE_COUNT_4_BIT,
+ VK_SAMPLE_COUNT_8_BIT,
+ VK_SAMPLE_COUNT_16_BIT,
+ VK_SAMPLE_COUNT_32_BIT,
+ VK_SAMPLE_COUNT_64_BIT
+ };
+
+ tcu::TestCaseGroup* const conservative = new tcu::TestCaseGroup(testCtx, "conservative", "Conservative rasterization tests");
+
+ rasterizationTests->addChild(conservative);
+
+ {
+ tcu::TestCaseGroup* const overestimate = new tcu::TestCaseGroup(testCtx, "overestimate", "Overestimate tests");
+
+ conservative->addChild(overestimate);
+
+ for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); ++samplesNdx)
+ {
+ const std::string samplesGroupName = "samples_" + de::toString(samples[samplesNdx]);
+
+ tcu::TestCaseGroup* const samplesGroup = new tcu::TestCaseGroup(testCtx, samplesGroupName.c_str(), "Samples tests");
+
+ overestimate->addChild(samplesGroup);
+
+ for (int primitiveTypeNdx = 0; primitiveTypeNdx < DE_LENGTH_OF_ARRAY(primitiveTypes); ++primitiveTypeNdx)
+ {
+ tcu::TestCaseGroup* const primitiveGroup = new tcu::TestCaseGroup(testCtx, primitiveTypes[primitiveTypeNdx].name, "Primitive tests");
+
+ samplesGroup->addChild(primitiveGroup);
+
+ {
+ tcu::TestCaseGroup* const normal = new tcu::TestCaseGroup(testCtx, "normal", "Normal conservative rasterization tests");
+
+ primitiveGroup->addChild(normal);
+
+ for (int overestimateSizesNdx = 0; overestimateSizesNdx < DE_LENGTH_OF_ARRAY(overestimateNormalSizes); ++overestimateSizesNdx)
+ {
+ const ConservativeTestConfig config =
+ {
+ VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT, // VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ overestimateNormalSizes[overestimateSizesNdx].size, // float extraOverestimationSize;
+ primitiveTypes[primitiveTypeNdx].type, // VkPrimitiveTopology primitiveTopology;
+ false, // bool degeneratePrimitives;
+ 1.0f, // float lineWidth;
+ RESOLUTION_POT, // deUint32 resolution;
+ };
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
+ normal->addChild(new ConservativeTestCase<ConservativeTraingleTestInstance> (testCtx,
+ overestimateNormalSizes[overestimateSizesNdx].name,
+ "Overestimate test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_LINE_LIST)
+ normal->addChild(new ConservativeTestCase<ConservativeLineTestInstance> (testCtx,
+ overestimateNormalSizes[overestimateSizesNdx].name,
+ "Overestimate test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_POINT_LIST)
+ normal->addChild(new ConservativeTestCase<ConservativePointTestInstance> (testCtx,
+ overestimateNormalSizes[overestimateSizesNdx].name,
+ "Overestimate test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+ }
+ }
+
+ {
+ tcu::TestCaseGroup* const degenerate = new tcu::TestCaseGroup(testCtx, "degenerate", "Degenerate primitives conservative rasterization tests");
+
+ primitiveGroup->addChild(degenerate);
+
+ for (int overestimateSizesNdx = 0; overestimateSizesNdx < DE_LENGTH_OF_ARRAY(overestimateDegenerate); ++overestimateSizesNdx)
+ {
+ const ConservativeTestConfig config =
+ {
+ VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT, // VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ overestimateDegenerate[overestimateSizesNdx].size, // float extraOverestimationSize;
+ primitiveTypes[primitiveTypeNdx].type, // VkPrimitiveTopology primitiveTopology;
+ true, // bool degeneratePrimitives;
+ 1.0f, // float lineWidth;
+ 64u, // deUint32 resolution;
+ };
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
+ degenerate->addChild(new ConservativeTestCase<ConservativeTraingleTestInstance> (testCtx,
+ overestimateDegenerate[overestimateSizesNdx].name,
+ "Overestimate triangle test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_LINE_LIST)
+ degenerate->addChild(new ConservativeTestCase<ConservativeLineTestInstance> (testCtx,
+ overestimateDegenerate[overestimateSizesNdx].name,
+ "Overestimate line test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+ }
+ }
+ }
+ }
+ }
+
+ {
+ tcu::TestCaseGroup* const underestimate = new tcu::TestCaseGroup(testCtx, "underestimate", "Underestimate tests");
+
+ conservative->addChild(underestimate);
+
+ for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); ++samplesNdx)
+ {
+ const std::string samplesGroupName = "samples_" + de::toString(samples[samplesNdx]);
+
+ tcu::TestCaseGroup* const samplesGroup = new tcu::TestCaseGroup(testCtx, samplesGroupName.c_str(), "Samples tests");
+
+ underestimate->addChild(samplesGroup);
+
+ for (int primitiveTypeNdx = 0; primitiveTypeNdx < DE_LENGTH_OF_ARRAY(primitiveTypes); ++primitiveTypeNdx)
+ {
+ tcu::TestCaseGroup* const primitiveGroup = new tcu::TestCaseGroup(testCtx, primitiveTypes[primitiveTypeNdx].name, "Primitive tests");
+
+ samplesGroup->addChild(primitiveGroup);
+
+ {
+ tcu::TestCaseGroup* const normal = new tcu::TestCaseGroup(testCtx, "normal", "Normal conservative rasterization tests");
+
+ primitiveGroup->addChild(normal);
+
+ ConservativeTestConfig config =
+ {
+ VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT, // VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ 0.0f, // float extraOverestimationSize;
+ primitiveTypes[primitiveTypeNdx].type, // VkPrimitiveTopology primitiveTopology;
+ false, // bool degeneratePrimitives;
+ 1.0f, // float lineWidth;
+ 64u, // deUint32 resolution;
+ };
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
+ normal->addChild(new ConservativeTestCase<ConservativeTraingleTestInstance> (testCtx,
+ "test",
+ "Underestimate test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_LINE_LIST)
+ {
+ for (int underestimateWidthNdx = 0; underestimateWidthNdx < DE_LENGTH_OF_ARRAY(underestimateLineWidths); ++underestimateWidthNdx)
+ {
+ config.lineWidth = underestimateLineWidths[underestimateWidthNdx].size;
+ normal->addChild(new ConservativeTestCase<ConservativeLineTestInstance> (testCtx,
+ underestimateLineWidths[underestimateWidthNdx].name,
+ "Underestimate test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+ }
+ }
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_POINT_LIST)
+ {
+ for (int underestimatePointSizeNdx = 0; underestimatePointSizeNdx < DE_LENGTH_OF_ARRAY(underestimatePointSizes); ++underestimatePointSizeNdx)
+ {
+ config.lineWidth = underestimatePointSizes[underestimatePointSizeNdx].size;
+ normal->addChild(new ConservativeTestCase<ConservativePointTestInstance> (testCtx,
+ underestimatePointSizes[underestimatePointSizeNdx].name,
+ "Underestimate test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+ }
+ }
+ }
+
+ {
+ tcu::TestCaseGroup* const degenerate = new tcu::TestCaseGroup(testCtx, "degenerate", "Degenerate primitives conservative rasterization tests");
+
+ primitiveGroup->addChild(degenerate);
+
+ ConservativeTestConfig config =
+ {
+ VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT, // VkConservativeRasterizationModeEXT conservativeRasterizationMode;
+ 0.0f, // float extraOverestimationSize;
+ primitiveTypes[primitiveTypeNdx].type, // VkPrimitiveTopology primitiveTopology;
+ true, // bool degeneratePrimitives;
+ 1.0f, // float lineWidth;
+ 64u, // deUint32 resolution;
+ };
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
+ degenerate->addChild(new ConservativeTestCase<ConservativeTraingleTestInstance> (testCtx,
+ "test",
+ "Underestimate triangle test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+
+ if (primitiveTypes[primitiveTypeNdx].type == VK_PRIMITIVE_TOPOLOGY_LINE_LIST)
+ {
+ for (int underestimateWidthNdx = 0; underestimateWidthNdx < DE_LENGTH_OF_ARRAY(underestimateLineWidths); ++underestimateWidthNdx)
+ {
+ config.lineWidth = underestimateLineWidths[underestimateWidthNdx].size;
+ degenerate->addChild(new ConservativeTestCase<ConservativeLineTestInstance> (testCtx,
+ underestimateLineWidths[underestimateWidthNdx].name,
+ "Underestimate line test, verify rasterization result",
+ config,
+ samples[samplesNdx]));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
// .interpolation
{
tcu::TestCaseGroup* const interpolation = new tcu::TestCaseGroup(testCtx, "interpolation", "Test interpolation");
@@ -4769,6 +7300,55 @@
}
}
+ // .depth bias
+ {
+ tcu::TestCaseGroup* const depthBias = new tcu::TestCaseGroup(testCtx, "depth_bias", "Test depth bias");
+ static const char dataDir[] = "rasterization/depth_bias";
+
+ static const struct
+ {
+ std::string name;
+ vk::VkFormat format;
+ std::string description;
+ } cases [] =
+ {
+ {"d16_unorm", vk::VK_FORMAT_D16_UNORM, "Test depth bias with format D16_UNORM"},
+ {"d32_sfloat", vk::VK_FORMAT_D32_SFLOAT, "Test depth bias with format D32_SFLOAT"},
+ {"d24_unorm", vk::VK_FORMAT_D24_UNORM_S8_UINT, "Test depth bias with format D24_UNORM_S8_UINT"}
+ };
+
+ for (int i = 0; i < DE_LENGTH_OF_ARRAY(cases); ++i)
+ {
+ const VkImageCreateInfo vkImageCreateInfo = {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType
+ nullptr, // pNext
+ 0, // flags
+ VK_IMAGE_TYPE_2D, // imageType
+ cases[i].format, // format
+ {250, 250, 1}, // extent
+ 1, // mipLevels
+ 1, // arrayLayers
+ VK_SAMPLE_COUNT_1_BIT, // samples
+ VK_IMAGE_TILING_OPTIMAL, // tiling
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, // usage
+ VK_SHARING_MODE_EXCLUSIVE, // sharingMode
+ 0, // queueFamilyIndexCount
+ nullptr, // pQueueFamilyIndices
+ VK_IMAGE_LAYOUT_UNDEFINED, // initialLayout
+ };
+
+ std::vector<std::string> requirements = std::vector<std::string>(0);
+ std::vector<VkImageCreateInfo> imageRequirements;
+ imageRequirements.push_back(vkImageCreateInfo);
+ const std::string fileName = cases[i].name + ".amber";
+ cts_amber::AmberTestCase* testCase = cts_amber::createAmberTestCase(testCtx, cases[i].name.c_str(), cases[i].description.c_str(), dataDir, fileName, requirements, imageRequirements);
+
+ depthBias->addChild(testCase);
+ }
+
+ rasterizationTests->addChild(depthBias);
+ }
+
// Fragment shader side effects.
{
rasterizationTests->addChild(createFragSideEffectsTests(testCtx));
diff --git a/external/vulkancts/modules/vulkan/ray_query/CMakeLists.txt b/external/vulkancts/modules/vulkan/ray_query/CMakeLists.txt
index ff06bbd..8d7f9cf 100644
--- a/external/vulkancts/modules/vulkan/ray_query/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/ray_query/CMakeLists.txt
@@ -9,10 +9,18 @@
vktRayQueryTraversalControlTests.hpp
vktRayQueryAccelerationStructuresTests.cpp
vktRayQueryAccelerationStructuresTests.hpp
+ vktRayQueryBarycentricCoordinatesTests.cpp
+ vktRayQueryBarycentricCoordinatesTests.hpp
+ vktRayQueryProceduralGeometryTests.cpp
+ vktRayQueryProceduralGeometryTests.hpp
vktRayQueryWatertightnessTests.cpp
vktRayQueryWatertightnessTests.hpp
vktRayQueryCullRayFlagsTests.cpp
vktRayQueryCullRayFlagsTests.hpp
+ vktRayQueryMiscTests.cpp
+ vktRayQueryMiscTests.hpp
+ vktRayQueryDirectionTests.cpp
+ vktRayQueryDirectionTests.hpp
)
set(DEQP_VK_RAY_QUERY_LIBS
diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp
index fcbe645..573a831 100644
--- a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryAccelerationStructuresTests.cpp
@@ -24,6 +24,7 @@
#include "vktRayQueryAccelerationStructuresTests.hpp"
#include <array>
+#include <set>
#include "vkDefs.hpp"
#include "deClock.h"
@@ -1457,6 +1458,21 @@
return result;
}
+void commonASTestsCheckSupport(Context& context)
+{
+ context.requireInstanceFunctionality("VK_KHR_get_physical_device_properties2");
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_query");
+
+ const VkPhysicalDeviceRayQueryFeaturesKHR& rayQueryFeaturesKHR = context.getRayQueryFeatures();
+ if (rayQueryFeaturesKHR.rayQuery == DE_FALSE)
+ TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayQueryFeaturesKHR.rayQuery");
+
+ const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
+ if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
+ TCU_THROW(TestError, "VK_KHR_ray_query requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
+}
+
class RayQueryASBasicTestCase : public TestCase
{
public:
@@ -1510,19 +1526,9 @@
void RayQueryASBasicTestCase::checkSupport (Context& context) const
{
- context.requireInstanceFunctionality("VK_KHR_get_physical_device_properties2");
- context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
- context.requireDeviceFunctionality("VK_KHR_ray_query");
+ commonASTestsCheckSupport(context);
- const VkPhysicalDeviceRayQueryFeaturesKHR& rayQueryFeaturesKHR = context.getRayQueryFeatures();
- if (rayQueryFeaturesKHR.rayQuery == DE_FALSE)
- TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayQueryFeaturesKHR.rayQuery");
-
- const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
- if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
- TCU_THROW(TestError, "VK_KHR_ray_query requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
-
- const VkPhysicalDeviceFeatures2& features2 = context.getDeviceFeatures2();
+ const VkPhysicalDeviceFeatures2& features2 = context.getDeviceFeatures2();
if ((m_data.shaderSourceType == SST_TESSELATION_CONTROL_SHADER ||
m_data.shaderSourceType == SST_TESSELATION_EVALUATION_SHADER) &&
@@ -1560,6 +1566,7 @@
break;
}
+ const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR && accelerationStructureFeaturesKHR.accelerationStructureHostCommands == DE_FALSE)
TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureHostCommands");
@@ -2579,8 +2586,12 @@
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR)
{
- const VkMemoryBarrier serializeMemoryBarrier = makeMemoryBarrier(VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT);
- cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &serializeMemoryBarrier);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ vkd.resetCommandPool(device, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
}
de::MovePtr<BottomLevelAccelerationStructure> asCopy = makeBottomLevelAccelerationStructure();
@@ -2682,8 +2693,12 @@
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR)
{
- const VkMemoryBarrier serializeMemoryBarrier = makeMemoryBarrier(VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT);
- cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &serializeMemoryBarrier);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ vkd.resetCommandPool(device, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
}
topLevelAccelerationStructureCopy = makeTopLevelAccelerationStructure();
@@ -2789,6 +2804,519 @@
return tcu::TestStatus::fail("Fail");
}
+// Tests dynamic indexing of acceleration structures
+class RayQueryASDynamicIndexingTestCase : public TestCase
+{
+public:
+ RayQueryASDynamicIndexingTestCase (tcu::TestContext& context, const char* name);
+ ~RayQueryASDynamicIndexingTestCase (void) = default;
+
+ void checkSupport (Context& context) const override;
+ void initPrograms (SourceCollections& programCollection) const override;
+ TestInstance* createInstance (Context& context) const override;
+};
+
+class RayQueryASDynamicIndexingTestInstance : public TestInstance
+{
+public:
+ RayQueryASDynamicIndexingTestInstance (Context& context);
+ ~RayQueryASDynamicIndexingTestInstance (void) = default;
+ tcu::TestStatus iterate (void) override;
+};
+
+RayQueryASDynamicIndexingTestCase::RayQueryASDynamicIndexingTestCase(tcu::TestContext& context, const char* name)
+ : TestCase(context, name, "")
+{
+}
+
+void RayQueryASDynamicIndexingTestCase::checkSupport(Context& context) const
+{
+ commonASTestsCheckSupport(context);
+ context.requireDeviceFunctionality("VK_EXT_descriptor_indexing");
+}
+
+void RayQueryASDynamicIndexingTestCase::initPrograms(SourceCollections& programCollection) const
+{
+ const vk::SpirVAsmBuildOptions spvBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, true);
+
+ // compute shader is defined in spir-v as it requires possing pointer to TLAS that was read from ssbo;
+ // original spir-v code was generated using following glsl code but resulting spir-v code was modiifed
+
+ // #version 460 core
+ // #extension GL_EXT_ray_query : require
+ // #extension GL_EXT_nonuniform_qualifier : enable
+ // #extension GL_ARB_gpu_shader_int64 : enable // needed only to generate spir-v
+
+ // #define ARRAY_SIZE 500
+ // layout(set = 0, binding = 0) uniform accelerationStructureEXT tlasArray[ARRAY_SIZE];
+ // layout(set = 0, binding = 1) readonly buffer topLevelASPointers {
+ // uint64_t ptr[];
+ // } tlasPointers;
+ // layout(set = 0, binding = 2) readonly buffer topLevelASIndices {
+ // uint idx[];
+ // } tlasIndices;
+ // layout(set = 0, binding = 3, std430) writeonly buffer Result {
+ // uint value[];
+ // } result;
+
+ // void main()
+ // {
+ // float tmin = 0.0;
+ // float tmax = 2.0;
+ // vec3 origin = vec3(0.25f, 0.5f, 1.0);
+ // vec3 direction = vec3(0.0,0.0,-1.0);
+ // uint tlasIndex = tlasIndices.idx[nonuniformEXT(gl_GlobalInvocationID.x)];
+
+ // rayQueryEXT rq;
+ // rayQueryInitializeEXT(rq, tlasArray[nonuniformEXT(tlasIndex)], gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, origin, tmin, direction, tmax);
+ // atomicAdd(result.value[nonuniformEXT(gl_GlobalInvocationID.x)], 2);
+
+ // if (rayQueryProceedEXT(rq))
+ // {
+ // if (rayQueryGetIntersectionTypeEXT(rq, false) == gl_RayQueryCandidateIntersectionTriangleEXT)
+ // atomicAdd(result.value[nonuniformEXT(gl_GlobalInvocationID.x + gl_NumWorkGroups.x)], 3);
+ // }
+
+ // //rayQueryInitializeEXT(rq, tlasArray[nonuniformEXT(tlasIndex)], gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, origin, tmin, direction, tmax);
+ // rayQueryInitializeEXT(rq, *tlasPointers.ptr[nonuniformEXT(tlasIndex)], gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, origin, tmin, direction, tmax);
+ // atomicAdd(result.value[nonuniformEXT(gl_GlobalInvocationID.x + gl_NumWorkGroups.x * 2)], 5);
+
+ // if (rayQueryProceedEXT(rq))
+ // {
+ // if (rayQueryGetIntersectionTypeEXT(rq, false) == gl_RayQueryCandidateIntersectionTriangleEXT)
+ // atomicAdd(result.value[nonuniformEXT(gl_GlobalInvocationID.x + gl_NumWorkGroups.x * 3)], 7);
+ // }
+ // }
+
+ const std::string compSource =
+ "OpCapability Int64\n"
+ "OpCapability Shader\n"
+ "OpCapability RayQueryKHR\n"
+ "OpCapability ShaderNonUniform\n"
+ "OpExtension \"SPV_EXT_descriptor_indexing\"\n"
+ "OpExtension \"SPV_KHR_ray_query\"\n"
+ "%1 = OpExtInstImport \"GLSL.std.450\"\n"
+ "OpMemoryModel Logical GLSL450\n"
+ "OpEntryPoint GLCompute %4 \"main\" %var_index_ssbo %33 %var_as_arr_uni_ptr %64 %83 %var_as_pointers_ssbo\n"
+ "OpExecutionMode %4 LocalSize 1 1 1\n"
+ "OpDecorate %25 ArrayStride 4\n"
+ "OpMemberDecorate %26 0 NonWritable\n"
+ "OpMemberDecorate %26 0 Offset 0\n"
+ "OpDecorate %26 Block\n"
+ "OpDecorate %var_index_ssbo DescriptorSet 0\n"
+ "OpDecorate %var_index_ssbo Binding 2\n"
+ "OpDecorate %33 BuiltIn GlobalInvocationId\n"
+ "OpDecorate %38 NonUniform\n"
+ "OpDecorate %40 NonUniform\n"
+ "OpDecorate %41 NonUniform\n"
+ "OpDecorate %var_as_arr_uni_ptr DescriptorSet 0\n"
+ "OpDecorate %var_as_arr_uni_ptr Binding 0\n"
+ "OpDecorate %51 NonUniform\n"
+ "OpDecorate %53 NonUniform\n"
+ "OpDecorate %54 NonUniform\n"
+ "OpDecorate %61 ArrayStride 4\n"
+ "OpMemberDecorate %62 0 NonReadable\n"
+ "OpMemberDecorate %62 0 Offset 0\n"
+ "OpDecorate %62 Block\n"
+ "OpDecorate %64 DescriptorSet 0\n"
+ "OpDecorate %64 Binding 3\n"
+ "OpDecorate %67 NonUniform\n"
+ "OpDecorate %83 BuiltIn NumWorkgroups\n"
+ "OpDecorate %87 NonUniform\n"
+ "OpDecorate %as_index NonUniform\n"
+ "OpDecorate %as_device_addres NonUniform\n"
+ "OpDecorate %105 NonUniform\n"
+ "OpDecorate %122 NonUniform\n"
+ "OpDecorate %127 ArrayStride 8\n"
+ "OpMemberDecorate %128 0 NonWritable\n"
+ "OpMemberDecorate %128 0 Offset 0\n"
+ "OpDecorate %128 Block\n"
+ "OpDecorate %var_as_pointers_ssbo DescriptorSet 0\n"
+ "OpDecorate %var_as_pointers_ssbo Binding 1\n"
+ "%2 = OpTypeVoid\n"
+ "%3 = OpTypeFunction %2\n"
+ "%6 = OpTypeFloat 32\n"
+ "%7 = OpTypePointer Function %6\n"
+ "%9 = OpConstant %6 0\n"
+ "%11 = OpConstant %6 2\n"
+ "%12 = OpTypeVector %6 3\n"
+ "%13 = OpTypePointer Function %12\n"
+ "%15 = OpConstant %6 0.25\n"
+ "%16 = OpConstant %6 0.5\n"
+ "%17 = OpConstant %6 1\n"
+ "%18 = OpConstantComposite %12 %15 %16 %17\n"
+ "%20 = OpConstant %6 -1\n"
+ "%21 = OpConstantComposite %12 %9 %9 %20\n"
+ "%type_uint32 = OpTypeInt 32 0\n"
+ "%23 = OpTypePointer Function %type_uint32\n"
+ "%25 = OpTypeRuntimeArray %type_uint32\n"
+ "%26 = OpTypeStruct %25\n"
+ "%27 = OpTypePointer StorageBuffer %26\n"
+ "%var_index_ssbo = OpVariable %27 StorageBuffer\n"
+ "%29 = OpTypeInt 32 1\n"
+ "%c_int32_0 = OpConstant %29 0\n"
+ "%31 = OpTypeVector %type_uint32 3\n"
+ "%32 = OpTypePointer Input %31\n"
+ "%33 = OpVariable %32 Input\n"
+ "%34 = OpConstant %type_uint32 0\n"
+ "%35 = OpTypePointer Input %type_uint32\n"
+ "%type_uint32_ssbo_ptr = OpTypePointer StorageBuffer %type_uint32\n"
+ "%42 = OpTypeRayQueryKHR\n"
+ "%43 = OpTypePointer Function %42\n"
+ "%type_as = OpTypeAccelerationStructureKHR\n"
+ "%46 = OpConstant %type_uint32 500\n"
+ "%type_as_arr = OpTypeArray %type_as %46\n"
+ "%type_as_arr_uni_ptr = OpTypePointer UniformConstant %type_as_arr\n"
+ "%var_as_arr_uni_ptr = OpVariable %type_as_arr_uni_ptr UniformConstant\n"
+ "%type_as_uni_ptr = OpTypePointer UniformConstant %type_as\n"
+ "%55 = OpConstant %type_uint32 16\n"
+ "%56 = OpConstant %type_uint32 255\n"
+ "%61 = OpTypeRuntimeArray %type_uint32\n"
+ "%62 = OpTypeStruct %61\n"
+ "%63 = OpTypePointer StorageBuffer %62\n"
+ "%64 = OpVariable %63 StorageBuffer\n"
+ "%69 = OpConstant %type_uint32 2\n"
+ "%70 = OpConstant %type_uint32 1\n"
+ "%72 = OpTypeBool\n"
+ "%76 = OpConstantFalse %72\n"
+ "%83 = OpVariable %32 Input\n"
+ "%89 = OpConstant %type_uint32 3\n"
+ "%107 = OpConstant %type_uint32 5\n"
+ "%124 = OpConstant %type_uint32 7\n"
+
+ // <changed_section>
+ "%type_uint64 = OpTypeInt 64 0\n"
+ "%127 = OpTypeRuntimeArray %type_uint64\n"
+ "%128 = OpTypeStruct %127\n"
+ "%129 = OpTypePointer StorageBuffer %128\n"
+ "%var_as_pointers_ssbo = OpVariable %129 StorageBuffer\n"
+ "%type_uint64_ssbo_ptr = OpTypePointer StorageBuffer %type_uint64\n"
+ // </changed_section>
+
+ // void main()
+ "%4 = OpFunction %2 None %3\n"
+ "%5 = OpLabel\n"
+ "%8 = OpVariable %7 Function\n"
+ "%10 = OpVariable %7 Function\n"
+ "%14 = OpVariable %13 Function\n"
+ "%19 = OpVariable %13 Function\n"
+ "%24 = OpVariable %23 Function\n"
+ "%var_ray_query = OpVariable %43 Function\n"
+ "OpStore %8 %9\n"
+ "OpStore %10 %11\n"
+ "OpStore %14 %18\n"
+ "OpStore %19 %21\n"
+ "%36 = OpAccessChain %35 %33 %34\n"
+ "%37 = OpLoad %type_uint32 %36\n"
+ "%38 = OpCopyObject %type_uint32 %37\n"
+ "%40 = OpAccessChain %type_uint32_ssbo_ptr %var_index_ssbo %c_int32_0 %38\n"
+ "%41 = OpLoad %type_uint32 %40\n"
+ "OpStore %24 %41\n"
+
+ // rayQueryInitializeEXT using AS that was read from array
+ "%50 = OpLoad %type_uint32 %24\n"
+ "%51 = OpCopyObject %type_uint32 %50\n"
+ "%53 = OpAccessChain %type_as_uni_ptr %var_as_arr_uni_ptr %51\n"
+ "%54 = OpLoad %type_as %53\n"
+ "%57 = OpLoad %12 %14\n"
+ "%58 = OpLoad %6 %8\n"
+ "%59 = OpLoad %12 %19\n"
+ "%60 = OpLoad %6 %10\n"
+ "OpRayQueryInitializeKHR %var_ray_query %54 %55 %56 %57 %58 %59 %60\n"
+
+ "%65 = OpAccessChain %35 %33 %34\n"
+ "%66 = OpLoad %type_uint32 %65\n"
+ "%67 = OpCopyObject %type_uint32 %66\n"
+ "%68 = OpAccessChain %type_uint32_ssbo_ptr %64 %c_int32_0 %67\n"
+ "%71 = OpAtomicIAdd %type_uint32 %68 %70 %34 %69\n"
+
+ "%73 = OpRayQueryProceedKHR %72 %var_ray_query\n"
+ "OpSelectionMerge %75 None\n"
+ "OpBranchConditional %73 %74 %75\n"
+ "%74 = OpLabel\n"
+
+ "%77 = OpRayQueryGetIntersectionTypeKHR %type_uint32 %var_ray_query %c_int32_0\n"
+ "%78 = OpIEqual %72 %77 %34\n"
+ "OpSelectionMerge %80 None\n"
+ "OpBranchConditional %78 %79 %80\n"
+ "%79 = OpLabel\n"
+ "%81 = OpAccessChain %35 %33 %34\n"
+ "%82 = OpLoad %type_uint32 %81\n"
+ "%84 = OpAccessChain %35 %83 %34\n"
+ "%85 = OpLoad %type_uint32 %84\n"
+ "%86 = OpIAdd %type_uint32 %82 %85\n"
+ "%87 = OpCopyObject %type_uint32 %86\n"
+ "%88 = OpAccessChain %type_uint32_ssbo_ptr %64 %c_int32_0 %87\n"
+ "%90 = OpAtomicIAdd %type_uint32 %88 %70 %34 %89\n"
+ "OpBranch %80\n"
+ "%80 = OpLabel\n"
+ "OpBranch %75\n"
+ "%75 = OpLabel\n"
+
+ // rayQueryInitializeEXT using pointer to AS
+ "%91 = OpLoad %type_uint32 %24\n"
+ "%as_index = OpCopyObject %type_uint32 %91\n"
+
+ // <changed_section>
+ "%as_device_addres_ptr = OpAccessChain %type_uint64_ssbo_ptr %var_as_pointers_ssbo %c_int32_0 %as_index\n"
+ "%as_device_addres = OpLoad %type_uint64 %as_device_addres_ptr Aligned 8\n"
+ "%as_to_use = OpConvertUToAccelerationStructureKHR %type_as %as_device_addres\n"
+ // </changed_section>
+
+ "%95 = OpLoad %12 %14\n"
+ "%96 = OpLoad %6 %8\n"
+ "%97 = OpLoad %12 %19\n"
+ "%98 = OpLoad %6 %10\n"
+ "OpRayQueryInitializeKHR %var_ray_query %as_to_use %55 %56 %95 %96 %97 %98\n"
+
+ "%99 = OpAccessChain %35 %33 %34\n"
+ "%100 = OpLoad %type_uint32 %99\n"
+ "%101 = OpAccessChain %35 %83 %34\n"
+ "%102 = OpLoad %type_uint32 %101\n"
+ "%103 = OpIMul %type_uint32 %102 %69\n"
+ "%104 = OpIAdd %type_uint32 %100 %103\n"
+ "%105 = OpCopyObject %type_uint32 %104\n"
+ "%106 = OpAccessChain %type_uint32_ssbo_ptr %64 %c_int32_0 %105\n"
+ "%108 = OpAtomicIAdd %type_uint32 %106 %70 %34 %107\n"
+
+ "%109 = OpRayQueryProceedKHR %72 %var_ray_query\n"
+ "OpSelectionMerge %111 None\n"
+ "OpBranchConditional %109 %110 %111\n"
+ "%110 = OpLabel\n"
+
+ "%112 = OpRayQueryGetIntersectionTypeKHR %type_uint32 %var_ray_query %c_int32_0\n"
+ "%113 = OpIEqual %72 %112 %34\n"
+ "OpSelectionMerge %115 None\n"
+ "OpBranchConditional %113 %114 %115\n"
+ "%114 = OpLabel\n"
+ "%116 = OpAccessChain %35 %33 %34\n"
+ "%117 = OpLoad %type_uint32 %116\n"
+ "%118 = OpAccessChain %35 %83 %34\n"
+ "%119 = OpLoad %type_uint32 %118\n"
+ "%120 = OpIMul %type_uint32 %119 %89\n"
+ "%121 = OpIAdd %type_uint32 %117 %120\n"
+ "%122 = OpCopyObject %type_uint32 %121\n"
+ "%123 = OpAccessChain %type_uint32_ssbo_ptr %64 %c_int32_0 %122\n"
+ "%125 = OpAtomicIAdd %type_uint32 %123 %70 %34 %124\n"
+ "OpBranch %115\n"
+ "%115 = OpLabel\n"
+ "OpBranch %111\n"
+ "%111 = OpLabel\n"
+ "OpReturn\n"
+ "OpFunctionEnd\n";
+
+ programCollection.spirvAsmSources.add("comp") << compSource << spvBuildOptions;
+}
+
+TestInstance* RayQueryASDynamicIndexingTestCase::createInstance(Context& context) const
+{
+ return new RayQueryASDynamicIndexingTestInstance(context);
+}
+
+
+RayQueryASDynamicIndexingTestInstance::RayQueryASDynamicIndexingTestInstance(Context& context)
+ : vkt::TestInstance(context)
+{
+}
+
+tcu::TestStatus RayQueryASDynamicIndexingTestInstance::iterate(void)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const VkQueue queue = m_context.getUniversalQueue();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ const deUint32 tlasCount = 500; // changing this will require also changing shaders
+ const deUint32 activeTlasCount = 32; // number of tlas out of <tlasCount> that will be active
+
+ const Move<VkDescriptorSetLayout> descriptorSetLayout = DescriptorSetLayoutBuilder()
+ .addArrayBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, tlasCount, VK_SHADER_STAGE_COMPUTE_BIT)
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT) // pointers to all acceleration structures
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT) // ssbo with indices of all acceleration structures
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT) // ssbo with result values
+ .build(vkd, device);
+
+ const Move<VkDescriptorPool> descriptorPool = DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, tlasCount)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const Move<VkDescriptorSet> descriptorSet = makeDescriptorSet(vkd, device, *descriptorPool, *descriptorSetLayout);
+
+ const Move<VkPipelineLayout> pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+ Move<VkShaderModule> shaderModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0u);
+ const VkComputePipelineCreateInfo pipelineCreateInfo
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkPipelineCreateFlags flags
+ { // VkPipelineShaderStageCreateInfo stage
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ DE_NULL,
+ (VkPipelineShaderStageCreateFlags)0,
+ VK_SHADER_STAGE_COMPUTE_BIT,
+ *shaderModule,
+ "main",
+ DE_NULL
+ },
+ *pipelineLayout, // VkPipelineLayout layout
+ DE_NULL, // VkPipeline basePipelineHandle
+ 0, // deInt32 basePipelineIndex
+ };
+
+ Move<VkPipeline> pipeline = createComputePipeline(vkd, device, DE_NULL, &pipelineCreateInfo);
+
+ const VkDeviceSize pointerBufferSize = tlasCount * sizeof(VkDeviceAddress);
+ const VkBufferCreateInfo pointerBufferCreateInfo = makeBufferCreateInfo(pointerBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ de::MovePtr<BufferWithMemory> pointerBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, pointerBufferCreateInfo, MemoryRequirement::HostVisible | MemoryRequirement::DeviceAddress));
+
+ const VkDeviceSize indicesBufferSize = activeTlasCount * sizeof(deUint32);
+ const VkBufferCreateInfo indicesBufferCreateInfo = makeBufferCreateInfo(indicesBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ de::MovePtr<BufferWithMemory> indicesBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, indicesBufferCreateInfo, MemoryRequirement::HostVisible));
+
+ const VkDeviceSize resultBufferSize = activeTlasCount * sizeof(deUint32) * 4;
+ const VkBufferCreateInfo resultBufferCreateInfo = makeBufferCreateInfo(resultBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+ de::MovePtr<BufferWithMemory> resultBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
+
+ const Move<VkCommandPool> cmdPool = createCommandPool(vkd, device, 0, queueFamilyIndex);
+ const Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> blas = de::SharedPtr<BottomLevelAccelerationStructure>(makeBottomLevelAccelerationStructure().release());
+ std::vector<de::MovePtr<TopLevelAccelerationStructure>> tlasVect(tlasCount);
+ std::vector<VkDeviceAddress> tlasPtrVect(tlasCount);
+ std::vector<VkAccelerationStructureKHR> tlasVkVect;
+
+ // randomly scatter AS indices across the range (number of them should be equal to the max subgroup size)
+ deRandom rnd;
+ deRandom_init(&rnd, 123);
+ std::set<deUint32> asIndicesSet;
+ while (asIndicesSet.size() < activeTlasCount)
+ asIndicesSet.insert(deRandom_getUint32(&rnd) % tlasCount);
+
+ // fill indices buffer
+ deUint32 helperIndex = 0;
+ auto& indicesBufferAlloc = indicesBuffer->getAllocation();
+ deUint32* indicesBufferPtr = reinterpret_cast<deUint32*>(indicesBufferAlloc.getHostPtr());
+ std::for_each(asIndicesSet.begin(), asIndicesSet.end(),
+ [&helperIndex, indicesBufferPtr](const deUint32& index)
+ {
+ indicesBufferPtr[helperIndex++] = index;
+ });
+ vk::flushAlloc(vkd, device, indicesBufferAlloc);
+
+ // clear result buffer
+ auto& resultBufferAlloc = resultBuffer->getAllocation();
+ void* resultBufferPtr = resultBufferAlloc.getHostPtr();
+ deMemset(resultBufferPtr, 0, static_cast<size_t>(resultBufferSize));
+ vk::flushAlloc(vkd, device, resultBufferAlloc);
+
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
+ {
+ // build bottom level acceleration structure
+ blas->setGeometryData(
+ {
+ { 0.0, 0.0, 0.0 },
+ { 1.0, 0.0, 0.0 },
+ { 0.0, 1.0, 0.0 },
+ },
+ true,
+ 0u
+ );
+
+ blas->createAndBuild(vkd, device, *cmdBuffer, allocator);
+
+ // build top level acceleration structures
+ for (deUint32 tlasIndex = 0; tlasIndex < tlasCount; ++tlasIndex)
+ {
+ auto& tlas = tlasVect[tlasIndex];
+ tlas = makeTopLevelAccelerationStructure();
+ tlas->setInstanceCount(1);
+ tlas->addInstance(blas);
+ if (!asIndicesSet.count(tlasIndex))
+ {
+ // tlas that are not in asIndicesSet should be empty but it is hard to do
+ // that with current cts utils so we are marking them as inactive instead
+ tlas->setInactiveInstances(true);
+ }
+ tlas->createAndBuild(vkd, device, *cmdBuffer, allocator);
+
+ // get acceleration structure device address
+ const VkAccelerationStructureDeviceAddressInfoKHR addressInfo =
+ {
+ VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ *tlas->getPtr() // VkAccelerationStructureKHR accelerationStructure
+ };
+ VkDeviceAddress vkda = vkd.getAccelerationStructureDeviceAddressKHR(device, &addressInfo);
+ tlasPtrVect[tlasIndex] = vkda;
+ }
+
+ // fill pointer buffer
+ vkd.cmdUpdateBuffer(*cmdBuffer, **pointerBuffer, 0, pointerBufferSize, tlasPtrVect.data());
+
+ // wait for data transfers
+ const VkMemoryBarrier uploadBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, &uploadBarrier, 1u);
+
+ // wait for as build
+ const VkMemoryBarrier asBuildBarrier = makeMemoryBarrier(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR);
+ cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, &asBuildBarrier, 1u);
+
+ tlasVkVect.reserve(tlasCount);
+ for (auto& tlas : tlasVect)
+ tlasVkVect.push_back(*tlas->getPtr());
+
+ VkWriteDescriptorSetAccelerationStructureKHR accelerationStructureWriteDescriptorSet =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ tlasCount, // deUint32 accelerationStructureCount;
+ tlasVkVect.data(), // const VkAccelerationStructureKHR* pAccelerationStructures;
+ };
+
+ const vk::VkDescriptorBufferInfo pointerBufferInfo = makeDescriptorBufferInfo(**pointerBuffer, 0u, VK_WHOLE_SIZE);
+ const vk::VkDescriptorBufferInfo indicesBufferInfo = makeDescriptorBufferInfo(**indicesBuffer, 0u, VK_WHOLE_SIZE);
+ const vk::VkDescriptorBufferInfo resultInfo = makeDescriptorBufferInfo(**resultBuffer, 0u, VK_WHOLE_SIZE);
+
+ DescriptorSetUpdateBuilder()
+ .writeArray (*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, tlasCount, &accelerationStructureWriteDescriptorSet)
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &pointerBufferInfo)
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &indicesBufferInfo)
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(3u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultInfo)
+ .update(vkd, device);
+
+ vkd.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, 1, &descriptorSet.get(), 0, DE_NULL);
+
+ vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+
+ vkd.cmdDispatch(*cmdBuffer, activeTlasCount, 1, 1);
+
+ const VkMemoryBarrier postTraceMemoryBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &postTraceMemoryBarrier);
+ }
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ invalidateMappedMemoryRange(vkd, device, resultBuffer->getAllocation().getMemory(), resultBuffer->getAllocation().getOffset(), resultBufferSize);
+
+ // verify result buffer
+ deUint32 failures = 0;
+ const deUint32* resultPtr = reinterpret_cast<deUint32*>(resultBuffer->getAllocation().getHostPtr());
+ for (deUint32 index = 0; index < activeTlasCount; ++index)
+ {
+ failures += (resultPtr[0 * activeTlasCount + index] != 2) +
+ (resultPtr[1 * activeTlasCount + index] != 3) +
+ (resultPtr[2 * activeTlasCount + index] != 5) +
+ (resultPtr[3 * activeTlasCount + index] != 7);
+ }
+
+ if (failures)
+ return tcu::TestStatus::fail(de::toString(failures) + " failures, " + de::toString(4 * activeTlasCount - failures) + " are ok");
+ return tcu::TestStatus::pass("Pass");
+}
+
} // anonymous
/********************/
@@ -3420,6 +3948,12 @@
}
}
+void addDynamicIndexingTests(tcu::TestCaseGroup* group)
+{
+ auto& ctx = group->getTestContext();
+ group->addChild(new RayQueryASDynamicIndexingTestCase(ctx, "dynamic_indexing"));
+}
+
void addEmptyAccelerationStructureTests (tcu::TestCaseGroup* group)
{
const struct
@@ -3536,6 +4070,7 @@
addTestGroup(group.get(), "host_threading", "Test host threading operations", addHostThreadingOperationTests);
addTestGroup(group.get(), "function_argument", "Test using AS as function argument using both pointers and bare values", addFuncArgTests);
addTestGroup(group.get(), "instance_triangle_culling", "Test building AS with counterclockwise triangles and/or disabling face culling", addInstanceTriangleCullingTests);
+ addTestGroup(group.get(), "dynamic_indexing", "Exercise dynamic indexing of acceleration structures", addDynamicIndexingTests);
addTestGroup(group.get(), "empty", "Test building empty acceleration structures using different methods", addEmptyAccelerationStructureTests);
return group.release();
diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBarycentricCoordinatesTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBarycentricCoordinatesTests.cpp
new file mode 100644
index 0000000..8248b03
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBarycentricCoordinatesTests.cpp
@@ -0,0 +1,383 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
+ *
+ * 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 Ray Query Barycentric Coordinates Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktRayQueryBarycentricCoordinatesTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkRayTracingUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkBarrierUtil.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deRandom.hpp"
+
+#include <sstream>
+#include <vector>
+
+namespace vkt
+{
+namespace RayQuery
+{
+
+namespace
+{
+
+using namespace vk;
+
+struct TestParams
+{
+ deUint32 seed;
+};
+
+constexpr float kZCoord = 5.0f;
+constexpr float kXYCoordAbs = 1.0f;
+
+constexpr float kThreshold = 0.001f; // For the resulting coordinates.
+constexpr float kTMin = 1.0f - kThreshold; // Require the same precision in T.
+constexpr float kTMax = 1.0f + kThreshold; // Ditto.
+constexpr deUint32 kNumRays = 20u;
+
+class BarycentricCoordinatesCase : public TestCase
+{
+public:
+ BarycentricCoordinatesCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~BarycentricCoordinatesCase (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+protected:
+ TestParams m_params;
+};
+
+class BarycentricCoordinatesInstance : public TestInstance
+{
+public:
+ BarycentricCoordinatesInstance (Context& context, const TestParams& params);
+ virtual ~BarycentricCoordinatesInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ TestParams m_params;
+};
+
+BarycentricCoordinatesCase::BarycentricCoordinatesCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+void BarycentricCoordinatesCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_query");
+}
+
+void BarycentricCoordinatesCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ std::ostringstream comp;
+ comp
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_query : require\n"
+ << "\n"
+ << "layout(local_size_x=" << kNumRays << ", local_size_y=1, local_size_z=1) in;\n"
+ << "\n"
+ << "layout(set=0, binding=0) uniform accelerationStructureEXT topLevelAS;\n"
+ << "layout(set=0, binding=1) uniform RayDirections {\n"
+ << " vec4 values[" << kNumRays << "];\n"
+ << "} directions;\n"
+ << "layout(set=0, binding=2, std430) buffer OutputBarycentrics {\n"
+ << " vec4 values[" << kNumRays << "];\n"
+ << "} coordinates;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint cullMask = 0xFF;\n"
+ << " const vec3 origin = vec3(0.0, 0.0, 0.0);\n"
+ << " const vec3 direction = directions.values[gl_LocalInvocationID.x].xyz;\n"
+ << " const float tMin = " << kTMin << ";\n"
+ << " const float tMax = " << kTMax << ";\n"
+ << " vec4 outputVal = vec4(-1.0, -1.0, -1.0, -1.0);\n"
+ << " rayQueryEXT rq;\n"
+ << " rayQueryInitializeEXT(rq, topLevelAS, gl_RayFlagsNoneEXT, cullMask, origin, tMin, direction, tMax);\n"
+ << " while (rayQueryProceedEXT(rq)) {\n"
+ << " if (rayQueryGetIntersectionTypeEXT(rq, false) == gl_RayQueryCandidateIntersectionTriangleEXT) {\n"
+ << " outputVal = vec4(rayQueryGetIntersectionBarycentricsEXT(rq, false), 0.0, 0.0);\n"
+ << " }\n"
+ << " }\n"
+ << " coordinates.values[gl_LocalInvocationID.x] = vec4(outputVal);\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("comp") << glu::ComputeSource(updateRayTracingGLSL(comp.str())) << buildOptions;
+}
+
+TestInstance* BarycentricCoordinatesCase::createInstance (Context& context) const
+{
+ return new BarycentricCoordinatesInstance(context, m_params);
+}
+
+BarycentricCoordinatesInstance::BarycentricCoordinatesInstance (Context& context, const TestParams& params)
+ : TestInstance (context)
+ , m_params (params)
+{}
+
+// Calculates coordinates in a triangle given barycentric coordinates b and c.
+tcu::Vec3 calcCoordinates (const std::vector<tcu::Vec3>& triangle, float b, float c)
+{
+ DE_ASSERT(triangle.size() == 3u);
+ DE_ASSERT(b > 0.0f);
+ DE_ASSERT(c > 0.0f);
+ DE_ASSERT(b + c < 1.0f);
+
+ const float a = 1.0f - b - c;
+ DE_ASSERT(a > 0.0f);
+
+ return triangle[0] * a + triangle[1] * b + triangle[2] * c;
+}
+
+// Return a, b, c with a close to 1.0f and (b, c) close to 0.0f.
+tcu::Vec3 getBarycentricVertex (void)
+{
+ const float a = 0.999f;
+ const float aux = 1.0f - a;
+ const float b = aux / 2.0f;
+ const float c = b;
+
+ return tcu::Vec3(a, b, c);
+}
+
+tcu::Vec4 extendToV4 (const tcu::Vec3& vec3)
+{
+ return tcu::Vec4(vec3.x(), vec3.y(), vec3.z(), 0.0f);
+}
+
+tcu::TestStatus BarycentricCoordinatesInstance::iterate (void)
+{
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+ const auto stages = VK_SHADER_STAGE_COMPUTE_BIT;
+
+ // Command pool and buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Build acceleration structures.
+ auto topLevelAS = makeTopLevelAccelerationStructure();
+ auto bottomLevelAS = makeBottomLevelAccelerationStructure();
+
+ const std::vector<tcu::Vec3> triangle =
+ {
+ tcu::Vec3( 0.0f, -kXYCoordAbs, kZCoord),
+ tcu::Vec3(-kXYCoordAbs, kXYCoordAbs, kZCoord),
+ tcu::Vec3( kXYCoordAbs, kXYCoordAbs, kZCoord),
+ };
+
+ bottomLevelAS->addGeometry(triangle, true/*is triangles*/, VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR);
+ bottomLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+ de::SharedPtr<BottomLevelAccelerationStructure> blasSharedPtr (bottomLevelAS.release());
+
+ topLevelAS->setInstanceCount(1);
+ topLevelAS->addInstance(blasSharedPtr, identityMatrix3x4, 0, 0xFFu, 0u, VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR);
+ topLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ // Uniform buffer for directions.
+ const auto directionsBufferSize = static_cast<VkDeviceSize>(sizeof(tcu::Vec4) * kNumRays);
+ const auto directionsBufferInfo = makeBufferCreateInfo(directionsBufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
+ BufferWithMemory directionsBuffer (vkd, device, alloc, directionsBufferInfo, MemoryRequirement::HostVisible);
+ auto& directionsBufferAlloc = directionsBuffer.getAllocation();
+ void* directionsBufferData = directionsBufferAlloc.getHostPtr();
+
+ // Generate rays towards the 3 triangle coordinates (avoiding exact vertices) and additional coordinates.
+ std::vector<tcu::Vec4> directions;
+ std::vector<tcu::Vec4> expectedOutputCoordinates;
+ directions.reserve(kNumRays);
+ expectedOutputCoordinates.reserve(kNumRays);
+
+ const auto barycentricABC = getBarycentricVertex();
+
+ directions.push_back(extendToV4(calcCoordinates(triangle, barycentricABC.x(), barycentricABC.y())));
+ directions.push_back(extendToV4(calcCoordinates(triangle, barycentricABC.y(), barycentricABC.x())));
+ directions.push_back(extendToV4(calcCoordinates(triangle, barycentricABC.y(), barycentricABC.z())));
+
+ expectedOutputCoordinates.push_back(tcu::Vec4(barycentricABC.x(), barycentricABC.y(), 0.0f, 0.0f));
+ expectedOutputCoordinates.push_back(tcu::Vec4(barycentricABC.y(), barycentricABC.x(), 0.0f, 0.0f));
+ expectedOutputCoordinates.push_back(tcu::Vec4(barycentricABC.y(), barycentricABC.z(), 0.0f, 0.0f));
+
+ de::Random rnd(m_params.seed);
+ while (directions.size() < kNumRays)
+ {
+ // Avoid 0.0 when choosing b and c.
+ float b;
+ while ((b = rnd.getFloat()) == 0.0f)
+ ;
+ float c;
+ while ((c = rnd.getFloat(0.0f, 1.0f - b)) == 0.0f)
+ ;
+
+ expectedOutputCoordinates.push_back(tcu::Vec4(b, c, 0.0f, 0.0f));
+ directions.push_back(extendToV4(calcCoordinates(triangle, b, c)));
+ }
+
+ deMemcpy(directionsBufferData, directions.data(), directionsBufferSize);
+ flushAlloc(vkd, device, directionsBufferAlloc);
+
+ // Storage buffer for output barycentric coordinates.
+ const auto barycoordsBufferSize = static_cast<VkDeviceSize>(sizeof(tcu::Vec4) * kNumRays);
+ const auto barycoordsBufferInfo = makeBufferCreateInfo(barycoordsBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ BufferWithMemory barycoordsBuffer (vkd, device, alloc, barycoordsBufferInfo, MemoryRequirement::HostVisible);
+ auto& barycoordsBufferAlloc = barycoordsBuffer.getAllocation();
+ void* barycoordsBufferData = barycoordsBufferAlloc.getHostPtr();
+ deMemset(barycoordsBufferData, 0, static_cast<size_t>(barycoordsBufferSize));
+ flushAlloc(vkd, device, barycoordsBufferAlloc);
+
+ // Descriptor set layout.
+ DescriptorSetLayoutBuilder dsLayoutBuilder;
+ dsLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, stages);
+ dsLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, stages);
+ dsLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stages);
+ const auto setLayout = dsLayoutBuilder.build(vkd, device);
+
+ // Pipeline layout.
+ const auto pipelineLayout = makePipelineLayout(vkd, device, setLayout.get());
+
+ // Descriptor pool and set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), setLayout.get());
+
+ // Update descriptor set.
+ {
+ const VkWriteDescriptorSetAccelerationStructureKHR accelDescInfo =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
+ nullptr,
+ 1u,
+ topLevelAS.get()->getPtr(),
+ };
+ const auto uniformBufferInfo = makeDescriptorBufferInfo(directionsBuffer.get(), 0ull, VK_WHOLE_SIZE);
+ const auto storageBufferInfo = makeDescriptorBufferInfo(barycoordsBuffer.get(), 0ull, VK_WHOLE_SIZE);
+
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &accelDescInfo);
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &uniformBufferInfo);
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &storageBufferInfo);
+ updateBuilder.update(vkd, device);
+ }
+
+ // Shader module.
+ const auto compModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0);
+
+ // Pipeline.
+ const VkPipelineShaderStageCreateInfo shaderInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ compModule.get(), // VkShaderModule module;
+ "main", // const char* pName;
+ nullptr, // const VkSpecializationInfo* pSpecializationInfo;
+ };
+ const VkComputePipelineCreateInfo pipelineInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ shaderInfo, // VkPipelineShaderStageCreateInfo stage;
+ pipelineLayout.get(), // VkPipelineLayout layout;
+ DE_NULL, // VkPipeline basePipelineHandle;
+ 0, // deInt32 basePipelineIndex;
+ };
+ const auto pipeline = createComputePipeline(vkd, device, DE_NULL, &pipelineInfo);
+
+ // Dispatch work with ray queries.
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdDispatch(cmdBuffer, 1u, 1u, 1u);
+
+ // Barrier for the output buffer.
+ const auto bufferBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &bufferBarrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify results.
+ std::vector<tcu::Vec4> outputData (expectedOutputCoordinates.size());
+ const auto barycoordsBufferSizeSz = static_cast<size_t>(barycoordsBufferSize);
+
+ invalidateAlloc(vkd, device, barycoordsBufferAlloc);
+ DE_ASSERT(de::dataSize(outputData) == barycoordsBufferSizeSz);
+ deMemcpy(outputData.data(), barycoordsBufferData, barycoordsBufferSizeSz);
+
+ for (size_t i = 0; i < outputData.size(); ++i)
+ {
+ const auto& outVal = outputData[i];
+ const auto& expectedVal = expectedOutputCoordinates[i];
+
+ if (outVal.z() != 0.0f || outVal.w() != 0.0f || de::abs(outVal.x() - expectedVal.x()) > kThreshold || de::abs(outVal.y() - expectedVal.y()) > kThreshold)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected value found for ray " << i << ": expected " << expectedVal << " and found " << outVal << ";";
+ TCU_FAIL(msg.str());
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createBarycentricCoordinatesTests (tcu::TestContext& testCtx)
+{
+ using GroupPtr = de::MovePtr<tcu::TestCaseGroup>;
+
+ GroupPtr mainGroup(new tcu::TestCaseGroup(testCtx, "barycentric_coordinates", "Test barycentric coordinates reported by the ray query"));
+
+ deUint32 seed = 1614674687u;
+ mainGroup->addChild(new BarycentricCoordinatesCase(testCtx, "compute", "", TestParams{seed++}));
+
+ return mainGroup.release();
+}
+
+} // RayQuery
+} // vkt
+
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBarycentricCoordinatesTests.hpp
similarity index 66%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_query/vktRayQueryBarycentricCoordinatesTests.hpp
index 1a85ebf..77ae0f2 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBarycentricCoordinatesTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYQUERYBARYCENTRICCOORDINATESTESTS_HPP
+#define _VKTRAYQUERYBARYCENTRICCOORDINATESTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Ray Query Barycentric Coordinates Tests
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +29,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayQuery
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createBarycentricCoordinatesTests (tcu::TestContext& testCtx);
-} // pipeline
+} // RayQuery
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYQUERYBARYCENTRICCOORDINATESTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBuiltinTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBuiltinTests.cpp
index 0d1ed87..f387b4e 100644
--- a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBuiltinTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryBuiltinTests.cpp
@@ -26,6 +26,7 @@
#include "vkDefs.hpp"
#include "vktTestCase.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vktTestGroupUtil.hpp"
#include "vkCmdUtil.hpp"
#include "vkObjUtil.hpp"
@@ -40,6 +41,7 @@
#include "tcuTextureUtil.hpp"
#include "tcuTestLog.hpp"
#include "tcuImageCompare.hpp"
+#include "tcuCommandLine.hpp"
#include "vkRayTracingUtil.hpp"
@@ -105,6 +107,21 @@
struct TestParams;
+ // Similar to a subset of the test context but allows us to plug in a custom device when needed.
+ // Note TestEnvironment objects do not own the resources they point to.
+ struct TestEnvironment
+ {
+ const InstanceInterface* vki;
+ VkPhysicalDevice physicalDevice;
+ const DeviceInterface* vkd;
+ VkDevice device;
+ Allocator* allocator;
+ VkQueue queue;
+ deUint32 queueFamilyIndex;
+ BinaryCollection* binaryCollection;
+ tcu::TestLog* log;
+ };
+
typedef void (*CheckSupportFunc)(Context& context, const TestParams& testParams);
typedef void (*InitProgramsFunc)(SourceCollections& programCollection, const TestParams& testParams);
typedef const std::string(*ShaderBodyTextFunc)(const TestParams& testParams);
@@ -115,9 +132,9 @@
PipelineConfiguration() {};
virtual ~PipelineConfiguration() {};
- virtual void initConfiguration(Context& context,
+ virtual void initConfiguration(const TestEnvironment& env,
TestParams& testParams) = 0;
- virtual void fillCommandBuffer(Context& context,
+ virtual void fillCommandBuffer(const TestEnvironment& env,
TestParams& testParams,
VkCommandBuffer commandBuffer,
const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
@@ -127,49 +144,50 @@
class TestConfiguration
{
public:
- TestConfiguration()
+ TestConfiguration(Context& context)
: m_bottomAccelerationStructures()
, m_topAccelerationStructure()
, m_expected()
+ , m_testEnvironment()
{
+ prepareTestEnvironment(context);
}
virtual ~TestConfiguration()
{
}
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
- VkCommandBuffer cmdBuffer) = 0;
- virtual bool verify(BufferWithMemory* resultBuffer,
- Context& context,
- TestParams& testParams);
+ const TestEnvironment& getTestEnvironment () const;
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures (TestParams& testParams, VkCommandBuffer cmdBuffer) = 0;
+ virtual bool verify (BufferWithMemory* resultBuffer, TestParams& testParams);
protected:
+ void prepareTestEnvironment (Context& context);
+
std::vector<de::SharedPtr<BottomLevelAccelerationStructure>> m_bottomAccelerationStructures;
de::SharedPtr<TopLevelAccelerationStructure> m_topAccelerationStructure;
std::vector<deInt32> m_expected;
+ de::MovePtr<TestEnvironment> m_testEnvironment;
};
class TestConfigurationFloat : public TestConfiguration
{
public:
- TestConfigurationFloat()
- : TestConfiguration()
+ TestConfigurationFloat(Context& context)
+ : TestConfiguration(context)
{
}
virtual ~TestConfigurationFloat()
{
}
virtual bool verify(BufferWithMemory* resultBuffer,
- Context& context,
TestParams& testParams) override;
};
class TestConfigurationVector : public TestConfiguration
{
public:
- TestConfigurationVector(bool useStrictComponentMatching = true)
- : TestConfiguration(),
+ TestConfigurationVector(Context& context, bool useStrictComponentMatching = true)
+ : TestConfiguration(context),
m_useStrictComponentMatching(useStrictComponentMatching)
{
}
@@ -177,7 +195,6 @@
{
}
virtual bool verify(BufferWithMemory* resultBuffer,
- Context& context,
TestParams& testParams) override;
private:
@@ -187,15 +204,14 @@
class TestConfigurationMatrix : public TestConfiguration
{
public:
- TestConfigurationMatrix()
- : TestConfiguration()
+ TestConfigurationMatrix(Context& context)
+ : TestConfiguration(context)
{
}
virtual ~TestConfigurationMatrix()
{
}
virtual bool verify(BufferWithMemory* resultBuffer,
- Context& context,
TestParams& testParams) override;
};
@@ -365,13 +381,13 @@
GraphicsConfiguration();
virtual ~GraphicsConfiguration() {};
- void initVertexBuffer(Context& context,
+ void initVertexBuffer(const TestEnvironment& env,
TestParams& testParams);
- Move<VkPipeline> makeGraphicsPipeline(Context& context,
+ Move<VkPipeline> makeGraphicsPipeline(const TestEnvironment& env,
TestParams& testParams);
- virtual void initConfiguration(Context& context,
+ virtual void initConfiguration(const TestEnvironment& env,
TestParams& testParams) override;
- virtual void fillCommandBuffer(Context& context,
+ virtual void fillCommandBuffer(const TestEnvironment& env,
TestParams& testParams,
VkCommandBuffer commandBuffer,
const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
@@ -744,14 +760,14 @@
}
}
- void GraphicsConfiguration::initVertexBuffer(Context& context,
+ void GraphicsConfiguration::initVertexBuffer(const TestEnvironment& env,
TestParams& testParams)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
+ Allocator& allocator = *env.allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
- Allocator& allocator = context.getDefaultAllocator();
std::vector<tcu::Vec4> vertices;
switch (testParams.stage)
@@ -879,11 +895,11 @@
}
}
- Move<VkPipeline> GraphicsConfiguration::makeGraphicsPipeline(Context& context,
+ Move<VkPipeline> GraphicsConfiguration::makeGraphicsPipeline(const TestEnvironment& env,
TestParams& testParams)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
const bool tessStageTest = (testParams.stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || testParams.stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
const VkPrimitiveTopology topology = tessStageTest ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
const deUint32 patchControlPoints = tessStageTest ? 4 : 0;
@@ -906,13 +922,13 @@
patchControlPoints);
}
- void GraphicsConfiguration::initConfiguration(Context& context,
+ void GraphicsConfiguration::initConfiguration(const TestEnvironment& env,
TestParams& testParams)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
- vk::BinaryCollection& collection = context.getBinaryCollection();
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
+ Allocator& allocator = *env.allocator;
+ vk::BinaryCollection& collection = *env.binaryCollection;
VkShaderStageFlags shaders = static_cast<VkShaderStageFlags>(0);
deUint32 shaderCount = 0;
@@ -949,21 +965,21 @@
m_renderPass = makeRenderPass(vkd, device, m_framebufferFormat);
m_framebuffer = makeFramebuffer(vkd, device, *m_renderPass, *m_framebufferAttachment, testParams.width, testParams.height);
m_pipelineLayout = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
- m_pipeline = makeGraphicsPipeline(context, testParams);
+ m_pipeline = makeGraphicsPipeline(env, testParams);
- initVertexBuffer(context, testParams);
+ initVertexBuffer(env, testParams);
}
- void GraphicsConfiguration::fillCommandBuffer(Context& context,
+ void GraphicsConfiguration::fillCommandBuffer(const TestEnvironment& env,
TestParams& testParams,
VkCommandBuffer cmdBuffer,
const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
const VkDescriptorImageInfo& resultImageInfo)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkDeviceSize vertexBufferOffset = 0;
- const VkWriteDescriptorSetAccelerationStructureKHR rayQueryAccelerationStructureWriteDescriptorSet =
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
+ const VkDeviceSize vertexBufferOffset = 0;
+ const VkWriteDescriptorSetAccelerationStructureKHR rayQueryAccelerationStructureWriteDescriptorSet =
{
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -998,9 +1014,9 @@
static void initPrograms(SourceCollections& programCollection,
const TestParams& testParams);
- virtual void initConfiguration(Context& context,
+ virtual void initConfiguration(const TestEnvironment& env,
TestParams& testParams) override;
- virtual void fillCommandBuffer(Context& context,
+ virtual void fillCommandBuffer(const TestEnvironment& env,
TestParams& testParams,
VkCommandBuffer commandBuffer,
const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
@@ -1073,14 +1089,14 @@
}
}
- void ComputeConfiguration::initConfiguration(Context& context,
+ void ComputeConfiguration::initConfiguration(const TestEnvironment& env,
TestParams& testParams)
{
DE_UNREF(testParams);
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- vk::BinaryCollection& collection = context.getBinaryCollection();
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
+ vk::BinaryCollection& collection = *env.binaryCollection;
m_descriptorSetLayout = DescriptorSetLayoutBuilder()
.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
@@ -1096,15 +1112,15 @@
m_pipeline = makeComputePipeline(vkd, device, *m_pipelineLayout, *m_shaderModule);
}
- void ComputeConfiguration::fillCommandBuffer(Context& context,
+ void ComputeConfiguration::fillCommandBuffer(const TestEnvironment& env,
TestParams& testParams,
VkCommandBuffer cmdBuffer,
const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
const VkDescriptorImageInfo& resultImageInfo)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkWriteDescriptorSetAccelerationStructureKHR rayQueryAccelerationStructureWriteDescriptorSet =
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
+ const VkWriteDescriptorSetAccelerationStructureKHR rayQueryAccelerationStructureWriteDescriptorSet =
{
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, // VkStructureType sType;
DE_NULL, // const void* pNext;
@@ -1135,9 +1151,9 @@
static void initPrograms(SourceCollections& programCollection,
const TestParams& testParams);
- virtual void initConfiguration(Context& context,
+ virtual void initConfiguration(const TestEnvironment& env,
TestParams& testParams) override;
- virtual void fillCommandBuffer(Context& context,
+ virtual void fillCommandBuffer(const TestEnvironment& env,
TestParams& testParams,
VkCommandBuffer commandBuffer,
const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
@@ -1446,17 +1462,17 @@
return shaderBindingTable;
}
- void RayTracingConfiguration::initConfiguration(Context& context,
+ void RayTracingConfiguration::initConfiguration(const TestEnvironment& env,
TestParams& testParams)
{
DE_UNREF(testParams);
- const InstanceInterface& vki = context.getInstanceInterface();
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- const VkPhysicalDevice physicalDevice = context.getPhysicalDevice();
- vk::BinaryCollection& collection = context.getBinaryCollection();
- Allocator& allocator = context.getDefaultAllocator();
+ const InstanceInterface& vki = *env.vki;
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
+ const VkPhysicalDevice physicalDevice = env.physicalDevice;
+ vk::BinaryCollection& collection = *env.binaryCollection;
+ Allocator& allocator = *env.allocator;
const deUint32 shaderGroupHandleSize = getShaderGroupHandleSize(vki, physicalDevice);
const VkShaderStageFlags hitStages = VK_SHADER_STAGE_ANY_HIT_BIT_KHR | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR | VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
deUint32 shaderCount = 0;
@@ -1523,17 +1539,17 @@
m_callableShaderBindingTableRegion = m_callableShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_callableShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
}
- void RayTracingConfiguration::fillCommandBuffer(Context& context,
+ void RayTracingConfiguration::fillCommandBuffer(const TestEnvironment& env,
TestParams& testParams,
VkCommandBuffer commandBuffer,
const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
const VkDescriptorImageInfo& resultImageInfo)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
- de::MovePtr<BottomLevelAccelerationStructure> bottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
- de::MovePtr<TopLevelAccelerationStructure> topLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+ const DeviceInterface& vkd = *env.vkd;
+ const VkDevice device = env.device;
+ Allocator& allocator = *env.allocator;
+ de::MovePtr<BottomLevelAccelerationStructure> bottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+ de::MovePtr<TopLevelAccelerationStructure> topLevelAccelerationStructure = makeTopLevelAccelerationStructure();
m_bottomLevelAccelerationStructure = de::SharedPtr<BottomLevelAccelerationStructure>(bottomLevelAccelerationStructure.release());
m_bottomLevelAccelerationStructure->setDefaultGeometryData(testParams.stage);
@@ -1579,9 +1595,31 @@
testParams.width, testParams.height, 1);
}
- bool TestConfiguration::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
+ void TestConfiguration::prepareTestEnvironment (Context& context)
{
- tcu::TestLog& log = context.getTestContext().getLog();
+ // By default, all data comes from the context.
+ m_testEnvironment = de::MovePtr<TestEnvironment>(new TestEnvironment
+ {
+ &context.getInstanceInterface(), // const InstanceInterface* vki;
+ context.getPhysicalDevice(), // VkPhysicalDevice physicalDevice;
+ &context.getDeviceInterface(), // const DeviceInterface* vkd;
+ context.getDevice(), // VkDevice device;
+ &context.getDefaultAllocator(), // Allocator* allocator;
+ context.getUniversalQueue(), // VkQueue queue;
+ context.getUniversalQueueFamilyIndex(), // deUint32 queueFamilyIndex;
+ &context.getBinaryCollection(), // BinaryCollection* binaryCollection;
+ &context.getTestContext().getLog(), // tcu::TestLog* log;
+ });
+ }
+
+ const TestEnvironment& TestConfiguration::getTestEnvironment () const
+ {
+ return *m_testEnvironment;
+ }
+
+ bool TestConfiguration::verify(BufferWithMemory* resultBuffer, TestParams& testParams)
+ {
+ tcu::TestLog& log = *(m_testEnvironment->log);
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deInt32* resultPtr = (deInt32*)resultBuffer->getAllocation().getHostPtr();
@@ -1631,9 +1669,9 @@
return (failures == 0);
}
- bool TestConfigurationFloat::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
+ bool TestConfigurationFloat::verify(BufferWithMemory* resultBuffer, TestParams& testParams)
{
- tcu::TestLog& log = context.getTestContext().getLog();
+ tcu::TestLog& log = *(m_testEnvironment->log);
const float eps = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
@@ -1690,9 +1728,9 @@
return (failures == 0);
}
- bool TestConfigurationVector::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
+ bool TestConfigurationVector::verify(BufferWithMemory* resultBuffer, TestParams& testParams)
{
- tcu::TestLog& log = context.getTestContext().getLog();
+ tcu::TestLog& log = *(m_testEnvironment->log);
const float eps = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
@@ -1812,9 +1850,9 @@
return failures == 0;
}
- bool TestConfigurationMatrix::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
+ bool TestConfigurationMatrix::verify(BufferWithMemory* resultBuffer, TestParams& testParams)
{
- tcu::TestLog& log = context.getTestContext().getLog();
+ tcu::TestLog& log = *(m_testEnvironment->log);
const float eps = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
@@ -1884,20 +1922,20 @@
class TestConfigurationFlow : public TestConfiguration
{
public:
+ TestConfigurationFlow (Context& context) : TestConfiguration(context) {}
+
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationFlow::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationFlow::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -2042,20 +2080,19 @@
class TestConfigurationPrimitiveId : public TestConfiguration
{
public:
+ TestConfigurationPrimitiveId (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationPrimitiveId::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationPrimitiveId::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -2204,18 +2241,18 @@
class TestConfigurationGetRayTMin : public TestConfiguration
{
public:
+ TestConfigurationGetRayTMin (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetRayTMin::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetRayTMin::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -2328,18 +2365,18 @@
class TestConfigurationGetWorldRayOrigin : public TestConfigurationVector
{
public:
+ TestConfigurationGetWorldRayOrigin (Context& context) : TestConfigurationVector(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetWorldRayOrigin::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetWorldRayOrigin::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -2481,18 +2518,18 @@
class TestConfigurationGetWorldRayDirection : public TestConfigurationVector
{
public:
+ TestConfigurationGetWorldRayDirection (Context& context) : TestConfigurationVector(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetWorldRayDirection::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetWorldRayDirection::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -2639,20 +2676,19 @@
class TestConfigurationInstanceId : public TestConfiguration
{
public:
+ TestConfigurationInstanceId (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationInstanceId::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationInstanceId::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -2801,20 +2837,19 @@
class TestConfigurationInstanceCustomIndex : public TestConfiguration
{
public:
+ TestConfigurationInstanceCustomIndex (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationInstanceCustomIndex::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationInstanceCustomIndex::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -2963,20 +2998,19 @@
class TestConfigurationIntersectionT : public TestConfigurationFloat
{
public:
+ TestConfigurationIntersectionT (Context& context) : TestConfigurationFloat(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationIntersectionT::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationIntersectionT::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const bool triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
@@ -3130,20 +3164,19 @@
class TestConfigurationObjectRayOrigin : public TestConfigurationVector
{
public:
+ TestConfigurationObjectRayOrigin (Context& context) : TestConfigurationVector(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationObjectRayOrigin::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationObjectRayOrigin::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 depth = testParams.depth;
@@ -3311,20 +3344,19 @@
class TestConfigurationObjectRayDirection : public TestConfigurationVector
{
public:
+ TestConfigurationObjectRayDirection (Context& context) : TestConfigurationVector(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationObjectRayDirection::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationObjectRayDirection::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 depth = testParams.depth;
@@ -3492,20 +3524,19 @@
class TestConfigurationObjectToWorld : public TestConfigurationMatrix
{
public:
+ TestConfigurationObjectToWorld (Context& context) : TestConfigurationMatrix(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationObjectToWorld::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationObjectToWorld::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const bool triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
@@ -3709,20 +3740,19 @@
class TestConfigurationWorldToObject : public TestConfigurationMatrix
{
public:
+ TestConfigurationWorldToObject (Context& context) : TestConfigurationMatrix(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationWorldToObject::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationWorldToObject::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const bool triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
@@ -3926,35 +3956,39 @@
class TestConfigurationNullASStruct : public TestConfiguration
{
public:
- TestConfigurationNullASStruct();
+ TestConfigurationNullASStruct(Context& context);
~TestConfigurationNullASStruct();
- static const std::string getShaderBodyText(const TestParams& testParams);
- static void checkSupport(Context& context,
- const TestParams& testParams);
+ static const std::string getShaderBodyText (const TestParams& testParams);
+ static void checkSupport (Context& context, const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
- VkCommandBuffer cmdBuffer) override;
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures (TestParams& testParams, VkCommandBuffer cmdBuffer) override;
protected:
+ void prepareTestEnvironment (Context& context);
Move<VkAccelerationStructureKHR> m_emptyAccelerationStructure;
+
+ Move<VkDevice> m_device;
+ de::MovePtr<DeviceDriver> m_vkd;
+ de::MovePtr<SimpleAllocator> m_allocator;
};
- TestConfigurationNullASStruct::TestConfigurationNullASStruct()
- : TestConfiguration()
+ TestConfigurationNullASStruct::TestConfigurationNullASStruct(Context& context)
+ : TestConfiguration(context)
, m_emptyAccelerationStructure()
+ , m_device()
+ , m_vkd()
+ , m_allocator()
{
+ prepareTestEnvironment(context);
}
TestConfigurationNullASStruct::~TestConfigurationNullASStruct()
{
}
- const VkAccelerationStructureKHR* TestConfigurationNullASStruct::initAccelerationStructures(Context& context,
- TestParams& testParams,
+ const VkAccelerationStructureKHR* TestConfigurationNullASStruct::initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer)
{
- DE_UNREF(context);
DE_UNREF(cmdBuffer);
m_expected = std::vector<deInt32>(testParams.width * testParams.height, 1);
@@ -3967,12 +4001,136 @@
{
DE_UNREF(testParams);
- context.requireDeviceFunctionality("VK_EXT_robustness2");
+ // Check if the physical device supports VK_EXT_robustness2 and the nullDescriptor feature.
+ const auto& vki = context.getInstanceInterface();
+ const auto physicalDevice = context.getPhysicalDevice();
+ const auto supportedExtensions = enumerateDeviceExtensionProperties(vki, physicalDevice, nullptr);
- const vk::VkPhysicalDeviceRobustness2FeaturesEXT& robustness2FeaturesEXT = context.getRobustness2FeaturesEXT();
+ if (!isExtensionSupported(supportedExtensions, RequiredExtension("VK_EXT_robustness2")))
+ TCU_THROW(NotSupportedError, "VK_EXT_robustness2 not supported");
- if (!robustness2FeaturesEXT.nullDescriptor)
- TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRobustness2FeaturesEXT::nullDescriptor");
+ VkPhysicalDeviceRobustness2FeaturesEXT robustness2Features = initVulkanStructure();
+ VkPhysicalDeviceFeatures2 features2 = initVulkanStructure(&robustness2Features);
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &features2);
+ if (!robustness2Features.nullDescriptor)
+ TCU_THROW(NotSupportedError, "VkPhysicalDeviceRobustness2FeaturesEXT::nullDescriptor not supported");
+ }
+
+ void TestConfigurationNullASStruct::prepareTestEnvironment (Context& context)
+ {
+ // Check if the physical device supports VK_EXT_robustness2 and the nullDescriptor feature.
+ const auto& vkp = context.getPlatformInterface();
+ const auto& vki = context.getInstanceInterface();
+ const auto instance = context.getInstance();
+ const auto physicalDevice = context.getPhysicalDevice();
+ const auto supportedExtensions = enumerateDeviceExtensionProperties(vki, physicalDevice, nullptr);
+ const auto queueFamilyIndex = context.getUniversalQueueFamilyIndex();
+ const auto queuePriority = 1.0f;
+ bool accelStructSupport = false;
+
+ // Add anything that's supported and may be needed, including nullDescriptor.
+ VkPhysicalDeviceFeatures2 features2 = initVulkanStructure();
+ VkPhysicalDeviceBufferDeviceAddressFeaturesKHR deviceAddressFeatures = initVulkanStructure();
+ VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = initVulkanStructure();
+ VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures = initVulkanStructure();
+ VkPhysicalDeviceRayTracingPipelineFeaturesKHR raytracingPipelineFeatures = initVulkanStructure();
+ VkPhysicalDeviceRobustness2FeaturesEXT robustness2Features = initVulkanStructure();
+ std::vector<const char*> deviceExtensions;
+
+ if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_KHR_deferred_host_operations")))
+ {
+ deviceExtensions.push_back("VK_KHR_deferred_host_operations");
+ }
+
+ if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_KHR_buffer_device_address")))
+ {
+ deviceAddressFeatures.pNext = features2.pNext;
+ features2.pNext = &deviceAddressFeatures;
+ deviceExtensions.push_back("VK_KHR_buffer_device_address");
+ }
+
+ if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_KHR_acceleration_structure")))
+ {
+ accelerationStructureFeatures.pNext = features2.pNext;
+ features2.pNext = &accelerationStructureFeatures;
+ deviceExtensions.push_back("VK_KHR_acceleration_structure");
+ accelStructSupport = true;
+ }
+
+ if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_KHR_ray_query")))
+ {
+ rayQueryFeatures.pNext = features2.pNext;
+ features2.pNext = &rayQueryFeatures;
+ deviceExtensions.push_back("VK_KHR_ray_query");
+ }
+
+ if (isExtensionSupported(supportedExtensions, RequiredExtension("VK_KHR_ray_tracing_pipeline")))
+ {
+ raytracingPipelineFeatures.pNext = features2.pNext;
+ features2.pNext = &raytracingPipelineFeatures;
+ deviceExtensions.push_back("VK_KHR_ray_tracing_pipeline");
+ }
+
+ vki.getPhysicalDeviceFeatures2(physicalDevice, &features2);
+
+ // Add robustness2 features to the chain and make sure robustBufferAccess is consistent with robustBufferAccess2.
+ features2.features.robustBufferAccess = VK_FALSE;
+ robustness2Features.nullDescriptor = VK_TRUE;
+ robustness2Features.pNext = features2.pNext;
+ features2.pNext = &robustness2Features;
+
+ // Add more needed extensions.
+ deviceExtensions.push_back("VK_EXT_robustness2");
+ if (accelStructSupport)
+ {
+ // Not promoted yet in Vulkan 1.1.
+ deviceExtensions.push_back("VK_EXT_descriptor_indexing");
+ deviceExtensions.push_back("VK_KHR_spirv_1_4");
+ deviceExtensions.push_back("VK_KHR_shader_float_controls");
+ }
+
+ const VkDeviceQueueCreateInfo queueInfo =
+ {
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkDeviceQueueCreateFlags flags;
+ queueFamilyIndex, // deUint32 queueFamilyIndex;
+ 1u, // deUint32 queueCount;
+ &queuePriority, // const float* pQueuePriorities;
+ };
+
+ const VkDeviceCreateInfo createInfo =
+ {
+ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // VkStructureType sType;
+ features2.pNext, // const void* pNext;
+ 0u, // VkDeviceCreateFlags flags;
+ 1u, // deUint32 queueCreateInfoCount;
+ &queueInfo, // const VkDeviceQueueCreateInfo* pQueueCreateInfos;
+ 0u, // deUint32 enabledLayerCount;
+ nullptr, // const char* const* ppEnabledLayerNames;
+ static_cast<deUint32>(deviceExtensions.size()), // deUint32 enabledExtensionCount;
+ deviceExtensions.data(), // const char* const* ppEnabledExtensionNames;
+ &features2.features, // const VkPhysicalDeviceFeatures* pEnabledFeatures;
+ };
+
+ m_device = createCustomDevice(context.getTestContext().getCommandLine().isValidationEnabled(), vkp, instance, vki, physicalDevice, &createInfo);
+ m_vkd = de::MovePtr<DeviceDriver>(new DeviceDriver(vkp, instance, m_device.get()));
+ const auto queue = getDeviceQueue(*m_vkd, *m_device, queueFamilyIndex, 0u);
+ m_allocator = de::MovePtr<SimpleAllocator>(new SimpleAllocator(*m_vkd, m_device.get(), getPhysicalDeviceMemoryProperties(vki, physicalDevice)));
+
+ m_testEnvironment = de::MovePtr<TestEnvironment>(new TestEnvironment
+ {
+ &vki, // const InstanceInterface* vki;
+ physicalDevice, // VkPhysicalDevice physicalDevice;
+ m_vkd.get(), // const DeviceInterface* vkd;
+ m_device.get(), // VkDevice device;
+ m_allocator.get(), // Allocator* allocator;
+ queue, // VkQueue queue;
+ queueFamilyIndex, // deUint32 queueFamilyIndex;
+ &context.getBinaryCollection(), // BinaryCollection* binaryCollection;
+ &context.getTestContext().getLog(), // tcu::TestLog* log;
+ });
}
const std::string TestConfigurationNullASStruct::getShaderBodyText(const TestParams& testParams)
@@ -4006,18 +4164,18 @@
class TestConfigurationGetIntersectionCandidateAABBOpaque : public TestConfiguration
{
public:
+ TestConfigurationGetIntersectionCandidateAABBOpaque (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetIntersectionCandidateAABBOpaque::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetIntersectionCandidateAABBOpaque::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -4133,19 +4291,19 @@
class TestConfigurationGetIntersectionFrontFace : public TestConfiguration
{
public:
+ TestConfigurationGetIntersectionFrontFace (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyTextCandidate(const TestParams& testParams);
static const std::string getShaderBodyTextCommitted(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetIntersectionFrontFace::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetIntersectionFrontFace::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -4298,19 +4456,19 @@
class TestConfigurationGetIntersectionGeometryIndex : public TestConfiguration
{
public:
+ TestConfigurationGetIntersectionGeometryIndex (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyTextCandidate(const TestParams& testParams);
static const std::string getShaderBodyTextCommitted(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetIntersectionGeometryIndex::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetIntersectionGeometryIndex::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -4463,8 +4621,8 @@
class TestConfigurationGetIntersectionBarycentrics : public TestConfigurationVector
{
public:
- TestConfigurationGetIntersectionBarycentrics()
- : TestConfigurationVector(false)
+ TestConfigurationGetIntersectionBarycentrics(Context& context)
+ : TestConfigurationVector(context, false)
{
/* Stub */
}
@@ -4472,16 +4630,15 @@
static const std::string getShaderBodyTextCandidate(const TestParams& testParams);
static const std::string getShaderBodyTextCommitted(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetIntersectionBarycentrics::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetIntersectionBarycentrics::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -4663,19 +4820,19 @@
class TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset : public TestConfiguration
{
public:
+ TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyTextCandidate(const TestParams& testParams);
static const std::string getShaderBodyTextCommitted(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -4825,10 +4982,10 @@
class TestConfigurationRayQueryTerminate: public TestConfiguration
{
public:
+ TestConfigurationRayQueryTerminate (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyText(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
private:
@@ -4837,11 +4994,11 @@
const deUint32 TestConfigurationRayQueryTerminate::N_RAY_QUERIES_TO_USE = 8;
- const VkAccelerationStructureKHR* TestConfigurationRayQueryTerminate::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationRayQueryTerminate::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -5005,19 +5162,19 @@
class TestConfigurationGetIntersectionType : public TestConfiguration
{
public:
+ TestConfigurationGetIntersectionType (Context& context) : TestConfiguration(context) {}
static const std::string getShaderBodyTextCandidate(const TestParams& testParams);
static const std::string getShaderBodyTextCommitted(const TestParams& testParams);
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
};
- const VkAccelerationStructureKHR* TestConfigurationGetIntersectionType::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationGetIntersectionType::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -5191,18 +5348,18 @@
class TestConfigurationUsingWrapperFunction : public TestConfiguration
{
public:
- virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
- TestParams& testParams,
+ TestConfigurationUsingWrapperFunction (Context& context) : TestConfiguration(context) {}
+ virtual const VkAccelerationStructureKHR* initAccelerationStructures(TestParams& testParams,
VkCommandBuffer cmdBuffer) override;
static const std::string getShaderBodyText(const TestParams& testParams);
};
- const VkAccelerationStructureKHR* TestConfigurationUsingWrapperFunction::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+ const VkAccelerationStructureKHR* TestConfigurationUsingWrapperFunction::initAccelerationStructures(TestParams& testParams, VkCommandBuffer cmdBuffer)
{
- const DeviceInterface& vkd = context.getDeviceInterface();
- const VkDevice device = context.getDevice();
- Allocator& allocator = context.getDefaultAllocator();
+ const DeviceInterface& vkd = *m_testEnvironment->vkd;
+ const VkDevice device = m_testEnvironment->device;
+ Allocator& allocator = *m_testEnvironment->allocator;
const deUint32 width = testParams.width;
const deUint32 height = testParams.height;
const deUint32 instancesGroupCount = testParams.instancesGroupCount;
@@ -5462,32 +5619,32 @@
{
switch (m_data.testType)
{
- case TEST_TYPE_FLOW: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationFlow()); break;
- case TEST_TYPE_PRIMITIVE_ID: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationPrimitiveId()); break;
- case TEST_TYPE_INSTANCE_ID: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceId()); break;
- case TEST_TYPE_INSTANCE_CUSTOM_INDEX: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceCustomIndex()); break;
- case TEST_TYPE_INTERSECTION_T_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationIntersectionT()); break;
- case TEST_TYPE_OBJECT_RAY_ORIGIN_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayOrigin()); break;
- case TEST_TYPE_OBJECT_RAY_DIRECTION_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayDirection()); break;
- case TEST_TYPE_OBJECT_TO_WORLD_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectToWorld()); break;
- case TEST_TYPE_WORLD_TO_OBJECT_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationWorldToObject()); break;
- case TEST_TYPE_NULL_ACCELERATION_STRUCTURE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationNullASStruct()); break;
- case TEST_TYPE_USING_WRAPPER_FUNCTION: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationUsingWrapperFunction()); break;
- case TEST_TYPE_GET_RAY_TMIN: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetRayTMin()); break;
- case TEST_TYPE_GET_WORLD_RAY_ORIGIN: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetWorldRayOrigin()); break;
- case TEST_TYPE_GET_WORLD_RAY_DIRECTION: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetWorldRayDirection()); break;
- case TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionCandidateAABBOpaque()); break;
- case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionFrontFace()); break;
- case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionFrontFace()); break;
- case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionGeometryIndex()); break;
- case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionGeometryIndex()); break;
- case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionBarycentrics()); break;
- case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionBarycentrics()); break;
- case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset()); break;
- case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset()); break;
- case TEST_TYPE_RAY_QUERY_TERMINATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationRayQueryTerminate()); break;
- case TEST_TYPE_GET_INTERSECTION_TYPE_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionType()); break;
- case TEST_TYPE_GET_INTERSECTION_TYPE_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionType()); break;
+ case TEST_TYPE_FLOW: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationFlow(context)); break;
+ case TEST_TYPE_PRIMITIVE_ID: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationPrimitiveId(context)); break;
+ case TEST_TYPE_INSTANCE_ID: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceId(context)); break;
+ case TEST_TYPE_INSTANCE_CUSTOM_INDEX: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceCustomIndex(context)); break;
+ case TEST_TYPE_INTERSECTION_T_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationIntersectionT(context)); break;
+ case TEST_TYPE_OBJECT_RAY_ORIGIN_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayOrigin(context)); break;
+ case TEST_TYPE_OBJECT_RAY_DIRECTION_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayDirection(context)); break;
+ case TEST_TYPE_OBJECT_TO_WORLD_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectToWorld(context)); break;
+ case TEST_TYPE_WORLD_TO_OBJECT_KHR: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationWorldToObject(context)); break;
+ case TEST_TYPE_NULL_ACCELERATION_STRUCTURE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationNullASStruct(context)); break;
+ case TEST_TYPE_USING_WRAPPER_FUNCTION: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationUsingWrapperFunction(context)); break;
+ case TEST_TYPE_GET_RAY_TMIN: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetRayTMin(context)); break;
+ case TEST_TYPE_GET_WORLD_RAY_ORIGIN: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetWorldRayOrigin(context)); break;
+ case TEST_TYPE_GET_WORLD_RAY_DIRECTION: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetWorldRayDirection(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionCandidateAABBOpaque(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionFrontFace(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionFrontFace(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionGeometryIndex(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionGeometryIndex(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionBarycentrics(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionBarycentrics(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset(context)); break;
+ case TEST_TYPE_RAY_QUERY_TERMINATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationRayQueryTerminate(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_TYPE_CANDIDATE: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionType(context)); break;
+ case TEST_TYPE_GET_INTERSECTION_TYPE_COMMITTED: m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionType(context)); break;
default: TCU_THROW(InternalError, "Unknown test type");
}
@@ -5532,11 +5689,12 @@
tcu::TestStatus RayQueryBuiltinTestInstance::iterate (void)
{
- const DeviceInterface& vkd = m_context.getDeviceInterface();
- const VkDevice device = m_context.getDevice();
- const VkQueue queue = m_context.getUniversalQueue();
- Allocator& allocator = m_context.getDefaultAllocator();
- const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const TestEnvironment& testEnv = m_testConfig->getTestEnvironment();
+ const DeviceInterface& vkd = *testEnv.vkd;
+ const VkDevice device = testEnv.device;
+ const VkQueue queue = testEnv.queue;
+ Allocator& allocator = *testEnv.allocator;
+ const deUint32 queueFamilyIndex = testEnv.queueFamilyIndex;
const deUint32 width = m_data.width;
const deUint32 height = m_data.height;
@@ -5558,7 +5716,7 @@
const Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
const VkAccelerationStructureKHR* topAccelerationStructurePtr = DE_NULL;
- m_pipelineConfig->initConfiguration(m_context, m_data);
+ m_pipelineConfig->initConfiguration(testEnv, m_data);
beginCommandBuffer(vkd, *cmdBuffer, 0u);
{
@@ -5572,9 +5730,9 @@
vkd.cmdClearColorImage(*cmdBuffer, **image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue.color, 1, &imageSubresourceRange);
cmdPipelineImageMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, &postImageBarrier);
- topAccelerationStructurePtr = m_testConfig->initAccelerationStructures(m_context, m_data, *cmdBuffer);
+ topAccelerationStructurePtr = m_testConfig->initAccelerationStructures(m_data, *cmdBuffer);
- m_pipelineConfig->fillCommandBuffer(m_context, m_data, *cmdBuffer, topAccelerationStructurePtr, resultImageInfo);
+ m_pipelineConfig->fillCommandBuffer(testEnv, m_data, *cmdBuffer, topAccelerationStructurePtr, resultImageInfo);
cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &postTestMemoryBarrier);
@@ -5588,7 +5746,7 @@
invalidateMappedMemoryRange(vkd, device, resultBuffer->getAllocation().getMemory(), resultBuffer->getAllocation().getOffset(), VK_WHOLE_SIZE);
- if (m_testConfig->verify(resultBuffer.get(), m_context, m_data))
+ if (m_testConfig->verify(resultBuffer.get(), m_data))
return tcu::TestStatus::pass("Pass");
else
return tcu::TestStatus::fail("Fail");
@@ -5602,7 +5760,7 @@
virtual void checkSupport(Context& context) const;
virtual void initPrograms(SourceCollections& programCollection) const;
- virtual TestInstance* createInstance(Context& context) const;
+ virtual TestInstance* createInstance(Context& context) const;
private:
TestParams m_data;
diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.cpp
new file mode 100644
index 0000000..359510b
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.cpp
@@ -0,0 +1,515 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
+ *
+ * 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 Ray Query Direction Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktRayQueryDirectionTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkObjUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkRayTracingUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkBarrierUtil.hpp"
+
+#include "tcuVector.hpp"
+#include "tcuMatrix.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deRandom.hpp"
+#include "deStringUtil.hpp"
+#include "deDefs.hpp"
+
+#include <vector>
+#include <cmath>
+#include <sstream>
+#include <utility>
+#include <algorithm>
+#include <limits>
+
+namespace vkt
+{
+namespace RayQuery
+{
+
+namespace
+{
+
+using namespace vk;
+
+using GeometryData = std::vector<tcu::Vec3>;
+
+struct SpaceObjects
+{
+ tcu::Vec3 origin;
+ tcu::Vec3 direction;
+ GeometryData geometry;
+
+ SpaceObjects (VkGeometryTypeKHR geometryType)
+ : origin (0.0f, 0.0f, 1.0f) // Origin of the ray at (0, 0, 1).
+ , direction (0.0f, 0.0f, 1.0f) // Shooting towards (0, 0, 1).
+ , geometry ()
+ {
+ // Triangle or AABB around (0, 0, 5).
+ DE_ASSERT(geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR || geometryType == VK_GEOMETRY_TYPE_AABBS_KHR);
+ if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR)
+ {
+ geometry.reserve(3u);
+ geometry.push_back(tcu::Vec3( 0.0f, 0.5f, 5.0f));
+ geometry.push_back(tcu::Vec3(-0.5f, -0.5f, 5.0f));
+ geometry.push_back(tcu::Vec3( 0.5f, -0.5f, 5.0f));
+ }
+ else
+ {
+ geometry.reserve(2u);
+ geometry.push_back(tcu::Vec3(-0.5f, -0.5f, 5.0f));
+ geometry.push_back(tcu::Vec3( 0.5f, 0.5f, 5.0f));
+ }
+ }
+
+ static float getDefaultDistance (void)
+ {
+ // Consistent with the Z coordinates of the origin, direction and points in the default constructor.
+ return 4.0f;
+ }
+
+ // Calculates expected distance given the direction scaling factor.
+ static float getExpectedDistance (float directionScale)
+ {
+ return getDefaultDistance() / directionScale;
+ }
+};
+
+// Default test tolerance for distance values.
+constexpr float kDefaultTolerance = 0.001f;
+
+// Calculates appropriate values for Tmin/Tmax given the expected distance.
+std::pair<float, float> calcTminTmax (float expectedDistance)
+{
+ const auto margin = kDefaultTolerance / 2.0f;
+ return std::make_pair(de::max(expectedDistance - margin, 0.0f), expectedDistance + margin);
+}
+
+// Get matrix to scale a point with the given scale factor.
+tcu::Mat3 getScaleMatrix (float scaleFactor)
+{
+ const float scaleDirectionMatrixData[] =
+ {
+ scaleFactor, 0.f, 0.f,
+ 0.f, scaleFactor, 0.f,
+ 0.f, 0.f, scaleFactor,
+ };
+ return tcu::Mat3(scaleDirectionMatrixData);
+}
+
+// Get a matrix to rotate a point around the X and Y axis by the given angles in radians.
+tcu::Mat3 getRotationMatrix (float rotationX, float rotationY)
+{
+ const float cosA = std::cos(rotationX);
+ const float sinA = std::sin(rotationX);
+
+ const float cosB = std::cos(rotationY);
+ const float sinB = std::sin(rotationY);
+
+ const float rotationMatrixDataX[] =
+ {
+ 1.0f, 0.0f, 0.0f,
+ 0.0f, cosA,-sinA,
+ 0.0f, sinA, cosA,
+ };
+ const tcu::Mat3 rotationMatrixX (rotationMatrixDataX);
+
+ const float rotationMatrixDataY[] =
+ {
+ cosB, 0.0f,-sinB,
+ 0.0f, 1.0f, 0.0f,
+ sinB, 0.0f, cosB,
+ };
+ const tcu::Mat3 rotationMatrixY (rotationMatrixDataY);
+
+ return rotationMatrixX * rotationMatrixY;
+}
+
+// Converts transformation matrix to the expected KHR format.
+VkTransformMatrixKHR toTransformMatrixKHR (const tcu::Mat3& mat3)
+{
+ VkTransformMatrixKHR result;
+
+ deMemset(result.matrix, 0, sizeof(result.matrix));
+ for (int y = 0; y < 3; ++y)
+ for (int x = 0; x < 3; ++x)
+ result.matrix[x][y] = mat3[x][y];
+
+ return result;
+}
+
+struct TestParams
+{
+ SpaceObjects spaceObjects;
+ float directionScale;
+ float rotationX;
+ float rotationY;
+ VkGeometryTypeKHR geometryType;
+};
+
+class DirectionTestCase : public vkt::TestCase
+{
+public:
+ DirectionTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~DirectionTestCase (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+protected:
+ TestParams m_params;
+};
+
+class DirectionTestInstance : public vkt::TestInstance
+{
+public:
+ DirectionTestInstance (Context& context, const TestParams& params);
+ virtual ~DirectionTestInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ TestParams m_params;
+};
+
+
+DirectionTestCase::DirectionTestCase(tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+void DirectionTestCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_query");
+}
+
+// Push constants. They need to match the shaders.
+// Note: origin and direction will be used as a Vec3. Declaring them as Vec4 eases matching alignments.
+struct PushConstants
+{
+ tcu::Vec4 origin;
+ tcu::Vec4 direction;
+ float tmix;
+ float tmax;
+};
+
+tcu::Vec4 toVec4 (const tcu::Vec3& vec3)
+{
+ return tcu::Vec4(vec3.x(), vec3.y(), vec3.z(), 0.0f);
+}
+
+void DirectionTestCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ std::ostringstream comp;
+ comp
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_query : require\n"
+ << "\n"
+ << "layout(local_size_x=1, local_size_y=1, local_size_z=1) in;\n"
+ << "\n"
+ << "layout(set=0, binding=0) uniform accelerationStructureEXT topLevelAS;\n"
+ << "layout(set=0, binding=1, std430) buffer OutBuffer { float val; } outBuffer;\n"
+ // Needs to match the PushConstants struct above.
+ << "layout(push_constant, std430) uniform PushConstants {\n"
+ << " vec4 origin;\n"
+ << " vec4 direction;\n"
+ << " float tmin;\n"
+ << " float tmax;\n"
+ << "} pc;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint cullMask = 0xFF;\n"
+ << " float outVal = -10000.0f;\n"
+ << " rayQueryEXT rq;\n"
+ << " rayQueryInitializeEXT(rq, topLevelAS, gl_RayFlagsNoneEXT, cullMask, pc.origin.xyz, pc.tmin, pc.direction.xyz, pc.tmax);\n"
+ << " while (rayQueryProceedEXT(rq)) {\n"
+ << " const uint candidateType = rayQueryGetIntersectionTypeEXT(rq, false);\n"
+ << " if (candidateType == gl_RayQueryCandidateIntersectionTriangleEXT) {\n"
+ << " outVal = rayQueryGetIntersectionTEXT(rq, false);\n"
+ << " }\n"
+ << " else if (candidateType == gl_RayQueryCandidateIntersectionAABBEXT) {\n"
+ << " outVal = pc.tmax;\n"
+ << " }\n"
+ << " }\n"
+ << " outBuffer.val = outVal;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("comp") << glu::ComputeSource(updateRayTracingGLSL(comp.str())) << buildOptions;
+}
+
+TestInstance* DirectionTestCase::createInstance (Context& context) const
+{
+ return new DirectionTestInstance(context, m_params);
+}
+
+DirectionTestInstance::DirectionTestInstance (Context& context, const TestParams& params)
+ : vkt::TestInstance (context)
+ , m_params (params)
+{}
+
+tcu::TestStatus DirectionTestInstance::iterate (void)
+{
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+ const auto stages = VK_SHADER_STAGE_COMPUTE_BIT;
+ const auto pcSize = static_cast<deUint32>(sizeof(PushConstants));
+
+ const auto scaleMatrix = getScaleMatrix(m_params.directionScale);
+ const auto rotationMatrix = getRotationMatrix(m_params.rotationX, m_params.rotationY);
+ const auto transformMatrix = toTransformMatrixKHR(rotationMatrix);
+
+ // Command pool and buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Build acceleration structures.
+ auto topLevelAS = makeTopLevelAccelerationStructure();
+ auto bottomLevelAS = makeBottomLevelAccelerationStructure();
+
+ const bool isTriangles = (m_params.geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR);
+ const VkGeometryInstanceFlagsKHR instanceFlags = (isTriangles ? VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR : 0);
+
+ bottomLevelAS->addGeometry(m_params.spaceObjects.geometry, isTriangles, VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR);
+ bottomLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> blasSharedPtr (bottomLevelAS.release());
+ topLevelAS->setInstanceCount(1);
+ topLevelAS->addInstance(blasSharedPtr, transformMatrix, 0, 0xFFu, 0u, instanceFlags);
+ topLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ // Create output buffer.
+ const auto bufferSize = static_cast<VkDeviceSize>(sizeof(float));
+ const auto bufferCreateInfo = makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ BufferWithMemory buffer (vkd, device, alloc, bufferCreateInfo, MemoryRequirement::HostVisible);
+ auto& bufferAlloc = buffer.getAllocation();
+
+ // Fill output buffer with an initial value.
+ deMemset(bufferAlloc.getHostPtr(), 0, sizeof(float));
+ flushAlloc(vkd, device, bufferAlloc);
+
+ // Descriptor set layout and pipeline layout.
+ DescriptorSetLayoutBuilder setLayoutBuilder;
+ setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, stages);
+ setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stages);
+ const auto setLayout = setLayoutBuilder.build(vkd, device);
+
+ const auto pcRange = makePushConstantRange(stages, 0u, pcSize);
+ const auto pipelineLayout = makePipelineLayout(vkd, device, 1u, &setLayout.get(), 1u, &pcRange);
+
+ // Descriptor pool and set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u);
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), setLayout.get());
+
+ // Update descriptor set.
+ {
+ const VkWriteDescriptorSetAccelerationStructureKHR accelDescInfo =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
+ nullptr,
+ 1u,
+ topLevelAS.get()->getPtr(),
+ };
+
+ const auto bufferDescInfo = makeDescriptorBufferInfo(buffer.get(), 0ull, VK_WHOLE_SIZE);
+
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &accelDescInfo);
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &bufferDescInfo);
+ updateBuilder.update(vkd, device);
+ }
+
+ // Shader module and pipeline.
+ const auto compModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0);
+
+ const VkPipelineShaderStageCreateInfo shaderInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage;
+ compModule.get(), // VkShaderModule module;
+ "main", // const char* pName;
+ nullptr, // const VkSpecializationInfo* pSpecializationInfo;
+ };
+ const VkComputePipelineCreateInfo pipelineInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ shaderInfo, // VkPipelineShaderStageCreateInfo stage;
+ pipelineLayout.get(), // VkPipelineLayout layout;
+ DE_NULL, // VkPipeline basePipelineHandle;
+ 0, // deInt32 basePipelineIndex;
+ };
+ const auto pipeline = createComputePipeline(vkd, device, DE_NULL, &pipelineInfo);
+
+ // Push constants.
+ const auto rotatedOrigin = m_params.spaceObjects.origin * rotationMatrix;
+ const auto finalDirection = m_params.spaceObjects.direction * scaleMatrix * rotationMatrix;
+ const auto expectedDistance = SpaceObjects::getExpectedDistance(m_params.directionScale);
+ const auto tMinMax = calcTminTmax(expectedDistance);
+ const PushConstants pcData =
+ {
+ toVec4(rotatedOrigin), // tcu::Vec4 origin;
+ toVec4(finalDirection), // tcu::Vec4 direction;
+ tMinMax.first, // float tmix;
+ tMinMax.second, // float tmax;
+ };
+
+ // Trace rays.
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdPushConstants(cmdBuffer, pipelineLayout.get(), stages, 0u, pcSize, &pcData);
+ vkd.cmdDispatch(cmdBuffer, 1u, 1u, 1u);
+
+ // Barrier for the output buffer.
+ const auto bufferBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &bufferBarrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Read value back from the buffer.
+ float bufferValue = 0.0f;
+ invalidateAlloc(vkd, device, bufferAlloc);
+ deMemcpy(&bufferValue, bufferAlloc.getHostPtr(), sizeof(bufferValue));
+
+ if (de::abs(bufferValue - expectedDistance) > kDefaultTolerance)
+ {
+ std::ostringstream msg;
+ msg << "Result distance (" << bufferValue << ") differs from expected distance (" << expectedDistance << ", tolerance " << kDefaultTolerance << ")";
+ TCU_FAIL(msg.str());
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createDirectionTests(tcu::TestContext& testCtx)
+{
+ using GroupPtr = de::MovePtr<tcu::TestCaseGroup>;
+
+ GroupPtr directionGroup (new tcu::TestCaseGroup(testCtx, "direction_length", "Test direction vector length when using ray queries"));
+
+ struct
+ {
+ VkGeometryTypeKHR geometryType;
+ const char* name;
+ } geometryTypes[] =
+ {
+ { VK_GEOMETRY_TYPE_TRIANGLES_KHR, "triangles" },
+ { VK_GEOMETRY_TYPE_AABBS_KHR, "aabbs" },
+ };
+
+ const float kPi2 = DE_PI * 2.0f;
+ const float kMinScalingFactor = 0.5f;
+ const float kMaxScalingFactor = 10.0f;
+
+ const int kNumRandomScalingFactors = 5;
+ const int kNumRandomRotations = 4;
+
+ de::Random rnd(1614686501u);
+
+ // Scaling factors: 1.0 and some randomly-generated ones.
+ std::vector<float> scalingFactors;
+
+ scalingFactors.reserve(kNumRandomScalingFactors + 1);
+ scalingFactors.push_back(1.0f);
+
+ for (int i = 0; i < kNumRandomScalingFactors; ++i)
+ scalingFactors.push_back(rnd.getFloat() * (kMaxScalingFactor - kMinScalingFactor) + kMinScalingFactor);
+
+ // Rotations: 0.0 on both axis and some randomly-generated ones.
+ std::vector<std::pair<float, float>> rotationAngles;
+
+ rotationAngles.reserve(kNumRandomRotations + 1);
+ rotationAngles.push_back(std::make_pair(0.0f, 0.0f));
+
+ for (int i = 0; i < kNumRandomRotations; ++i)
+ rotationAngles.push_back(std::make_pair(rnd.getFloat() * kPi2, rnd.getFloat() * kPi2));
+
+ for (int geometryTypeIdx = 0; geometryTypeIdx < DE_LENGTH_OF_ARRAY(geometryTypes); ++geometryTypeIdx)
+ {
+ const auto& gType = geometryTypes[geometryTypeIdx];
+
+ GroupPtr geomGroup (new tcu::TestCaseGroup(testCtx, gType.name, ""));
+
+ for (size_t scalingIdx = 0; scalingIdx < scalingFactors.size(); ++scalingIdx)
+ {
+ const auto scale = scalingFactors[scalingIdx];
+ const auto scaleName = "scaling_factor_" + de::toString(scalingIdx);
+ GroupPtr factorGroup (new tcu::TestCaseGroup(testCtx, scaleName.c_str(), ""));
+
+ for (size_t rotationIdx = 0; rotationIdx < rotationAngles.size(); ++rotationIdx)
+ {
+ const auto angles = rotationAngles[rotationIdx];
+ const auto angleName = "rotation_" + de::toString(rotationIdx);
+ const auto geometryType = gType.geometryType;
+
+ SpaceObjects spaceObjects(geometryType);
+
+ TestParams params =
+ {
+ spaceObjects, // SpaceObjects spaceObjects;
+ scale, // float directionScale;
+ angles.first, // float rotationX;
+ angles.second, // float rotationY;
+ geometryType, // VkGeometryTypeKHR geometryType;
+ };
+
+ factorGroup->addChild(new DirectionTestCase(testCtx, angleName, "", params));
+ }
+
+ geomGroup->addChild(factorGroup.release());
+ }
+
+ directionGroup->addChild(geomGroup.release());
+ }
+
+ return directionGroup.release();
+}
+
+} // RayQuery
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.hpp
similarity index 69%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.hpp
index 1a85ebf..a929ebe 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryDirectionTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYQUERYDIRECTIONTESTS_HPP
+#define _VKTRAYQUERYDIRECTIONTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Ray Query Direction Tests
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +29,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayQuery
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createDirectionTests(tcu::TestContext& testCtx);
-} // pipeline
+} // RayQuery
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYQUERYDIRECTIONTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryMiscTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryMiscTests.cpp
new file mode 100644
index 0000000..d0a1f5e
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryMiscTests.cpp
@@ -0,0 +1,360 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
+ *
+ * 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 Ray Query miscellaneous tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktRayQueryMiscTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkRayTracingUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkObjUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkBarrierUtil.hpp"
+
+#include "tcuVector.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deRandom.hpp"
+
+#include <sstream>
+#include <limits>
+#include <vector>
+
+namespace vkt
+{
+namespace RayQuery
+{
+
+namespace
+{
+
+using namespace vk;
+
+class DynamicIndexingCase : public vkt::TestCase
+{
+public:
+ DynamicIndexingCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description);
+ virtual ~DynamicIndexingCase (void) {}
+
+ virtual void initPrograms (vk::SourceCollections& programCollection) const override;
+ virtual void checkSupport (Context& context) const override;
+ virtual TestInstance* createInstance (Context& context) const override;
+
+ // Constants and data types.
+ static constexpr deUint32 kLocalSizeX = 48u;
+ static constexpr deUint32 kNumQueries = 48u;
+
+ // This must match the shader.
+ struct InputData
+ {
+ deUint32 goodQueryIndex;
+ deUint32 proceedQueryIndex;
+ };
+};
+
+class DynamicIndexingInstance : public vkt::TestInstance
+{
+public:
+ DynamicIndexingInstance (Context& context);
+ virtual ~DynamicIndexingInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+};
+
+DynamicIndexingCase::DynamicIndexingCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description)
+ : vkt::TestCase (testCtx, name, description)
+{}
+
+void DynamicIndexingCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions buildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ std::ostringstream src;
+
+ src
+ << "#version 460\n"
+ << "#extension GL_EXT_ray_query : require\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "\n"
+ << "layout (local_size_x=" << kLocalSizeX << ", local_size_y=1, local_size_z=1) in; \n"
+ << "\n"
+ << "struct InputData {\n"
+ << " uint goodQueryIndex;\n"
+ << " uint proceedQueryIndex; // Note: same index as the one above in practice.\n"
+ << "};\n"
+ << "\n"
+ << "layout (set=0, binding=0) uniform accelerationStructureEXT topLevelAS;\n"
+ << "layout (set=0, binding=1, std430) buffer InputBlock {\n"
+ << " InputData inputData[];\n"
+ << "} inputBlock;\n"
+ << "layout (set=0, binding=2, std430) buffer OutputBlock {\n"
+ << " uint outputData[];\n"
+ << "} outputBlock;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint numQueries = " << kNumQueries << ";\n"
+ << "\n"
+ << " const uint rayFlags = 0u; \n"
+ << " const uint cullMask = 0xFFu;\n"
+ << " const float tmin = 0.1;\n"
+ << " const float tmax = 10.0;\n"
+ << " const vec3 direct = vec3(0, 0, 1); \n"
+ << "\n"
+ << " rayQueryEXT rayQueries[numQueries];\n"
+ << " vec3 origin;\n"
+ << "\n"
+ << " InputData inputValues = inputBlock.inputData[gl_LocalInvocationID.x];\n"
+ << "\n"
+ << " // Initialize all queries. Only goodQueryIndex will have the right origin for a hit.\n"
+ << " for (int i = 0; i < numQueries; i++) {\n"
+ << " origin = ((i == inputValues.goodQueryIndex) ? vec3(0, 0, 0) : vec3(5, 5, 0));\n"
+ << " rayQueryInitializeEXT(rayQueries[i], topLevelAS, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+ << " }\n"
+ << "\n"
+ << " // Attempt to proceed with the good query to confirm a hit.\n"
+ << " while (rayQueryProceedEXT(rayQueries[inputValues.proceedQueryIndex]))\n"
+ << " outputBlock.outputData[gl_LocalInvocationID.x] = 1u; \n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("comp") << glu::ComputeSource(updateRayTracingGLSL(src.str())) << buildOptions;
+}
+
+void DynamicIndexingCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_query");
+
+ const auto& rayQueryFeaturesKHR = context.getRayQueryFeatures();
+ if (!rayQueryFeaturesKHR.rayQuery)
+ TCU_THROW(NotSupportedError, "Ray queries not supported");
+
+ const auto& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
+ if (!accelerationStructureFeaturesKHR.accelerationStructure)
+ TCU_FAIL("Acceleration structures not supported but ray queries supported");
+}
+
+vkt::TestInstance* DynamicIndexingCase::createInstance (Context& context) const
+{
+ return new DynamicIndexingInstance(context);
+}
+
+DynamicIndexingInstance::DynamicIndexingInstance (Context& context)
+ : vkt::TestInstance(context)
+{}
+
+deUint32 getRndIndex (de::Random& rng, deUint32 size)
+{
+ DE_ASSERT(size > 0u);
+ DE_ASSERT(size <= static_cast<deUint32>(std::numeric_limits<int>::max()));
+
+ const int iMin = 0;
+ const int iMax = static_cast<int>(size) - 1;
+
+ return static_cast<deUint32>(rng.getInt(iMin, iMax));
+}
+
+tcu::TestStatus DynamicIndexingInstance::iterate (void)
+{
+ using InputData = DynamicIndexingCase::InputData;
+ constexpr auto kLocalSizeX = DynamicIndexingCase::kLocalSizeX;
+ constexpr auto kNumQueries = DynamicIndexingCase::kNumQueries;
+
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto queue = m_context.getUniversalQueue();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+
+ de::Random rng (1604936737u);
+ InputData inputDataArray[kLocalSizeX];
+ deUint32 outputDataArray[kLocalSizeX];
+
+ // Prepare input buffer.
+ for (int i = 0; i < DE_LENGTH_OF_ARRAY(inputDataArray); ++i)
+ {
+ // The two values will contain the same query index.
+ inputDataArray[i].goodQueryIndex = getRndIndex(rng, kNumQueries);
+ inputDataArray[i].proceedQueryIndex = inputDataArray[i].goodQueryIndex;
+ }
+
+ const auto inputBufferSize = static_cast<VkDeviceSize>(sizeof(inputDataArray));
+ const auto inputBufferInfo = makeBufferCreateInfo(inputBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ BufferWithMemory inputBuffer (vkd, device, alloc, inputBufferInfo, MemoryRequirement::HostVisible);
+ auto& inputBufferAlloc = inputBuffer.getAllocation();
+ void* inputBufferPtr = inputBufferAlloc.getHostPtr();
+
+ deMemcpy(inputBufferPtr, inputDataArray, static_cast<size_t>(inputBufferSize));
+ flushAlloc(vkd, device, inputBufferAlloc);
+
+ // Prepare output buffer.
+ const auto outputBufferSize = static_cast<VkDeviceSize>(sizeof(outputDataArray));
+ const auto outputBufferInfo = makeBufferCreateInfo(outputBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ BufferWithMemory outputBuffer (vkd, device, alloc, outputBufferInfo, MemoryRequirement::HostVisible);
+ auto& outputBufferAlloc = outputBuffer.getAllocation();
+ void* outputBufferPtr = outputBufferAlloc.getHostPtr();
+
+ deMemset(outputBufferPtr, 0, static_cast<size_t>(outputBufferSize));
+ flushAlloc(vkd, device, outputBufferAlloc);
+
+ // Prepare acceleration structures.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ de::SharedPtr<TopLevelAccelerationStructure> topLevelAS (makeTopLevelAccelerationStructure().release());
+ de::SharedPtr<BottomLevelAccelerationStructure> bottomLevelAS (makeBottomLevelAccelerationStructure().release());
+
+ // These need to match the origin and direction in the shader for a hit.
+ const std::vector<tcu::Vec3> vertices =
+ {
+ tcu::Vec3(-1.0f, -1.0f, 1.0f),
+ tcu::Vec3(-1.0f, 1.0f, 1.0f),
+ tcu::Vec3( 1.0f, -1.0f, 1.0f),
+
+ tcu::Vec3(-1.0f, 1.0f, 1.0f),
+ tcu::Vec3( 1.0f, 1.0f, 1.0f),
+ tcu::Vec3( 1.0f, -1.0f, 1.0f),
+ };
+
+ bottomLevelAS->addGeometry(vertices, /*triangles*/true, VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR);
+ bottomLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ topLevelAS->addInstance(bottomLevelAS);
+ topLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ // Descriptor set layout.
+ const VkShaderStageFlagBits stageBit = VK_SHADER_STAGE_COMPUTE_BIT;
+
+ DescriptorSetLayoutBuilder layoutBuilder;
+ layoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, stageBit);
+ layoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageBit);
+ layoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stageBit);
+ const auto descriptorSetLayout = layoutBuilder.build(vkd, device);
+
+ // Shader module.
+ const auto shaderModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0u);
+
+ // Pipeline layout.
+ const auto pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+
+ const VkPipelineShaderStageCreateInfo shaderStageInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineShaderStageCreateFlags flags;
+ stageBit, // VkShaderStageFlagBits stage;
+ shaderModule.get(), // VkShaderModule module;
+ "main", // const char* pName;
+ nullptr, // const VkSpecializationInfo* pSpecializationInfo;
+ };
+
+ const VkComputePipelineCreateInfo pipelineInfo =
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineCreateFlags flags;
+ shaderStageInfo, // VkPipelineShaderStageCreateInfo stage;
+ pipelineLayout.get(), // VkPipelineLayout layout;
+ DE_NULL, // VkPipeline basePipelineHandle;
+ 0, // deInt32 basePipelineIndex;
+ };
+
+ const auto pipeline = createComputePipeline(vkd, device, DE_NULL, &pipelineInfo);
+
+ // Create and update descriptor set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2u);
+
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSetPtr = makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayout.get());
+ const auto descriptorSet = descriptorSetPtr.get();
+
+ const VkWriteDescriptorSetAccelerationStructureKHR asWrite =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 1u, // deUint32 accelerationStructureCount;
+ topLevelAS->getPtr(), // const VkAccelerationStructureKHR* pAccelerationStructures;
+ };
+
+ const auto inputBufferWriteInfo = makeDescriptorBufferInfo(inputBuffer.get(), 0ull, inputBufferSize);
+ const auto outputBufferWriteInfo = makeDescriptorBufferInfo(outputBuffer.get(), 0ull, outputBufferSize);
+
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &asWrite);
+ updateBuilder.writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &inputBufferWriteInfo);
+ updateBuilder.writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &outputBufferWriteInfo);
+ updateBuilder.update(vkd, device);
+
+ // Use pipeline.
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout.get(), 0u, 1u, &descriptorSet, 0u, nullptr);
+ vkd.cmdDispatch(cmdBuffer, 1u, 1u, 1u);
+
+ const auto memBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &memBarrier, 0u, nullptr, 0u, nullptr);
+
+ // Submit recorded commands.
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Check output buffer.
+ invalidateAlloc(vkd, device, outputBufferAlloc);
+ deMemcpy(outputDataArray, outputBufferPtr, static_cast<size_t>(outputBufferSize));
+
+ for (int i = 0; i < DE_LENGTH_OF_ARRAY(outputDataArray); ++i)
+ {
+ constexpr auto expected = 1u;
+ const auto& value = outputDataArray[i];
+
+ if (value != expected)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected value found at position " << i << " in the output buffer: expected " << expected << " but found " << value;
+ TCU_FAIL(msg.str());
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createMiscTests (tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "misc", "Miscellaneous ray query tests"));
+
+ group->addChild(new DynamicIndexingCase(testCtx, "dynamic_indexing", "Dynamic indexing of ray queries"));
+
+ return group.release();
+}
+
+} // RayQuery
+} // vkt
+
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryMiscTests.hpp
similarity index 69%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_query/vktRayQueryMiscTests.hpp
index 1a85ebf..16ea566 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryMiscTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYQUERYMISCTESTS_HPP
+#define _VKTRAYQUERYMISCTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Ray Query miscellaneous tests
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +29,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayQuery
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createMiscTests (tcu::TestContext& testCtx);
-} // pipeline
+} // RayQuery
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYQUERYMISCTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryProceduralGeometryTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryProceduralGeometryTests.cpp
new file mode 100644
index 0000000..2b72d94
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryProceduralGeometryTests.cpp
@@ -0,0 +1,495 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * 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 procedural geometry with complex bouding box sets
+ *//*--------------------------------------------------------------------*/
+
+#include "vktRayQueryProceduralGeometryTests.hpp"
+#include "vkDefs.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkRayTracingUtil.hpp"
+#include "tcuVectorUtil.hpp"
+#include "tcuTexture.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuFloat.hpp"
+
+namespace vkt
+{
+namespace RayQuery
+{
+namespace
+{
+using namespace vk;
+using namespace vkt;
+
+enum class TestType
+{
+ OBJECT_BEHIND_BOUNDING_BOX = 0,
+ TRIANGLE_IN_BETWEEN
+};
+
+class RayQueryProceduralGeometryTestBase : public TestInstance
+{
+public:
+
+ RayQueryProceduralGeometryTestBase (Context& context);
+ ~RayQueryProceduralGeometryTestBase (void) = default;
+
+ tcu::TestStatus iterate (void) override;
+
+protected:
+
+ virtual void setupAccelerationStructures() = 0;
+
+private:
+
+ VkWriteDescriptorSetAccelerationStructureKHR makeASWriteDescriptorSet (const VkAccelerationStructureKHR* pAccelerationStructure);
+ void clearBuffer (de::SharedPtr<BufferWithMemory> buffer, VkDeviceSize bufferSize);
+
+protected:
+
+ Move<VkCommandPool> m_cmdPool;
+ Move<VkCommandBuffer> m_cmdBuffer;
+
+ std::vector<de::SharedPtr<BottomLevelAccelerationStructure> > m_blasVect;
+ de::SharedPtr<TopLevelAccelerationStructure> m_referenceTLAS;
+ de::SharedPtr<TopLevelAccelerationStructure> m_resultTLAS;
+};
+
+RayQueryProceduralGeometryTestBase::RayQueryProceduralGeometryTestBase(Context& context)
+ : vkt::TestInstance (context)
+ , m_referenceTLAS (makeTopLevelAccelerationStructure().release())
+ , m_resultTLAS (makeTopLevelAccelerationStructure().release())
+{
+}
+
+tcu::TestStatus RayQueryProceduralGeometryTestBase::iterate(void)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const VkQueue queue = m_context.getUniversalQueue();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ const deUint32 imageSize = 64u;
+
+ const Move<VkDescriptorPool> descriptorPool = DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 2u)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2u)
+ .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 2u);
+
+ Move<VkDescriptorSetLayout> descriptorSetLayout = DescriptorSetLayoutBuilder()
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_SHADER_STAGE_COMPUTE_BIT) // as with single/four aabb's
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT) // ssbo with result/reference values
+ .build(vkd, device);
+
+ const Move<VkDescriptorSet> referenceDescriptorSet = makeDescriptorSet(vkd, device, *descriptorPool, *descriptorSetLayout);
+ const Move<VkDescriptorSet> resultDescriptorSet = makeDescriptorSet(vkd, device, *descriptorPool, *descriptorSetLayout);
+
+ const VkDeviceSize resultBufferSize = imageSize * imageSize * sizeof(int);
+ const VkBufferCreateInfo resultBufferCreateInfo = makeBufferCreateInfo(resultBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+ de::SharedPtr<BufferWithMemory> referenceBuffer = de::SharedPtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
+ de::SharedPtr<BufferWithMemory> resultBuffer = de::SharedPtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
+
+ Move<VkShaderModule> shaderModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("comp"), 0u);
+ const Move<VkPipelineLayout> pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+ const VkComputePipelineCreateInfo pipelineCreateInfo
+ {
+ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 0u, // VkPipelineCreateFlags flags
+ { // VkPipelineShaderStageCreateInfo stage
+ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ DE_NULL,
+ (VkPipelineShaderStageCreateFlags)0,
+ VK_SHADER_STAGE_COMPUTE_BIT,
+ *shaderModule,
+ "main",
+ DE_NULL
+ },
+ *pipelineLayout, // VkPipelineLayout layout
+ DE_NULL, // VkPipeline basePipelineHandle
+ 0, // deInt32 basePipelineIndex
+ };
+ Move<VkPipeline> pipeline = createComputePipeline(vkd, device, DE_NULL, &pipelineCreateInfo);
+
+ m_cmdPool = createCommandPool(vkd, device, 0, queueFamilyIndex);
+ m_cmdBuffer = allocateCommandBuffer(vkd, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ // clear result and reference buffers
+ clearBuffer(resultBuffer, resultBufferSize);
+ clearBuffer(referenceBuffer, resultBufferSize);
+
+ beginCommandBuffer(vkd, *m_cmdBuffer, 0u);
+ {
+ setupAccelerationStructures();
+
+ // update descriptor sets
+ {
+ typedef DescriptorSetUpdateBuilder::Location DSL;
+
+ const VkWriteDescriptorSetAccelerationStructureKHR referenceAS = makeASWriteDescriptorSet(m_referenceTLAS->getPtr());
+ const VkDescriptorBufferInfo referenceSSBO = makeDescriptorBufferInfo(**referenceBuffer, 0u, VK_WHOLE_SIZE);
+ DescriptorSetUpdateBuilder()
+ .writeSingle(*referenceDescriptorSet, DSL::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &referenceAS)
+ .writeSingle(*referenceDescriptorSet, DSL::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &referenceSSBO)
+ .update(vkd, device);
+
+ const VkWriteDescriptorSetAccelerationStructureKHR resultAS = makeASWriteDescriptorSet(m_resultTLAS->getPtr());
+ const VkDescriptorBufferInfo resultSSBO = makeDescriptorBufferInfo(**resultBuffer, 0u, VK_WHOLE_SIZE);
+ DescriptorSetUpdateBuilder()
+ .writeSingle(*resultDescriptorSet, DSL::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &resultAS)
+ .writeSingle(*resultDescriptorSet, DSL::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultSSBO)
+ .update(vkd, device);
+ }
+
+ // wait for data transfers
+ const VkMemoryBarrier bufferUploadBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, &bufferUploadBarrier, 1u);
+
+ // wait for as build
+ const VkMemoryBarrier asBuildBarrier = makeMemoryBarrier(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_ACCESS_SHADER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *m_cmdBuffer, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, &asBuildBarrier, 1u);
+
+ vkd.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+
+ // generate reference
+ vkd.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, 1, &referenceDescriptorSet.get(), 0, DE_NULL);
+ vkd.cmdDispatch(*m_cmdBuffer, imageSize, imageSize, 1);
+
+ // generate result
+ vkd.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0, 1, &resultDescriptorSet.get(), 0, DE_NULL);
+ vkd.cmdDispatch(*m_cmdBuffer, imageSize, imageSize, 1);
+
+ const VkMemoryBarrier postTraceMemoryBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *m_cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &postTraceMemoryBarrier);
+ }
+ endCommandBuffer(vkd, *m_cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, m_cmdBuffer.get());
+
+ // verify result buffer
+ auto referenceAllocation = referenceBuffer->getAllocation();
+ invalidateMappedMemoryRange(vkd, device, referenceAllocation.getMemory(), referenceAllocation.getOffset(), resultBufferSize);
+
+ auto resultAllocation = resultBuffer->getAllocation();
+ invalidateMappedMemoryRange(vkd, device, resultAllocation.getMemory(), resultAllocation.getOffset(), resultBufferSize);
+
+ tcu::TextureFormat imageFormat (vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+ tcu::PixelBufferAccess referenceAccess (imageFormat, imageSize, imageSize, 1, referenceAllocation.getHostPtr());
+ tcu::PixelBufferAccess resultAccess (imageFormat, imageSize, imageSize, 1, resultAllocation.getHostPtr());
+
+ if (tcu::intThresholdCompare(m_context.getTestContext().getLog(), "Result comparison", "", referenceAccess, resultAccess, tcu::UVec4(0), tcu::COMPARE_LOG_EVERYTHING))
+ return tcu::TestStatus::pass("Pass");
+ return tcu::TestStatus::fail("Fail");
+}
+
+VkWriteDescriptorSetAccelerationStructureKHR RayQueryProceduralGeometryTestBase::makeASWriteDescriptorSet(const VkAccelerationStructureKHR* pAccelerationStructure)
+{
+ return
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 1u, // deUint32 accelerationStructureCount
+ pAccelerationStructure // const VkAccelerationStructureKHR* pAccelerationStructures
+ };
+}
+
+void RayQueryProceduralGeometryTestBase::clearBuffer(de::SharedPtr<BufferWithMemory> buffer, VkDeviceSize bufferSize)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ auto& bufferAlloc = buffer->getAllocation();
+ void* bufferPtr = bufferAlloc.getHostPtr();
+
+ deMemset(bufferPtr, 1, static_cast<size_t>(bufferSize));
+ vk::flushAlloc(vkd, device, bufferAlloc);
+}
+
+class ObjectBehindBoundingBoxInstance : public RayQueryProceduralGeometryTestBase
+{
+public:
+
+ ObjectBehindBoundingBoxInstance(Context& context);
+ void setupAccelerationStructures() override;
+};
+
+ObjectBehindBoundingBoxInstance::ObjectBehindBoundingBoxInstance(Context& context)
+ : RayQueryProceduralGeometryTestBase(context)
+{
+}
+
+void ObjectBehindBoundingBoxInstance::setupAccelerationStructures()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ // build reference acceleration structure - single aabb big enough to fit whole procedural geometry
+ de::SharedPtr<BottomLevelAccelerationStructure> referenceBLAS(makeBottomLevelAccelerationStructure().release());
+ referenceBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, -64.0 },
+ { 64.0, 64.0, -16.0 },
+ },
+ false,
+ 0
+ );
+ referenceBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(referenceBLAS);
+
+ m_referenceTLAS->setInstanceCount(1);
+ m_referenceTLAS->addInstance(m_blasVect.back());
+ m_referenceTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+
+ // build result acceleration structure - wall of 4 aabb's and generated object is actualy behind it (as it is just 1.0 unit thick)
+ de::SharedPtr<BottomLevelAccelerationStructure> resultBLAS(makeBottomLevelAccelerationStructure().release());
+ resultBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, 0.0 }, // | |
+ { 32.0, 32.0, 1.0 }, // |* |
+ { 32.0, 0.0, 0.0 }, // | |
+ { 64.0, 32.0, 1.0 }, // | *|
+ { 0.0, 32.0, 0.0 }, // |* |
+ { 32.0, 64.0, 1.0 }, // | |
+ { 32.0, 32.0, 0.0 }, // | *|
+ { 64.0, 64.0, 1.0 }, // | |
+ },
+ false,
+ 0
+ );
+ resultBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(resultBLAS);
+
+ m_resultTLAS->setInstanceCount(1);
+ m_resultTLAS->addInstance(m_blasVect.back());
+ m_resultTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+}
+
+class TriangleInBeteenInstance : public RayQueryProceduralGeometryTestBase
+{
+public:
+
+ TriangleInBeteenInstance(Context& context);
+ void setupAccelerationStructures() override;
+};
+
+TriangleInBeteenInstance::TriangleInBeteenInstance(Context& context)
+ : RayQueryProceduralGeometryTestBase(context)
+{
+}
+
+void TriangleInBeteenInstance::setupAccelerationStructures()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ de::SharedPtr<BottomLevelAccelerationStructure> triangleBLAS(makeBottomLevelAccelerationStructure().release());
+ triangleBLAS->setGeometryData(
+ {
+ { 16.0, 16.0, -8.0 },
+ { 56.0, 32.0, -8.0 },
+ { 32.0, 48.0, -8.0 },
+ },
+ true,
+ VK_GEOMETRY_OPAQUE_BIT_KHR
+ );
+ triangleBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(triangleBLAS);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> fullElipsoidBLAS(makeBottomLevelAccelerationStructure().release());
+ fullElipsoidBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, -64.0 },
+ { 64.0, 64.0, -16.0 },
+ },
+ false,
+ 0
+ );
+ fullElipsoidBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(fullElipsoidBLAS);
+
+ // build reference acceleration structure - triangle and a single aabb big enough to fit whole procedural geometry
+ m_referenceTLAS->setInstanceCount(2);
+ m_referenceTLAS->addInstance(fullElipsoidBLAS);
+ m_referenceTLAS->addInstance(triangleBLAS);
+ m_referenceTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> elipsoidWallBLAS(makeBottomLevelAccelerationStructure().release());
+ elipsoidWallBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, 0.0 }, // |* |
+ { 20.0, 64.0, 1.0 },
+ { 20.0, 0.0, 0.0 }, // | * |
+ { 44.0, 64.0, 1.0 },
+ { 44.0, 0.0, 0.0 }, // | *|
+ { 64.0, 64.0, 1.0 },
+ },
+ false,
+ 0
+ );
+ elipsoidWallBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(elipsoidWallBLAS);
+
+ // build result acceleration structure - triangle and a three aabb's (they are in front of triangle but generate intersections behind it)
+ m_resultTLAS->setInstanceCount(2);
+ m_resultTLAS->addInstance(elipsoidWallBLAS);
+ m_resultTLAS->addInstance(triangleBLAS);
+ m_resultTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+}
+
+class RayQueryProceduralGeometryTestCase : public TestCase
+{
+public:
+ RayQueryProceduralGeometryTestCase (tcu::TestContext& context, const char* name, TestType testType);
+ ~RayQueryProceduralGeometryTestCase (void) = default;
+
+ void checkSupport (Context& context) const override;
+ void initPrograms (SourceCollections& programCollection) const override;
+ TestInstance* createInstance (Context& context) const override;
+
+protected:
+ TestType m_testType;
+};
+
+RayQueryProceduralGeometryTestCase::RayQueryProceduralGeometryTestCase(tcu::TestContext& context, const char* name, TestType testType)
+ : TestCase (context, name, "")
+ , m_testType (testType)
+{
+}
+
+void RayQueryProceduralGeometryTestCase::checkSupport(Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_query");
+
+ if (!context.getRayQueryFeatures().rayQuery)
+ TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayQueryFeaturesKHR.rayQuery");
+
+ if (!context.getAccelerationStructureFeatures().accelerationStructure)
+ TCU_THROW(TestError, "Requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
+}
+
+void RayQueryProceduralGeometryTestCase::initPrograms(SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions glslBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ std::string compSource =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_query : require\n"
+
+ "layout(set = 0, binding = 0) uniform accelerationStructureEXT tlas;\n"
+ "layout(set = 0, binding = 1, std430) writeonly buffer Result {\n"
+ " int value[];\n"
+ "} result;\n"
+
+ "void main()\n"
+ "{\n"
+ " float tmin = 0.0;\n"
+ " float tmax = 50.0;\n"
+ " vec3 rayOrigin = vec3(float(gl_GlobalInvocationID.x) + 0.5f, float(gl_GlobalInvocationID.y) + 0.5f, 2.0);\n"
+ " vec3 rayDir = vec3(0.0,0.0,-1.0);\n"
+ " uint resultIndex = gl_GlobalInvocationID.x + gl_GlobalInvocationID.y * gl_NumWorkGroups.x;\n"
+ " int payload = 30;\n"
+
+ // elipsoid center and radii
+ " vec3 elipsoidOrigin = vec3(32.0, 32.0, -30.0);\n"
+ " vec3 elipsoidRadii = vec3(30.0, 15.0, 5.0);\n"
+
+ " rayQueryEXT rq;\n"
+ " rayQueryInitializeEXT(rq, tlas, gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, rayOrigin, tmin, rayDir, tmax);\n"
+
+ " while (rayQueryProceedEXT(rq))\n"
+ " {\n"
+ " uint intersectionType = rayQueryGetIntersectionTypeEXT(rq, false);\n"
+ " if (intersectionType == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+ " {\n"
+ // simplify to ray sphere intersection
+ " vec3 eliDir = rayOrigin - elipsoidOrigin;\n"
+ " vec3 eliS = eliDir / elipsoidRadii;\n"
+ " vec3 rayS = rayDir / elipsoidRadii;\n"
+
+ " float a = dot(rayS, rayS);\n"
+ " float b = dot(eliS, rayS);\n"
+ " float c = dot(eliS, eliS);\n"
+ " float h = b * b - a * (c - 1.0);\n"
+ " if (h >= 0.0)\n"
+ " rayQueryGenerateIntersectionEXT(rq, (-b - sqrt(h)) / a);\n"
+ " }\n"
+ " else if (intersectionType == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+ " {\n"
+ " payload = 250;\n"
+ " rayQueryConfirmIntersectionEXT(rq);\n"
+ " }\n"
+ " }\n"
+ " if (rayQueryGetIntersectionTypeEXT(rq, true) != gl_RayQueryCommittedIntersectionNoneEXT)\n"
+ " {\n"
+ " int instanceId = rayQueryGetIntersectionInstanceIdEXT(rq, true);\n"
+ " if (instanceId > -1)\n"
+ " {\n"
+ " float hitT = rayQueryGetIntersectionTEXT(rq, true);\n"
+ " vec3 lightDir = normalize(vec3(0.0, 0.0, 1.0));\n"
+ " vec3 hitPos = rayOrigin + hitT * rayDir;\n"
+ " vec3 hitNormal = normalize((hitPos - elipsoidOrigin) / elipsoidRadii);\n"
+ " payload = 50 + int(200.0 * clamp(dot(hitNormal, lightDir), 0.0, 1.0));\n"
+ " }\n"
+ " }\n"
+
+ // to be able to display result in cherry this is interpreated as r8g8b8a8 during verification
+ // we are using only red but we need to add alpha (note: r and a may be swapped depending on endianness)
+ " result.value[resultIndex] = payload + 0xFF000000;\n"
+ "};\n";
+ programCollection.glslSources.add("comp") << glu::ComputeSource(compSource) << glslBuildOptions;
+}
+
+TestInstance* RayQueryProceduralGeometryTestCase::createInstance(Context& context) const
+{
+ if (m_testType == TestType::TRIANGLE_IN_BETWEEN)
+ return new TriangleInBeteenInstance(context);
+
+ // TestType::OBJECT_BEHIND_BOUNDING_BOX
+ return new ObjectBehindBoundingBoxInstance(context);
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createProceduralGeometryTests(tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "procedural_geometry", "Test procedural geometry with complex bouding box sets"));
+
+ group->addChild(new RayQueryProceduralGeometryTestCase(testCtx, "object_behind_bounding_boxes", TestType::OBJECT_BEHIND_BOUNDING_BOX));
+ group->addChild(new RayQueryProceduralGeometryTestCase(testCtx, "triangle_in_between", TestType::TRIANGLE_IN_BETWEEN));
+
+ return group.release();
+}
+
+} // RayQuery
+
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryProceduralGeometryTests.hpp
similarity index 68%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_query/vktRayQueryProceduralGeometryTests.hpp
index 1a85ebf..f0651c2 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryProceduralGeometryTests.hpp
@@ -1,11 +1,10 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYQUERYPROCEDURALGEOMETRYTESTS_HPP
+#define _VKTRAYQUERYPROCEDURALGEOMETRYTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group 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.
@@ -21,7 +20,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Test procedural geometry with complex bouding box sets
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +28,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayQuery
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createProceduralGeometryTests (tcu::TestContext& testCtx);
-} // pipeline
+} // RayQuery
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYQUERYPROCEDURALGEOMETRYTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryTests.cpp b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryTests.cpp
index e7613b3..1e4dcf6 100644
--- a/external/vulkancts/modules/vulkan/ray_query/vktRayQueryTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_query/vktRayQueryTests.cpp
@@ -25,8 +25,12 @@
#include "vktRayQueryBuiltinTests.hpp"
#include "vktRayQueryTraversalControlTests.hpp"
#include "vktRayQueryAccelerationStructuresTests.hpp"
+#include "vktRayQueryProceduralGeometryTests.hpp"
#include "vktRayQueryWatertightnessTests.hpp"
#include "vktRayQueryCullRayFlagsTests.hpp"
+#include "vktRayQueryMiscTests.hpp"
+#include "vktRayQueryDirectionTests.hpp"
+#include "vktRayQueryBarycentricCoordinatesTests.hpp"
#include "deUniquePtr.hpp"
@@ -44,9 +48,13 @@
group->addChild(createBuiltinTests(testCtx));
group->addChild(createTraversalControlTests(testCtx));
group->addChild(createAccelerationStructuresTests(testCtx));
+ group->addChild(createProceduralGeometryTests(testCtx));
group->addChild(createAdvancedTests(testCtx));
group->addChild(createWatertightnessTests(testCtx));
group->addChild(createCullRayFlagsTests(testCtx));
+ group->addChild(createMiscTests(testCtx));
+ group->addChild(createDirectionTests(testCtx));
+ group->addChild(createBarycentricCoordinatesTests(testCtx));
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/CMakeLists.txt b/external/vulkancts/modules/vulkan/ray_tracing/CMakeLists.txt
index 4ff590c..5ce603f 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/ray_tracing/CMakeLists.txt
@@ -3,6 +3,8 @@
set(DEQP_VK_RAY_TRACING_SRCS
vktRayTracingBarrierTests.cpp
vktRayTracingBarrierTests.hpp
+ vktRayTracingBarycentricCoordinatesTests.cpp
+ vktRayTracingBarycentricCoordinatesTests.hpp
vktRayTracingBuildIndirectTests.cpp
vktRayTracingBuildIndirectTests.hpp
vktRayTracingBuiltinTests.cpp
@@ -15,6 +17,10 @@
vktRayTracingCallableShadersTests.hpp
vktRayTracingComplexControlFlowTests.cpp
vktRayTracingComplexControlFlowTests.hpp
+ vktRayTracingDataSpillTests.cpp
+ vktRayTracingDataSpillTests.hpp
+ vktRayTracingDirectionTests.cpp
+ vktRayTracingDirectionTests.hpp
vktRayTracingTraceRaysTests.cpp
vktRayTracingTraceRaysTests.hpp
vktRayTracingMemGuaranteeTests.cpp
@@ -33,6 +39,8 @@
vktRayTracingWatertightnessTests.hpp
vktRayTracingPipelineLibraryTests.cpp
vktRayTracingPipelineLibraryTests.hpp
+ vktRayTracingProceduralGeometryTests.cpp
+ vktRayTracingProceduralGeometryTests.hpp
vktRayTracingCaptureReplayTests.cpp
vktRayTracingCaptureReplayTests.hpp
vktRayTracingTests.cpp
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp
index 08ae844..b57e171 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingAccelerationStructuresTests.cpp
@@ -25,6 +25,7 @@
#include "vkDefs.hpp"
#include "deClock.h"
+#include "deRandom.h"
#include "vktTestCase.hpp"
#include "vktTestGroupUtil.hpp"
@@ -43,6 +44,8 @@
#include "tcuImageCompare.hpp"
#include "tcuFloat.hpp"
+#include <set>
+
namespace vkt
{
namespace RayTracing
@@ -826,6 +829,21 @@
return makeClearValueColorF32(32.0f, 0.0f, 0.0f, 0.0f);
}
+void commonASTestsCheckSupport(Context& context)
+{
+ context.requireInstanceFunctionality("VK_KHR_get_physical_device_properties2");
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+
+ const VkPhysicalDeviceRayTracingPipelineFeaturesKHR& rayTracingPipelineFeaturesKHR = context.getRayTracingPipelineFeatures();
+ if (rayTracingPipelineFeaturesKHR.rayTracingPipeline == DE_FALSE)
+ TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline");
+
+ const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
+ if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
+ TCU_THROW(TestError, "VK_KHR_ray_tracing_pipeline requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
+}
+
class RayTracingASBasicTestCase : public TestCase
{
public:
@@ -854,7 +872,7 @@
{
public:
RayTracingASBasicTestInstance (Context& context, const TestParams& data);
- ~RayTracingASBasicTestInstance (void);
+ ~RayTracingASBasicTestInstance (void) = default;
tcu::TestStatus iterate (void) override;
protected:
@@ -877,18 +895,9 @@
void RayTracingASBasicTestCase::checkSupport(Context& context) const
{
- context.requireInstanceFunctionality("VK_KHR_get_physical_device_properties2");
- context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
- context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+ commonASTestsCheckSupport(context);
- const VkPhysicalDeviceRayTracingPipelineFeaturesKHR& rayTracingPipelineFeaturesKHR = context.getRayTracingPipelineFeatures();
- if (rayTracingPipelineFeaturesKHR.rayTracingPipeline == DE_FALSE)
- TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline");
-
- const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
- if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
- TCU_THROW(TestError, "VK_KHR_ray_tracing_pipeline requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
-
+ const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR && accelerationStructureFeaturesKHR.accelerationStructureHostCommands == DE_FALSE)
TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructureHostCommands");
@@ -1453,10 +1462,6 @@
{
}
-RayTracingASBasicTestInstance::~RayTracingASBasicTestInstance (void)
-{
-}
-
de::MovePtr<BufferWithMemory> RayTracingASBasicTestInstance::runTest(const deUint32 workerThreadsCount)
{
const InstanceInterface& vki = m_context.getInstanceInterface();
@@ -1649,8 +1654,12 @@
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR)
{
- const VkMemoryBarrier serializeMemoryBarrier = makeMemoryBarrier(VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT);
- cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &serializeMemoryBarrier);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ vkd.resetCommandPool(device, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
}
de::MovePtr<BottomLevelAccelerationStructure> asCopy = makeBottomLevelAccelerationStructure();
@@ -1744,7 +1753,7 @@
}
case OP_SERIALIZE:
{
- de::SharedPtr<SerialStorage> storage( new SerialStorage(vkd, device, allocator, m_data.buildType, topBlasSerialSize[0]));
+ de::SharedPtr<SerialStorage> storage = de::SharedPtr<SerialStorage>(new SerialStorage(vkd, device, allocator, m_data.buildType, topBlasSerialSize[0]));
topLevelAccelerationStructure->setDeferredOperation(htSerialize, workerThreadsCount);
topLevelAccelerationStructure->serialize(vkd, device, *cmdBuffer, storage.get());
@@ -1752,8 +1761,12 @@
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR)
{
- const VkMemoryBarrier serializeMemoryBarrier = makeMemoryBarrier(VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT);
- cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &serializeMemoryBarrier);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ vkd.resetCommandPool(device, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
}
topLevelAccelerationStructureCopy = makeTopLevelAccelerationStructure();
@@ -1864,6 +1877,490 @@
return tcu::TestStatus::fail("Fail");
}
+// Tests dynamic indexing of acceleration structures
+class RayTracingASDynamicIndexingTestCase : public TestCase
+{
+public:
+ RayTracingASDynamicIndexingTestCase (tcu::TestContext& context, const char* name);
+ ~RayTracingASDynamicIndexingTestCase (void) = default;
+
+ void checkSupport (Context& context) const override;
+ void initPrograms (SourceCollections& programCollection) const override;
+ TestInstance* createInstance (Context& context) const override;
+};
+
+class RayTracingASDynamicIndexingTestInstance : public TestInstance
+{
+public:
+ RayTracingASDynamicIndexingTestInstance (Context& context);
+ ~RayTracingASDynamicIndexingTestInstance (void) = default;
+ tcu::TestStatus iterate (void) override;
+};
+
+RayTracingASDynamicIndexingTestCase::RayTracingASDynamicIndexingTestCase(tcu::TestContext& context, const char* name)
+ : TestCase(context, name, "")
+{
+}
+
+void RayTracingASDynamicIndexingTestCase::checkSupport(Context& context) const
+{
+ commonASTestsCheckSupport(context);
+ context.requireDeviceFunctionality("VK_EXT_descriptor_indexing");
+}
+
+void RayTracingASDynamicIndexingTestCase::initPrograms(SourceCollections& programCollection) const
+{
+ const vk::SpirVAsmBuildOptions spvBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, true);
+ const vk::ShaderBuildOptions glslBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ // raygen shader is defined in spir-v as it requires possing pointer to TLAS that was read from ssbo;
+ // original spir-v code was generated using following glsl code but resulting spir-v code was modiifed
+ //
+ // #version 460 core
+ // #extension GL_EXT_ray_tracing : require
+ // #extension GL_EXT_nonuniform_qualifier : enable
+ // #extension GL_ARB_gpu_shader_int64 : enable // needed only to generate spir-v
+ // #define ARRAY_SIZE 500
+ // layout(location = 0) rayPayloadEXT uvec2 payload; // offset and flag indicating if we are using descriptors or pointers
+
+ // layout(set = 0, binding = 0) uniform accelerationStructureEXT tlasArray[ARRAY_SIZE];
+ // layout(set = 0, binding = 1) readonly buffer topLevelASPointers {
+ // uint64_t ptr[];
+ // } tlasPointers;
+ // layout(set = 0, binding = 2) readonly buffer topLevelASIndices {
+ // uint idx[];
+ // } tlasIndices;
+ // layout(set = 0, binding = 3, std430) writeonly buffer Result {
+ // uint value[];
+ // } result;
+
+ // void main()
+ // {
+ // float tmin = 0.0;\n"
+ // float tmax = 2.0;\n"
+ // vec3 origin = vec3(0.25f, 0.5f, 1.0);\n"
+ // vec3 direction = vec3(0.0,0.0,-1.0);\n"
+ // uint activeTlasIndex = gl_LaunchIDEXT.x;\n"
+ // uint activeTlasCount = gl_LaunchSizeEXT.x;\n"
+ // uint tlasIndex = tlasIndices.idx[nonuniformEXT(activeTlasIndex)];\n"
+
+ // atomicAdd(result.value[nonuniformEXT(activeTlasIndex)], 2);\n"
+ // payload = uvec2(activeTlasIndex + activeTlasCount.x, 0);\n"
+ // traceRayEXT(tlasArray[nonuniformEXT(tlasIndex)], gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, 0, 0, 0, origin, tmin, direction, tmax, 0);\n"
+
+ // atomicAdd(result.value[nonuniformEXT(activeTlasIndex + activeTlasCount * 2)], 5);\n"
+ // payload = uvec2(activeTlasIndex + activeTlasCount * 3, 1);\n"
+ // traceRayEXT(tlasArray[nonuniformEXT(tlasIndex)], gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, 0, 0, 0, origin, tmin, direction, tmax, 0); // used to generate initial spirv
+ // //traceRayEXT(*tlasPointers.ptr[nonuniformEXT(tlasIndex)], gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, 0, 0, 0, origin, tmin, direction, tmax, 0); // not available in glsl but should be done in spirv
+ // };
+
+ const std::string rgenSource =
+ "OpCapability Int64\n"
+ "OpCapability RayTracingKHR\n"
+ "OpCapability ShaderNonUniform\n"
+ "OpExtension \"SPV_EXT_descriptor_indexing\"\n"
+ "OpExtension \"SPV_KHR_ray_tracing\"\n"
+ "%1 = OpExtInstImport \"GLSL.std.450\"\n"
+ "OpMemoryModel Logical GLSL450\n"
+ "OpEntryPoint RayGenerationKHR %4 \"main\" %27 %33 %var_tlas_indices %var_result %60 %var_as_arr_ptr %var_as_pointers_ssbo\n"
+ "OpDecorate %27 BuiltIn LaunchIdNV\n"
+ "OpDecorate %33 BuiltIn LaunchSizeNV\n"
+ "OpDecorate %37 ArrayStride 4\n"
+ "OpMemberDecorate %38 0 NonWritable\n"
+ "OpMemberDecorate %38 0 Offset 0\n"
+ "OpDecorate %38 Block\n"
+ "OpDecorate %var_tlas_indices DescriptorSet 0\n"
+ "OpDecorate %var_tlas_indices Binding 2\n"
+ "OpDecorate %44 NonUniform\n"
+ "OpDecorate %46 NonUniform\n"
+ "OpDecorate %47 NonUniform\n"
+ "OpDecorate %48 ArrayStride 4\n"
+ "OpMemberDecorate %49 0 NonReadable\n"
+ "OpMemberDecorate %49 0 Offset 0\n"
+ "OpDecorate %49 Block\n"
+ "OpDecorate %var_result DescriptorSet 0\n"
+ "OpDecorate %var_result Binding 3\n"
+ "OpDecorate %53 NonUniform\n"
+ "OpDecorate %60 Location 0\n"
+ "OpDecorate %var_as_arr_ptr DescriptorSet 0\n"
+ "OpDecorate %var_as_arr_ptr Binding 0\n"
+ "OpDecorate %71 NonUniform\n"
+ "OpDecorate %73 NonUniform\n"
+ "OpDecorate %74 NonUniform\n"
+ "OpDecorate %85 NonUniform\n"
+ "OpDecorate %as_index NonUniform\n"
+ "OpDecorate %as_device_addres NonUniform\n"
+ "OpDecorate %104 ArrayStride 8\n"
+ "OpMemberDecorate %105 0 NonWritable\n"
+ "OpMemberDecorate %105 0 Offset 0\n"
+ "OpDecorate %105 Block\n"
+ "OpDecorate %var_as_pointers_ssbo DescriptorSet 0\n"
+ "OpDecorate %var_as_pointers_ssbo Binding 1\n"
+ // types, constants and variables
+ "%2 = OpTypeVoid\n"
+ "%3 = OpTypeFunction %2\n"
+ "%6 = OpTypeFloat 32\n"
+ "%7 = OpTypePointer Function %6\n"
+ "%9 = OpConstant %6 0\n"
+ "%11 = OpConstant %6 2\n"
+ "%12 = OpTypeVector %6 3\n"
+ "%13 = OpTypePointer Function %12\n"
+ "%15 = OpConstant %6 0.25\n"
+ "%16 = OpConstant %6 0.5\n"
+ "%17 = OpConstant %6 1\n"
+ "%18 = OpConstantComposite %12 %15 %16 %17\n"
+ "%20 = OpConstant %6 -1\n"
+ "%21 = OpConstantComposite %12 %9 %9 %20\n"
+ "%type_uint32 = OpTypeInt 32 0\n"
+ "%23 = OpTypePointer Function %type_uint32\n"
+ "%25 = OpTypeVector %type_uint32 3\n"
+ "%26 = OpTypePointer Input %25\n"
+ "%27 = OpVariable %26 Input\n"
+ "%28 = OpConstant %type_uint32 0\n"
+ "%29 = OpTypePointer Input %type_uint32\n"
+ "%33 = OpVariable %26 Input\n"
+ "%37 = OpTypeRuntimeArray %type_uint32\n"
+ "%38 = OpTypeStruct %37\n"
+ "%39 = OpTypePointer StorageBuffer %38\n"
+ "%var_tlas_indices = OpVariable %39 StorageBuffer\n"
+ "%type_int32 = OpTypeInt 32 1\n"
+ "%c_int32_0 = OpConstant %type_int32 0\n"
+ "%45 = OpTypePointer StorageBuffer %type_uint32\n"
+ "%48 = OpTypeRuntimeArray %type_uint32\n"
+ "%49 = OpTypeStruct %48\n"
+ "%50 = OpTypePointer StorageBuffer %49\n"
+ "%var_result = OpVariable %50 StorageBuffer\n"
+ "%55 = OpConstant %type_uint32 2\n"
+ "%56 = OpConstant %type_uint32 1\n"
+ "%58 = OpTypeVector %type_uint32 2\n"
+ "%59 = OpTypePointer RayPayloadNV %58\n"
+ "%60 = OpVariable %59 RayPayloadNV\n"
+ "%type_as = OpTypeAccelerationStructureKHR\n"
+ "%66 = OpConstant %type_uint32 500\n"
+ "%67 = OpTypeArray %type_as %66\n"
+ "%68 = OpTypePointer UniformConstant %67\n"
+ "%var_as_arr_ptr = OpVariable %68 UniformConstant\n"
+ "%72 = OpTypePointer UniformConstant %type_as\n"
+ "%75 = OpConstant %type_uint32 16\n"
+ "%76 = OpConstant %type_uint32 255\n"
+ "%87 = OpConstant %type_uint32 5\n"
+ "%91 = OpConstant %type_uint32 3\n"
+
+ // <changed_section>
+ "%type_uint64 = OpTypeInt 64 0\n"
+ "%104 = OpTypeRuntimeArray %type_uint64\n"
+ "%105 = OpTypeStruct %104\n"
+ "%106 = OpTypePointer StorageBuffer %105\n"
+ "%var_as_pointers_ssbo = OpVariable %106 StorageBuffer\n"
+ "%type_uint64_ssbo_ptr = OpTypePointer StorageBuffer %type_uint64\n"
+ // </changed_section>
+
+ // void main()
+ "%4 = OpFunction %2 None %3\n"
+ "%5 = OpLabel\n"
+ "%8 = OpVariable %7 Function\n"
+ "%10 = OpVariable %7 Function\n"
+ "%14 = OpVariable %13 Function\n"
+ "%19 = OpVariable %13 Function\n"
+ "%24 = OpVariable %23 Function\n"
+ "%32 = OpVariable %23 Function\n"
+ "%36 = OpVariable %23 Function\n"
+ "OpStore %8 %9\n"
+ "OpStore %10 %11\n"
+ "OpStore %14 %18\n"
+ "OpStore %19 %21\n"
+ "%30 = OpAccessChain %29 %27 %28\n"
+ "%31 = OpLoad %type_uint32 %30\n"
+ "OpStore %24 %31\n"
+ "%34 = OpAccessChain %29 %33 %28\n"
+ "%35 = OpLoad %type_uint32 %34\n"
+ "OpStore %32 %35\n"
+ "%43 = OpLoad %type_uint32 %24\n"
+ "%44 = OpCopyObject %type_uint32 %43\n"
+ "%46 = OpAccessChain %45 %var_tlas_indices %c_int32_0 %44\n"
+ "%47 = OpLoad %type_uint32 %46\n"
+ "OpStore %36 %47\n"
+ // atomicAdd
+ "%52 = OpLoad %type_uint32 %24\n"
+ "%53 = OpCopyObject %type_uint32 %52\n"
+ "%54 = OpAccessChain %45 %var_result %c_int32_0 %53\n"
+ "%57 = OpAtomicIAdd %type_uint32 %54 %56 %28 %55\n"
+ // setup payload
+ "%61 = OpLoad %type_uint32 %24\n"
+ "%62 = OpLoad %type_uint32 %32\n"
+ "%63 = OpIAdd %type_uint32 %61 %62\n"
+ "%64 = OpCompositeConstruct %58 %63 %28\n"
+ "OpStore %60 %64\n"
+ // trace rays using tlas from array
+ "%70 = OpLoad %type_uint32 %36\n"
+ "%71 = OpCopyObject %type_uint32 %70\n"
+ "%73 = OpAccessChain %72 %var_as_arr_ptr %71\n"
+ "%74 = OpLoad %type_as %73\n"
+ "%77 = OpLoad %12 %14\n"
+ "%78 = OpLoad %6 %8\n"
+ "%79 = OpLoad %12 %19\n"
+ "%80 = OpLoad %6 %10\n"
+ "OpTraceRayKHR %74 %75 %76 %28 %28 %28 %77 %78 %79 %80 %60\n"
+ // atomicAdd
+ "%81 = OpLoad %type_uint32 %24\n"
+ "%82 = OpLoad %type_uint32 %32\n"
+ "%83 = OpIMul %type_uint32 %82 %55\n"
+ "%84 = OpIAdd %type_uint32 %81 %83\n"
+ "%85 = OpCopyObject %type_uint32 %84\n"
+ "%86 = OpAccessChain %45 %var_result %c_int32_0 %85\n"
+ "%88 = OpAtomicIAdd %type_uint32 %86 %56 %28 %87\n"
+ // setup payload
+ "%89 = OpLoad %type_uint32 %24\n"
+ "%90 = OpLoad %type_uint32 %32\n"
+ "%92 = OpIMul %type_uint32 %90 %91\n"
+ "%93 = OpIAdd %type_uint32 %89 %92\n"
+ "%94 = OpCompositeConstruct %58 %93 %56\n"
+ "OpStore %60 %94\n"
+ // trace rays using pointers to tlas
+ "%95 = OpLoad %type_uint32 %36\n"
+ "%as_index = OpCopyObject %type_uint32 %95\n"
+
+ // <changed_section> OLD
+ "%as_device_addres_ptr = OpAccessChain %type_uint64_ssbo_ptr %var_as_pointers_ssbo %c_int32_0 %as_index\n"
+ "%as_device_addres = OpLoad %type_uint64 %as_device_addres_ptr Aligned 8\n"
+ "%as_to_use = OpConvertUToAccelerationStructureKHR %type_as %as_device_addres\n"
+ // </changed_section>
+
+ "%99 = OpLoad %12 %14\n"
+ "%100 = OpLoad %6 %8\n"
+ "%101 = OpLoad %12 %19\n"
+ "%102 = OpLoad %6 %10\n"
+ "OpTraceRayKHR %as_to_use %75 %76 %28 %28 %28 %99 %100 %101 %102 %60\n"
+ "OpReturn\n"
+ "OpFunctionEnd\n";
+ programCollection.spirvAsmSources.add("rgen") << rgenSource << spvBuildOptions;
+
+ std::string chitSource =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "#extension GL_EXT_nonuniform_qualifier : enable\n"
+ "layout(location = 0) rayPayloadInEXT uvec2 payload;\n"
+ "\n"
+ "layout(set = 0, binding = 3) writeonly buffer Result {\n"
+ " uint value[];\n"
+ "} result;\n"
+ "void main()\n"
+ "{\n"
+ // payload.y is 0 or 1 so we will add 3 or 7 (just two prime numbers)
+ " atomicAdd(result.value[nonuniformEXT(payload.x)], 3 + payload.y * 4);\n"
+ "}\n";
+ programCollection.glslSources.add("chit") << glu::ClosestHitSource(chitSource) << glslBuildOptions;
+}
+
+TestInstance* RayTracingASDynamicIndexingTestCase::createInstance(Context& context) const
+{
+ return new RayTracingASDynamicIndexingTestInstance(context);
+}
+
+RayTracingASDynamicIndexingTestInstance::RayTracingASDynamicIndexingTestInstance(Context& context)
+ : vkt::TestInstance(context)
+{
+}
+
+tcu::TestStatus RayTracingASDynamicIndexingTestInstance::iterate(void)
+{
+ const InstanceInterface& vki = m_context.getInstanceInterface();
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const VkQueue queue = m_context.getUniversalQueue();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ const deUint32 shaderGroupHandleSize = getShaderGroupSize(vki, physicalDevice);
+ const deUint32 shaderGroupBaseAlignment = getShaderGroupBaseAlignment(vki, physicalDevice);
+ const deUint32 tlasCount = 500; // changing this will require also changing shaders
+ const deUint32 activeTlasCount = 32; // number of tlas out of <tlasCount> that will be active
+
+ const Move<VkDescriptorSetLayout> descriptorSetLayout = DescriptorSetLayoutBuilder()
+ .addArrayBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, tlasCount, ALL_RAY_TRACING_STAGES)
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, ALL_RAY_TRACING_STAGES) // pointers to all acceleration structures
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, ALL_RAY_TRACING_STAGES) // ssbo with indices of all acceleration structures
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, ALL_RAY_TRACING_STAGES) // ssbo with result values
+ .build(vkd, device);
+
+ const Move<VkDescriptorPool> descriptorPool = DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, tlasCount)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
+ .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const Move<VkDescriptorSet> descriptorSet = makeDescriptorSet(vkd, device, *descriptorPool, *descriptorSetLayout);
+
+ de::MovePtr<RayTracingPipeline> rayTracingPipeline = de::newMovePtr<RayTracingPipeline>();
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("rgen"), 0), 0);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("chit"), 0), 1);
+
+ const Move<VkPipelineLayout> pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+ Move<VkPipeline> pipeline = rayTracingPipeline->createPipeline(vkd, device, *pipelineLayout);
+ de::MovePtr<BufferWithMemory> raygenShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, *pipeline, allocator, shaderGroupHandleSize, shaderGroupBaseAlignment, 0, 1);
+ de::MovePtr<BufferWithMemory> hitShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, *pipeline, allocator, shaderGroupHandleSize, shaderGroupBaseAlignment, 1, 1);
+
+ const VkStridedDeviceAddressRegionKHR raygenShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, raygenShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ const VkStridedDeviceAddressRegionKHR missShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ const VkStridedDeviceAddressRegionKHR hitShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, hitShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ const VkStridedDeviceAddressRegionKHR callableShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+
+ const VkDeviceSize pointerBufferSize = tlasCount * sizeof(VkDeviceAddress);
+ const VkBufferCreateInfo pointerBufferCreateInfo = makeBufferCreateInfo(pointerBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ de::MovePtr<BufferWithMemory> pointerBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, pointerBufferCreateInfo, MemoryRequirement::HostVisible | MemoryRequirement::DeviceAddress));
+
+ const VkDeviceSize indicesBufferSize = activeTlasCount * sizeof(deUint32);
+ const VkBufferCreateInfo indicesBufferCreateInfo = makeBufferCreateInfo(indicesBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ de::MovePtr<BufferWithMemory> indicesBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, indicesBufferCreateInfo, MemoryRequirement::HostVisible));
+
+ const VkDeviceSize resultBufferSize = activeTlasCount * sizeof(deUint32) * 4;
+ const VkBufferCreateInfo resultBufferCreateInfo = makeBufferCreateInfo(resultBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+ de::MovePtr<BufferWithMemory> resultBuffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
+
+ const Move<VkCommandPool> cmdPool = createCommandPool(vkd, device, 0, queueFamilyIndex);
+ const Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> blas = de::SharedPtr<BottomLevelAccelerationStructure>(makeBottomLevelAccelerationStructure().release());
+ std::vector<de::MovePtr<TopLevelAccelerationStructure>> tlasVect(tlasCount);
+ std::vector<VkDeviceAddress> tlasPtrVect(tlasCount);
+ std::vector<VkAccelerationStructureKHR> tlasVkVect;
+
+ // randomly scatter active AS across the range
+ deRandom rnd;
+ deRandom_init(&rnd, 123);
+ std::set<deUint32> asIndicesSet;
+ while (asIndicesSet.size() < activeTlasCount)
+ asIndicesSet.insert(deRandom_getUint32(&rnd) % tlasCount);
+
+ // fill indices buffer
+ deUint32 helperIndex = 0;
+ auto& indicesBufferAlloc = indicesBuffer->getAllocation();
+ deUint32* indicesBufferPtr = reinterpret_cast<deUint32*>(indicesBufferAlloc.getHostPtr());
+ std::for_each(asIndicesSet.begin(), asIndicesSet.end(),
+ [&helperIndex, indicesBufferPtr](const deUint32& index)
+ {
+ indicesBufferPtr[helperIndex++] = index;
+ });
+ vk::flushAlloc(vkd, device, indicesBufferAlloc);
+
+ // clear result buffer
+ auto& resultBufferAlloc = resultBuffer->getAllocation();
+ void* resultBufferPtr = resultBufferAlloc.getHostPtr();
+ deMemset(resultBufferPtr, 0, static_cast<size_t>(resultBufferSize));
+ vk::flushAlloc(vkd, device, resultBufferAlloc);
+
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
+ {
+ // build bottom level acceleration structure
+ blas->setGeometryData(
+ {
+ { 0.0, 0.0, 0.0 },
+ { 1.0, 0.0, 0.0 },
+ { 0.0, 1.0, 0.0 },
+ },
+ true,
+ VK_GEOMETRY_OPAQUE_BIT_KHR
+ );
+
+ blas->createAndBuild(vkd, device, *cmdBuffer, allocator);
+
+ // build top level acceleration structures
+ for (deUint32 tlasIndex = 0; tlasIndex < tlasCount; ++tlasIndex)
+ {
+ auto& tlas = tlasVect[tlasIndex];
+ tlas = makeTopLevelAccelerationStructure();
+ tlas->setInstanceCount(1);
+ tlas->addInstance(blas);
+ if (!asIndicesSet.count(tlasIndex))
+ {
+ // tlas that are not in asIndicesSet should be empty but it is hard to do
+ // that with current cts utils so we are marking them as inactive instead
+ tlas->setInactiveInstances(true);
+ }
+ tlas->createAndBuild(vkd, device, *cmdBuffer, allocator);
+
+ // get acceleration structure device address
+ const VkAccelerationStructureDeviceAddressInfoKHR addressInfo =
+ {
+ VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ *tlas->getPtr() // VkAccelerationStructureKHR accelerationStructure
+ };
+ VkDeviceAddress vkda = vkd.getAccelerationStructureDeviceAddressKHR(device, &addressInfo);
+ tlasPtrVect[tlasIndex] = vkda;
+ }
+
+ // fill pointer buffer
+ vkd.cmdUpdateBuffer(*cmdBuffer, **pointerBuffer, 0, pointerBufferSize, tlasPtrVect.data());
+
+ // wait for data transfers
+ const VkMemoryBarrier bufferUploadBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, &bufferUploadBarrier, 1u);
+
+ // wait for as build
+ const VkMemoryBarrier asBuildBarrier = makeMemoryBarrier(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR);
+ cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, &asBuildBarrier, 1u);
+
+ tlasVkVect.reserve(tlasCount);
+ for (auto& tlas : tlasVect)
+ tlasVkVect.push_back(*tlas->getPtr());
+
+ VkWriteDescriptorSetAccelerationStructureKHR accelerationStructureWriteDescriptorSet =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, // VkStructureType sType;
+ DE_NULL, // const void* pNext;
+ tlasCount, // deUint32 accelerationStructureCount;
+ tlasVkVect.data(), // const VkAccelerationStructureKHR* pAccelerationStructures;
+ };
+
+ const vk::VkDescriptorBufferInfo pointerBufferInfo = makeDescriptorBufferInfo(**pointerBuffer, 0u, VK_WHOLE_SIZE);
+ const vk::VkDescriptorBufferInfo indicesBufferInfo = makeDescriptorBufferInfo(**indicesBuffer, 0u, VK_WHOLE_SIZE);
+ const vk::VkDescriptorBufferInfo resultInfo = makeDescriptorBufferInfo(**resultBuffer, 0u, VK_WHOLE_SIZE);
+
+ DescriptorSetUpdateBuilder()
+ .writeArray (*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, tlasCount, &accelerationStructureWriteDescriptorSet)
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &pointerBufferInfo)
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &indicesBufferInfo)
+ .writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(3u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultInfo)
+ .update(vkd, device);
+
+ vkd.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, *pipelineLayout, 0, 1, &descriptorSet.get(), 0, DE_NULL);
+
+ vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, *pipeline);
+
+ cmdTraceRays(vkd,
+ *cmdBuffer,
+ &raygenShaderBindingTableRegion,
+ &missShaderBindingTableRegion,
+ &hitShaderBindingTableRegion,
+ &callableShaderBindingTableRegion,
+ activeTlasCount, 1, 1);
+
+ const VkMemoryBarrier postTraceMemoryBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_TRANSFER_BIT, &postTraceMemoryBarrier);
+ }
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ invalidateMappedMemoryRange(vkd, device, resultBuffer->getAllocation().getMemory(), resultBuffer->getAllocation().getOffset(), resultBufferSize);
+
+ // verify result buffer
+ deUint32 failures = 0;
+ const deUint32* resultPtr = reinterpret_cast<deUint32*>(resultBuffer->getAllocation().getHostPtr());
+ for (deUint32 index = 0; index < activeTlasCount; ++index)
+ {
+ failures += (resultPtr[0 * activeTlasCount + index] != 2) +
+ (resultPtr[1 * activeTlasCount + index] != 3) +
+ (resultPtr[2 * activeTlasCount + index] != 5) +
+ (resultPtr[3 * activeTlasCount + index] != 7);
+ }
+
+ if (failures)
+ return tcu::TestStatus::fail(de::toString(failures) + " failures, " + de::toString(4 * activeTlasCount - failures) + " are ok");
+ return tcu::TestStatus::pass("Pass");
+}
+
} // anonymous
void addBasicBuildingTests(tcu::TestCaseGroup* group)
@@ -2394,6 +2891,12 @@
}
}
+void addDynamicIndexingTests (tcu::TestCaseGroup* group)
+{
+ auto& ctx = group->getTestContext();
+ group->addChild(new RayTracingASDynamicIndexingTestCase(ctx, "dynamic_indexing"));
+}
+
void addEmptyAccelerationStructureTests (tcu::TestCaseGroup* group)
{
const struct
@@ -2547,6 +3050,7 @@
addTestGroup(group.get(), "host_threading", "Test host threading operations", addHostThreadingOperationTests);
addTestGroup(group.get(), "function_argument", "Test using AS as function argument using both pointers and bare values", addFuncArgTests);
addTestGroup(group.get(), "instance_triangle_culling", "Test building AS with counterclockwise triangles and/or disabling face culling", addInstanceTriangleCullingTests);
+ addTestGroup(group.get(), "dynamic_indexing", "Exercise dynamic indexing of acceleration structures", addDynamicIndexingTests);
addTestGroup(group.get(), "empty", "Test building empty acceleration structures using different methods", addEmptyAccelerationStructureTests);
addTestGroup(group.get(), "instance_index", "Test using different values for the instance index and checking them in shaders", addInstanceIndexTests);
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarycentricCoordinatesTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarycentricCoordinatesTests.cpp
new file mode 100644
index 0000000..2ebc1be
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarycentricCoordinatesTests.cpp
@@ -0,0 +1,444 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
+ *
+ * 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 Ray Tracing Barycentric Coordinates Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktRayTracingBarycentricCoordinatesTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkRayTracingUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkBarrierUtil.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deRandom.hpp"
+
+#include <sstream>
+#include <vector>
+
+namespace vkt
+{
+namespace RayTracing
+{
+
+namespace
+{
+
+using namespace vk;
+
+struct TestParams
+{
+ VkShaderStageFlagBits stage;
+ deUint32 seed;
+};
+
+VkShaderStageFlags getUsedStages (const TestParams& params)
+{
+ return (VK_SHADER_STAGE_RAYGEN_BIT_KHR | VK_SHADER_STAGE_MISS_BIT_KHR | params.stage);
+}
+
+constexpr float kZCoord = 5.0f;
+constexpr float kXYCoordAbs = 1.0f;
+
+constexpr float kThreshold = 0.001f; // For the resulting coordinates.
+constexpr float kTMin = 1.0f - kThreshold; // Require the same precision in T.
+constexpr float kTMax = 1.0f + kThreshold; // Ditto.
+constexpr deUint32 kNumRays = 20u;
+
+class BarycentricCoordinatesCase : public TestCase
+{
+public:
+ BarycentricCoordinatesCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~BarycentricCoordinatesCase (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+protected:
+ TestParams m_params;
+};
+
+class BarycentricCoordinatesInstance : public TestInstance
+{
+public:
+ BarycentricCoordinatesInstance (Context& context, const TestParams& params);
+ virtual ~BarycentricCoordinatesInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ TestParams m_params;
+};
+
+BarycentricCoordinatesCase::BarycentricCoordinatesCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+void BarycentricCoordinatesCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+}
+
+void BarycentricCoordinatesCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ std::ostringstream layoutDecls;
+ layoutDecls
+ << "layout(set=0, binding=0) uniform accelerationStructureEXT topLevelAS;\n"
+ << "layout(set=0, binding=1) uniform RayDirections {\n"
+ << " vec4 values[" << kNumRays << "];\n"
+ << "} directions;\n"
+ << "layout(set=0, binding=2, std430) buffer OutputBarycentrics {\n"
+ << " vec4 values[" << kNumRays << "];\n"
+ << "} coordinates;\n"
+ ;
+ const auto layoutDeclsStr = layoutDecls.str();
+
+ std::ostringstream rgen;
+ rgen
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "\n"
+ << "layout(location=0) rayPayloadEXT vec3 hitValue;\n"
+ << "\n"
+ << layoutDeclsStr
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint cullMask = 0xFF;\n"
+ << " const vec3 origin = vec3(0.0, 0.0, 0.0);\n"
+ << " const vec3 direction = directions.values[gl_LaunchIDEXT.x].xyz;\n"
+ << " const float tMin = " << kTMin << ";\n"
+ << " const float tMax = " << kTMax << ";\n"
+ << " traceRayEXT(topLevelAS, gl_RayFlagsNoneEXT, cullMask, 0, 0, 0, origin, tMin, direction, tMax, 0);\n"
+ << "}\n"
+ ;
+
+ std::ostringstream hits;
+ hits
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "\n"
+ << "hitAttributeEXT vec2 baryCoord;\n"
+ << "\n"
+ << layoutDeclsStr
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " coordinates.values[gl_LaunchIDEXT.x] = vec4(baryCoord, 0.0, 0.0);\n"
+ << "}\n"
+ ;
+
+ std::ostringstream miss;
+ miss
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+ << layoutDeclsStr
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " coordinates.values[gl_LaunchIDEXT.x] = vec4(-1.0, -1.0, -1.0, -1.0);\n"
+ << "}\n";
+ ;
+
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+ programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(miss.str())) << buildOptions;
+
+ if (m_params.stage == VK_SHADER_STAGE_ANY_HIT_BIT_KHR)
+ programCollection.glslSources.add("hits") << glu::AnyHitSource(updateRayTracingGLSL(hits.str())) << buildOptions;
+ else if (m_params.stage == VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR)
+ programCollection.glslSources.add("hits") << glu::ClosestHitSource(updateRayTracingGLSL(hits.str())) << buildOptions;
+ else
+ DE_ASSERT(false);
+}
+
+TestInstance* BarycentricCoordinatesCase::createInstance (Context& context) const
+{
+ return new BarycentricCoordinatesInstance(context, m_params);
+}
+
+BarycentricCoordinatesInstance::BarycentricCoordinatesInstance (Context& context, const TestParams& params)
+ : TestInstance (context)
+ , m_params (params)
+{}
+
+// Calculates coordinates in a triangle given barycentric coordinates b and c.
+tcu::Vec3 calcCoordinates (const std::vector<tcu::Vec3>& triangle, float b, float c)
+{
+ DE_ASSERT(triangle.size() == 3u);
+ DE_ASSERT(b > 0.0f);
+ DE_ASSERT(c > 0.0f);
+ DE_ASSERT(b + c < 1.0f);
+
+ const float a = 1.0f - b - c;
+ DE_ASSERT(a > 0.0f);
+
+ return triangle[0] * a + triangle[1] * b + triangle[2] * c;
+}
+
+// Return a, b, c with a close to 1.0f and (b, c) close to 0.0f.
+tcu::Vec3 getBarycentricVertex (void)
+{
+ const float a = 0.999f;
+ const float aux = 1.0f - a;
+ const float b = aux / 2.0f;
+ const float c = b;
+
+ return tcu::Vec3(a, b, c);
+}
+
+tcu::Vec4 extendToV4 (const tcu::Vec3& vec3)
+{
+ return tcu::Vec4(vec3.x(), vec3.y(), vec3.z(), 0.0f);
+}
+
+tcu::TestStatus BarycentricCoordinatesInstance::iterate (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto physDev = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+ const auto stages = getUsedStages(m_params);
+
+ // Command pool and buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Build acceleration structures.
+ auto topLevelAS = makeTopLevelAccelerationStructure();
+ auto bottomLevelAS = makeBottomLevelAccelerationStructure();
+
+ const std::vector<tcu::Vec3> triangle =
+ {
+ tcu::Vec3( 0.0f, -kXYCoordAbs, kZCoord),
+ tcu::Vec3(-kXYCoordAbs, kXYCoordAbs, kZCoord),
+ tcu::Vec3( kXYCoordAbs, kXYCoordAbs, kZCoord),
+ };
+
+ bottomLevelAS->addGeometry(triangle, true/*is triangles*/, VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR);
+ bottomLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+ de::SharedPtr<BottomLevelAccelerationStructure> blasSharedPtr (bottomLevelAS.release());
+
+ topLevelAS->setInstanceCount(1);
+ topLevelAS->addInstance(blasSharedPtr, identityMatrix3x4, 0, 0xFFu, 0u, VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR);
+ topLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ // Uniform buffer for directions.
+ const auto directionsBufferSize = static_cast<VkDeviceSize>(sizeof(tcu::Vec4) * kNumRays);
+ const auto directionsBufferInfo = makeBufferCreateInfo(directionsBufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
+ BufferWithMemory directionsBuffer (vkd, device, alloc, directionsBufferInfo, MemoryRequirement::HostVisible);
+ auto& directionsBufferAlloc = directionsBuffer.getAllocation();
+ void* directionsBufferData = directionsBufferAlloc.getHostPtr();
+
+ // Generate rays towards the 3 triangle coordinates (avoiding exact vertices) and additional coordinates.
+ std::vector<tcu::Vec4> directions;
+ std::vector<tcu::Vec4> expectedOutputCoordinates;
+ directions.reserve(kNumRays);
+ expectedOutputCoordinates.reserve(kNumRays);
+
+ const auto barycentricABC = getBarycentricVertex();
+
+ directions.push_back(extendToV4(calcCoordinates(triangle, barycentricABC.x(), barycentricABC.y())));
+ directions.push_back(extendToV4(calcCoordinates(triangle, barycentricABC.y(), barycentricABC.x())));
+ directions.push_back(extendToV4(calcCoordinates(triangle, barycentricABC.y(), barycentricABC.z())));
+
+ expectedOutputCoordinates.push_back(tcu::Vec4(barycentricABC.x(), barycentricABC.y(), 0.0f, 0.0f));
+ expectedOutputCoordinates.push_back(tcu::Vec4(barycentricABC.y(), barycentricABC.x(), 0.0f, 0.0f));
+ expectedOutputCoordinates.push_back(tcu::Vec4(barycentricABC.y(), barycentricABC.z(), 0.0f, 0.0f));
+
+ de::Random rnd(m_params.seed);
+ while (directions.size() < kNumRays)
+ {
+ // Avoid 0.0 when choosing b and c.
+ float b;
+ while ((b = rnd.getFloat()) == 0.0f)
+ ;
+ float c;
+ while ((c = rnd.getFloat(0.0f, 1.0f - b)) == 0.0f)
+ ;
+
+ expectedOutputCoordinates.push_back(tcu::Vec4(b, c, 0.0f, 0.0f));
+ directions.push_back(extendToV4(calcCoordinates(triangle, b, c)));
+ }
+
+ deMemcpy(directionsBufferData, directions.data(), directionsBufferSize);
+ flushAlloc(vkd, device, directionsBufferAlloc);
+
+ // Storage buffer for output barycentric coordinates.
+ const auto barycoordsBufferSize = static_cast<VkDeviceSize>(sizeof(tcu::Vec4) * kNumRays);
+ const auto barycoordsBufferInfo = makeBufferCreateInfo(barycoordsBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ BufferWithMemory barycoordsBuffer (vkd, device, alloc, barycoordsBufferInfo, MemoryRequirement::HostVisible);
+ auto& barycoordsBufferAlloc = barycoordsBuffer.getAllocation();
+ void* barycoordsBufferData = barycoordsBufferAlloc.getHostPtr();
+ deMemset(barycoordsBufferData, 0, static_cast<size_t>(barycoordsBufferSize));
+ flushAlloc(vkd, device, barycoordsBufferAlloc);
+
+ // Descriptor set layout.
+ DescriptorSetLayoutBuilder dsLayoutBuilder;
+ dsLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, stages);
+ dsLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, stages);
+ dsLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stages);
+ const auto setLayout = dsLayoutBuilder.build(vkd, device);
+
+ // Pipeline layout.
+ const auto pipelineLayout = makePipelineLayout(vkd, device, setLayout.get());
+
+ // Descriptor pool and set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), setLayout.get());
+
+ // Update descriptor set.
+ {
+ const VkWriteDescriptorSetAccelerationStructureKHR accelDescInfo =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
+ nullptr,
+ 1u,
+ topLevelAS.get()->getPtr(),
+ };
+ const auto uniformBufferInfo = makeDescriptorBufferInfo(directionsBuffer.get(), 0ull, VK_WHOLE_SIZE);
+ const auto storageBufferInfo = makeDescriptorBufferInfo(barycoordsBuffer.get(), 0ull, VK_WHOLE_SIZE);
+
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &accelDescInfo);
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &uniformBufferInfo);
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &storageBufferInfo);
+ updateBuilder.update(vkd, device);
+ }
+
+ // Shader modules.
+ auto rgenModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("rgen"), 0);
+ auto missModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("miss"), 0);
+ auto hitsModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("hits"), 0);
+
+ // Get some ray tracing properties.
+ deUint32 shaderGroupHandleSize = 0u;
+ deUint32 shaderGroupBaseAlignment = 1u;
+ {
+ const auto rayTracingPropertiesKHR = makeRayTracingProperties(vki, physDev);
+ shaderGroupHandleSize = rayTracingPropertiesKHR->getShaderGroupHandleSize();
+ shaderGroupBaseAlignment = rayTracingPropertiesKHR->getShaderGroupBaseAlignment();
+ }
+
+ // Create raytracing pipeline and shader binding tables.
+ Move<VkPipeline> pipeline;
+ de::MovePtr<BufferWithMemory> raygenSBT;
+ de::MovePtr<BufferWithMemory> missSBT;
+ de::MovePtr<BufferWithMemory> hitSBT;
+ de::MovePtr<BufferWithMemory> callableSBT;
+
+ auto raygenSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ auto missSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ auto hitSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ auto callableSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+
+ {
+ const auto rayTracingPipeline = de::newMovePtr<RayTracingPipeline>();
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, rgenModule, 0);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR, missModule, 1);
+ rayTracingPipeline->addShader(m_params.stage, hitsModule, 2);
+
+ pipeline = rayTracingPipeline->createPipeline(vkd, device, pipelineLayout.get());
+
+ raygenSBT = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 0, 1);
+ raygenSBTRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, raygenSBT->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+
+ missSBT = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 1, 1);
+ missSBTRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, missSBT->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+
+ hitSBT = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 2, 1);
+ hitSBTRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, hitSBT->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+
+ // Trace rays.
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdTraceRaysKHR(cmdBuffer, &raygenSBTRegion, &missSBTRegion, &hitSBTRegion, &callableSBTRegion, kNumRays, 1u, 1u);
+
+ // Barrier for the output buffer.
+ const auto bufferBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &bufferBarrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify results.
+ std::vector<tcu::Vec4> outputData (expectedOutputCoordinates.size());
+ const auto barycoordsBufferSizeSz = static_cast<size_t>(barycoordsBufferSize);
+
+ invalidateAlloc(vkd, device, barycoordsBufferAlloc);
+ DE_ASSERT(de::dataSize(outputData) == barycoordsBufferSizeSz);
+ deMemcpy(outputData.data(), barycoordsBufferData, barycoordsBufferSizeSz);
+
+ for (size_t i = 0; i < outputData.size(); ++i)
+ {
+ const auto& outVal = outputData[i];
+ const auto& expectedVal = expectedOutputCoordinates[i];
+
+ if (outVal.z() != 0.0f || outVal.w() != 0.0f || de::abs(outVal.x() - expectedVal.x()) > kThreshold || de::abs(outVal.y() - expectedVal.y()) > kThreshold)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected value found for ray " << i << ": expected " << expectedVal << " and found " << outVal << ";";
+ TCU_FAIL(msg.str());
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createBarycentricCoordinatesTests (tcu::TestContext& testCtx)
+{
+ using GroupPtr = de::MovePtr<tcu::TestCaseGroup>;
+
+ GroupPtr mainGroup(new tcu::TestCaseGroup(testCtx, "barycentric_coordinates", "Test barycentric coordinates reported in hit attributes"));
+
+ deUint32 seed = 1614343620u;
+ mainGroup->addChild(new BarycentricCoordinatesCase(testCtx, "ahit", "", TestParams{VK_SHADER_STAGE_ANY_HIT_BIT_KHR, seed++}));
+ mainGroup->addChild(new BarycentricCoordinatesCase(testCtx, "chit", "", TestParams{VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, seed++}));
+
+ return mainGroup.release();
+}
+
+} // RayTracing
+} // vkt
+
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarycentricCoordinatesTests.hpp
similarity index 66%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarycentricCoordinatesTests.hpp
index 1a85ebf..37f3f3b 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBarycentricCoordinatesTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYTRACINGBARYCENTRICCOORDINATESTESTS_HPP
+#define _VKTRAYTRACINGBARYCENTRICCOORDINATESTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Ray Tracing Barycentric Coordinates Tests
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +29,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayTracing
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createBarycentricCoordinatesTests (tcu::TestContext& testCtx);
-} // pipeline
+} // RayTracing
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYTRACINGBARYCENTRICCOORDINATESTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuildIndirectTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuildIndirectTests.cpp
index 0b7b275..c8fbd75 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuildIndirectTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuildIndirectTests.cpp
@@ -282,7 +282,7 @@
"\n"
"void main()\n"
"{\n"
- " uint primitiveCount = " << m_data.depth << "u;\n"
+ " uint primitiveCount = " << m_data.instancesGroupCount << "u;\n"
" uint primitiveOffset = " << 0 << "u;\n"
" uint firstVertex = " << 0 << "u;\n"
" uint transformOffset = " << 0 << "u;\n"
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingCaptureReplayTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingCaptureReplayTests.cpp
index 4a828f3..123ee79 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingCaptureReplayTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingCaptureReplayTests.cpp
@@ -28,6 +28,7 @@
#include "vktTestCase.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkCmdUtil.hpp"
#include "vkObjUtil.hpp"
#include "vkBuilderUtil.hpp"
@@ -38,6 +39,8 @@
#include "vkRayTracingUtil.hpp"
+#include "tcuCommandLine.hpp"
+
namespace vkt
{
namespace RayTracing
@@ -929,6 +932,7 @@
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkInstance instance = m_context.getInstance();
const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
+ const auto validationEnabled = m_context.getTestContext().getCommandLine().isValidationEnabled();
VkQueue queue = DE_NULL;
deUint32 queueFamilyIndex = NO_MATCH_FOUND;
@@ -997,7 +1001,7 @@
deviceInfo.pEnabledFeatures = DE_NULL;
deviceInfo.queueCreateInfoCount = 1;
deviceInfo.pQueueCreateInfos = &queueInfo;
- Move<VkDevice> testDevice = createDevice(vkp, m_context.getInstance(), vki, physicalDevice, &deviceInfo);
+ Move<VkDevice> testDevice = createCustomDevice(validationEnabled, vkp, m_context.getInstance(), vki, physicalDevice, &deviceInfo);
VkDevice device = *testDevice;
DeviceDriver vkd (vkp, instance, device);
@@ -1197,8 +1201,12 @@
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR)
{
- const VkMemoryBarrier serializeMemoryBarrier = makeMemoryBarrier(VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT);
- cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &serializeMemoryBarrier);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ vkd.resetCommandPool(device, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
}
de::MovePtr<BottomLevelAccelerationStructure> asCopy = makeBottomLevelAccelerationStructure();
@@ -1296,8 +1304,12 @@
if (m_data.buildType == VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR)
{
- const VkMemoryBarrier serializeMemoryBarrier = makeMemoryBarrier(VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT);
- cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &serializeMemoryBarrier);
+ endCommandBuffer(vkd, *cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+
+ vkd.resetCommandPool(device, *cmdPool, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
+ beginCommandBuffer(vkd, *cmdBuffer, 0u);
}
topLevelAccelerationStructureCopy = makeTopLevelAccelerationStructure();
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp
index 2bf869a..bef7ff6 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingComplexControlFlowTests.cpp
@@ -231,7 +231,6 @@
const VkShaderStageFlags shaderStageFlags,
deUint32& shaderGroup,
deUint32& shaderGroupCount) const;
- void checkSupportInInstance (void) const;
PushConstants getPushConstants (void) const;
std::vector<deUint32> getExpectedValues (void) const;
de::MovePtr<BufferWithMemory> runTest (void);
@@ -359,6 +358,9 @@
if (0 != (m_shaders2 & VK_SHADER_STAGE_MISS_BIT_KHR)) rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR , createShaderModule(vkd, device, collection.get("miss2"), 0), m_missShaderGroup + 1);
if (0 != (m_shaders2 & VK_SHADER_STAGE_INTERSECTION_BIT_KHR)) rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR , createShaderModule(vkd, device, collection.get("sect2"), 0), m_hitShaderGroup + 1);
+ if (m_data.testOp == TEST_OP_TRACE_RAY && m_data.stage != VK_SHADER_STAGE_RAYGEN_BIT_KHR)
+ rayTracingPipeline->setMaxRecursionDepth(2);
+
Move<VkPipeline> pipeline = rayTracingPipeline->createPipeline(vkd, device, pipelineLayout);
return pipeline;
@@ -636,10 +638,6 @@
return buffer;
}
-void RayTracingComplexControlFlowInstance::checkSupportInInstance (void) const
-{
-}
-
std::vector<deUint32> RayTracingComplexControlFlowInstance::getExpectedValues (void) const
{
const deUint32 plainSize = m_data.width * m_data.height;
@@ -972,8 +970,6 @@
tcu::TestStatus RayTracingComplexControlFlowInstance::iterate (void)
{
- checkSupportInInstance();
-
const de::MovePtr<BufferWithMemory> buffer = runTest();
const deUint32* bufferPtr = (deUint32*)buffer->getAllocation().getHostPtr();
const vector<deUint32> expected = getExpectedValues();
@@ -1041,7 +1037,7 @@
static inline const std::string getMissPassthrough (void);
static inline const std::string getHitPassthrough (void);
- CaseDef m_data;
+ CaseDef m_data;
};
ComplexControlFlowTestCase::ComplexControlFlowTestCase (tcu::TestContext& context, const char* name, const char* desc, const CaseDef data)
@@ -1057,15 +1053,26 @@
void ComplexControlFlowTestCase::checkSupport (Context& context) const
{
context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+
const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
+
if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
TCU_THROW(TestError, "VK_KHR_ray_tracing_pipeline requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+
const VkPhysicalDeviceRayTracingPipelineFeaturesKHR& rayTracingPipelineFeaturesKHR = context.getRayTracingPipelineFeatures();
+
if (rayTracingPipelineFeaturesKHR.rayTracingPipeline == DE_FALSE)
TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline");
+ const VkPhysicalDeviceRayTracingPipelinePropertiesKHR& rayTracingPipelinePropertiesKHR = context.getRayTracingPipelineProperties();
+
+ if (m_data.testOp == TEST_OP_TRACE_RAY && m_data.stage != VK_SHADER_STAGE_RAYGEN_BIT_KHR)
+ {
+ if (rayTracingPipelinePropertiesKHR.maxRayRecursionDepth < 2)
+ TCU_THROW(NotSupportedError, "rayTracingPipelinePropertiesKHR.maxRayRecursionDepth is smaller than required");
+ }
}
@@ -1685,6 +1692,15 @@
tcu::TestCaseGroup* createComplexControlFlowTests (tcu::TestContext& testCtx)
{
+ const VkShaderStageFlagBits R = VK_SHADER_STAGE_RAYGEN_BIT_KHR;
+ const VkShaderStageFlagBits A = VK_SHADER_STAGE_ANY_HIT_BIT_KHR;
+ const VkShaderStageFlagBits C = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
+ const VkShaderStageFlagBits M = VK_SHADER_STAGE_MISS_BIT_KHR;
+ const VkShaderStageFlagBits I = VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
+ const VkShaderStageFlagBits L = VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+
+ DE_UNREF(A);
+
static const struct
{
const char* name;
@@ -1701,14 +1717,15 @@
};
static const struct
{
- const char* name;
- TestOp op;
+ const char* name;
+ TestOp op;
+ VkShaderStageFlags applicableInStages;
}
testOps[]
{
- { "execute_callable", TEST_OP_EXECUTE_CALLABLE },
- { "trace_ray", TEST_OP_TRACE_RAY },
- { "report_intersection", TEST_OP_REPORT_INTERSECTION },
+ { "execute_callable", TEST_OP_EXECUTE_CALLABLE, R | C | M | L },
+ { "trace_ray", TEST_OP_TRACE_RAY, R | C | M },
+ { "report_intersection", TEST_OP_REPORT_INTERSECTION, I },
};
static const struct
{
@@ -1756,36 +1773,9 @@
height, // deUint32 height;
};
- if (testOp == TEST_OP_REPORT_INTERSECTION && testStage != VK_SHADER_STAGE_INTERSECTION_BIT_KHR)
+ if ((testOps[testOpNdx].applicableInStages & static_cast<VkShaderStageFlags>(testStage)) == 0)
continue;
- if (testOp == TEST_OP_TRACE_RAY)
- {
- switch (testStage)
- {
- case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
- case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
- case VK_SHADER_STAGE_MISS_BIT_KHR:
- break;
- default:
- continue;
- }
- }
-
- if (testOp == TEST_OP_EXECUTE_CALLABLE)
- {
- switch (testStage)
- {
- case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
- case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
- case VK_SHADER_STAGE_MISS_BIT_KHR:
- case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
- break;
- default:
- continue;
- }
- }
-
testOpGroup->addChild(new ComplexControlFlowTestCase(testCtx, testName.c_str(), "", caseDef));
}
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDataSpillTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDataSpillTests.cpp
new file mode 100644
index 0000000..07617dd
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDataSpillTests.cpp
@@ -0,0 +1,2819 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
+ *
+ * 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 Ray Tracing Data Spill tests
+ *//*--------------------------------------------------------------------*/
+#include "vktRayTracingDataSpillTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkRayTracingUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkBarrierUtil.hpp"
+
+#include "tcuStringTemplate.hpp"
+#include "tcuFloat.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deSTLUtil.hpp"
+
+#include <sstream>
+#include <string>
+#include <map>
+#include <vector>
+#include <array>
+#include <utility>
+
+using namespace vk;
+
+namespace vkt
+{
+namespace RayTracing
+{
+
+namespace
+{
+
+// The type of shader call that will be used.
+enum class CallType
+{
+ TRACE_RAY = 0,
+ EXECUTE_CALLABLE,
+ REPORT_INTERSECTION,
+};
+
+// The type of data that will be checked.
+enum class DataType
+{
+ // These can be made an array or vector.
+ INT32 = 0,
+ UINT32,
+ INT64,
+ UINT64,
+ INT16,
+ UINT16,
+ INT8,
+ UINT8,
+ FLOAT32,
+ FLOAT64,
+ FLOAT16,
+
+ // These are standalone, so the vector type should be scalar.
+ STRUCT,
+ IMAGE,
+ SAMPLER,
+ SAMPLED_IMAGE,
+ PTR_IMAGE,
+ PTR_SAMPLER,
+ PTR_SAMPLED_IMAGE,
+ PTR_TEXEL,
+ OP_NULL,
+ OP_UNDEF,
+};
+
+// The type of vector in use.
+enum class VectorType
+{
+ SCALAR = 1,
+ V2 = 2,
+ V3 = 3,
+ V4 = 4,
+ A5 = 5,
+};
+
+struct InputStruct
+{
+ deUint32 uintPart;
+ float floatPart;
+};
+
+constexpr auto kImageFormat = VK_FORMAT_R32_UINT;
+const auto kImageExtent = makeExtent3D(1u, 1u, 1u);
+
+// For samplers.
+const VkImageUsageFlags kSampledImageUsage = (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
+constexpr size_t kNumImages = 4u;
+constexpr size_t kNumSamplers = 4u;
+constexpr size_t kNumCombined = 2u;
+constexpr size_t kNumAloneImages = kNumImages - kNumCombined;
+constexpr size_t kNumAloneSamplers = kNumSamplers - kNumCombined;
+
+// For storage images.
+const VkImageUsageFlags kStorageImageUsage = (VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT);
+
+// For the pipeline interface tests.
+constexpr size_t kNumStorageValues = 6u;
+constexpr deUint32 kShaderRecordSize = sizeof(tcu::UVec4);
+
+// Get the effective vector length in memory.
+size_t getEffectiveVectorLength (VectorType vectorType)
+{
+ return ((vectorType == VectorType::V3) ? static_cast<size_t>(4) : static_cast<size_t>(vectorType));
+}
+
+// Get the corresponding element size.
+VkDeviceSize getElementSize(DataType dataType, VectorType vectorType)
+{
+ const size_t length = getEffectiveVectorLength(vectorType);
+ size_t dataSize = 0u;
+
+ switch (dataType)
+ {
+ case DataType::INT32: dataSize = sizeof(deInt32); break;
+ case DataType::UINT32: dataSize = sizeof(deUint32); break;
+ case DataType::INT64: dataSize = sizeof(deInt64); break;
+ case DataType::UINT64: dataSize = sizeof(deUint64); break;
+ case DataType::INT16: dataSize = sizeof(deInt16); break;
+ case DataType::UINT16: dataSize = sizeof(deUint16); break;
+ case DataType::INT8: dataSize = sizeof(deInt8); break;
+ case DataType::UINT8: dataSize = sizeof(deUint8); break;
+ case DataType::FLOAT32: dataSize = sizeof(tcu::Float32); break;
+ case DataType::FLOAT64: dataSize = sizeof(tcu::Float64); break;
+ case DataType::FLOAT16: dataSize = sizeof(tcu::Float16); break;
+ case DataType::STRUCT: dataSize = sizeof(InputStruct); break;
+ case DataType::IMAGE: // fallthrough.
+ case DataType::SAMPLER: // fallthrough.
+ case DataType::SAMPLED_IMAGE: // fallthrough.
+ case DataType::PTR_IMAGE: // fallthrough.
+ case DataType::PTR_SAMPLER: // fallthrough.
+ case DataType::PTR_SAMPLED_IMAGE: // fallthrough.
+ dataSize = sizeof(tcu::Float32); break;
+ case DataType::PTR_TEXEL: dataSize = sizeof(deInt32); break;
+ case DataType::OP_NULL: // fallthrough.
+ case DataType::OP_UNDEF: // fallthrough.
+ dataSize = sizeof(deUint32); break;
+ default: DE_ASSERT(false); break;
+ }
+
+ return static_cast<VkDeviceSize>(dataSize * length);
+}
+
+// Proper stage for generating default geometry.
+VkShaderStageFlagBits getShaderStageForGeometry (CallType type_)
+{
+ VkShaderStageFlagBits bits = VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM;
+
+ switch (type_)
+ {
+ case CallType::TRACE_RAY: bits = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR; break;
+ case CallType::EXECUTE_CALLABLE: bits = VK_SHADER_STAGE_CALLABLE_BIT_KHR; break;
+ case CallType::REPORT_INTERSECTION: bits = VK_SHADER_STAGE_INTERSECTION_BIT_KHR; break;
+ default: DE_ASSERT(false); break;
+ }
+
+ DE_ASSERT(bits != VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM);
+ return bits;
+}
+
+VkShaderStageFlags getShaderStages (CallType type_)
+{
+ VkShaderStageFlags flags = VK_SHADER_STAGE_RAYGEN_BIT_KHR;
+
+ switch (type_)
+ {
+ case CallType::EXECUTE_CALLABLE:
+ flags |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+ break;
+ case CallType::TRACE_RAY:
+ flags |= VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
+ break;
+ case CallType::REPORT_INTERSECTION:
+ flags |= VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
+ flags |= VK_SHADER_STAGE_ANY_HIT_BIT_KHR;
+ break;
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+
+ return flags;
+}
+
+// Some test types need additional descriptors with samplers, images and combined image samplers.
+bool samplersNeeded (DataType dataType)
+{
+ bool needed = false;
+
+ switch (dataType)
+ {
+ case DataType::IMAGE:
+ case DataType::SAMPLER:
+ case DataType::SAMPLED_IMAGE:
+ case DataType::PTR_IMAGE:
+ case DataType::PTR_SAMPLER:
+ case DataType::PTR_SAMPLED_IMAGE:
+ needed = true;
+ break;
+ default:
+ break;
+ }
+
+ return needed;
+}
+
+// Some test types need an additional descriptor with a storage image.
+bool storageImageNeeded (DataType dataType)
+{
+ return (dataType == DataType::PTR_TEXEL);
+}
+
+// Returns two strings:
+// .first is an optional GLSL additional type declaration (for structs, basically).
+// .second is the value declaration inside the input block.
+std::pair<std::string, std::string> getGLSLInputValDecl (DataType dataType, VectorType vectorType)
+{
+ using TypePair = std::pair<DataType, VectorType>;
+ using TypeMap = std::map<TypePair, std::string>;
+
+ const std::string varName = "val";
+ const auto dataTypeIdx = static_cast<int>(dataType);
+
+ if (dataTypeIdx >= static_cast<int>(DataType::INT32) && dataTypeIdx <= static_cast<int>(DataType::FLOAT16))
+ {
+ // Note: A5 uses the same type as the scalar version. The array suffix will be added below.
+ const TypeMap map =
+ {
+ std::make_pair(std::make_pair(DataType::INT32, VectorType::SCALAR), "int32_t"),
+ std::make_pair(std::make_pair(DataType::INT32, VectorType::V2), "i32vec2"),
+ std::make_pair(std::make_pair(DataType::INT32, VectorType::V3), "i32vec3"),
+ std::make_pair(std::make_pair(DataType::INT32, VectorType::V4), "i32vec4"),
+ std::make_pair(std::make_pair(DataType::INT32, VectorType::A5), "int32_t"),
+ std::make_pair(std::make_pair(DataType::UINT32, VectorType::SCALAR), "uint32_t"),
+ std::make_pair(std::make_pair(DataType::UINT32, VectorType::V2), "u32vec2"),
+ std::make_pair(std::make_pair(DataType::UINT32, VectorType::V3), "u32vec3"),
+ std::make_pair(std::make_pair(DataType::UINT32, VectorType::V4), "u32vec4"),
+ std::make_pair(std::make_pair(DataType::UINT32, VectorType::A5), "uint32_t"),
+ std::make_pair(std::make_pair(DataType::INT64, VectorType::SCALAR), "int64_t"),
+ std::make_pair(std::make_pair(DataType::INT64, VectorType::V2), "i64vec2"),
+ std::make_pair(std::make_pair(DataType::INT64, VectorType::V3), "i64vec3"),
+ std::make_pair(std::make_pair(DataType::INT64, VectorType::V4), "i64vec4"),
+ std::make_pair(std::make_pair(DataType::INT64, VectorType::A5), "int64_t"),
+ std::make_pair(std::make_pair(DataType::UINT64, VectorType::SCALAR), "uint64_t"),
+ std::make_pair(std::make_pair(DataType::UINT64, VectorType::V2), "u64vec2"),
+ std::make_pair(std::make_pair(DataType::UINT64, VectorType::V3), "u64vec3"),
+ std::make_pair(std::make_pair(DataType::UINT64, VectorType::V4), "u64vec4"),
+ std::make_pair(std::make_pair(DataType::UINT64, VectorType::A5), "uint64_t"),
+ std::make_pair(std::make_pair(DataType::INT16, VectorType::SCALAR), "int16_t"),
+ std::make_pair(std::make_pair(DataType::INT16, VectorType::V2), "i16vec2"),
+ std::make_pair(std::make_pair(DataType::INT16, VectorType::V3), "i16vec3"),
+ std::make_pair(std::make_pair(DataType::INT16, VectorType::V4), "i16vec4"),
+ std::make_pair(std::make_pair(DataType::INT16, VectorType::A5), "int16_t"),
+ std::make_pair(std::make_pair(DataType::UINT16, VectorType::SCALAR), "uint16_t"),
+ std::make_pair(std::make_pair(DataType::UINT16, VectorType::V2), "u16vec2"),
+ std::make_pair(std::make_pair(DataType::UINT16, VectorType::V3), "u16vec3"),
+ std::make_pair(std::make_pair(DataType::UINT16, VectorType::V4), "u16vec4"),
+ std::make_pair(std::make_pair(DataType::UINT16, VectorType::A5), "uint16_t"),
+ std::make_pair(std::make_pair(DataType::INT8, VectorType::SCALAR), "int8_t"),
+ std::make_pair(std::make_pair(DataType::INT8, VectorType::V2), "i8vec2"),
+ std::make_pair(std::make_pair(DataType::INT8, VectorType::V3), "i8vec3"),
+ std::make_pair(std::make_pair(DataType::INT8, VectorType::V4), "i8vec4"),
+ std::make_pair(std::make_pair(DataType::INT8, VectorType::A5), "int8_t"),
+ std::make_pair(std::make_pair(DataType::UINT8, VectorType::SCALAR), "uint8_t"),
+ std::make_pair(std::make_pair(DataType::UINT8, VectorType::V2), "u8vec2"),
+ std::make_pair(std::make_pair(DataType::UINT8, VectorType::V3), "u8vec3"),
+ std::make_pair(std::make_pair(DataType::UINT8, VectorType::V4), "u8vec4"),
+ std::make_pair(std::make_pair(DataType::UINT8, VectorType::A5), "uint8_t"),
+ std::make_pair(std::make_pair(DataType::FLOAT32, VectorType::SCALAR), "float32_t"),
+ std::make_pair(std::make_pair(DataType::FLOAT32, VectorType::V2), "f32vec2"),
+ std::make_pair(std::make_pair(DataType::FLOAT32, VectorType::V3), "f32vec3"),
+ std::make_pair(std::make_pair(DataType::FLOAT32, VectorType::V4), "f32vec4"),
+ std::make_pair(std::make_pair(DataType::FLOAT32, VectorType::A5), "float32_t"),
+ std::make_pair(std::make_pair(DataType::FLOAT64, VectorType::SCALAR), "float64_t"),
+ std::make_pair(std::make_pair(DataType::FLOAT64, VectorType::V2), "f64vec2"),
+ std::make_pair(std::make_pair(DataType::FLOAT64, VectorType::V3), "f64vec3"),
+ std::make_pair(std::make_pair(DataType::FLOAT64, VectorType::V4), "f64vec4"),
+ std::make_pair(std::make_pair(DataType::FLOAT64, VectorType::A5), "float64_t"),
+ std::make_pair(std::make_pair(DataType::FLOAT16, VectorType::SCALAR), "float16_t"),
+ std::make_pair(std::make_pair(DataType::FLOAT16, VectorType::V2), "f16vec2"),
+ std::make_pair(std::make_pair(DataType::FLOAT16, VectorType::V3), "f16vec3"),
+ std::make_pair(std::make_pair(DataType::FLOAT16, VectorType::V4), "f16vec4"),
+ std::make_pair(std::make_pair(DataType::FLOAT16, VectorType::A5), "float16_t"),
+ };
+
+ const auto key = std::make_pair(dataType, vectorType);
+ const auto found = map.find(key);
+
+ DE_ASSERT(found != end(map));
+
+ const auto baseType = found->second;
+ const std::string decl = baseType + " " + varName + ((vectorType == VectorType::A5) ? "[5]" : "") + ";";
+
+ return std::make_pair(std::string(), decl);
+ }
+ else if (dataType == DataType::STRUCT)
+ {
+ return std::make_pair(std::string("struct InputStruct { uint val1; float val2; };\n"), std::string("InputStruct val;"));
+ }
+ else if (samplersNeeded(dataType))
+ {
+ return std::make_pair(std::string(), std::string("float val;"));
+ }
+ else if (storageImageNeeded(dataType))
+ {
+ return std::make_pair(std::string(), std::string("int val;"));
+ }
+ else if (dataType == DataType::OP_NULL || dataType == DataType::OP_UNDEF)
+ {
+ return std::make_pair(std::string(), std::string("uint val;"));
+ }
+
+ // Unreachable.
+ DE_ASSERT(false);
+ return std::make_pair(std::string(), std::string());
+}
+
+class DataSpillTestCase : public vkt::TestCase
+{
+public:
+ struct TestParams
+ {
+ CallType callType;
+ DataType dataType;
+ VectorType vectorType;
+ };
+
+ DataSpillTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& testParams);
+ virtual ~DataSpillTestCase (void) {}
+
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
+private:
+ TestParams m_params;
+};
+
+class DataSpillTestInstance : public vkt::TestInstance
+{
+public:
+ using TestParams = DataSpillTestCase::TestParams;
+
+ DataSpillTestInstance (Context& context, const TestParams& testParams);
+ virtual ~DataSpillTestInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+private:
+ TestParams m_params;
+};
+
+
+DataSpillTestCase::DataSpillTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& testParams)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (testParams)
+{
+ switch (m_params.dataType)
+ {
+ case DataType::STRUCT:
+ case DataType::IMAGE:
+ case DataType::SAMPLER:
+ case DataType::SAMPLED_IMAGE:
+ case DataType::PTR_IMAGE:
+ case DataType::PTR_SAMPLER:
+ case DataType::PTR_SAMPLED_IMAGE:
+ case DataType::PTR_TEXEL:
+ case DataType::OP_NULL:
+ case DataType::OP_UNDEF:
+ DE_ASSERT(m_params.vectorType == VectorType::SCALAR);
+ break;
+ default:
+ break;
+ }
+
+ // The code assumes at most one of these is needed.
+ DE_ASSERT(!(samplersNeeded(m_params.dataType) && storageImageNeeded(m_params.dataType)));
+}
+
+TestInstance* DataSpillTestCase::createInstance (Context& context) const
+{
+ return new DataSpillTestInstance(context, m_params);
+}
+
+DataSpillTestInstance::DataSpillTestInstance (Context& context, const TestParams& testParams)
+ : vkt::TestInstance (context)
+ , m_params (testParams)
+{
+}
+
+// General checks for all tests.
+void commonCheckSupport (Context& context)
+{
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+
+ const auto& rtFeatures = context.getRayTracingPipelineFeatures();
+ if (!rtFeatures.rayTracingPipeline)
+ TCU_THROW(NotSupportedError, "Ray Tracing pipelines not supported");
+
+ const auto& asFeatures = context.getAccelerationStructureFeatures();
+ if (!asFeatures.accelerationStructure)
+ TCU_FAIL("VK_KHR_acceleration_structure supported without accelerationStructure support");
+
+}
+
+void DataSpillTestCase::checkSupport (Context& context) const
+{
+ // General checks first.
+ commonCheckSupport(context);
+
+ const auto& features = context.getDeviceFeatures();
+ const auto& featuresStorage16 = context.get16BitStorageFeatures();
+ const auto& featuresF16I8 = context.getShaderFloat16Int8Features();
+ const auto& featuresStorage8 = context.get8BitStorageFeatures();
+
+ if (m_params.dataType == DataType::INT64 || m_params.dataType == DataType::UINT64)
+ {
+ if (!features.shaderInt64)
+ TCU_THROW(NotSupportedError, "64-bit integers not supported");
+ }
+ else if (m_params.dataType == DataType::INT16 || m_params.dataType == DataType::UINT16)
+ {
+ context.requireDeviceFunctionality("VK_KHR_16bit_storage");
+
+ if (!features.shaderInt16)
+ TCU_THROW(NotSupportedError, "16-bit integers not supported");
+
+ if (!featuresStorage16.storageBuffer16BitAccess)
+ TCU_THROW(NotSupportedError, "16-bit storage buffer access not supported");
+ }
+ else if (m_params.dataType == DataType::INT8 || m_params.dataType == DataType::UINT8)
+ {
+ context.requireDeviceFunctionality("VK_KHR_shader_float16_int8");
+ context.requireDeviceFunctionality("VK_KHR_8bit_storage");
+
+ if (!featuresF16I8.shaderInt8)
+ TCU_THROW(NotSupportedError, "8-bit integers not supported");
+
+ if (!featuresStorage8.storageBuffer8BitAccess)
+ TCU_THROW(NotSupportedError, "8-bit storage buffer access not supported");
+ }
+ else if (m_params.dataType == DataType::FLOAT64)
+ {
+ if (!features.shaderFloat64)
+ TCU_THROW(NotSupportedError, "64-bit floats not supported");
+ }
+ else if (m_params.dataType == DataType::FLOAT16)
+ {
+ context.requireDeviceFunctionality("VK_KHR_shader_float16_int8");
+ context.requireDeviceFunctionality("VK_KHR_16bit_storage");
+
+ if (!featuresF16I8.shaderFloat16)
+ TCU_THROW(NotSupportedError, "16-bit floats not supported");
+
+ if (!featuresStorage16.storageBuffer16BitAccess)
+ TCU_THROW(NotSupportedError, "16-bit storage buffer access not supported");
+ }
+ else if (samplersNeeded(m_params.dataType))
+ {
+ context.requireDeviceFunctionality("VK_EXT_descriptor_indexing");
+ const auto indexingFeatures = context.getDescriptorIndexingFeatures();
+ if (!indexingFeatures.shaderSampledImageArrayNonUniformIndexing)
+ TCU_THROW(NotSupportedError, "No support for non-uniform sampled image arrays");
+ }
+}
+
+void DataSpillTestCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+ const vk::SpirVAsmBuildOptions spvBuildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, true);
+
+ std::ostringstream spvTemplateStream;
+
+ // This SPIR-V template will be used to generate shaders for different
+ // stages (raygen, callable, etc). The basic mechanism uses 3 SSBOs: one
+ // used strictly as an input, one to write the check result, and one to
+ // verify the shader call has taken place. The latter two SSBOs contain just
+ // a single uint, but the input SSBO typically contains other type of data
+ // that will be filled from the test instance with predetermined values. The
+ // shader will expect this data to have specific values that can be combined
+ // some way to give an expected result (e.g. by adding the 4 components if
+ // it's a vec4). This result will be used in the shader call to make sure
+ // input values are read *before* the call. After the shader call has taken
+ // place, the shader will attempt to read the input buffer again and verify
+ // the value is still correct and matches the previous one. If the result
+ // matches, it will write a confirmation value in the check buffer. In the
+ // mean time, the callee will write a confirmation value in the callee
+ // buffer to verify the shader call took place.
+ //
+ // Some test variants use samplers, images or sampled images. These need
+ // additional bindings of different types and the interesting value is
+ // typically placed in the image instead of the input buffer, while the
+ // input buffer is used for sampling coordinates instead.
+ //
+ // Some important SPIR-V template variables:
+ //
+ // - INPUT_BUFFER_VALUE_TYPE will contain the type of input buffer data.
+ // - CALC_ZERO_FOR_CALLABLE is expected to contain instructions that will
+ // calculate a value of zero to be used in the shader call instruction.
+ // This value should be derived from the input data.
+ // - CALL_STATEMENTS will contain the shader call instructions.
+ // - CALC_EQUAL_STATEMENT is expected to contain instructions that will
+ // set %equal to true as a %bool if the before- and after- data match.
+ //
+ // - %input_val_ptr contains the pointer to the input value.
+ // - %input_val_before contains the value read before the call.
+ // - %input_val_after contains the value read after the call.
+
+ spvTemplateStream
+ << " OpCapability RayTracingKHR\n"
+ << "${EXTRA_CAPABILITIES}"
+ << " OpExtension \"SPV_KHR_ray_tracing\"\n"
+ << "${EXTRA_EXTENSIONS}"
+ << " OpMemoryModel Logical GLSL450\n"
+ << " OpEntryPoint ${ENTRY_POINT} %main \"main\" %topLevelAS %calleeBuffer %outputBuffer %inputBuffer${MAIN_INTERFACE_EXTRAS}\n"
+ << "${INTERFACE_DECORATIONS}"
+ << " OpMemberDecorate %InputBlock 0 Offset 0\n"
+ << " OpDecorate %InputBlock Block\n"
+ << " OpDecorate %inputBuffer DescriptorSet 0\n"
+ << " OpDecorate %inputBuffer Binding 3\n"
+ << " OpMemberDecorate %OutputBlock 0 Offset 0\n"
+ << " OpDecorate %OutputBlock Block\n"
+ << " OpDecorate %outputBuffer DescriptorSet 0\n"
+ << " OpDecorate %outputBuffer Binding 2\n"
+ << " OpMemberDecorate %CalleeBlock 0 Offset 0\n"
+ << " OpDecorate %CalleeBlock Block\n"
+ << " OpDecorate %calleeBuffer DescriptorSet 0\n"
+ << " OpDecorate %calleeBuffer Binding 1\n"
+ << " OpDecorate %topLevelAS DescriptorSet 0\n"
+ << " OpDecorate %topLevelAS Binding 0\n"
+ << "${EXTRA_BINDINGS}"
+ << " %void = OpTypeVoid\n"
+ << " %void_func = OpTypeFunction %void\n"
+ << " %int = OpTypeInt 32 1\n"
+ << " %uint = OpTypeInt 32 0\n"
+ << " %int_0 = OpConstant %int 0\n"
+ << " %uint_0 = OpConstant %uint 0\n"
+ << " %uint_1 = OpConstant %uint 1\n"
+ << " %uint_2 = OpConstant %uint 2\n"
+ << " %uint_3 = OpConstant %uint 3\n"
+ << " %uint_4 = OpConstant %uint 4\n"
+ << " %uint_5 = OpConstant %uint 5\n"
+ << " %uint_255 = OpConstant %uint 255\n"
+ << " %bool = OpTypeBool\n"
+ << " %float = OpTypeFloat 32\n"
+ << " %float_0 = OpConstant %float 0\n"
+ << " %float_1 = OpConstant %float 1\n"
+ << " %float_9 = OpConstant %float 9\n"
+ << " %float_0_5 = OpConstant %float 0.5\n"
+ << " %float_n1 = OpConstant %float -1\n"
+ << " %v3float = OpTypeVector %float 3\n"
+ << " %origin_const = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0\n"
+ << " %direction_const = OpConstantComposite %v3float %float_0 %float_0 %float_n1\n"
+ << "${EXTRA_TYPES_AND_CONSTANTS}"
+ << " %data_func_ptr = OpTypePointer Function ${INPUT_BUFFER_VALUE_TYPE}\n"
+ << "${INTERFACE_TYPES_AND_VARIABLES}"
+ << " %InputBlock = OpTypeStruct ${INPUT_BUFFER_VALUE_TYPE}\n"
+ << " %_ptr_StorageBuffer_InputBlock = OpTypePointer StorageBuffer %InputBlock\n"
+ << " %inputBuffer = OpVariable %_ptr_StorageBuffer_InputBlock StorageBuffer\n"
+ << " %data_storagebuffer_ptr = OpTypePointer StorageBuffer ${INPUT_BUFFER_VALUE_TYPE}\n"
+ << " %OutputBlock = OpTypeStruct %uint\n"
+ << "%_ptr_StorageBuffer_OutputBlock = OpTypePointer StorageBuffer %OutputBlock\n"
+ << " %outputBuffer = OpVariable %_ptr_StorageBuffer_OutputBlock StorageBuffer\n"
+ << " %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint\n"
+ << " %CalleeBlock = OpTypeStruct %uint\n"
+ << "%_ptr_StorageBuffer_CalleeBlock = OpTypePointer StorageBuffer %CalleeBlock\n"
+ << " %calleeBuffer = OpVariable %_ptr_StorageBuffer_CalleeBlock StorageBuffer\n"
+ << " %as_type = OpTypeAccelerationStructureKHR\n"
+ << " %as_uniformconstant_ptr = OpTypePointer UniformConstant %as_type\n"
+ << " %topLevelAS = OpVariable %as_uniformconstant_ptr UniformConstant\n"
+ << "${EXTRA_BINDING_VARIABLES}"
+ << " %main = OpFunction %void None %void_func\n"
+ << " %main_label = OpLabel\n"
+ << "${EXTRA_FUNCTION_VARIABLES}"
+ << " %input_val_ptr = OpAccessChain %data_storagebuffer_ptr %inputBuffer %int_0\n"
+ << " %output_val_ptr = OpAccessChain %_ptr_StorageBuffer_uint %outputBuffer %int_0\n"
+ // Note we use Volatile to load the input buffer value before and after the call statements.
+ << " %input_val_before = OpLoad ${INPUT_BUFFER_VALUE_TYPE} %input_val_ptr Volatile\n"
+ << "${CALC_ZERO_FOR_CALLABLE}"
+ << "${CALL_STATEMENTS}"
+ << " %input_val_after = OpLoad ${INPUT_BUFFER_VALUE_TYPE} %input_val_ptr Volatile\n"
+ << "${CALC_EQUAL_STATEMENT}"
+ << " %output_val = OpSelect %uint %equal %uint_1 %uint_0\n"
+ << " OpStore %output_val_ptr %output_val\n"
+ << " OpReturn\n"
+ << " OpFunctionEnd\n"
+ ;
+
+ const tcu::StringTemplate spvTemplate (spvTemplateStream.str());
+
+ std::map<std::string, std::string> subs;
+ std::string componentTypeName;
+ std::string opEqual;
+ const int numComponents = static_cast<int>(m_params.vectorType);
+ const auto isArray = (numComponents > static_cast<int>(VectorType::V4));
+ const auto numComponentsStr = de::toString(numComponents);
+
+ subs["EXTRA_CAPABILITIES"] = "";
+ subs["EXTRA_EXTENSIONS"] = "";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] = "";
+ subs["EXTRA_FUNCTION_VARIABLES"] = "";
+ subs["EXTRA_BINDINGS"] = "";
+ subs["EXTRA_BINDING_VARIABLES"] = "";
+ subs["EXTRA_FUNCTIONS"] = "";
+
+ // Take into account some of these substitutions will be updated after the if-block.
+
+ if (m_params.dataType == DataType::INT32)
+ {
+ componentTypeName = "int";
+
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%int";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %int_37 = OpConstant %int 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_int = OpISub %int %input_val_before %int_37\n"
+ " %zero_for_callable = OpBitcast %uint %zero_int\n";
+ }
+ else if (m_params.dataType == DataType::UINT32)
+ {
+ componentTypeName = "uint";
+
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%uint";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %uint_37 = OpConstant %uint 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_for_callable = OpISub %uint %input_val_before %uint_37\n";
+ }
+ else if (m_params.dataType == DataType::INT64)
+ {
+ componentTypeName = "long";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Int64\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%long";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %long = OpTypeInt 64 1\n"
+ " %long_37 = OpConstant %long 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_long = OpISub %long %input_val_before %long_37\n"
+ " %zero_for_callable = OpSConvert %uint %zero_long\n";
+ }
+ else if (m_params.dataType == DataType::UINT64)
+ {
+ componentTypeName = "ulong";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Int64\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%ulong";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %ulong = OpTypeInt 64 0\n"
+ " %ulong_37 = OpConstant %ulong 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_ulong = OpISub %ulong %input_val_before %ulong_37\n"
+ " %zero_for_callable = OpUConvert %uint %zero_ulong\n";
+ }
+ else if (m_params.dataType == DataType::INT16)
+ {
+ componentTypeName = "short";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Int16\n"
+ " OpCapability StorageBuffer16BitAccess\n";
+ subs["EXTRA_EXTENSIONS"] += " OpExtension \"SPV_KHR_16bit_storage\"\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%short";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %short = OpTypeInt 16 1\n"
+ " %short_37 = OpConstant %short 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_short = OpISub %short %input_val_before %short_37\n"
+ " %zero_for_callable = OpSConvert %uint %zero_short\n";
+ }
+ else if (m_params.dataType == DataType::UINT16)
+ {
+ componentTypeName = "ushort";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Int16\n"
+ " OpCapability StorageBuffer16BitAccess\n";
+ subs["EXTRA_EXTENSIONS"] += " OpExtension \"SPV_KHR_16bit_storage\"\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%ushort";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %ushort = OpTypeInt 16 0\n"
+ " %ushort_37 = OpConstant %ushort 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_ushort = OpISub %ushort %input_val_before %ushort_37\n"
+ " %zero_for_callable = OpUConvert %uint %zero_ushort\n";
+ }
+ else if (m_params.dataType == DataType::INT8)
+ {
+ componentTypeName = "char";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Int8\n"
+ " OpCapability StorageBuffer8BitAccess\n";
+ subs["EXTRA_EXTENSIONS"] += " OpExtension \"SPV_KHR_8bit_storage\"\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%char";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %char = OpTypeInt 8 1\n"
+ " %char_37 = OpConstant %char 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_char = OpISub %char %input_val_before %char_37\n"
+ " %zero_for_callable = OpSConvert %uint %zero_char\n";
+ }
+ else if (m_params.dataType == DataType::UINT8)
+ {
+ componentTypeName = "uchar";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Int8\n"
+ " OpCapability StorageBuffer8BitAccess\n";
+ subs["EXTRA_EXTENSIONS"] += " OpExtension \"SPV_KHR_8bit_storage\"\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%uchar";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %uchar = OpTypeInt 8 0\n"
+ " %uchar_37 = OpConstant %uchar 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_uchar = OpISub %uchar %input_val_before %uchar_37\n"
+ " %zero_for_callable = OpUConvert %uint %zero_uchar\n";
+ }
+ else if (m_params.dataType == DataType::FLOAT32)
+ {
+ componentTypeName = "float";
+
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%float";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %float_37 = OpConstant %float 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_float = OpFSub %float %input_val_before %float_37\n"
+ " %zero_for_callable = OpConvertFToU %uint %zero_float\n";
+ }
+ else if (m_params.dataType == DataType::FLOAT64)
+ {
+ componentTypeName = "double";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Float64\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%double";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %double = OpTypeFloat 64\n"
+ " %double_37 = OpConstant %double 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_double = OpFSub %double %input_val_before %double_37\n"
+ " %zero_for_callable = OpConvertFToU %uint %zero_double\n";
+ }
+ else if (m_params.dataType == DataType::FLOAT16)
+ {
+ componentTypeName = "half";
+
+ subs["EXTRA_CAPABILITIES"] += " OpCapability Float16\n"
+ " OpCapability StorageBuffer16BitAccess\n";
+ subs["EXTRA_EXTENSIONS"] += " OpExtension \"SPV_KHR_16bit_storage\"\n";
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%half";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %half = OpTypeFloat 16\n"
+ " %half_37 = OpConstant %half 37\n";
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %zero_half = OpFSub %half %input_val_before %half_37\n"
+ " %zero_for_callable = OpConvertFToU %uint %zero_half\n";
+ }
+ else if (m_params.dataType == DataType::STRUCT)
+ {
+ componentTypeName = "InputStruct";
+
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%InputStruct";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %InputStruct = OpTypeStruct %uint %float\n"
+ " %float_37 = OpConstant %float 37\n"
+ " %uint_part_ptr_type = OpTypePointer StorageBuffer %uint\n"
+ " %float_part_ptr_type = OpTypePointer StorageBuffer %float\n"
+ " %uint_part_func_ptr_type = OpTypePointer Function %uint\n"
+ " %float_part_func_ptr_type = OpTypePointer Function %float\n"
+ " %input_struct_func_ptr_type = OpTypePointer Function %InputStruct\n"
+ ;
+ subs["INTERFACE_DECORATIONS"] = " OpMemberDecorate %InputStruct 0 Offset 0\n"
+ " OpMemberDecorate %InputStruct 1 Offset 4\n";
+
+ // Sum struct members, then substract constant and convert to uint.
+ subs["CALC_ZERO_FOR_CALLABLE"] = " %uint_part_ptr = OpAccessChain %uint_part_ptr_type %input_val_ptr %uint_0\n"
+ " %float_part_ptr = OpAccessChain %float_part_ptr_type %input_val_ptr %uint_1\n"
+ " %uint_part = OpLoad %uint %uint_part_ptr\n"
+ " %float_part = OpLoad %float %float_part_ptr\n"
+ " %uint_as_float = OpConvertUToF %float %uint_part\n"
+ " %member_sum = OpFAdd %float %float_part %uint_as_float\n"
+ " %zero_float = OpFSub %float %member_sum %float_37\n"
+ " %zero_for_callable = OpConvertFToU %uint %zero_float\n"
+ ;
+ }
+ else if (samplersNeeded(m_params.dataType))
+ {
+ // These tests will use additional bindings as arrays of 2 elements:
+ // - 1 array of samplers.
+ // - 1 array of images.
+ // - 1 array of combined image samplers.
+ // Input values are typically used as texture coordinates (normally zeros)
+ // Pixels will contain the expected values instead of them being in the input buffer.
+
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%float";
+ subs["EXTRA_CAPABILITIES"] += " OpCapability SampledImageArrayNonUniformIndexing\n";
+ subs["EXTRA_EXTENSIONS"] += " OpExtension \"SPV_EXT_descriptor_indexing\"\n";
+ subs["MAIN_INTERFACE_EXTRAS"] += " %sampledTexture %textureSampler %combinedImageSampler";
+ subs["EXTRA_BINDINGS"] += " OpDecorate %sampledTexture DescriptorSet 0\n"
+ " OpDecorate %sampledTexture Binding 4\n"
+ " OpDecorate %textureSampler DescriptorSet 0\n"
+ " OpDecorate %textureSampler Binding 5\n"
+ " OpDecorate %combinedImageSampler DescriptorSet 0\n"
+ " OpDecorate %combinedImageSampler Binding 6\n";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %uint_37 = OpConstant %uint 37\n"
+ " %v4uint = OpTypeVector %uint 4\n"
+ " %v2float = OpTypeVector %float 2\n"
+ " %image_type = OpTypeImage %uint 2D 0 0 0 1 Unknown\n"
+ " %image_array_type = OpTypeArray %image_type %uint_2\n"
+ " %image_array_type_uniform_ptr = OpTypePointer UniformConstant %image_array_type\n"
+ " %image_type_uniform_ptr = OpTypePointer UniformConstant %image_type\n"
+ " %sampler_type = OpTypeSampler\n"
+ " %sampler_array_type = OpTypeArray %sampler_type %uint_2\n"
+ "%sampler_array_type_uniform_ptr = OpTypePointer UniformConstant %sampler_array_type\n"
+ " %sampler_type_uniform_ptr = OpTypePointer UniformConstant %sampler_type\n"
+ " %sampled_image_type = OpTypeSampledImage %image_type\n"
+ " %sampled_image_array_type = OpTypeArray %sampled_image_type %uint_2\n"
+ "%sampled_image_array_type_uniform_ptr = OpTypePointer UniformConstant %sampled_image_array_type\n"
+ "%sampled_image_type_uniform_ptr = OpTypePointer UniformConstant %sampled_image_type\n"
+ ;
+ subs["EXTRA_BINDING_VARIABLES"] += " %sampledTexture = OpVariable %image_array_type_uniform_ptr UniformConstant\n"
+ " %textureSampler = OpVariable %sampler_array_type_uniform_ptr UniformConstant\n"
+ " %combinedImageSampler = OpVariable %sampled_image_array_type_uniform_ptr UniformConstant\n"
+ ;
+
+ if (m_params.dataType == DataType::IMAGE || m_params.dataType == DataType::SAMPLER)
+ {
+ // Use the first sampler and sample from the first image.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%image_0_ptr = OpAccessChain %image_type_uniform_ptr %sampledTexture %uint_0\n"
+ "%sampler_0_ptr = OpAccessChain %sampler_type_uniform_ptr %textureSampler %uint_0\n"
+ "%sampler_0 = OpLoad %sampler_type %sampler_0_ptr\n"
+ "%image_0 = OpLoad %image_type %image_0_ptr\n"
+ "%sampled_image_0 = OpSampledImage %sampled_image_type %image_0 %sampler_0\n"
+ "%texture_coords_0 = OpCompositeConstruct %v2float %input_val_before %input_val_before\n"
+ "%pixel_vec_0 = OpImageSampleExplicitLod %v4uint %sampled_image_0 %texture_coords_0 Lod|ZeroExtend %float_0\n"
+ "%pixel_0 = OpCompositeExtract %uint %pixel_vec_0 0\n"
+ "%zero_for_callable = OpISub %uint %pixel_0 %uint_37\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::SAMPLED_IMAGE)
+ {
+ // Use the first combined image sampler.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%sampled_image_0_ptr = OpAccessChain %sampled_image_type_uniform_ptr %combinedImageSampler %uint_0\n"
+ "%sampled_image_0 = OpLoad %sampled_image_type %sampled_image_0_ptr\n"
+ "%texture_coords_0 = OpCompositeConstruct %v2float %input_val_before %input_val_before\n"
+ "%pixel_vec_0 = OpImageSampleExplicitLod %v4uint %sampled_image_0 %texture_coords_0 Lod|ZeroExtend %float_0\n"
+ "%pixel_0 = OpCompositeExtract %uint %pixel_vec_0 0\n"
+ "%zero_for_callable = OpISub %uint %pixel_0 %uint_37\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::PTR_IMAGE)
+ {
+ // We attempt to create the second pointer before the call.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%image_0_ptr = OpAccessChain %image_type_uniform_ptr %sampledTexture %uint_0\n"
+ "%image_1_ptr = OpAccessChain %image_type_uniform_ptr %sampledTexture %uint_1\n"
+ "%image_0 = OpLoad %image_type %image_0_ptr\n"
+ "%sampler_0_ptr = OpAccessChain %sampler_type_uniform_ptr %textureSampler %uint_0\n"
+ "%sampler_0 = OpLoad %sampler_type %sampler_0_ptr\n"
+ "%sampled_image_0 = OpSampledImage %sampled_image_type %image_0 %sampler_0\n"
+ "%texture_coords_0 = OpCompositeConstruct %v2float %input_val_before %input_val_before\n"
+ "%pixel_vec_0 = OpImageSampleExplicitLod %v4uint %sampled_image_0 %texture_coords_0 Lod|ZeroExtend %float_0\n"
+ "%pixel_0 = OpCompositeExtract %uint %pixel_vec_0 0\n"
+ "%zero_for_callable = OpISub %uint %pixel_0 %uint_37\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::PTR_SAMPLER)
+ {
+ // We attempt to create the second pointer before the call.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%sampler_0_ptr = OpAccessChain %sampler_type_uniform_ptr %textureSampler %uint_0\n"
+ "%sampler_1_ptr = OpAccessChain %sampler_type_uniform_ptr %textureSampler %uint_1\n"
+ "%sampler_0 = OpLoad %sampler_type %sampler_0_ptr\n"
+ "%image_0_ptr = OpAccessChain %image_type_uniform_ptr %sampledTexture %uint_0\n"
+ "%image_0 = OpLoad %image_type %image_0_ptr\n"
+ "%sampled_image_0 = OpSampledImage %sampled_image_type %image_0 %sampler_0\n"
+ "%texture_coords_0 = OpCompositeConstruct %v2float %input_val_before %input_val_before\n"
+ "%pixel_vec_0 = OpImageSampleExplicitLod %v4uint %sampled_image_0 %texture_coords_0 Lod|ZeroExtend %float_0\n"
+ "%pixel_0 = OpCompositeExtract %uint %pixel_vec_0 0\n"
+ "%zero_for_callable = OpISub %uint %pixel_0 %uint_37\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::PTR_SAMPLED_IMAGE)
+ {
+ // We attempt to create the second pointer before the call.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%sampled_image_0_ptr = OpAccessChain %sampled_image_type_uniform_ptr %combinedImageSampler %uint_0\n"
+ "%sampled_image_1_ptr = OpAccessChain %sampled_image_type_uniform_ptr %combinedImageSampler %uint_1\n"
+ "%sampled_image_0 = OpLoad %sampled_image_type %sampled_image_0_ptr\n"
+ "%texture_coords_0 = OpCompositeConstruct %v2float %input_val_before %input_val_before\n"
+ "%pixel_vec_0 = OpImageSampleExplicitLod %v4uint %sampled_image_0 %texture_coords_0 Lod|ZeroExtend %float_0\n"
+ "%pixel_0 = OpCompositeExtract %uint %pixel_vec_0 0\n"
+ "%zero_for_callable = OpISub %uint %pixel_0 %uint_37\n"
+ ;
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+ else if (storageImageNeeded(m_params.dataType))
+ {
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%int";
+ subs["MAIN_INTERFACE_EXTRAS"] += " %storageImage";
+ subs["EXTRA_BINDINGS"] += " OpDecorate %storageImage DescriptorSet 0\n"
+ " OpDecorate %storageImage Binding 4\n"
+ ;
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %uint_37 = OpConstant %uint 37\n"
+ " %v2int = OpTypeVector %int 2\n"
+ " %image_type = OpTypeImage %uint 2D 0 0 0 2 R32ui\n"
+ " %image_type_uniform_ptr = OpTypePointer UniformConstant %image_type\n"
+ " %uint_img_ptr = OpTypePointer Image %uint\n"
+ ;
+ subs["EXTRA_BINDING_VARIABLES"] += " %storageImage = OpVariable %image_type_uniform_ptr UniformConstant\n"
+ ;
+
+ // Load value from the image, expecting it to be 37 and swapping it with 5.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%coords = OpCompositeConstruct %v2int %input_val_before %input_val_before\n"
+ "%texel_ptr = OpImageTexelPointer %uint_img_ptr %storageImage %coords %uint_0\n"
+ "%texel_value = OpAtomicCompareExchange %uint %texel_ptr %uint_1 %uint_0 %uint_0 %uint_5 %uint_37\n"
+ "%zero_for_callable = OpISub %uint %texel_value %uint_37\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::OP_NULL)
+ {
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%uint";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %uint_37 = OpConstant %uint 37\n"
+ " %constant_null = OpConstantNull %uint\n"
+ ;
+
+ // Create a local copy of the null constant global object to work with it.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%constant_null_copy = OpCopyObject %uint %constant_null\n"
+ "%is_37_before = OpIEqual %bool %input_val_before %uint_37\n"
+ "%zero_for_callable = OpSelect %uint %is_37_before %constant_null_copy %uint_5\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::OP_UNDEF)
+ {
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%uint";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += " %uint_37 = OpConstant %uint 37\n"
+ ;
+
+ // Extract an undef value and write it to the output buffer to make sure it's used before the call. The value will be overwritten later.
+ subs["CALC_ZERO_FOR_CALLABLE"] += "%undef_var = OpUndef %uint\n"
+ "%undef_val_before = OpCopyObject %uint %undef_var\n"
+ "OpStore %output_val_ptr %undef_val_before Volatile\n"
+ "%zero_for_callable = OpISub %uint %uint_37 %input_val_before\n"
+ ;
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+
+ // Comparison statement for data before and after the call.
+ switch (m_params.dataType)
+ {
+ case DataType::INT32:
+ case DataType::UINT32:
+ case DataType::INT64:
+ case DataType::UINT64:
+ case DataType::INT16:
+ case DataType::UINT16:
+ case DataType::INT8:
+ case DataType::UINT8:
+ opEqual = "OpIEqual";
+ break;
+ case DataType::FLOAT32:
+ case DataType::FLOAT64:
+ case DataType::FLOAT16:
+ opEqual = "OpFOrdEqual";
+ break;
+ case DataType::STRUCT:
+ case DataType::IMAGE:
+ case DataType::SAMPLER:
+ case DataType::SAMPLED_IMAGE:
+ case DataType::PTR_IMAGE:
+ case DataType::PTR_SAMPLER:
+ case DataType::PTR_SAMPLED_IMAGE:
+ case DataType::PTR_TEXEL:
+ case DataType::OP_NULL:
+ case DataType::OP_UNDEF:
+ // These needs special code for the comparison.
+ opEqual = "INVALID";
+ break;
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+
+ if (m_params.dataType == DataType::STRUCT)
+ {
+ // We need to store the before and after values in a variable in order to be able to access each member individually without accessing the StorageBuffer again.
+ subs["EXTRA_FUNCTION_VARIABLES"] = " %input_val_func_before = OpVariable %input_struct_func_ptr_type Function\n"
+ " %input_val_func_after = OpVariable %input_struct_func_ptr_type Function\n"
+ ;
+ subs["CALC_EQUAL_STATEMENT"] = " OpStore %input_val_func_before %input_val_before\n"
+ " OpStore %input_val_func_after %input_val_after\n"
+ " %uint_part_func_before_ptr = OpAccessChain %uint_part_func_ptr_type %input_val_func_before %uint_0\n"
+ " %float_part_func_before_ptr = OpAccessChain %float_part_func_ptr_type %input_val_func_before %uint_1\n"
+ " %uint_part_func_after_ptr = OpAccessChain %uint_part_func_ptr_type %input_val_func_after %uint_0\n"
+ " %float_part_func_after_ptr = OpAccessChain %float_part_func_ptr_type %input_val_func_after %uint_1\n"
+ " %uint_part_before = OpLoad %uint %uint_part_func_before_ptr\n"
+ " %float_part_before = OpLoad %float %float_part_func_before_ptr\n"
+ " %uint_part_after = OpLoad %uint %uint_part_func_after_ptr\n"
+ " %float_part_after = OpLoad %float %float_part_func_after_ptr\n"
+ " %uint_equal = OpIEqual %bool %uint_part_before %uint_part_after\n"
+ " %float_equal = OpFOrdEqual %bool %float_part_before %float_part_after\n"
+ " %equal = OpLogicalAnd %bool %uint_equal %float_equal\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::IMAGE)
+ {
+ // Use the same image and the second sampler with different coordinates (actually the same).
+ subs["CALC_EQUAL_STATEMENT"] += "%sampler_1_ptr = OpAccessChain %sampler_type_uniform_ptr %textureSampler %uint_1\n"
+ "%sampler_1 = OpLoad %sampler_type %sampler_1_ptr\n"
+ "%sampled_image_1 = OpSampledImage %sampled_image_type %image_0 %sampler_1\n"
+ "%texture_coords_1 = OpCompositeConstruct %v2float %input_val_after %input_val_after\n"
+ "%pixel_vec_1 = OpImageSampleExplicitLod %v4uint %sampled_image_1 %texture_coords_1 Lod|ZeroExtend %float_0\n"
+ "%pixel_1 = OpCompositeExtract %uint %pixel_vec_1 0\n"
+ "%equal = OpIEqual %bool %pixel_0 %pixel_1\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::SAMPLER)
+ {
+ // Use the same sampler and sample from the second image with different coordinates (but actually the same).
+ subs["CALC_EQUAL_STATEMENT"] += "%image_1_ptr = OpAccessChain %image_type_uniform_ptr %sampledTexture %uint_1\n"
+ "%image_1 = OpLoad %image_type %image_1_ptr\n"
+ "%sampled_image_1 = OpSampledImage %sampled_image_type %image_1 %sampler_0\n"
+ "%texture_coords_1 = OpCompositeConstruct %v2float %input_val_after %input_val_after\n"
+ "%pixel_vec_1 = OpImageSampleExplicitLod %v4uint %sampled_image_1 %texture_coords_1 Lod|ZeroExtend %float_0\n"
+ "%pixel_1 = OpCompositeExtract %uint %pixel_vec_1 0\n"
+ "%equal = OpIEqual %bool %pixel_0 %pixel_1\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::SAMPLED_IMAGE)
+ {
+ // Reuse the same combined image sampler with different coordinates (actually the same).
+ subs["CALC_EQUAL_STATEMENT"] += "%texture_coords_1 = OpCompositeConstruct %v2float %input_val_after %input_val_after\n"
+ "%pixel_vec_1 = OpImageSampleExplicitLod %v4uint %sampled_image_0 %texture_coords_1 Lod|ZeroExtend %float_0\n"
+ "%pixel_1 = OpCompositeExtract %uint %pixel_vec_1 0\n"
+ "%equal = OpIEqual %bool %pixel_0 %pixel_1\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::PTR_IMAGE)
+ {
+ // We attempt to use the second pointer only after the call.
+ subs["CALC_EQUAL_STATEMENT"] += "%image_1 = OpLoad %image_type %image_1_ptr\n"
+ "%sampled_image_1 = OpSampledImage %sampled_image_type %image_1 %sampler_0\n"
+ "%texture_coords_1 = OpCompositeConstruct %v2float %input_val_after %input_val_after\n"
+ "%pixel_vec_1 = OpImageSampleExplicitLod %v4uint %sampled_image_1 %texture_coords_1 Lod|ZeroExtend %float_0\n"
+ "%pixel_1 = OpCompositeExtract %uint %pixel_vec_1 0\n"
+ "%equal = OpIEqual %bool %pixel_0 %pixel_1\n"
+ ;
+
+ }
+ else if (m_params.dataType == DataType::PTR_SAMPLER)
+ {
+ // We attempt to use the second pointer only after the call.
+ subs["CALC_EQUAL_STATEMENT"] += "%sampler_1 = OpLoad %sampler_type %sampler_1_ptr\n"
+ "%sampled_image_1 = OpSampledImage %sampled_image_type %image_0 %sampler_1\n"
+ "%texture_coords_1 = OpCompositeConstruct %v2float %input_val_after %input_val_after\n"
+ "%pixel_vec_1 = OpImageSampleExplicitLod %v4uint %sampled_image_1 %texture_coords_1 Lod|ZeroExtend %float_0\n"
+ "%pixel_1 = OpCompositeExtract %uint %pixel_vec_1 0\n"
+ "%equal = OpIEqual %bool %pixel_0 %pixel_1\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::PTR_SAMPLED_IMAGE)
+ {
+ // We attempt to use the second pointer only after the call.
+ subs["CALC_EQUAL_STATEMENT"] += "%sampled_image_1 = OpLoad %sampled_image_type %sampled_image_1_ptr\n"
+ "%texture_coords_1 = OpCompositeConstruct %v2float %input_val_after %input_val_after\n"
+ "%pixel_vec_1 = OpImageSampleExplicitLod %v4uint %sampled_image_1 %texture_coords_1 Lod|ZeroExtend %float_0\n"
+ "%pixel_1 = OpCompositeExtract %uint %pixel_vec_1 0\n"
+ "%equal = OpIEqual %bool %pixel_0 %pixel_1\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::PTR_TEXEL)
+ {
+ // Check value 5 was stored properly.
+ subs["CALC_EQUAL_STATEMENT"] += "%stored_val = OpAtomicLoad %uint %texel_ptr %uint_1 %uint_0\n"
+ "%equal = OpIEqual %bool %stored_val %uint_5\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::OP_NULL)
+ {
+ // Reuse the null constant after the call.
+ subs["CALC_EQUAL_STATEMENT"] += "%is_37_after = OpIEqual %bool %input_val_after %uint_37\n"
+ "%writeback_val = OpSelect %uint %is_37_after %constant_null_copy %uint_5\n"
+ "OpStore %input_val_ptr %writeback_val Volatile\n"
+ "%readback_val = OpLoad %uint %input_val_ptr Volatile\n"
+ "%equal = OpIEqual %bool %readback_val %uint_0\n"
+ ;
+ }
+ else if (m_params.dataType == DataType::OP_UNDEF)
+ {
+ // Extract another undef value and write it to the input buffer. It will not be checked later.
+ subs["CALC_EQUAL_STATEMENT"] += "%undef_val_after = OpCopyObject %uint %undef_var\n"
+ "OpStore %input_val_ptr %undef_val_after Volatile\n"
+ "%equal = OpIEqual %bool %input_val_after %input_val_before\n"
+ ;
+ }
+ else
+ {
+ subs["CALC_EQUAL_STATEMENT"] += " %equal = " + opEqual + " %bool %input_val_before %input_val_after\n";
+ }
+
+ // Modifications for vectors and arrays.
+ if (numComponents > 1)
+ {
+ const std::string vectorTypeName = "v" + numComponentsStr + componentTypeName;
+ const std::string opType = (isArray ? "OpTypeArray" : "OpTypeVector");
+ const std::string componentCountStr = (isArray ? ("%uint_" + numComponentsStr) : numComponentsStr);
+
+ // Some extra types are needed.
+ if (!(m_params.dataType == DataType::FLOAT32 && m_params.vectorType == VectorType::V3))
+ {
+ // Note: v3float is already defined in the shader by default.
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += "%" + vectorTypeName + " = " + opType + " %" + componentTypeName + " " + componentCountStr + "\n";
+ }
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += "%v" + numComponentsStr + "bool = " + opType + " %bool " + componentCountStr + "\n";
+ subs["EXTRA_TYPES_AND_CONSTANTS"] += "%comp_ptr = OpTypePointer StorageBuffer %" + componentTypeName + "\n";
+
+ // The input value in the buffer has a different type.
+ subs["INPUT_BUFFER_VALUE_TYPE"] = "%" + vectorTypeName;
+
+ // Overwrite the way we calculate the zero used in the call.
+
+ // Proper operations for adding, substracting and converting components.
+ std::string opAdd;
+ std::string opSub;
+ std::string opConvert;
+
+ switch (m_params.dataType)
+ {
+ case DataType::INT32:
+ case DataType::UINT32:
+ case DataType::INT64:
+ case DataType::UINT64:
+ case DataType::INT16:
+ case DataType::UINT16:
+ case DataType::INT8:
+ case DataType::UINT8:
+ opAdd = "OpIAdd";
+ opSub = "OpISub";
+ break;
+ case DataType::FLOAT32:
+ case DataType::FLOAT64:
+ case DataType::FLOAT16:
+ opAdd = "OpFAdd";
+ opSub = "OpFSub";
+ break;
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+
+ switch (m_params.dataType)
+ {
+ case DataType::UINT32:
+ opConvert = "OpCopyObject";
+ break;
+ case DataType::INT32:
+ opConvert = "OpBitcast";
+ break;
+ case DataType::INT64:
+ case DataType::INT16:
+ case DataType::INT8:
+ opConvert = "OpSConvert";
+ break;
+ case DataType::UINT64:
+ case DataType::UINT16:
+ case DataType::UINT8:
+ opConvert = "OpUConvert";
+ break;
+ case DataType::FLOAT32:
+ case DataType::FLOAT64:
+ case DataType::FLOAT16:
+ opConvert = "OpConvertFToU";
+ break;
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+
+ std::ostringstream zeroForCallable;
+
+ // Create pointers to components and load components.
+ for (int i = 0; i < numComponents; ++i)
+ {
+ zeroForCallable
+ << "%component_ptr_" << i << " = OpAccessChain %comp_ptr %input_val_ptr %uint_" << i << "\n"
+ << "%component_" << i << " = OpLoad %" << componentTypeName << " %component_ptr_" << i << "\n"
+ ;
+ }
+
+ // Sum components together in %total_sum.
+ for (int i = 1; i < numComponents; ++i)
+ {
+ const std::string previous = ((i == 1) ? "%component_0" : ("%partial_" + de::toString(i-1)));
+ const std::string resultName = ((i == (numComponents - 1)) ? "%total_sum" : ("%partial_" + de::toString(i)));
+ zeroForCallable << resultName << " = " << opAdd << " %" << componentTypeName << " %component_" << i << " " << previous << "\n";
+ }
+
+ // Recalculate the zero.
+ zeroForCallable
+ << "%zero_" << componentTypeName << " = " << opSub << " %" << componentTypeName << " %total_sum %" << componentTypeName << "_37\n"
+ << "%zero_for_callable = " << opConvert << " %uint %zero_" << componentTypeName << "\n"
+ ;
+
+ // Finally replace the zero_for_callable statements with the special version for vectors.
+ subs["CALC_ZERO_FOR_CALLABLE"] = zeroForCallable.str();
+
+ // Rework comparison statements.
+ if (isArray)
+ {
+ // Arrays need to be compared per-component.
+ std::ostringstream calcEqual;
+
+ for (int i = 0; i < numComponents; ++i)
+ {
+ calcEqual
+ << "%component_after_" << i << " = OpLoad %" << componentTypeName << " %component_ptr_" << i << "\n"
+ << "%equal_" << i << " = " << opEqual << " %bool %component_" << i << " %component_after_" << i << "\n";
+ ;
+ if (i > 0)
+ calcEqual << "%and_" << i << " = OpLogicalAnd %bool %equal_" << (i - 1) << " %equal_" << i << "\n";
+ if (i == numComponents - 1)
+ calcEqual << "%equal = OpCopyObject %bool %and_" << i << "\n";
+ }
+
+ subs["CALC_EQUAL_STATEMENT"] = calcEqual.str();
+ }
+ else
+ {
+ // Vectors can be compared using a bool vector and OpAll.
+ subs["CALC_EQUAL_STATEMENT"] = " %equal_vector = " + opEqual + " %v" + numComponentsStr + "bool %input_val_before %input_val_after\n";
+ subs["CALC_EQUAL_STATEMENT"] += " %equal = OpAll %bool %equal_vector\n";
+ }
+ }
+
+ if (isArray)
+ {
+ // Arrays need an ArrayStride decoration.
+ std::ostringstream interfaceDecorations;
+ interfaceDecorations << "OpDecorate %v" << numComponentsStr << componentTypeName << " ArrayStride " << getElementSize(m_params.dataType, VectorType::SCALAR) << "\n";
+ subs["INTERFACE_DECORATIONS"] = interfaceDecorations.str();
+ }
+
+ const auto inputBlockDecls = getGLSLInputValDecl(m_params.dataType, m_params.vectorType);
+
+ std::ostringstream glslBindings;
+ glslBindings
+ << inputBlockDecls.first // Additional data types needed.
+ << "layout(set = 0, binding = 0) uniform accelerationStructureEXT topLevelAS;\n"
+ << "layout(set = 0, binding = 1) buffer CalleeBlock { uint val; } calleeBuffer;\n"
+ << "layout(set = 0, binding = 2) buffer OutputBlock { uint val; } outputBuffer;\n"
+ << "layout(set = 0, binding = 3) buffer InputBlock { " << inputBlockDecls.second << " } inputBuffer;\n"
+ ;
+
+ if (samplersNeeded(m_params.dataType))
+ {
+ glslBindings
+ << "layout(set = 0, binding = 4) uniform utexture2D sampledTexture[2];\n"
+ << "layout(set = 0, binding = 5) uniform sampler textureSampler[2];\n"
+ << "layout(set = 0, binding = 6) uniform usampler2D combinedImageSampler[2];\n"
+ ;
+ }
+ else if (storageImageNeeded(m_params.dataType))
+ {
+ glslBindings
+ << "layout(set = 0, binding = 4, r32ui) uniform uimage2D storageImage;\n"
+ ;
+ }
+
+ const auto glslBindingsStr = glslBindings.str();
+ const auto glslHeaderStr = "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "#extension GL_EXT_shader_explicit_arithmetic_types : require\n";
+
+
+ if (m_params.callType == CallType::TRACE_RAY)
+ {
+ subs["ENTRY_POINT"] = "RayGenerationKHR";
+ subs["MAIN_INTERFACE_EXTRAS"] += " %hitValue";
+ subs["INTERFACE_DECORATIONS"] += " OpDecorate %hitValue Location 0\n";
+ subs["INTERFACE_TYPES_AND_VARIABLES"] = " %payload_ptr = OpTypePointer RayPayloadKHR %v3float\n"
+ " %hitValue = OpVariable %payload_ptr RayPayloadKHR\n";
+ subs["CALL_STATEMENTS"] = " %as_value = OpLoad %as_type %topLevelAS\n"
+ " OpTraceRayKHR %as_value %uint_0 %uint_255 %zero_for_callable %zero_for_callable %zero_for_callable %origin_const %float_0 %direction_const %float_9 %hitValue\n";
+
+ const auto rgen = spvTemplate.specialize(subs);
+ programCollection.spirvAsmSources.add("rgen") << rgen << spvBuildOptions;
+
+ std::stringstream chit;
+ chit
+ << glslHeaderStr
+ << "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+ << "hitAttributeEXT vec3 attribs;\n"
+ << glslBindingsStr
+ << "void main()\n"
+ << "{\n"
+ << " calleeBuffer.val = 1u;\n"
+ << "}\n";
+ ;
+ programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(chit.str())) << buildOptions;
+ }
+ else if (m_params.callType == CallType::EXECUTE_CALLABLE)
+ {
+ subs["ENTRY_POINT"] = "RayGenerationKHR";
+ subs["MAIN_INTERFACE_EXTRAS"] += " %callableData";
+ subs["INTERFACE_DECORATIONS"] += " OpDecorate %callableData Location 0\n";
+ subs["INTERFACE_TYPES_AND_VARIABLES"] = " %callable_data_ptr = OpTypePointer CallableDataKHR %float\n"
+ " %callableData = OpVariable %callable_data_ptr CallableDataKHR\n";
+ subs["CALL_STATEMENTS"] = " OpExecuteCallableKHR %zero_for_callable %callableData\n";
+
+ const auto rgen = spvTemplate.specialize(subs);
+ programCollection.spirvAsmSources.add("rgen") << rgen << spvBuildOptions;
+
+ std::ostringstream call;
+ call
+ << glslHeaderStr
+ << "layout(location = 0) callableDataInEXT float callableData;\n"
+ << glslBindingsStr
+ << "void main()\n"
+ << "{\n"
+ << " calleeBuffer.val = 1u;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("call") << glu::CallableSource(updateRayTracingGLSL(call.str())) << buildOptions;
+ }
+ else if (m_params.callType == CallType::REPORT_INTERSECTION)
+ {
+ subs["ENTRY_POINT"] = "IntersectionKHR";
+ subs["MAIN_INTERFACE_EXTRAS"] += " %attribs";
+ subs["INTERFACE_DECORATIONS"] += "";
+ subs["INTERFACE_TYPES_AND_VARIABLES"] = " %hit_attribute_ptr = OpTypePointer HitAttributeKHR %v3float\n"
+ " %attribs = OpVariable %hit_attribute_ptr HitAttributeKHR\n";
+ subs["CALL_STATEMENTS"] = " %intersection_ret = OpReportIntersectionKHR %bool %float_1 %zero_for_callable\n";
+
+ const auto rint = spvTemplate.specialize(subs);
+ programCollection.spirvAsmSources.add("rint") << rint << spvBuildOptions;
+
+ std::ostringstream rgen;
+ rgen
+ << glslHeaderStr
+ << "layout(location = 0) rayPayloadEXT vec3 hitValue;\n"
+ << glslBindingsStr
+ << "void main()\n"
+ << "{\n"
+ << " traceRayEXT(topLevelAS, 0u, 0xFFu, 0, 0, 0, vec3(0.5, 0.5, 0.0), 0.0, vec3(0.0, 0.0, -1.0), 9.0, 0);\n"
+ << "}\n"
+ ;
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ std::stringstream ahit;
+ ahit
+ << glslHeaderStr
+ << "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+ << "hitAttributeEXT vec3 attribs;\n"
+ << glslBindingsStr
+ << "void main()\n"
+ << "{\n"
+ << " calleeBuffer.val = 1u;\n"
+ << "}\n";
+ ;
+ programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(ahit.str())) << buildOptions;
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+}
+
+using v2i32 = tcu::Vector<deInt32, 2>;
+using v3i32 = tcu::Vector<deInt32, 3>;
+using v4i32 = tcu::Vector<deInt32, 4>;
+using a5i32 = std::array<deInt32, 5>;
+
+using v2u32 = tcu::Vector<deUint32, 2>;
+using v3u32 = tcu::Vector<deUint32, 3>;
+using v4u32 = tcu::Vector<deUint32, 4>;
+using a5u32 = std::array<deUint32, 5>;
+
+using v2i64 = tcu::Vector<deInt64, 2>;
+using v3i64 = tcu::Vector<deInt64, 3>;
+using v4i64 = tcu::Vector<deInt64, 4>;
+using a5i64 = std::array<deInt64, 5>;
+
+using v2u64 = tcu::Vector<deUint64, 2>;
+using v3u64 = tcu::Vector<deUint64, 3>;
+using v4u64 = tcu::Vector<deUint64, 4>;
+using a5u64 = std::array<deUint64, 5>;
+
+using v2i16 = tcu::Vector<deInt16, 2>;
+using v3i16 = tcu::Vector<deInt16, 3>;
+using v4i16 = tcu::Vector<deInt16, 4>;
+using a5i16 = std::array<deInt16, 5>;
+
+using v2u16 = tcu::Vector<deUint16, 2>;
+using v3u16 = tcu::Vector<deUint16, 3>;
+using v4u16 = tcu::Vector<deUint16, 4>;
+using a5u16 = std::array<deUint16, 5>;
+
+using v2i8 = tcu::Vector<deInt8, 2>;
+using v3i8 = tcu::Vector<deInt8, 3>;
+using v4i8 = tcu::Vector<deInt8, 4>;
+using a5i8 = std::array<deInt8, 5>;
+
+using v2u8 = tcu::Vector<deUint8, 2>;
+using v3u8 = tcu::Vector<deUint8, 3>;
+using v4u8 = tcu::Vector<deUint8, 4>;
+using a5u8 = std::array<deUint8, 5>;
+
+using v2f32 = tcu::Vector<tcu::Float32, 2>;
+using v3f32 = tcu::Vector<tcu::Float32, 3>;
+using v4f32 = tcu::Vector<tcu::Float32, 4>;
+using a5f32 = std::array<tcu::Float32, 5>;
+
+using v2f64 = tcu::Vector<tcu::Float64, 2>;
+using v3f64 = tcu::Vector<tcu::Float64, 3>;
+using v4f64 = tcu::Vector<tcu::Float64, 4>;
+using a5f64 = std::array<tcu::Float64, 5>;
+
+using v2f16 = tcu::Vector<tcu::Float16, 2>;
+using v3f16 = tcu::Vector<tcu::Float16, 3>;
+using v4f16 = tcu::Vector<tcu::Float16, 4>;
+using a5f16 = std::array<tcu::Float16, 5>;
+
+// Scalar types get filled with value 37, matching the value that will be substracted in the shader.
+#define GEN_SCALAR_FILL(DATA_TYPE) \
+ do { \
+ const auto inputBufferValue = static_cast<DATA_TYPE>(37.0); \
+ deMemcpy(bufferPtr, &inputBufferValue, sizeof(inputBufferValue)); \
+ } while (0)
+
+// Vector types get filled with values that add up to 37, matching the value that will be substracted in the shader.
+#define GEN_V2_FILL(DATA_TYPE) \
+ do { \
+ DATA_TYPE inputBufferValue; \
+ inputBufferValue.x() = static_cast<DATA_TYPE::Element>(21.0); \
+ inputBufferValue.y() = static_cast<DATA_TYPE::Element>(16.0); \
+ deMemcpy(bufferPtr, &inputBufferValue, sizeof(inputBufferValue)); \
+ } while (0)
+
+#define GEN_V3_FILL(DATA_TYPE) \
+ do { \
+ DATA_TYPE inputBufferValue; \
+ inputBufferValue.x() = static_cast<DATA_TYPE::Element>(11.0); \
+ inputBufferValue.y() = static_cast<DATA_TYPE::Element>(19.0); \
+ inputBufferValue.z() = static_cast<DATA_TYPE::Element>(7.0); \
+ deMemcpy(bufferPtr, &inputBufferValue, sizeof(inputBufferValue)); \
+ } while (0)
+
+#define GEN_V4_FILL(DATA_TYPE) \
+ do { \
+ DATA_TYPE inputBufferValue; \
+ inputBufferValue.x() = static_cast<DATA_TYPE::Element>(9.0); \
+ inputBufferValue.y() = static_cast<DATA_TYPE::Element>(11.0); \
+ inputBufferValue.z() = static_cast<DATA_TYPE::Element>(3.0); \
+ inputBufferValue.w() = static_cast<DATA_TYPE::Element>(14.0); \
+ deMemcpy(bufferPtr, &inputBufferValue, sizeof(inputBufferValue)); \
+ } while (0)
+
+#define GEN_A5_FILL(DATA_TYPE) \
+ do { \
+ DATA_TYPE inputBufferValue; \
+ inputBufferValue[0] = static_cast<DATA_TYPE::value_type>(13.0); \
+ inputBufferValue[1] = static_cast<DATA_TYPE::value_type>(6.0); \
+ inputBufferValue[2] = static_cast<DATA_TYPE::value_type>(2.0); \
+ inputBufferValue[3] = static_cast<DATA_TYPE::value_type>(5.0); \
+ inputBufferValue[4] = static_cast<DATA_TYPE::value_type>(11.0); \
+ deMemcpy(bufferPtr, inputBufferValue.data(), de::dataSize(inputBufferValue)); \
+ } while (0)
+
+void fillInputBuffer (DataType dataType, VectorType vectorType, void* bufferPtr)
+{
+ if (vectorType == VectorType::SCALAR)
+ {
+ if (dataType == DataType::INT32) GEN_SCALAR_FILL(deInt32);
+ else if (dataType == DataType::UINT32) GEN_SCALAR_FILL(deUint32);
+ else if (dataType == DataType::INT64) GEN_SCALAR_FILL(deInt64);
+ else if (dataType == DataType::UINT64) GEN_SCALAR_FILL(deUint64);
+ else if (dataType == DataType::INT16) GEN_SCALAR_FILL(deInt16);
+ else if (dataType == DataType::UINT16) GEN_SCALAR_FILL(deUint16);
+ else if (dataType == DataType::INT8) GEN_SCALAR_FILL(deInt8);
+ else if (dataType == DataType::UINT8) GEN_SCALAR_FILL(deUint8);
+ else if (dataType == DataType::FLOAT32) GEN_SCALAR_FILL(tcu::Float32);
+ else if (dataType == DataType::FLOAT64) GEN_SCALAR_FILL(tcu::Float64);
+ else if (dataType == DataType::FLOAT16) GEN_SCALAR_FILL(tcu::Float16);
+ else if (dataType == DataType::STRUCT)
+ {
+ InputStruct data = { 12u, 25.0f };
+ deMemcpy(bufferPtr, &data, sizeof(data));
+ }
+ else if (dataType == DataType::OP_NULL) GEN_SCALAR_FILL(deUint32);
+ else if (dataType == DataType::OP_UNDEF) GEN_SCALAR_FILL(deUint32);
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+ else if (vectorType == VectorType::V2)
+ {
+ if (dataType == DataType::INT32) GEN_V2_FILL(v2i32);
+ else if (dataType == DataType::UINT32) GEN_V2_FILL(v2u32);
+ else if (dataType == DataType::INT64) GEN_V2_FILL(v2i64);
+ else if (dataType == DataType::UINT64) GEN_V2_FILL(v2u64);
+ else if (dataType == DataType::INT16) GEN_V2_FILL(v2i16);
+ else if (dataType == DataType::UINT16) GEN_V2_FILL(v2u16);
+ else if (dataType == DataType::INT8) GEN_V2_FILL(v2i8);
+ else if (dataType == DataType::UINT8) GEN_V2_FILL(v2u8);
+ else if (dataType == DataType::FLOAT32) GEN_V2_FILL(v2f32);
+ else if (dataType == DataType::FLOAT64) GEN_V2_FILL(v2f64);
+ else if (dataType == DataType::FLOAT16) GEN_V2_FILL(v2f16);
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+ else if (vectorType == VectorType::V3)
+ {
+ if (dataType == DataType::INT32) GEN_V3_FILL(v3i32);
+ else if (dataType == DataType::UINT32) GEN_V3_FILL(v3u32);
+ else if (dataType == DataType::INT64) GEN_V3_FILL(v3i64);
+ else if (dataType == DataType::UINT64) GEN_V3_FILL(v3u64);
+ else if (dataType == DataType::INT16) GEN_V3_FILL(v3i16);
+ else if (dataType == DataType::UINT16) GEN_V3_FILL(v3u16);
+ else if (dataType == DataType::INT8) GEN_V3_FILL(v3i8);
+ else if (dataType == DataType::UINT8) GEN_V3_FILL(v3u8);
+ else if (dataType == DataType::FLOAT32) GEN_V3_FILL(v3f32);
+ else if (dataType == DataType::FLOAT64) GEN_V3_FILL(v3f64);
+ else if (dataType == DataType::FLOAT16) GEN_V3_FILL(v3f16);
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+ else if (vectorType == VectorType::V4)
+ {
+ if (dataType == DataType::INT32) GEN_V4_FILL(v4i32);
+ else if (dataType == DataType::UINT32) GEN_V4_FILL(v4u32);
+ else if (dataType == DataType::INT64) GEN_V4_FILL(v4i64);
+ else if (dataType == DataType::UINT64) GEN_V4_FILL(v4u64);
+ else if (dataType == DataType::INT16) GEN_V4_FILL(v4i16);
+ else if (dataType == DataType::UINT16) GEN_V4_FILL(v4u16);
+ else if (dataType == DataType::INT8) GEN_V4_FILL(v4i8);
+ else if (dataType == DataType::UINT8) GEN_V4_FILL(v4u8);
+ else if (dataType == DataType::FLOAT32) GEN_V4_FILL(v4f32);
+ else if (dataType == DataType::FLOAT64) GEN_V4_FILL(v4f64);
+ else if (dataType == DataType::FLOAT16) GEN_V4_FILL(v4f16);
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+ else if (vectorType == VectorType::A5)
+ {
+ if (dataType == DataType::INT32) GEN_A5_FILL(a5i32);
+ else if (dataType == DataType::UINT32) GEN_A5_FILL(a5u32);
+ else if (dataType == DataType::INT64) GEN_A5_FILL(a5i64);
+ else if (dataType == DataType::UINT64) GEN_A5_FILL(a5u64);
+ else if (dataType == DataType::INT16) GEN_A5_FILL(a5i16);
+ else if (dataType == DataType::UINT16) GEN_A5_FILL(a5u16);
+ else if (dataType == DataType::INT8) GEN_A5_FILL(a5i8);
+ else if (dataType == DataType::UINT8) GEN_A5_FILL(a5u8);
+ else if (dataType == DataType::FLOAT32) GEN_A5_FILL(a5f32);
+ else if (dataType == DataType::FLOAT64) GEN_A5_FILL(a5f64);
+ else if (dataType == DataType::FLOAT16) GEN_A5_FILL(a5f16);
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+}
+
+tcu::TestStatus DataSpillTestInstance::iterate (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto physicalDevice = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ const auto queue = m_context.getUniversalQueue();
+ const auto familyIndex = m_context.getUniversalQueueFamilyIndex();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto shaderStages = getShaderStages(m_params.callType);
+
+ // Command buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, familyIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Callee, input and output buffers.
+ const auto calleeBufferSize = getElementSize(DataType::UINT32, VectorType::SCALAR);
+ const auto outputBufferSize = getElementSize(DataType::UINT32, VectorType::SCALAR);
+ const auto inputBufferSize = getElementSize(m_params.dataType, m_params.vectorType);
+
+ const auto calleeBufferInfo = makeBufferCreateInfo(calleeBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ const auto outputBufferInfo = makeBufferCreateInfo(outputBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ const auto inputBufferInfo = makeBufferCreateInfo(inputBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+
+ BufferWithMemory calleeBuffer (vkd, device, alloc, calleeBufferInfo, MemoryRequirement::HostVisible);
+ BufferWithMemory outputBuffer (vkd, device, alloc, outputBufferInfo, MemoryRequirement::HostVisible);
+ BufferWithMemory inputBuffer (vkd, device, alloc, inputBufferInfo, MemoryRequirement::HostVisible);
+
+ // Fill buffers with values.
+ auto& calleeBufferAlloc = calleeBuffer.getAllocation();
+ auto* calleeBufferPtr = calleeBufferAlloc.getHostPtr();
+ auto& outputBufferAlloc = outputBuffer.getAllocation();
+ auto* outputBufferPtr = outputBufferAlloc.getHostPtr();
+ auto& inputBufferAlloc = inputBuffer.getAllocation();
+ auto* inputBufferPtr = inputBufferAlloc.getHostPtr();
+
+ deMemset(calleeBufferPtr, 0, static_cast<size_t>(calleeBufferSize));
+ deMemset(outputBufferPtr, 0, static_cast<size_t>(outputBufferSize));
+
+ if (samplersNeeded(m_params.dataType) || storageImageNeeded(m_params.dataType))
+ {
+ // The input buffer for these cases will be filled with zeros (sampling coordinates), and the input textures will contain the interesting input value.
+ deMemset(inputBufferPtr, 0, static_cast<size_t>(inputBufferSize));
+ }
+ else
+ {
+ // We want to fill the input buffer with values that will be consistently used in the shader to obtain a result of zero.
+ fillInputBuffer(m_params.dataType, m_params.vectorType, inputBufferPtr);
+ }
+
+ flushAlloc(vkd, device, calleeBufferAlloc);
+ flushAlloc(vkd, device, outputBufferAlloc);
+ flushAlloc(vkd, device, inputBufferAlloc);
+
+ // Acceleration structures.
+ de::MovePtr<BottomLevelAccelerationStructure> bottomLevelAccelerationStructure;
+ de::MovePtr<TopLevelAccelerationStructure> topLevelAccelerationStructure;
+
+ bottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+ bottomLevelAccelerationStructure->setDefaultGeometryData(getShaderStageForGeometry(m_params.callType), VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR);
+ bottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ topLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+ topLevelAccelerationStructure->setInstanceCount(1);
+ topLevelAccelerationStructure->addInstance(de::SharedPtr<BottomLevelAccelerationStructure>(bottomLevelAccelerationStructure.release()));
+ topLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ // Get some ray tracing properties.
+ deUint32 shaderGroupHandleSize = 0u;
+ deUint32 shaderGroupBaseAlignment = 1u;
+ {
+ const auto rayTracingPropertiesKHR = makeRayTracingProperties(vki, physicalDevice);
+ shaderGroupHandleSize = rayTracingPropertiesKHR->getShaderGroupHandleSize();
+ shaderGroupBaseAlignment = rayTracingPropertiesKHR->getShaderGroupBaseAlignment();
+ }
+
+ // Textures and samplers if needed.
+ de::MovePtr<BufferWithMemory> textureData;
+ std::vector<de::MovePtr<ImageWithMemory>> textures;
+ std::vector<Move<VkImageView>> textureViews;
+ std::vector<Move<VkSampler>> samplers;
+
+ if (samplersNeeded(m_params.dataType) || storageImageNeeded(m_params.dataType))
+ {
+ // Create texture data with the expected contents.
+ {
+ const auto textureDataSize = static_cast<VkDeviceSize>(sizeof(deUint32));
+ const auto textureDataCreateInfo = makeBufferCreateInfo(textureDataSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+
+ textureData = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, alloc, textureDataCreateInfo, MemoryRequirement::HostVisible));
+ auto& textureDataAlloc = textureData->getAllocation();
+ auto* textureDataPtr = textureDataAlloc.getHostPtr();
+
+ fillInputBuffer(DataType::UINT32, VectorType::SCALAR, textureDataPtr);
+ flushAlloc(vkd, device, textureDataAlloc);
+ }
+
+ // Images will be created like this with different usages.
+ VkImageCreateInfo imageCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkImageCreateFlags flags;
+ VK_IMAGE_TYPE_2D, // VkImageType imageType;
+ kImageFormat, // VkFormat format;
+ kImageExtent, // VkExtent3D extent;
+ 1u, // deUint32 mipLevels;
+ 1u, // deUint32 arrayLayers;
+ VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
+ VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
+ kSampledImageUsage, // VkImageUsageFlags usage;
+ VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
+ 0u, // deUint32 queueFamilyIndexCount;
+ nullptr, // const deUint32* pQueueFamilyIndices;
+ VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
+ };
+
+ const auto imageSubresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+ const auto imageSubresourceLayers = makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u);
+
+ if (samplersNeeded(m_params.dataType))
+ {
+ // All samplers will be created like this.
+ const VkSamplerCreateInfo samplerCreateInfo =
+ {
+ VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkSamplerCreateFlags flags;
+ VK_FILTER_NEAREST, // VkFilter magFilter;
+ VK_FILTER_NEAREST, // VkFilter minFilter;
+ VK_SAMPLER_MIPMAP_MODE_NEAREST, // VkSamplerMipmapMode mipmapMode;
+ VK_SAMPLER_ADDRESS_MODE_REPEAT, // VkSamplerAddressMode addressModeU;
+ VK_SAMPLER_ADDRESS_MODE_REPEAT, // VkSamplerAddressMode addressModeV;
+ VK_SAMPLER_ADDRESS_MODE_REPEAT, // VkSamplerAddressMode addressModeW;
+ 0.0, // float mipLodBias;
+ VK_FALSE, // VkBool32 anisotropyEnable;
+ 1.0f, // float maxAnisotropy;
+ VK_FALSE, // VkBool32 compareEnable;
+ VK_COMPARE_OP_ALWAYS, // VkCompareOp compareOp;
+ 0.0f, // float minLod;
+ 1.0f, // float maxLod;
+ VK_BORDER_COLOR_INT_OPAQUE_BLACK, // VkBorderColor borderColor;
+ VK_FALSE, // VkBool32 unnormalizedCoordinates;
+ };
+
+ // Create textures and samplers.
+ for (size_t i = 0; i < kNumImages; ++i)
+ {
+ textures.emplace_back(new ImageWithMemory(vkd, device, alloc, imageCreateInfo, MemoryRequirement::Any));
+ textureViews.emplace_back(makeImageView(vkd, device, textures.back()->get(), VK_IMAGE_VIEW_TYPE_2D, kImageFormat, imageSubresourceRange));
+ }
+
+ for (size_t i = 0; i < kNumSamplers; ++i)
+ samplers.emplace_back(createSampler(vkd, device, &samplerCreateInfo));
+
+ // Make sure texture data is available in the transfer stage.
+ const auto textureDataBarrier = makeMemoryBarrier(VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1u, &textureDataBarrier, 0u, nullptr, 0u, nullptr);
+
+ const auto bufferImageCopy = makeBufferImageCopy(kImageExtent, imageSubresourceLayers);
+
+ // Fill textures with data and prepare them for the ray tracing pipeline stages.
+ for (size_t i = 0; i < kNumImages; ++i)
+ {
+ const auto texturePreCopyBarrier = makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, textures[i]->get(), imageSubresourceRange);
+ const auto texturePostCopyBarrier = makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, textures[i]->get(), imageSubresourceRange);
+
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &texturePreCopyBarrier);
+ vkd.cmdCopyBufferToImage(cmdBuffer, textureData->get(), textures[i]->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &bufferImageCopy);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, 0u, 0u, nullptr, 0u, nullptr, 1u, &texturePostCopyBarrier);
+ }
+ }
+ else if (storageImageNeeded(m_params.dataType))
+ {
+ // Image will be used for storage.
+ imageCreateInfo.usage = kStorageImageUsage;
+
+ textures.emplace_back(new ImageWithMemory(vkd, device, alloc, imageCreateInfo, MemoryRequirement::Any));
+ textureViews.emplace_back(makeImageView(vkd, device, textures.back()->get(), VK_IMAGE_VIEW_TYPE_2D, kImageFormat, imageSubresourceRange));
+
+ // Make sure texture data is available in the transfer stage.
+ const auto textureDataBarrier = makeMemoryBarrier(VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1u, &textureDataBarrier, 0u, nullptr, 0u, nullptr);
+
+ const auto bufferImageCopy = makeBufferImageCopy(kImageExtent, imageSubresourceLayers);
+ const auto texturePreCopyBarrier = makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, textures.back()->get(), imageSubresourceRange);
+ const auto texturePostCopyBarrier = makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, (VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, textures.back()->get(), imageSubresourceRange);
+
+ // Fill texture with data and prepare them for the ray tracing pipeline stages.
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &texturePreCopyBarrier);
+ vkd.cmdCopyBufferToImage(cmdBuffer, textureData->get(), textures.back()->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &bufferImageCopy);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, 0u, 0u, nullptr, 0u, nullptr, 1u, &texturePostCopyBarrier);
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+
+ // Descriptor set layout.
+ DescriptorSetLayoutBuilder dslBuilder;
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1u, shaderStages, nullptr);
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, shaderStages, nullptr); // Callee buffer.
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, shaderStages, nullptr); // Output buffer.
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, shaderStages, nullptr); // Input buffer.
+ if (samplersNeeded(m_params.dataType))
+ {
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 2u, shaderStages, nullptr);
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_SAMPLER, 2u, shaderStages, nullptr);
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2u, shaderStages, nullptr);
+ }
+ else if (storageImageNeeded(m_params.dataType))
+ {
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u, shaderStages, nullptr);
+ }
+ const auto descriptorSetLayout = dslBuilder.build(vkd, device);
+
+ // Pipeline layout.
+ const auto pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+
+ // Descriptor pool and set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 3u);
+ if (samplersNeeded(m_params.dataType))
+ {
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 2u);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_SAMPLER, 2u);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2u);
+ }
+ else if (storageImageNeeded(m_params.dataType))
+ {
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1u);
+ }
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayout.get());
+
+ // Update descriptor set.
+ {
+ const VkWriteDescriptorSetAccelerationStructureKHR writeASInfo =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
+ nullptr,
+ 1u,
+ topLevelAccelerationStructure.get()->getPtr(),
+ };
+
+ DescriptorSetUpdateBuilder updateBuilder;
+
+ const auto ds = descriptorSet.get();
+
+ const auto calleeBufferDescriptorInfo = makeDescriptorBufferInfo(calleeBuffer.get(), 0ull, VK_WHOLE_SIZE);
+ const auto outputBufferDescriptorInfo = makeDescriptorBufferInfo(outputBuffer.get(), 0ull, VK_WHOLE_SIZE);
+ const auto inputBufferDescriptorInfo = makeDescriptorBufferInfo(inputBuffer.get(), 0ull, VK_WHOLE_SIZE);
+
+ updateBuilder.writeSingle(ds, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &writeASInfo);
+ updateBuilder.writeSingle(ds, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &calleeBufferDescriptorInfo);
+ updateBuilder.writeSingle(ds, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &outputBufferDescriptorInfo);
+ updateBuilder.writeSingle(ds, DescriptorSetUpdateBuilder::Location::binding(3u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &inputBufferDescriptorInfo);
+
+ if (samplersNeeded(m_params.dataType))
+ {
+ // Update textures, samplers and combined image samplers.
+ std::vector<VkDescriptorImageInfo> textureDescInfos;
+ std::vector<VkDescriptorImageInfo> textureSamplerInfos;
+ std::vector<VkDescriptorImageInfo> combinedSamplerInfos;
+
+ for (size_t i = 0; i < kNumAloneImages; ++i)
+ textureDescInfos.push_back(makeDescriptorImageInfo(DE_NULL, textureViews[i].get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+ for (size_t i = 0; i < kNumAloneSamplers; ++i)
+ textureSamplerInfos.push_back(makeDescriptorImageInfo(samplers[i].get(), DE_NULL, VK_IMAGE_LAYOUT_UNDEFINED));
+
+ for (size_t i = 0; i < kNumCombined; ++i)
+ combinedSamplerInfos.push_back(makeDescriptorImageInfo(samplers[i + kNumAloneSamplers].get(), textureViews[i + kNumAloneImages].get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
+
+ updateBuilder.writeArray(ds, DescriptorSetUpdateBuilder::Location::binding(4u), VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, kNumAloneImages, textureDescInfos.data());
+ updateBuilder.writeArray(ds, DescriptorSetUpdateBuilder::Location::binding(5u), VK_DESCRIPTOR_TYPE_SAMPLER, kNumAloneSamplers, textureSamplerInfos.data());
+ updateBuilder.writeArray(ds, DescriptorSetUpdateBuilder::Location::binding(6u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, kNumCombined, combinedSamplerInfos.data());
+ }
+ else if (storageImageNeeded(m_params.dataType))
+ {
+ const auto storageImageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, textureViews.back().get(), VK_IMAGE_LAYOUT_GENERAL);
+ updateBuilder.writeSingle(ds, DescriptorSetUpdateBuilder::Location::binding(4u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &storageImageDescriptorInfo);
+ }
+
+ updateBuilder.update(vkd, device);
+ }
+
+ // Create raytracing pipeline and shader binding tables.
+ Move<VkPipeline> pipeline;
+
+ de::MovePtr<BufferWithMemory> raygenShaderBindingTable;
+ de::MovePtr<BufferWithMemory> missShaderBindingTable;
+ de::MovePtr<BufferWithMemory> hitShaderBindingTable;
+ de::MovePtr<BufferWithMemory> callableShaderBindingTable;
+
+ VkStridedDeviceAddressRegionKHR raygenShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR missShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR hitShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR callableShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+
+ {
+ const auto rayTracingPipeline = de::newMovePtr<RayTracingPipeline>();
+ const auto callType = m_params.callType;
+
+ // Every case uses a ray generation shader.
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("rgen"), 0), 0);
+
+ if (callType == CallType::TRACE_RAY)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("chit"), 0), 1);
+ }
+ else if (callType == CallType::EXECUTE_CALLABLE)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("call"), 0), 1);
+ }
+ else if (callType == CallType::REPORT_INTERSECTION)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("rint"), 0), 1);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_ANY_HIT_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("ahit"), 0), 1);
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+
+ pipeline = rayTracingPipeline->createPipeline(vkd, device, pipelineLayout.get());
+
+ raygenShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 0, 1);
+ raygenShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, raygenShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+
+ if (callType == CallType::EXECUTE_CALLABLE)
+ {
+ callableShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 1, 1);
+ callableShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, callableShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+ else if (callType == CallType::TRACE_RAY || callType == CallType::REPORT_INTERSECTION)
+ {
+ hitShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 1, 1);
+ hitShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, hitShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+
+ // Use ray tracing pipeline.
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdTraceRaysKHR(cmdBuffer, &raygenShaderBindingTableRegion, &missShaderBindingTableRegion, &hitShaderBindingTableRegion, &callableShaderBindingTableRegion, 1u, 1u, 1u);
+
+ // Synchronize output and callee buffers.
+ const auto memBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &memBarrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify output and callee buffers.
+ invalidateAlloc(vkd, device, outputBufferAlloc);
+ invalidateAlloc(vkd, device, calleeBufferAlloc);
+
+ std::map<std::string, void*> bufferPtrs;
+ bufferPtrs["output"] = outputBufferPtr;
+ bufferPtrs["callee"] = calleeBufferPtr;
+
+ for (const auto& ptr : bufferPtrs)
+ {
+ const auto& bufferName = ptr.first;
+ const auto& bufferPtr = ptr.second;
+
+ deUint32 outputVal;
+ deMemcpy(&outputVal, bufferPtr, sizeof(outputVal));
+
+ if (outputVal != 1u)
+ return tcu::TestStatus::fail("Unexpected value found in " + bufferName + " buffer: " + de::toString(outputVal));
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+enum class InterfaceType
+{
+ RAY_PAYLOAD = 0,
+ CALLABLE_DATA,
+ HIT_ATTRIBUTES,
+ SHADER_RECORD_BUFFER_RGEN,
+ SHADER_RECORD_BUFFER_CALL,
+ SHADER_RECORD_BUFFER_MISS,
+ SHADER_RECORD_BUFFER_HIT,
+};
+
+// Separate class to ease testing pipeline interface variables.
+class DataSpillPipelineInterfaceTestCase : public vkt::TestCase
+{
+public:
+ struct TestParams
+ {
+ InterfaceType interfaceType;
+ };
+
+ DataSpillPipelineInterfaceTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& testParams);
+ virtual ~DataSpillPipelineInterfaceTestCase (void) {}
+
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+ virtual void checkSupport (Context& context) const;
+
+private:
+ TestParams m_params;
+};
+
+class DataSpillPipelineInterfaceTestInstance : public vkt::TestInstance
+{
+public:
+ using TestParams = DataSpillPipelineInterfaceTestCase::TestParams;
+
+ DataSpillPipelineInterfaceTestInstance (Context& context, const TestParams& testParams);
+ ~DataSpillPipelineInterfaceTestInstance (void) {}
+
+ tcu::TestStatus iterate (void);
+
+private:
+ TestParams m_params;
+};
+
+DataSpillPipelineInterfaceTestCase::DataSpillPipelineInterfaceTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& testParams)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (testParams)
+{
+}
+
+TestInstance* DataSpillPipelineInterfaceTestCase::createInstance (Context& context) const
+{
+ return new DataSpillPipelineInterfaceTestInstance (context, m_params);
+}
+
+DataSpillPipelineInterfaceTestInstance::DataSpillPipelineInterfaceTestInstance (Context& context, const TestParams& testParams)
+ : vkt::TestInstance (context)
+ , m_params (testParams)
+{
+}
+
+void DataSpillPipelineInterfaceTestCase::checkSupport (Context& context) const
+{
+ commonCheckSupport(context);
+}
+
+void DataSpillPipelineInterfaceTestCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ const std::string glslHeader =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ ;
+
+ const std::string glslBindings =
+ "layout(set = 0, binding = 0) uniform accelerationStructureEXT topLevelAS;\n"
+ "layout(set = 0, binding = 1) buffer StorageBlock { uint val[" + std::to_string(kNumStorageValues) + "]; } storageBuffer;\n"
+ ;
+
+ if (m_params.interfaceType == InterfaceType::RAY_PAYLOAD)
+ {
+ // The closest hit shader will store 100 in the second array position.
+ // The ray gen shader will store 103 in the first array position using the hitValue after the traceRayExt() call.
+
+ std::ostringstream rgen;
+ rgen
+ << glslHeader
+ << "layout(location = 0) rayPayloadEXT vec3 hitValue;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " hitValue = vec3(10.0, 30.0, 60.0);\n"
+ << " traceRayEXT(topLevelAS, 0u, 0xFFu, 0, 0, 0, vec3(0.5, 0.5, 0.0), 0.0, vec3(0.0, 0.0, -1.0), 9.0, 0);\n"
+ << " storageBuffer.val[0] = uint(hitValue.x + hitValue.y + hitValue.z);\n"
+ << "}\n"
+ ;
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ std::stringstream chit;
+ chit
+ << glslHeader
+ << "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+ << "hitAttributeEXT vec3 attribs;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " storageBuffer.val[1] = uint(hitValue.x + hitValue.y + hitValue.z);\n"
+ << " hitValue = vec3(hitValue.x + 1.0, hitValue.y + 1.0, hitValue.z + 1.0);\n"
+ << "}\n";
+ ;
+ programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(chit.str())) << buildOptions;
+ }
+ else if (m_params.interfaceType == InterfaceType::CALLABLE_DATA)
+ {
+ // The callable shader shader will store 100 in the second array position.
+ // The ray gen shader will store 200 in the first array position using the callable data after the executeCallableEXT() call.
+
+ std::ostringstream rgen;
+ rgen
+ << glslHeader
+ << "layout(location = 0) callableDataEXT float callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " callableData = 100.0;\n"
+ << " executeCallableEXT(0, 0);\n"
+ << " storageBuffer.val[0] = uint(callableData);\n"
+ << "}\n"
+ ;
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ std::ostringstream call;
+ call
+ << glslHeader
+ << "layout(location = 0) callableDataInEXT float callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " storageBuffer.val[1] = uint(callableData);\n"
+ << " callableData = callableData * 2.0;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("call") << glu::CallableSource(updateRayTracingGLSL(call.str())) << buildOptions;
+ }
+ else if (m_params.interfaceType == InterfaceType::HIT_ATTRIBUTES)
+ {
+ // The ray gen shader will store value 300 in the first storage buffer position.
+ // The intersection shader will store value 315 in the second storage buffer position.
+ // The closes hit shader will store value 330 in the third storage buffer position using the hit attributes.
+
+ std::ostringstream rgen;
+ rgen
+ << glslHeader
+ << "layout(location = 0) rayPayloadEXT vec3 hitValue;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " traceRayEXT(topLevelAS, 0u, 0xFFu, 0, 0, 0, vec3(0.5, 0.5, 0.0), 0.0, vec3(0.0, 0.0, -1.0), 9.0, 0);\n"
+ << " storageBuffer.val[0] = 300u;\n"
+ << "}\n"
+ ;
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ std::stringstream rint;
+ rint
+ << glslHeader
+ << "hitAttributeEXT vec3 attribs;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " attribs = vec3(140.0, 160.0, 30.0);\n"
+ << " storageBuffer.val[1] = 315u;\n"
+ << " reportIntersectionEXT(1.0f, 0);\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("rint") << glu::IntersectionSource(updateRayTracingGLSL(rint.str())) << buildOptions;
+
+ std::stringstream chit;
+ chit
+ << glslHeader
+ << "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+ << "hitAttributeEXT vec3 attribs;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " storageBuffer.val[2] = uint(attribs.x + attribs.y + attribs.z);\n"
+ << "}\n";
+ ;
+ programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(chit.str())) << buildOptions;
+
+ }
+ else if (m_params.interfaceType == InterfaceType::SHADER_RECORD_BUFFER_RGEN)
+ {
+ // The ray gen shader will have a uvec4 in the shader record buffer with contents 400, 401, 402, 403.
+ // The shader will call a callable shader indicating a position in that vec4 (0, 1, 2, 3). For example, let's use position 1.
+ // The callable shader will return the indicated position+1 modulo 4, so it will return 2 in our case.
+ // *After* returning from the callable shader, the raygen shader will use that reply to access position 2 and write a 402 in the first output buffer position.
+ // The callable shader will store 450 in the second output buffer position.
+
+ std::ostringstream rgen;
+ rgen
+ << glslHeader
+ << "layout(shaderRecordEXT) buffer ShaderRecordStruct {\n"
+ << " uvec4 info;\n"
+ << "};\n"
+ << "layout(location = 0) callableDataEXT uint callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " callableData = 1u;"
+ << " executeCallableEXT(0, 0);\n"
+ << " if (callableData == 0u) storageBuffer.val[0] = info.x;\n"
+ << " else if (callableData == 1u) storageBuffer.val[0] = info.y;\n"
+ << " else if (callableData == 2u) storageBuffer.val[0] = info.z;\n"
+ << " else if (callableData == 3u) storageBuffer.val[0] = info.w;\n"
+ << "}\n"
+ ;
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ std::ostringstream call;
+ call
+ << glslHeader
+ << "layout(location = 0) callableDataInEXT uint callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " storageBuffer.val[1] = 450u;\n"
+ << " callableData = (callableData + 1u) % 4u;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("call") << glu::CallableSource(updateRayTracingGLSL(call.str())) << buildOptions;
+ }
+ else if (m_params.interfaceType == InterfaceType::SHADER_RECORD_BUFFER_CALL)
+ {
+ // Similar to the previous case, with a twist:
+ // * rgen passes the vector position.
+ // * call increases that by one.
+ // * subcall increases again and does the modulo operation, also writing 450 in the third output buffer value.
+ // * call is the one accessing the vector at the returned position, writing 403 in this case to the second output buffer value.
+ // * call passes this value back doubled to rgen, which writes it to the first output buffer value (806).
+
+ std::ostringstream rgen;
+ rgen
+ << glslHeader
+ << "layout(location = 0) callableDataEXT uint callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " callableData = 1u;\n"
+ << " executeCallableEXT(0, 0);\n"
+ << " storageBuffer.val[0] = callableData;\n"
+ << "}\n"
+ ;
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ std::ostringstream call;
+ call
+ << glslHeader
+ << "layout(shaderRecordEXT) buffer ShaderRecordStruct {\n"
+ << " uvec4 info;\n"
+ << "};\n"
+ << "layout(location = 0) callableDataInEXT uint callableDataIn;\n"
+ << "layout(location = 1) callableDataEXT uint callableDataOut;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " callableDataOut = callableDataIn + 1u;\n"
+ << " executeCallableEXT(1, 1);\n"
+ << " uint outputBufferValue = 777u;\n"
+ << " if (callableDataOut == 0u) outputBufferValue = info.x;\n"
+ << " else if (callableDataOut == 1u) outputBufferValue = info.y;\n"
+ << " else if (callableDataOut == 2u) outputBufferValue = info.z;\n"
+ << " else if (callableDataOut == 3u) outputBufferValue = info.w;\n"
+ << " storageBuffer.val[1] = outputBufferValue;\n"
+ << " callableDataIn = outputBufferValue * 2u;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("call") << glu::CallableSource(updateRayTracingGLSL(call.str())) << buildOptions;
+
+ std::ostringstream subcall;
+ subcall
+ << glslHeader
+ << "layout(location = 1) callableDataInEXT uint callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " callableData = (callableData + 1u) % 4u;\n"
+ << " storageBuffer.val[2] = 450u;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("subcall") << glu::CallableSource(updateRayTracingGLSL(subcall.str())) << buildOptions;
+ }
+ else if (m_params.interfaceType == InterfaceType::SHADER_RECORD_BUFFER_MISS || m_params.interfaceType == InterfaceType::SHADER_RECORD_BUFFER_HIT)
+ {
+ // Similar to the previous one, but the intermediate call shader has been replaced with a miss or closest hit shader.
+ // The rgen shader will communicate with the miss/chit shader using the ray payload instead of the callable data.
+ // Also, the initial position will be 2, so it will wrap around in this case. The numbers will also change.
+
+ std::ostringstream rgen;
+ rgen
+ << glslHeader
+ << "layout(location = 0) rayPayloadEXT uint rayPayload;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " rayPayload = 2u;\n"
+ << " traceRayEXT(topLevelAS, 0u, 0xFFu, 0, 0, 0, vec3(0.5, 0.5, 0.0), 0.0, vec3(0.0, 0.0, -1.0), 9.0, 0);\n"
+ << " storageBuffer.val[0] = rayPayload;\n"
+ << "}\n"
+ ;
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ std::ostringstream chitOrMiss;
+ chitOrMiss
+ << glslHeader
+ << "layout(shaderRecordEXT) buffer ShaderRecordStruct {\n"
+ << " uvec4 info;\n"
+ << "};\n"
+ << "layout(location = 0) rayPayloadInEXT uint rayPayload;\n"
+ << "layout(location = 0) callableDataEXT uint callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " callableData = rayPayload + 1u;\n"
+ << " executeCallableEXT(0, 0);\n"
+ << " uint outputBufferValue = 777u;\n"
+ << " if (callableData == 0u) outputBufferValue = info.x;\n"
+ << " else if (callableData == 1u) outputBufferValue = info.y;\n"
+ << " else if (callableData == 2u) outputBufferValue = info.z;\n"
+ << " else if (callableData == 3u) outputBufferValue = info.w;\n"
+ << " storageBuffer.val[1] = outputBufferValue;\n"
+ << " rayPayload = outputBufferValue * 3u;\n"
+ << "}\n"
+ ;
+
+ if (m_params.interfaceType == InterfaceType::SHADER_RECORD_BUFFER_MISS)
+ programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(chitOrMiss.str())) << buildOptions;
+ else if (m_params.interfaceType == InterfaceType::SHADER_RECORD_BUFFER_HIT)
+ programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(chitOrMiss.str())) << buildOptions;
+ else
+ DE_ASSERT(false);
+
+ std::ostringstream call;
+ call
+ << glslHeader
+ << "layout(location = 0) callableDataInEXT uint callableData;\n"
+ << glslBindings
+ << "void main()\n"
+ << "{\n"
+ << " storageBuffer.val[2] = 490u;\n"
+ << " callableData = (callableData + 1u) % 4u;\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("call") << glu::CallableSource(updateRayTracingGLSL(call.str())) << buildOptions;
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+}
+
+VkShaderStageFlags getShaderStages (InterfaceType type_)
+{
+ VkShaderStageFlags flags = VK_SHADER_STAGE_RAYGEN_BIT_KHR;
+
+ switch (type_)
+ {
+ case InterfaceType::HIT_ATTRIBUTES:
+ flags |= VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
+ // fallthrough.
+ case InterfaceType::RAY_PAYLOAD:
+ flags |= VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
+ break;
+ case InterfaceType::CALLABLE_DATA:
+ case InterfaceType::SHADER_RECORD_BUFFER_RGEN:
+ case InterfaceType::SHADER_RECORD_BUFFER_CALL:
+ flags |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+ break;
+ case InterfaceType::SHADER_RECORD_BUFFER_MISS:
+ flags |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+ flags |= VK_SHADER_STAGE_MISS_BIT_KHR;
+ break;
+ case InterfaceType::SHADER_RECORD_BUFFER_HIT:
+ flags |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+ flags |= VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
+ break;
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+
+ return flags;
+}
+
+// Proper stage for generating default geometry.
+VkShaderStageFlagBits getShaderStageForGeometry (InterfaceType type_)
+{
+ VkShaderStageFlagBits bits = VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM;
+
+ switch (type_)
+ {
+ case InterfaceType::HIT_ATTRIBUTES: bits = VK_SHADER_STAGE_INTERSECTION_BIT_KHR; break;
+ case InterfaceType::RAY_PAYLOAD: bits = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR; break;
+ case InterfaceType::CALLABLE_DATA: bits = VK_SHADER_STAGE_CALLABLE_BIT_KHR; break;
+ case InterfaceType::SHADER_RECORD_BUFFER_RGEN: bits = VK_SHADER_STAGE_CALLABLE_BIT_KHR; break;
+ case InterfaceType::SHADER_RECORD_BUFFER_CALL: bits = VK_SHADER_STAGE_CALLABLE_BIT_KHR; break;
+ case InterfaceType::SHADER_RECORD_BUFFER_MISS: bits = VK_SHADER_STAGE_MISS_BIT_KHR; break;
+ case InterfaceType::SHADER_RECORD_BUFFER_HIT: bits = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR; break;
+ default: DE_ASSERT(false); break;
+ }
+
+ DE_ASSERT(bits != VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM);
+ return bits;
+}
+
+void createSBTWithShaderRecord (const DeviceInterface& vkd, VkDevice device, vk::Allocator &alloc,
+ VkPipeline pipeline, RayTracingPipeline* rayTracingPipeline,
+ deUint32 shaderGroupHandleSize, deUint32 shaderGroupBaseAlignment,
+ deUint32 firstGroup, deUint32 groupCount,
+ de::MovePtr<BufferWithMemory>& shaderBindingTable,
+ VkStridedDeviceAddressRegionKHR& shaderBindingTableRegion)
+{
+ const auto alignedSize = de::roundUp(shaderGroupHandleSize + kShaderRecordSize, shaderGroupHandleSize);
+ shaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline, alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, firstGroup, groupCount, 0u, 0u, MemoryRequirement::Any, 0u, 0u, kShaderRecordSize);
+ shaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, shaderBindingTable->get(), 0), alignedSize, groupCount * alignedSize);
+
+ // Fill shader record buffer data.
+ // Note we will only fill the first shader record after the handle.
+ const tcu::UVec4 shaderRecordData (400u, 401u, 402u, 403u);
+ auto& sbtAlloc = shaderBindingTable->getAllocation();
+ auto* dataPtr = reinterpret_cast<deUint8*>(sbtAlloc.getHostPtr()) + shaderGroupHandleSize;
+
+ DE_STATIC_ASSERT(sizeof(shaderRecordData) == static_cast<size_t>(kShaderRecordSize));
+ deMemcpy(dataPtr, &shaderRecordData, sizeof(shaderRecordData));
+}
+
+tcu::TestStatus DataSpillPipelineInterfaceTestInstance::iterate (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto physicalDevice = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ const auto queue = m_context.getUniversalQueue();
+ const auto familyIndex = m_context.getUniversalQueueFamilyIndex();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto shaderStages = getShaderStages(m_params.interfaceType);
+
+ // Command buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, familyIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Storage buffer.
+ std::array<deUint32, kNumStorageValues> storageBufferData;
+ const auto storageBufferSize = de::dataSize(storageBufferData);
+ const auto storagebufferInfo = makeBufferCreateInfo(storageBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ BufferWithMemory storageBuffer (vkd, device, alloc, storagebufferInfo, MemoryRequirement::HostVisible);
+
+ // Zero-out buffer.
+ auto& storageBufferAlloc = storageBuffer.getAllocation();
+ auto* storageBufferPtr = storageBufferAlloc.getHostPtr();
+ deMemset(storageBufferPtr, 0, storageBufferSize);
+ flushAlloc(vkd, device, storageBufferAlloc);
+
+ // Acceleration structures.
+ de::MovePtr<BottomLevelAccelerationStructure> bottomLevelAccelerationStructure;
+ de::MovePtr<TopLevelAccelerationStructure> topLevelAccelerationStructure;
+
+ bottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+ bottomLevelAccelerationStructure->setDefaultGeometryData(getShaderStageForGeometry(m_params.interfaceType), VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR);
+ bottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ topLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+ topLevelAccelerationStructure->setInstanceCount(1);
+ topLevelAccelerationStructure->addInstance(de::SharedPtr<BottomLevelAccelerationStructure>(bottomLevelAccelerationStructure.release()));
+ topLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ // Get some ray tracing properties.
+ deUint32 shaderGroupHandleSize = 0u;
+ deUint32 shaderGroupBaseAlignment = 1u;
+ {
+ const auto rayTracingPropertiesKHR = makeRayTracingProperties(vki, physicalDevice);
+ shaderGroupHandleSize = rayTracingPropertiesKHR->getShaderGroupHandleSize();
+ shaderGroupBaseAlignment = rayTracingPropertiesKHR->getShaderGroupBaseAlignment();
+ }
+
+ // Descriptor set layout.
+ DescriptorSetLayoutBuilder dslBuilder;
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1u, shaderStages, nullptr);
+ dslBuilder.addBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u, shaderStages, nullptr); // Callee buffer.
+ const auto descriptorSetLayout = dslBuilder.build(vkd, device);
+
+ // Pipeline layout.
+ const auto pipelineLayout = makePipelineLayout(vkd, device, descriptorSetLayout.get());
+
+ // Descriptor pool and set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), descriptorSetLayout.get());
+
+ // Update descriptor set.
+ {
+ const VkWriteDescriptorSetAccelerationStructureKHR writeASInfo =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
+ nullptr,
+ 1u,
+ topLevelAccelerationStructure.get()->getPtr(),
+ };
+
+ const auto ds = descriptorSet.get();
+ const auto storageBufferDescriptorInfo = makeDescriptorBufferInfo(storageBuffer.get(), 0ull, VK_WHOLE_SIZE);
+
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(ds, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &writeASInfo);
+ updateBuilder.writeSingle(ds, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &storageBufferDescriptorInfo);
+ updateBuilder.update(vkd, device);
+ }
+
+ // Create raytracing pipeline and shader binding tables.
+ const auto interfaceType = m_params.interfaceType;
+ Move<VkPipeline> pipeline;
+
+ de::MovePtr<BufferWithMemory> raygenShaderBindingTable;
+ de::MovePtr<BufferWithMemory> missShaderBindingTable;
+ de::MovePtr<BufferWithMemory> hitShaderBindingTable;
+ de::MovePtr<BufferWithMemory> callableShaderBindingTable;
+
+ VkStridedDeviceAddressRegionKHR raygenShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR missShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR hitShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR callableShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+
+ {
+ const auto rayTracingPipeline = de::newMovePtr<RayTracingPipeline>();
+
+ // Every case uses a ray generation shader.
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("rgen"), 0), 0);
+
+ if (interfaceType == InterfaceType::RAY_PAYLOAD)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("chit"), 0), 1);
+ }
+ else if (interfaceType == InterfaceType::CALLABLE_DATA || interfaceType == InterfaceType::SHADER_RECORD_BUFFER_RGEN)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("call"), 0), 1);
+ }
+ else if (interfaceType == InterfaceType::HIT_ATTRIBUTES)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("rint"), 0), 1);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("chit"), 0), 1);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_CALL)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("call"), 0), 1);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("subcall"), 0), 2);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_MISS)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("miss"), 0), 1);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("call"), 0), 2);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_HIT)
+ {
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("chit"), 0), 1);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR, createShaderModule(vkd, device, m_context.getBinaryCollection().get("call"), 0), 2);
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+
+ pipeline = rayTracingPipeline->createPipeline(vkd, device, pipelineLayout.get());
+
+ if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_RGEN)
+ {
+ createSBTWithShaderRecord (vkd, device, alloc, pipeline.get(), rayTracingPipeline.get(), shaderGroupHandleSize, shaderGroupBaseAlignment,
+ 0u, 1u, raygenShaderBindingTable, raygenShaderBindingTableRegion);
+ }
+ else
+ {
+ raygenShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 0, 1);
+ raygenShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, raygenShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+
+
+ if (interfaceType == InterfaceType::CALLABLE_DATA || interfaceType == InterfaceType::SHADER_RECORD_BUFFER_RGEN)
+ {
+ callableShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 1, 1);
+ callableShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, callableShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+ else if (interfaceType == InterfaceType::RAY_PAYLOAD || interfaceType == InterfaceType::HIT_ATTRIBUTES)
+ {
+ hitShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 1, 1);
+ hitShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, hitShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_CALL)
+ {
+ createSBTWithShaderRecord (vkd, device, alloc, pipeline.get(), rayTracingPipeline.get(), shaderGroupHandleSize, shaderGroupBaseAlignment,
+ 1u, 2u, callableShaderBindingTable, callableShaderBindingTableRegion);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_MISS)
+ {
+ createSBTWithShaderRecord (vkd, device, alloc, pipeline.get(), rayTracingPipeline.get(), shaderGroupHandleSize, shaderGroupBaseAlignment,
+ 1u, 1u, missShaderBindingTable, missShaderBindingTableRegion);
+
+ // Callable shader table.
+ callableShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 2, 1);
+ callableShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, callableShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_HIT)
+ {
+ createSBTWithShaderRecord (vkd, device, alloc, pipeline.get(), rayTracingPipeline.get(), shaderGroupHandleSize, shaderGroupBaseAlignment,
+ 1u, 1u, hitShaderBindingTable, hitShaderBindingTableRegion);
+
+ // Callable shader table.
+ callableShaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 2, 1);
+ callableShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, callableShaderBindingTable->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+ }
+
+ // Use ray tracing pipeline.
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdTraceRaysKHR(cmdBuffer, &raygenShaderBindingTableRegion, &missShaderBindingTableRegion, &hitShaderBindingTableRegion, &callableShaderBindingTableRegion, 1u, 1u, 1u);
+
+ // Synchronize output and callee buffers.
+ const auto memBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &memBarrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Verify storage buffer.
+ invalidateAlloc(vkd, device, storageBufferAlloc);
+ deMemcpy(storageBufferData.data(), storageBufferPtr, storageBufferSize);
+
+ // These values must match what the shaders store.
+ std::vector<deUint32> expectedData;
+ if (interfaceType == InterfaceType::RAY_PAYLOAD)
+ {
+ expectedData.push_back(103u);
+ expectedData.push_back(100u);
+ }
+ else if (interfaceType == InterfaceType::CALLABLE_DATA)
+ {
+ expectedData.push_back(200u);
+ expectedData.push_back(100u);
+ }
+ else if (interfaceType == InterfaceType::HIT_ATTRIBUTES)
+ {
+ expectedData.push_back(300u);
+ expectedData.push_back(315u);
+ expectedData.push_back(330u);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_RGEN)
+ {
+ expectedData.push_back(402u);
+ expectedData.push_back(450u);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_CALL)
+ {
+ expectedData.push_back(806u);
+ expectedData.push_back(403u);
+ expectedData.push_back(450u);
+ }
+ else if (interfaceType == InterfaceType::SHADER_RECORD_BUFFER_MISS || interfaceType == InterfaceType::SHADER_RECORD_BUFFER_HIT)
+ {
+ expectedData.push_back(1200u);
+ expectedData.push_back( 400u);
+ expectedData.push_back( 490u);
+ }
+ else
+ {
+ DE_ASSERT(false);
+ }
+
+ size_t pos;
+ for (pos = 0u; pos < expectedData.size(); ++pos)
+ {
+ const auto& stored = storageBufferData.at(pos);
+ const auto& expected = expectedData.at(pos);
+ if (stored != expected)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected output value found at position " << pos << " (expected " << expected << " but got " << stored << ")";
+ return tcu::TestStatus::fail(msg.str());
+ }
+ }
+
+ // Expect zeros in unused positions, as filled on the host.
+ for (; pos < storageBufferData.size(); ++pos)
+ {
+ const auto& stored = storageBufferData.at(pos);
+ if (stored != 0u)
+ {
+ std::ostringstream msg;
+ msg << "Unexpected output value found at position " << pos << " (expected 0 but got " << stored << ")";
+ return tcu::TestStatus::fail(msg.str());
+ }
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous namespace
+
+tcu::TestCaseGroup* createDataSpillTests(tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "data_spill", "Ray tracing tests for data spilling and unspilling around shader calls"));
+
+ struct
+ {
+ CallType callType;
+ const char* name;
+ } callTypes[] =
+ {
+ { CallType::EXECUTE_CALLABLE, "execute_callable" },
+ { CallType::TRACE_RAY, "trace_ray" },
+ { CallType::REPORT_INTERSECTION, "report_intersection" },
+ };
+
+ struct
+ {
+ DataType dataType;
+ const char* name;
+ } dataTypes[] =
+ {
+ { DataType::INT32, "int32" },
+ { DataType::UINT32, "uint32" },
+ { DataType::INT64, "int64" },
+ { DataType::UINT64, "uint64" },
+ { DataType::INT16, "int16" },
+ { DataType::UINT16, "uint16" },
+ { DataType::INT8, "int8" },
+ { DataType::UINT8, "uint8" },
+ { DataType::FLOAT32, "float32" },
+ { DataType::FLOAT64, "float64" },
+ { DataType::FLOAT16, "float16" },
+ { DataType::STRUCT, "struct" },
+ { DataType::SAMPLER, "sampler" },
+ { DataType::IMAGE, "image" },
+ { DataType::SAMPLED_IMAGE, "combined" },
+ { DataType::PTR_IMAGE, "ptr_image" },
+ { DataType::PTR_SAMPLER, "ptr_sampler" },
+ { DataType::PTR_SAMPLED_IMAGE, "ptr_combined" },
+ { DataType::PTR_TEXEL, "ptr_texel" },
+ { DataType::OP_NULL, "op_null" },
+ { DataType::OP_UNDEF, "op_undef" },
+ };
+
+ struct
+ {
+ VectorType vectorType;
+ const char* prefix;
+ } vectorTypes[] =
+ {
+ { VectorType::SCALAR, "" },
+ { VectorType::V2, "v2" },
+ { VectorType::V3, "v3" },
+ { VectorType::V4, "v4" },
+ { VectorType::A5, "a5" },
+ };
+
+ for (int callTypeIdx = 0; callTypeIdx < DE_LENGTH_OF_ARRAY(callTypes); ++callTypeIdx)
+ {
+ const auto& entryCallTypes = callTypes[callTypeIdx];
+
+ de::MovePtr<tcu::TestCaseGroup> callTypeGroup(new tcu::TestCaseGroup(testCtx, entryCallTypes.name, ""));
+ for (int dataTypeIdx = 0; dataTypeIdx < DE_LENGTH_OF_ARRAY(dataTypes); ++dataTypeIdx)
+ {
+ const auto& entryDataTypes = dataTypes[dataTypeIdx];
+
+ for (int vectorTypeIdx = 0; vectorTypeIdx < DE_LENGTH_OF_ARRAY(vectorTypes); ++vectorTypeIdx)
+ {
+ const auto& entryVectorTypes = vectorTypes[vectorTypeIdx];
+
+ if ((samplersNeeded(entryDataTypes.dataType)
+ || storageImageNeeded(entryDataTypes.dataType)
+ || entryDataTypes.dataType == DataType::STRUCT
+ || entryDataTypes.dataType == DataType::OP_NULL
+ || entryDataTypes.dataType == DataType::OP_UNDEF)
+ && entryVectorTypes.vectorType != VectorType::SCALAR)
+ {
+ continue;
+ }
+
+ DataSpillTestCase::TestParams params;
+ params.callType = entryCallTypes.callType;
+ params.dataType = entryDataTypes.dataType;
+ params.vectorType = entryVectorTypes.vectorType;
+
+ const auto testName = std::string(entryVectorTypes.prefix) + entryDataTypes.name;
+
+ callTypeGroup->addChild(new DataSpillTestCase(testCtx, testName, "", params));
+ }
+ }
+
+ group->addChild(callTypeGroup.release());
+ }
+
+ // Pipeline interface tests.
+ de::MovePtr<tcu::TestCaseGroup> pipelineInterfaceGroup(new tcu::TestCaseGroup(testCtx, "pipeline_interface", "Test data spilling and unspilling of pipeline interface variables"));
+
+ struct
+ {
+ InterfaceType interfaceType;
+ const char* name;
+ } interfaceTypes[] =
+ {
+ { InterfaceType::RAY_PAYLOAD, "ray_payload" },
+ { InterfaceType::CALLABLE_DATA, "callable_data" },
+ { InterfaceType::HIT_ATTRIBUTES, "hit_attributes" },
+ { InterfaceType::SHADER_RECORD_BUFFER_RGEN, "shader_record_buffer_rgen" },
+ { InterfaceType::SHADER_RECORD_BUFFER_CALL, "shader_record_buffer_call" },
+ { InterfaceType::SHADER_RECORD_BUFFER_MISS, "shader_record_buffer_miss" },
+ { InterfaceType::SHADER_RECORD_BUFFER_HIT, "shader_record_buffer_hit" },
+ };
+
+ for (int idx = 0; idx < DE_LENGTH_OF_ARRAY(interfaceTypes); ++idx)
+ {
+ const auto& entry = interfaceTypes[idx];
+ DataSpillPipelineInterfaceTestCase::TestParams params;
+
+ params.interfaceType = entry.interfaceType;
+
+ pipelineInterfaceGroup->addChild(new DataSpillPipelineInterfaceTestCase(testCtx, entry.name, "", params));
+ }
+
+ group->addChild(pipelineInterfaceGroup.release());
+
+ return group.release();
+}
+
+} // RayTracing
+} // vkt
+
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDataSpillTests.hpp
similarity index 69%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDataSpillTests.hpp
index 1a85ebf..e9c61cc 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDataSpillTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYTRACINGDATASPILLTESTS_HPP
+#define _VKTRAYTRACINGDATASPILLTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Ray Tracing Data Spill tests
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +29,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayTracing
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createDataSpillTests(tcu::TestContext& testCtx);
-} // pipeline
+} // RayTracing
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYTRACINGDATASPILLTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.cpp
new file mode 100644
index 0000000..ac7da38
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.cpp
@@ -0,0 +1,674 @@
+/*-------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
+ *
+ * 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 Ray Tracing Direction Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktRayTracingDirectionTests.hpp"
+#include "vktTestCase.hpp"
+
+#include "vkObjUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkRayTracingUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkBarrierUtil.hpp"
+
+#include "tcuVector.hpp"
+#include "tcuMatrix.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deRandom.hpp"
+#include "deStringUtil.hpp"
+#include "deDefs.hpp"
+
+#include <vector>
+#include <cmath>
+#include <sstream>
+#include <utility>
+#include <algorithm>
+#include <limits>
+
+namespace vkt
+{
+namespace RayTracing
+{
+
+namespace
+{
+
+using namespace vk;
+
+using GeometryData = std::vector<tcu::Vec3>;
+
+struct SpaceObjects
+{
+ tcu::Vec3 origin;
+ tcu::Vec3 direction;
+ GeometryData geometry;
+
+ SpaceObjects (VkGeometryTypeKHR geometryType)
+ : origin (0.0f, 0.0f, 1.0f) // Origin of the ray at (0, 0, 1).
+ , direction (0.0f, 0.0f, 1.0f) // Shooting towards (0, 0, 1).
+ , geometry ()
+ {
+ // Triangle or AABB around (0, 0, 5).
+ DE_ASSERT(geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR || geometryType == VK_GEOMETRY_TYPE_AABBS_KHR);
+ if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR)
+ {
+ geometry.reserve(3u);
+ geometry.push_back(tcu::Vec3( 0.0f, 0.5f, 5.0f));
+ geometry.push_back(tcu::Vec3(-0.5f, -0.5f, 5.0f));
+ geometry.push_back(tcu::Vec3( 0.5f, -0.5f, 5.0f));
+ }
+ else
+ {
+ geometry.reserve(2u);
+ geometry.push_back(tcu::Vec3(-0.5f, -0.5f, 5.0f));
+ geometry.push_back(tcu::Vec3( 0.5f, 0.5f, 5.0f));
+ }
+ }
+
+ static float getDefaultDistance (void)
+ {
+ // Consistent with the Z coordinates of the origin, direction and points in the default constructor.
+ return 4.0f;
+ }
+
+ // Calculates expected distance given the direction scaling factor.
+ static float getExpectedDistance (float directionScale)
+ {
+ return getDefaultDistance() / directionScale;
+ }
+};
+
+// Default test tolerance for distance values.
+constexpr float kDefaultTolerance = 0.001f;
+
+// Calculates appropriate values for Tmin/Tmax given the expected distance.
+std::pair<float, float> calcTminTmax (float expectedDistance)
+{
+ const auto margin = kDefaultTolerance / 2.0f;
+ return std::make_pair(de::max(expectedDistance - margin, 0.0f), expectedDistance + margin);
+}
+
+// Get matrix to scale a point with the given scale factor.
+tcu::Mat3 getScaleMatrix (float scaleFactor)
+{
+ const float scaleDirectionMatrixData[] =
+ {
+ scaleFactor, 0.f, 0.f,
+ 0.f, scaleFactor, 0.f,
+ 0.f, 0.f, scaleFactor,
+ };
+ return tcu::Mat3(scaleDirectionMatrixData);
+}
+
+// Get a matrix to rotate a point around the X and Y axis by the given angles in radians.
+tcu::Mat3 getRotationMatrix (float rotationX, float rotationY)
+{
+ const float cosA = std::cos(rotationX);
+ const float sinA = std::sin(rotationX);
+
+ const float cosB = std::cos(rotationY);
+ const float sinB = std::sin(rotationY);
+
+ const float rotationMatrixDataX[] =
+ {
+ 1.0f, 0.0f, 0.0f,
+ 0.0f, cosA,-sinA,
+ 0.0f, sinA, cosA,
+ };
+ const tcu::Mat3 rotationMatrixX (rotationMatrixDataX);
+
+ const float rotationMatrixDataY[] =
+ {
+ cosB, 0.0f,-sinB,
+ 0.0f, 1.0f, 0.0f,
+ sinB, 0.0f, cosB,
+ };
+ const tcu::Mat3 rotationMatrixY (rotationMatrixDataY);
+
+ return rotationMatrixX * rotationMatrixY;
+}
+
+// Converts transformation matrix to the expected KHR format.
+VkTransformMatrixKHR toTransformMatrixKHR (const tcu::Mat3& mat3)
+{
+ VkTransformMatrixKHR result;
+
+ deMemset(result.matrix, 0, sizeof(result.matrix));
+ for (int y = 0; y < 3; ++y)
+ for (int x = 0; x < 3; ++x)
+ result.matrix[x][y] = mat3[x][y];
+
+ return result;
+}
+
+struct TestParams
+{
+ SpaceObjects spaceObjects;
+ float directionScale;
+ float rotationX;
+ float rotationY;
+ VkShaderStageFlagBits testStage;
+ VkGeometryTypeKHR geometryType;
+
+ VkShaderStageFlags usedStages (void) const
+ {
+ VkShaderStageFlags flags = (VK_SHADER_STAGE_RAYGEN_BIT_KHR | VK_SHADER_STAGE_MISS_BIT_KHR | testStage);
+
+ if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR)
+ flags |= VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
+
+ return flags;
+ }
+
+ // True if we are testing the intersection shader.
+ bool isecMain (void) const
+ {
+ return (testStage == VK_SHADER_STAGE_INTERSECTION_BIT_KHR);
+ }
+
+ // True if the intersection shader is needed as an auxiliar shader.
+ bool isecAux (void) const
+ {
+ return (!isecMain() && geometryType == VK_GEOMETRY_TYPE_AABBS_KHR);
+ }
+
+ // True if the intersection shader is used in some capacity.
+ bool isecUsed (void) const
+ {
+ return (isecMain() || isecAux());
+ }
+};
+
+class DirectionTestCase : public vkt::TestCase
+{
+public:
+ DirectionTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params);
+ virtual ~DirectionTestCase (void) {}
+
+ virtual void checkSupport (Context& context) const;
+ virtual void initPrograms (vk::SourceCollections& programCollection) const;
+ virtual TestInstance* createInstance (Context& context) const;
+
+protected:
+ TestParams m_params;
+};
+
+class DirectionTestInstance : public vkt::TestInstance
+{
+public:
+ DirectionTestInstance (Context& context, const TestParams& params);
+ virtual ~DirectionTestInstance (void) {}
+
+ virtual tcu::TestStatus iterate (void);
+
+protected:
+ TestParams m_params;
+};
+
+
+DirectionTestCase::DirectionTestCase(tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TestParams& params)
+ : vkt::TestCase (testCtx, name, description)
+ , m_params (params)
+{}
+
+void DirectionTestCase::checkSupport (Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+ context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+}
+
+// Push constants. They need to match the shaders.
+// Note: origin and direction will be used as a Vec3. Declaring them as Vec4 eases matching alignments.
+struct PushConstants
+{
+ tcu::Vec4 origin;
+ tcu::Vec4 direction;
+ float tmix;
+ float tmax;
+};
+
+tcu::Vec4 toVec4 (const tcu::Vec3& vec3)
+{
+ return tcu::Vec4(vec3.x(), vec3.y(), vec3.z(), 0.0f);
+}
+
+void DirectionTestCase::initPrograms (vk::SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions buildOptions (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ std::ostringstream rgen;
+ rgen
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "layout(location=0) rayPayloadEXT vec3 hitValue;\n"
+ << "layout(set=0, binding=0) uniform accelerationStructureEXT topLevelAS;\n"
+ // Needs to match the PushConstants struct above.
+ << "layout(push_constant, std430) uniform PushConstants {\n"
+ << " vec4 origin;\n"
+ << " vec4 direction;\n"
+ << " float tmin;\n"
+ << " float tmax;\n"
+ << "} pc;\n"
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " const uint cullMask = 0xFF;\n"
+ << " traceRayEXT(topLevelAS, gl_RayFlagsNoneEXT, cullMask, 0, 0, 0, pc.origin.xyz, pc.tmin, pc.direction.xyz, pc.tmax, 0);\n"
+ << "}\n"
+ ;
+
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(rgen.str())) << buildOptions;
+
+ const bool isecTest = m_params.isecMain();
+ const std::string bufferDecl = "layout(set=0, binding=1, std430) buffer OutBuffer { float val; } outBuffer;\n";
+
+ std::ostringstream isec;
+ isec
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "hitAttributeEXT vec3 hitAttribute;\n"
+ << (isecTest ? bufferDecl : "")
+ << "void main()\n"
+ << "{\n"
+ << " hitAttribute = vec3(0.0f, 0.0f, 0.0f);\n"
+ << (isecTest ? " outBuffer.val = gl_RayTmaxEXT;\n" : "")
+ << " reportIntersectionEXT(gl_RayTmaxEXT, 0);\n"
+ << "}\n"
+ ;
+
+ std::ostringstream hits;
+ hits
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "layout(location=0) rayPayloadInEXT vec3 hitValue;\n"
+ << "hitAttributeEXT vec3 attribs;\n"
+ << bufferDecl
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " outBuffer.val = gl_HitTEXT;\n"
+ << "}\n"
+ ;
+
+ switch (m_params.testStage)
+ {
+ case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
+ programCollection.glslSources.add("hits") << glu::ClosestHitSource(updateRayTracingGLSL(hits.str())) << buildOptions;
+ break;
+ case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
+ programCollection.glslSources.add("hits") << glu::AnyHitSource(updateRayTracingGLSL(hits.str())) << buildOptions;
+ break;
+ case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
+ programCollection.glslSources.add("isec") << glu::IntersectionSource(updateRayTracingGLSL(isec.str())) << buildOptions;
+ break;
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+
+ // Also add the intersection shader if needed for AABBs.
+ if (m_params.isecAux())
+ programCollection.glslSources.add("isec") << glu::IntersectionSource(updateRayTracingGLSL(isec.str())) << buildOptions;
+
+ std::ostringstream miss;
+ miss
+ << "#version 460 core\n"
+ << "#extension GL_EXT_ray_tracing : require\n"
+ << "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+ << bufferDecl
+ << "\n"
+ << "void main()\n"
+ << "{\n"
+ << " outBuffer.val = -10000.0f;\n"
+ << "}\n";
+ ;
+
+ programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(miss.str())) << buildOptions;
+}
+
+TestInstance* DirectionTestCase::createInstance (Context& context) const
+{
+ return new DirectionTestInstance(context, m_params);
+}
+
+DirectionTestInstance::DirectionTestInstance (Context& context, const TestParams& params)
+ : vkt::TestInstance (context)
+ , m_params (params)
+{}
+
+tcu::TestStatus DirectionTestInstance::iterate (void)
+{
+ const auto& vki = m_context.getInstanceInterface();
+ const auto physDev = m_context.getPhysicalDevice();
+ const auto& vkd = m_context.getDeviceInterface();
+ const auto device = m_context.getDevice();
+ auto& alloc = m_context.getDefaultAllocator();
+ const auto qIndex = m_context.getUniversalQueueFamilyIndex();
+ const auto queue = m_context.getUniversalQueue();
+ const auto stages = m_params.usedStages();
+ const auto pcSize = static_cast<deUint32>(sizeof(PushConstants));
+
+ const auto scaleMatrix = getScaleMatrix(m_params.directionScale);
+ const auto rotationMatrix = getRotationMatrix(m_params.rotationX, m_params.rotationY);
+ const auto transformMatrix = toTransformMatrixKHR(rotationMatrix);
+
+ // Command pool and buffer.
+ const auto cmdPool = makeCommandPool(vkd, device, qIndex);
+ const auto cmdBufferPtr = allocateCommandBuffer(vkd, device, cmdPool.get(), VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+ const auto cmdBuffer = cmdBufferPtr.get();
+
+ beginCommandBuffer(vkd, cmdBuffer);
+
+ // Build acceleration structures.
+ auto topLevelAS = makeTopLevelAccelerationStructure();
+ auto bottomLevelAS = makeBottomLevelAccelerationStructure();
+
+ const bool isTriangles = (m_params.geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR);
+ const VkGeometryInstanceFlagsKHR instanceFlags = (isTriangles ? VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR : 0);
+
+ bottomLevelAS->addGeometry(m_params.spaceObjects.geometry, isTriangles, VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR);
+ bottomLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> blasSharedPtr (bottomLevelAS.release());
+ topLevelAS->setInstanceCount(1);
+ topLevelAS->addInstance(blasSharedPtr, transformMatrix, 0, 0xFFu, 0u, instanceFlags);
+ topLevelAS->createAndBuild(vkd, device, cmdBuffer, alloc);
+
+ // Create output buffer.
+ const auto bufferSize = static_cast<VkDeviceSize>(sizeof(float));
+ const auto bufferCreateInfo = makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+ BufferWithMemory buffer (vkd, device, alloc, bufferCreateInfo, MemoryRequirement::HostVisible);
+ auto& bufferAlloc = buffer.getAllocation();
+
+ // Fill output buffer with an initial value.
+ deMemset(bufferAlloc.getHostPtr(), 0, sizeof(float));
+ flushAlloc(vkd, device, bufferAlloc);
+
+ // Descriptor set layout and pipeline layout.
+ DescriptorSetLayoutBuilder setLayoutBuilder;
+ setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, stages);
+ setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, stages);
+ const auto setLayout = setLayoutBuilder.build(vkd, device);
+
+ const VkPushConstantRange pcRange =
+ {
+ stages, // VkShaderStageFlags stageFlags;
+ 0u, // deUint32 offset;
+ pcSize, // deUint32 size;
+ };
+
+ const VkPipelineLayoutCreateInfo pipelineLayoutInfo =
+ {
+ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
+ nullptr, // const void* pNext;
+ 0u, // VkPipelineLayoutCreateFlags flags;
+ 1u, // deUint32 setLayoutCount;
+ &setLayout.get(), // const VkDescriptorSetLayout* pSetLayouts;
+ 1u, // deUint32 pushConstantRangeCount;
+ &pcRange, // const VkPushConstantRange* pPushConstantRanges;
+ };
+ const auto pipelineLayout = createPipelineLayout(vkd, device, &pipelineLayoutInfo);
+
+ // Descriptor pool and set.
+ DescriptorPoolBuilder poolBuilder;
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
+ poolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1u);
+ const auto descriptorPool = poolBuilder.build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+ const auto descriptorSet = makeDescriptorSet(vkd, device, descriptorPool.get(), setLayout.get());
+
+ // Update descriptor set.
+ {
+ const VkWriteDescriptorSetAccelerationStructureKHR accelDescInfo =
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
+ nullptr,
+ 1u,
+ topLevelAS.get()->getPtr(),
+ };
+
+ const auto bufferDescInfo = makeDescriptorBufferInfo(buffer.get(), 0ull, VK_WHOLE_SIZE);
+
+ DescriptorSetUpdateBuilder updateBuilder;
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &accelDescInfo);
+ updateBuilder.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &bufferDescInfo);
+ updateBuilder.update(vkd, device);
+ }
+
+ // Shader modules.
+ Move<VkShaderModule> rgenModule;
+ Move<VkShaderModule> missModule;
+ Move<VkShaderModule> hitsModule;
+ Move<VkShaderModule> isecModule;
+
+ rgenModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("rgen"), 0);
+ missModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("miss"), 0);
+
+ if (!m_params.isecMain())
+ hitsModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("hits"), 0);
+
+ if (m_params.isecUsed())
+ isecModule = createShaderModule(vkd, device, m_context.getBinaryCollection().get("isec"), 0);
+
+ // Get some ray tracing properties.
+ deUint32 shaderGroupHandleSize = 0u;
+ deUint32 shaderGroupBaseAlignment = 1u;
+ {
+ const auto rayTracingPropertiesKHR = makeRayTracingProperties(vki, physDev);
+ shaderGroupHandleSize = rayTracingPropertiesKHR->getShaderGroupHandleSize();
+ shaderGroupBaseAlignment = rayTracingPropertiesKHR->getShaderGroupBaseAlignment();
+ }
+
+ // Create raytracing pipeline and shader binding tables.
+ Move<VkPipeline> pipeline;
+
+ de::MovePtr<BufferWithMemory> raygenSBT;
+ de::MovePtr<BufferWithMemory> missSBT;
+ de::MovePtr<BufferWithMemory> hitSBT;
+ de::MovePtr<BufferWithMemory> callableSBT;
+
+ VkStridedDeviceAddressRegionKHR raygenSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR missSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR hitSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+ VkStridedDeviceAddressRegionKHR callableSBTRegion = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+
+ {
+ const auto hitModuleCount = (m_params.isecAux() ? 2 : 1);
+ const auto rayTracingPipeline = de::newMovePtr<RayTracingPipeline>();
+
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, rgenModule, 0);
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR, missModule, 1);
+
+ if (!m_params.isecMain())
+ rayTracingPipeline->addShader(m_params.testStage, hitsModule, 2);
+
+ if (m_params.isecUsed())
+ rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR, isecModule, 2);
+
+ pipeline = rayTracingPipeline->createPipeline(vkd, device, pipelineLayout.get());
+
+ raygenSBT = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 0, 1);
+ raygenSBTRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, raygenSBT->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+
+ missSBT = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 1, 1);
+ missSBTRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, missSBT->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize);
+
+ hitSBT = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline.get(), alloc, shaderGroupHandleSize, shaderGroupBaseAlignment, 2, 1);
+ hitSBTRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, hitSBT->get(), 0), shaderGroupHandleSize, shaderGroupHandleSize * hitModuleCount);
+ }
+
+ // Push constants.
+ const auto rotatedOrigin = m_params.spaceObjects.origin * rotationMatrix;
+ const auto finalDirection = m_params.spaceObjects.direction * scaleMatrix * rotationMatrix;
+ const auto expectedDistance = SpaceObjects::getExpectedDistance(m_params.directionScale);
+ const auto tMinMax = calcTminTmax(expectedDistance);
+ const PushConstants pcData =
+ {
+ toVec4(rotatedOrigin), // tcu::Vec4 origin;
+ toVec4(finalDirection), // tcu::Vec4 direction;
+ tMinMax.first, // float tmix;
+ tMinMax.second, // float tmax;
+ };
+
+ // Trace rays.
+ vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipeline.get());
+ vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pipelineLayout.get(), 0u, 1u, &descriptorSet.get(), 0u, nullptr);
+ vkd.cmdPushConstants(cmdBuffer, pipelineLayout.get(), stages, 0u, pcSize, &pcData);
+ vkd.cmdTraceRaysKHR(cmdBuffer, &raygenSBTRegion, &missSBTRegion, &hitSBTRegion, &callableSBTRegion, 1u, 1u, 1u);
+
+ // Barrier for the output buffer.
+ const auto bufferBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT);
+ vkd.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &bufferBarrier, 0u, nullptr, 0u, nullptr);
+
+ endCommandBuffer(vkd, cmdBuffer);
+ submitCommandsAndWait(vkd, device, queue, cmdBuffer);
+
+ // Read value back from the buffer.
+ float bufferValue = 0.0f;
+ invalidateAlloc(vkd, device, bufferAlloc);
+ deMemcpy(&bufferValue, bufferAlloc.getHostPtr(), sizeof(bufferValue));
+
+ if (de::abs(bufferValue - expectedDistance) > kDefaultTolerance)
+ {
+ std::ostringstream msg;
+ msg << "Result distance (" << bufferValue << ") differs from expected distance (" << expectedDistance << ", tolerance " << kDefaultTolerance << ")";
+ TCU_FAIL(msg.str());
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createDirectionTests(tcu::TestContext& testCtx)
+{
+ using GroupPtr = de::MovePtr<tcu::TestCaseGroup>;
+
+ GroupPtr directionGroup (new tcu::TestCaseGroup(testCtx, "direction_length", "Test direction vector length when tracing rays"));
+
+ struct
+ {
+ VkShaderStageFlagBits hitStage;
+ const char* name;
+ } stages[] =
+ {
+ { VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, "chit" },
+ { VK_SHADER_STAGE_ANY_HIT_BIT_KHR, "ahit" },
+ { VK_SHADER_STAGE_INTERSECTION_BIT_KHR, "isec" },
+ };
+
+ struct
+ {
+ VkGeometryTypeKHR geometryType;
+ const char* name;
+ } geometryTypes[] =
+ {
+ { VK_GEOMETRY_TYPE_TRIANGLES_KHR, "triangles" },
+ { VK_GEOMETRY_TYPE_AABBS_KHR, "aabbs" },
+ };
+
+ const float kPi2 = DE_PI * 2.0f;
+ const float kMinScalingFactor = 0.5f;
+ const float kMaxScalingFactor = 10.0f;
+
+ const int kNumRandomScalingFactors = 5;
+ const int kNumRandomRotations = 4;
+
+ de::Random rnd(1613648516u);
+
+ // Scaling factors: 1.0 and some randomly-generated ones.
+ std::vector<float> scalingFactors;
+
+ scalingFactors.reserve(kNumRandomScalingFactors + 1);
+ scalingFactors.push_back(1.0f);
+
+ for (int i = 0; i < kNumRandomScalingFactors; ++i)
+ scalingFactors.push_back(rnd.getFloat() * (kMaxScalingFactor - kMinScalingFactor) + kMinScalingFactor);
+
+ // Rotations: 0.0 on both axis and some randomly-generated ones.
+ std::vector<std::pair<float, float>> rotationAngles;
+
+ rotationAngles.reserve(kNumRandomRotations + 1);
+ rotationAngles.push_back(std::make_pair(0.0f, 0.0f));
+
+ for (int i = 0; i < kNumRandomRotations; ++i)
+ rotationAngles.push_back(std::make_pair(rnd.getFloat() * kPi2, rnd.getFloat() * kPi2));
+
+ for (int stageIdx = 0; stageIdx < DE_LENGTH_OF_ARRAY(stages); ++stageIdx)
+ {
+ const auto& stageData = stages[stageIdx];
+ GroupPtr stageGroup (new tcu::TestCaseGroup(testCtx, stageData.name, ""));
+
+ for (int geometryTypeIdx = 0; geometryTypeIdx < DE_LENGTH_OF_ARRAY(geometryTypes); ++geometryTypeIdx)
+ {
+ const auto& gType = geometryTypes[geometryTypeIdx];
+
+ // We cannot test triangles with the ray intersection stage.
+ if (gType.geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR && stageData.hitStage == VK_SHADER_STAGE_INTERSECTION_BIT_KHR)
+ continue;
+
+ GroupPtr geomGroup (new tcu::TestCaseGroup(testCtx, gType.name, ""));
+
+ for (size_t scalingIdx = 0; scalingIdx < scalingFactors.size(); ++scalingIdx)
+ {
+ const auto scale = scalingFactors[scalingIdx];
+ const auto scaleName = "scaling_factor_" + de::toString(scalingIdx);
+ GroupPtr factorGroup (new tcu::TestCaseGroup(testCtx, scaleName.c_str(), ""));
+
+ for (size_t rotationIdx = 0; rotationIdx < rotationAngles.size(); ++rotationIdx)
+ {
+ const auto angles = rotationAngles[rotationIdx];
+ const auto angleName = "rotation_" + de::toString(rotationIdx);
+ const auto geometryType = gType.geometryType;
+
+ SpaceObjects spaceObjects(geometryType);
+
+ TestParams params =
+ {
+ spaceObjects, // SpaceObjects spaceObjects;
+ scale, // float directionScale;
+ angles.first, // float rotationX;
+ angles.second, // float rotationY;
+ stageData.hitStage, // VkShaderStageFlagBits hitStage;
+ geometryType, // VkGeometryTypeKHR geometryType;
+ };
+
+ factorGroup->addChild(new DirectionTestCase(testCtx, angleName, "", params));
+ }
+
+ geomGroup->addChild(factorGroup.release());
+ }
+
+ stageGroup->addChild(geomGroup.release());
+ }
+
+ directionGroup->addChild(stageGroup.release());
+ }
+
+ return directionGroup.release();
+}
+
+} // RayTracing
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.hpp
similarity index 69%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.hpp
index 1a85ebf..8518d80 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingDirectionTests.hpp
@@ -1,11 +1,11 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYTRACINGDIRECTIONTESTS_HPP
+#define _VKTRAYTRACINGDIRECTIONTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group Inc.
+ * Copyright (c) 2021 The Khronos Group Inc.
+ * Copyright (c) 2021 Valve Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Ray Tracing Direction Tests
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +29,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayTracing
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createDirectionTests(tcu::TestContext& testCtx);
-} // pipeline
+} // RayTracing
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYTRACINGDIRECTIONTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingMiscTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingMiscTests.cpp
index 341cf96..9749982 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingMiscTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingMiscTests.cpp
@@ -108,6 +108,7 @@
NO_DUPLICATE_ANY_HIT,
REPORT_INTERSECTION_RESULT,
RAY_PAYLOAD_IN,
+ RECURSIVE_TRACES_0,
RECURSIVE_TRACES_1,
RECURSIVE_TRACES_2,
RECURSIVE_TRACES_3,
@@ -161,6 +162,12 @@
SHADER_RECORD_BLOCK_STD430_4,
SHADER_RECORD_BLOCK_STD430_5,
SHADER_RECORD_BLOCK_STD430_6,
+ IGNORE_ANY_HIT_STATICALLY,
+ IGNORE_ANY_HIT_DYNAMICALLY,
+ TERMINATE_ANY_HIT_STATICALLY,
+ TERMINATE_ANY_HIT_DYNAMICALLY,
+ TERMINATE_INTERSECTION_STATICALLY,
+ TERMINATE_INTERSECTION_DYNAMICALLY,
COUNT
};
@@ -947,6 +954,72 @@
tcu::Vec3 m_gridStartXYZ;
};
+/* Provides an AS holding a single {(0, 0, 0), (-1, 1, 0), {1, 1, 0} tri. */
+class TriASProvider : public ASProviderBase
+{
+public:
+ TriASProvider()
+ {
+ /* Stub*/
+ }
+
+ std::unique_ptr<TopLevelAccelerationStructure> createTLAS( Context& context,
+ const AccelerationStructureLayout& /* asLayout */,
+ VkCommandBuffer cmdBuffer,
+ const VkGeometryFlagsKHR& bottomLevelGeometryFlags,
+ const ASPropertyProvider* optASPropertyProviderPtr,
+ IGridASFeedback* /* optASFeedbackPtr */) const final
+ {
+ Allocator& allocator = context.getDefaultAllocator ();
+ const DeviceInterface& deviceInterface = context.getDeviceInterface ();
+ const VkDevice deviceVk = context.getDevice ();
+ std::unique_ptr<TopLevelAccelerationStructure> resultPtr;
+ de::MovePtr<TopLevelAccelerationStructure> tlPtr = makeTopLevelAccelerationStructure ();
+
+ {
+
+ const auto cullMask = (optASPropertyProviderPtr != nullptr) ? optASPropertyProviderPtr->getCullMask(0, 0)
+ : static_cast<deUint8>(0xFF);
+ const auto instanceCustomIndex = (optASPropertyProviderPtr != nullptr) ? optASPropertyProviderPtr->getInstanceCustomIndex(0, 0)
+ : 0;
+
+ tlPtr->setInstanceCount(1);
+
+ {
+ de::MovePtr<BottomLevelAccelerationStructure> blPtr = makeBottomLevelAccelerationStructure();
+ const std::vector<tcu::Vec3> vertexVec = {tcu::Vec3(0, 0, 0), tcu::Vec3(-1, 1, 0), tcu::Vec3(1, 1, 0) };
+
+ blPtr->setGeometryCount (1u);
+ blPtr->addGeometry (vertexVec,
+ true, /* triangles */
+ bottomLevelGeometryFlags);
+
+ blPtr->createAndBuild( deviceInterface,
+ deviceVk,
+ cmdBuffer,
+ allocator);
+
+ tlPtr->addInstance( de::SharedPtr<BottomLevelAccelerationStructure>(blPtr.release() ),
+ identityMatrix3x4,
+ instanceCustomIndex,
+ cullMask);
+ }
+ }
+
+ tlPtr->createAndBuild( deviceInterface,
+ deviceVk,
+ cmdBuffer,
+ allocator);
+
+ resultPtr = decltype(resultPtr)(tlPtr.release() );
+ return resultPtr;
+ }
+
+ deUint32 getNPrimitives() const final
+ {
+ return 1;
+ }
+};
/* Test logic providers ==> */
class TestBase
@@ -1025,6 +1098,11 @@
descriptorSetLayout);
}
+ virtual std::vector<deUint8> getResultBufferStartData() const
+ {
+ return std::vector<deUint8>();
+ }
+
virtual const void* getShaderRecordData(const ShaderGroups& /* shaderGroup */) const
{
return nullptr;
@@ -4070,7 +4148,7 @@
(testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_SCALAR_OFFSET_3) ||
(testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_SCALAR_OFFSET_4) ||
(testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_SCALAR_OFFSET_5) ||
- (testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_STD430_OFFSET_6) ||
+ (testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_SCALAR_OFFSET_6) ||
(testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_STD430_OFFSET_1) ||
(testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_STD430_OFFSET_2) ||
(testType == TestType::SHADER_RECORD_BLOCK_EXPLICIT_STD430_OFFSET_3) ||
@@ -6026,7 +6104,6 @@
deUint32 getResultBufferSize() const final
{
- DE_ASSERT(m_depthToUse != 0);
DE_ASSERT(m_depthToUse < 30); //< due to how nItemsExpectedPerRay is stored.
DE_ASSERT(m_nRaysToTest != 0);
@@ -6066,8 +6143,6 @@
bool init( vkt::Context& /* context */,
RayTracingProperties* /* rtPropsPtr */) final
{
- DE_ASSERT(m_depthToUse != 0);
-
m_specializationEntry.constantID = 1;
m_specializationEntry.offset = 0;
m_specializationEntry.size = sizeof(deUint32);
@@ -6349,6 +6424,8 @@
}
{
+ const std::string rayPayloadDefinition = ((m_depthToUse == 0u) ? "" : rayPayloadDefinitionVec.at(0));
+
std::stringstream css;
css <<
@@ -6359,7 +6436,7 @@
"layout(set = 0, binding = 1) uniform accelerationStructureEXT accelerationStructure;\n"
"\n"
+ de::toString(resultBufferDefinition)
- + rayPayloadDefinitionVec.at(0) +
+ + rayPayloadDefinition +
"void main()\n"
"{\n"
" uint nInvocation = gl_LaunchIDEXT.z * gl_LaunchSizeEXT.x * gl_LaunchSizeEXT.y + gl_LaunchIDEXT.y * gl_LaunchSizeEXT.x + gl_LaunchIDEXT.x;\n"
@@ -6386,12 +6463,14 @@
" resultItems[nItem].shaderStage = 3;\n"
" }\n"
"\n"
- " currentDepth = 0;\n"
- " currentNOriginRay = nInvocation;\n"
- " currentResultItem = nItem;\n"
- "\n"
- " traceRayEXT(accelerationStructure, rayFlags, cullMask, 0, 0, 0, origin, tmin, directionHit, tmax, 0);\n"
- " traceRayEXT(accelerationStructure, rayFlags, cullMask, 0, 0, 0, origin, tmin, directionMiss, tmax, 0);\n"
+ + ((m_depthToUse == 0u) ? "" :
+ " currentDepth = 0;\n"
+ " currentNOriginRay = nInvocation;\n"
+ " currentResultItem = nItem;\n"
+ "\n"
+ " traceRayEXT(accelerationStructure, rayFlags, cullMask, 0, 0, 0, origin, tmin, directionHit, tmax, 0);\n"
+ " traceRayEXT(accelerationStructure, rayFlags, cullMask, 0, 0, 0, origin, tmin, directionMiss, tmax, 0);\n"
+ ) +
"}\n";
programCollection.glslSources.add("rgen") << glu::RaygenSource(css.str() ) << buildOptions;
@@ -6499,7 +6578,7 @@
}
}
- if (resultItemPtr->depth >= m_depthToUse)
+ if (resultItemPtr->depth >= m_depthToUse && m_depthToUse > 0u)
{
DE_ASSERT(resultItemPtr->depth < m_depthToUse);
@@ -6604,14 +6683,14 @@
if ( currentResultItemPtr->stage == VK_SHADER_STAGE_RAYGEN_BIT_KHR ||
currentNLevel != m_depthToUse - 1)
{
- if (currentResultItemPtr->childCHitNodePtr == nullptr)
+ if (currentResultItemPtr->childCHitNodePtr == nullptr && m_depthToUse > 0u)
{
DE_ASSERT(currentResultItemPtr->childCHitNodePtr != nullptr);
goto end;
}
- if (currentResultItemPtr->childMissNodePtr == nullptr)
+ if (currentResultItemPtr->childMissNodePtr == nullptr && m_depthToUse > 0u)
{
DE_ASSERT(currentResultItemPtr->childMissNodePtr != nullptr);
@@ -7295,6 +7374,492 @@
VkSpecializationMapEntry m_specializationInfoMapEntry;
};
+class TerminationTest : public TestBase
+{
+public:
+ enum class Mode
+ {
+ IGNORE_ANY_HIT_STATICALLY,
+ IGNORE_ANY_HIT_DYNAMICALLY,
+ TERMINATE_ANY_HIT_STATICALLY,
+ TERMINATE_ANY_HIT_DYNAMICALLY,
+ TERMINATE_INTERSECTION_STATICALLY,
+ TERMINATE_INTERSECTION_DYNAMICALLY,
+
+ UNKNOWN
+ };
+
+ static Mode getModeFromTestType(const TestType& testType)
+ {
+ Mode result = Mode::UNKNOWN;
+
+ switch (testType)
+ {
+ case TestType::IGNORE_ANY_HIT_DYNAMICALLY: result = Mode::IGNORE_ANY_HIT_DYNAMICALLY; break;
+ case TestType::IGNORE_ANY_HIT_STATICALLY: result = Mode::IGNORE_ANY_HIT_STATICALLY; break;
+ case TestType::TERMINATE_ANY_HIT_DYNAMICALLY: result = Mode::TERMINATE_ANY_HIT_DYNAMICALLY; break;
+ case TestType::TERMINATE_ANY_HIT_STATICALLY: result = Mode::TERMINATE_ANY_HIT_STATICALLY; break;
+ case TestType::TERMINATE_INTERSECTION_DYNAMICALLY: result = Mode::TERMINATE_INTERSECTION_DYNAMICALLY; break;
+ case TestType::TERMINATE_INTERSECTION_STATICALLY: result = Mode::TERMINATE_INTERSECTION_STATICALLY; break;
+
+ default:
+ {
+ DE_ASSERT(false && "This should never happen");
+ }
+ }
+
+ return result;
+ }
+
+ TerminationTest(const Mode& mode)
+ :m_mode(mode)
+ {
+ /* Stub */
+ }
+
+ ~TerminationTest()
+ {
+ /* Stub */
+ }
+
+ std::vector<std::string> getCHitShaderCollectionShaderNames() const final
+ {
+ return {};
+ }
+
+ tcu::UVec3 getDispatchSize() const final
+ {
+ return tcu::UVec3(1, 1, 1);
+ }
+
+ std::vector<deUint8> getResultBufferStartData() const final
+ {
+ auto resultU8Vec = std::vector<deUint8> (getResultBufferSize () );
+ auto resultU32DataPtr = reinterpret_cast<deUint32*> (resultU8Vec.data () );
+
+ memset( resultU8Vec.data(),
+ 0,
+ resultU8Vec.size() );
+
+ if (m_mode == Mode::IGNORE_ANY_HIT_DYNAMICALLY ||
+ m_mode == Mode::TERMINATE_ANY_HIT_DYNAMICALLY)
+ {
+ resultU32DataPtr[2] = 1;
+ }
+ else
+ if (m_mode == Mode::TERMINATE_INTERSECTION_DYNAMICALLY)
+ {
+ resultU32DataPtr[3] = 1;
+ }
+
+ return resultU8Vec;
+ }
+
+ deUint32 getResultBufferSize() const final
+ {
+ const deUint32 nExtraUints = ( m_mode == Mode::IGNORE_ANY_HIT_DYNAMICALLY ||
+ m_mode == Mode::TERMINATE_ANY_HIT_DYNAMICALLY ||
+ m_mode == Mode::TERMINATE_INTERSECTION_DYNAMICALLY) ? 1
+ : 0;
+ const deUint32 nResultUints = ( m_mode == Mode::TERMINATE_INTERSECTION_DYNAMICALLY ||
+ m_mode == Mode::TERMINATE_INTERSECTION_STATICALLY) ? 3
+ : 2;
+
+ return static_cast<deUint32>(sizeof(deUint32) ) * (nExtraUints + nResultUints);
+ }
+
+ std::vector<TopLevelAccelerationStructure*> getTLASPtrVecToBind() const final
+ {
+ return {m_tlPtr.get() };
+ }
+
+ void resetTLAS() final
+ {
+ m_tlPtr.reset();
+ }
+
+ void initAS(vkt::Context& context,
+ RayTracingProperties* /* rtPropertiesPtr */,
+ VkCommandBuffer commandBuffer) final
+ {
+ if (m_mode == Mode::TERMINATE_INTERSECTION_DYNAMICALLY ||
+ m_mode == Mode::TERMINATE_INTERSECTION_STATICALLY)
+ {
+ const tcu::Vec3 gridCellSizeXYZ = tcu::Vec3 ( 2, 1, 1);
+ const tcu::Vec3 gridInterCellDeltaXYZ = tcu::Vec3 ( 3, 3, 3);
+ const tcu::UVec3 gridSizeXYZ = tcu::UVec3( 1, 1, 1);
+ const tcu::Vec3 gridStartXYZ = tcu::Vec3 (-1, -1, -1);
+
+ m_asProviderPtr.reset(
+ new GridASProvider( gridStartXYZ,
+ gridCellSizeXYZ,
+ gridSizeXYZ,
+ gridInterCellDeltaXYZ,
+ GeometryType::AABB)
+ );
+ }
+ else
+ {
+ m_asProviderPtr.reset(
+ new TriASProvider()
+ );
+ }
+
+ m_tlPtr = m_asProviderPtr->createTLAS( context,
+ AccelerationStructureLayout::ONE_TL_ONE_BL_ONE_GEOMETRY,
+ commandBuffer,
+ VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR,
+ nullptr, /* optASPropertyProviderPtr */
+ nullptr); /* optASFedbackPtr */
+ }
+
+ void initPrograms(SourceCollections& programCollection) const final
+ {
+ const vk::ShaderBuildOptions buildOptions( programCollection.usedVulkanVersion,
+ vk::SPIRV_VERSION_1_4,
+ 0u, /* flags */
+ true); /* allowSpirv14 */
+
+ const std::string resultBufferSizeString = de::toString(getResultBufferSize() / sizeof(deUint32) );
+
+ {
+ std::string aHitShader;
+
+ switch (m_mode)
+ {
+ case Mode::IGNORE_ANY_HIT_DYNAMICALLY:
+ {
+ aHitShader =
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "hitAttributeEXT vec3 dummyAttribute;\n"
+ "\n"
+ "layout(location = 0) rayPayloadInEXT dummy { vec3 dummyVec;};\n"
+ "layout(set = 0, binding = 0, std430) buffer result\n"
+ "{\n"
+ " uint resultData[" + resultBufferSizeString + "];\n"
+ "};\n"
+ "\n"
+ "void ignoreIntersectionWrapper()\n"
+ "{\n"
+ " ignoreIntersectionEXT;\n"
+ "}\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ "\n"
+ " if (resultData[2] == 1)\n"
+ " {\n"
+ " ignoreIntersectionWrapper();\n"
+ " }\n"
+ "\n"
+ " resultData[0] = 1;\n"
+ "}\n";
+
+ break;
+ }
+
+ case Mode::IGNORE_ANY_HIT_STATICALLY:
+ {
+ aHitShader =
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "hitAttributeEXT vec3 dummyAttribute;\n"
+ "\n"
+ "layout(location = 0) rayPayloadInEXT dummy { vec3 dummyVec;};\n"
+ "layout(set = 0, binding = 0, std430) buffer result\n"
+ "{\n"
+ " uint resultData[" + resultBufferSizeString + "];\n"
+ "};\n"
+ "\n"
+ "void ignoreIntersectionWrapper()\n"
+ "{\n"
+ " ignoreIntersectionEXT;\n"
+ "}\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " ignoreIntersectionWrapper();\n"
+ "\n"
+ " resultData[0] = 1;\n"
+ "}\n";
+
+ break;
+ }
+
+ case Mode::TERMINATE_ANY_HIT_DYNAMICALLY:
+ {
+ aHitShader =
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "hitAttributeEXT vec3 dummyAttribute;\n"
+ "\n"
+ "layout(location = 0) rayPayloadInEXT dummy { vec3 dummyVec;};\n"
+ "layout(set = 0, binding = 0, std430) buffer result\n"
+ "{\n"
+ " uint resultData[" + resultBufferSizeString + "];\n"
+ "};\n"
+ "\n"
+ "void terminateRayWrapper()\n"
+ "{\n"
+ " terminateRayEXT;\n"
+ "}\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " if (resultData[2] == 1)\n"
+ " {\n"
+ " terminateRayWrapper();\n"
+ " }\n"
+ "\n"
+ " resultData[0] = 1;\n"
+ "}\n";
+
+ break;
+ }
+
+ case Mode::TERMINATE_ANY_HIT_STATICALLY:
+ case Mode::TERMINATE_INTERSECTION_STATICALLY:
+ {
+ aHitShader =
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "hitAttributeEXT vec3 dummyAttribute;\n"
+ "\n"
+ "layout(location = 0) rayPayloadInEXT dummy { vec3 dummyVec;};\n"
+ "layout(set = 0, binding = 0, std430) buffer result\n"
+ "{\n"
+ " uint resultData[" + resultBufferSizeString + "];\n"
+ "};\n"
+ "\n"
+ "void terminateRayWrapper()\n"
+ "{\n"
+ " terminateRayEXT;\n"
+ "}\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " terminateRayWrapper();\n"
+ "\n"
+ " resultData[0] = 1;\n"
+ "}\n";
+
+ break;
+ }
+
+ case Mode::TERMINATE_INTERSECTION_DYNAMICALLY:
+ {
+ aHitShader =
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "hitAttributeEXT vec3 dummyAttribute;\n"
+ "\n"
+ "layout(location = 0) rayPayloadInEXT dummy { vec3 dummyVec;};\n"
+ "layout(set = 0, binding = 0, std430) buffer result\n"
+ "{\n"
+ " uint resultData[" + resultBufferSizeString + "];\n"
+ "};\n"
+ "\n"
+ "void terminateRayWrapper()\n"
+ "{\n"
+ " terminateRayEXT;\n"
+ "}\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " if (resultData[3] == 1)\n"
+ " {\n"
+ " terminateRayWrapper();\n"
+ " }\n"
+ "\n"
+ " resultData[0] = 1;\n"
+ "}\n";
+
+ break;
+ }
+
+ default:
+ {
+ DE_ASSERT(false);
+ }
+ }
+
+ programCollection.glslSources.add("ahit") << glu::AnyHitSource(aHitShader) << buildOptions;
+ }
+
+ if (m_mode == Mode::TERMINATE_INTERSECTION_DYNAMICALLY ||
+ m_mode == Mode::TERMINATE_INTERSECTION_STATICALLY)
+ {
+ std::stringstream css;
+
+ css <<
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "hitAttributeEXT vec3 hitAttribute;\n"
+ "\n"
+ "layout(set = 0, binding = 0, std430) buffer result\n"
+ "{\n"
+ " uint resultData[4];\n"
+ "};\n"
+ "\n"
+ "void generateIntersection()\n"
+ "{\n"
+ " reportIntersectionEXT(0.95f, 0);\n"
+ "}\n"
+ "\n"
+ "void main()\n"
+ "{\n";
+
+ if (m_mode == Mode::TERMINATE_INTERSECTION_DYNAMICALLY)
+ {
+ css << " if (resultData[3] == 1)\n"
+ " {\n";
+ }
+
+ css << " generateIntersection();\n";
+
+ if (m_mode == Mode::TERMINATE_INTERSECTION_DYNAMICALLY)
+ {
+ css << " }\n";
+ }
+
+ css <<
+ "\n"
+ " resultData[2] = 1;\n"
+ "}\n";
+
+ programCollection.glslSources.add("intersection") << glu::IntersectionSource(css.str() ) << buildOptions;
+ }
+
+ {
+ std::stringstream css;
+
+ css <<
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "layout(location = 0) rayPayloadInEXT vec3 dummy;\n"
+ "layout(set = 0, binding = 0, std430) buffer result\n"
+ "{\n"
+ " uint resultData[2];\n"
+ "};\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " resultData[1] = 1;\n"
+ "}\n";
+
+ programCollection.glslSources.add("miss") << glu::MissSource(css.str() ) << buildOptions;
+ }
+
+ {
+ std::stringstream css;
+
+ css <<
+ "#version 460 core\n"
+ "\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "\n"
+ "layout(location = 0) rayPayloadEXT vec3 dummy;\n"
+ "layout(set = 0, binding = 1) uniform accelerationStructureEXT topLevelAS;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " uint nInvocation = gl_LaunchIDEXT.z * gl_LaunchSizeEXT.x * gl_LaunchSizeEXT.y + gl_LaunchIDEXT.y * gl_LaunchSizeEXT.x + gl_LaunchIDEXT.x;\n"
+ " uint rayFlags = 0;\n"
+ " uint cullMask = 0xFF;\n"
+ " float tmin = 0.001;\n"
+ " float tmax = 9.0;\n"
+ " vec3 origin = vec3(-1, -1, -1);\n"
+ " vec3 target = vec3(0.5, 0.5, 0);\n"
+ " vec3 direct = normalize(target - origin);\n"
+ "\n"
+ " traceRayEXT(topLevelAS, rayFlags, cullMask, 0, 0, 0, origin, tmin, direct, tmax, 0);\n"
+ "}\n";
+
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(css.str() ) << buildOptions;
+ }
+ }
+
+ bool verifyResultBuffer (const void* resultDataPtr) const final
+ {
+ const deUint32* resultU32DataPtr = reinterpret_cast<const deUint32*>(resultDataPtr);
+ bool result = false;
+
+ switch (m_mode)
+ {
+ case Mode::IGNORE_ANY_HIT_DYNAMICALLY:
+ case Mode::IGNORE_ANY_HIT_STATICALLY:
+ {
+ if (resultU32DataPtr[0] != 0 ||
+ resultU32DataPtr[1] != 1)
+ {
+ goto end;
+ }
+
+ result = true;
+
+ break;
+ }
+
+ case Mode::TERMINATE_ANY_HIT_DYNAMICALLY:
+ case Mode::TERMINATE_ANY_HIT_STATICALLY:
+ {
+ if (resultU32DataPtr[0] != 0 ||
+ resultU32DataPtr[1] != 0)
+ {
+ goto end;
+ }
+
+ result = true;
+
+ break;
+ }
+
+ case Mode::TERMINATE_INTERSECTION_DYNAMICALLY:
+ case Mode::TERMINATE_INTERSECTION_STATICALLY:
+ {
+ if (resultU32DataPtr[0] != 0 ||
+ resultU32DataPtr[1] != 0 ||
+ resultU32DataPtr[2] != 0)
+ {
+ goto end;
+ }
+
+ result = true;
+
+ break;
+ }
+
+ default:
+ {
+ TCU_FAIL("This should never be reached");
+ }
+ }
+
+end:
+ return result;
+ }
+
+private:
+ std::unique_ptr<ASProviderBase> m_asProviderPtr;
+ const Mode m_mode;
+ std::unique_ptr<TopLevelAccelerationStructure> m_tlPtr;
+};
+
/* Generic misc test instance */
class RayTracingMiscTestInstance : public TestInstance
{
@@ -7571,10 +8136,13 @@
}
}
- missShaderStackSize = deviceInterface.getRayTracingShaderGroupStackSizeKHR( deviceVk,
- *pipelineVkPtr,
- static_cast<deUint32>(ShaderGroups::MISS_GROUP),
- VK_SHADER_GROUP_SHADER_GENERAL_KHR);
+ if (nMissGroups > 0u)
+ {
+ missShaderStackSize = deviceInterface.getRayTracingShaderGroupStackSizeKHR( deviceVk,
+ *pipelineVkPtr,
+ static_cast<deUint32>(ShaderGroups::MISS_GROUP),
+ VK_SHADER_GROUP_SHADER_GENERAL_KHR);
+ }
for (deUint32 nCallableShader = 0; nCallableShader < static_cast<deUint32>(callableShaderCollectionNames.size() ); ++nCallableShader)
{
@@ -7626,43 +8194,52 @@
0u, /* opaqueCaptureAddress */
0u); /* shaderBindingTableOffset */
- const void* missShaderBindingGroupShaderRecordDataPtr = m_testPtr->getShaderRecordData( ShaderGroups::MISS_GROUP);
- const auto missShaderBindingTablePtr = rayTracingPipelinePtr->createShaderBindingTable( deviceInterface,
- deviceVk,
- *pipelineVkPtr,
- allocator,
- m_rayTracingPropsPtr->getShaderGroupHandleSize (),
- m_rayTracingPropsPtr->getShaderGroupBaseAlignment (),
- missGroupIndex,
- nMissGroups, /* groupCount */
- 0u, /* additionalBufferCreateFlags */
- 0u, /* additionalBufferUsageFlags */
- MemoryRequirement::Any,
- 0u, /* opaqueCaptureAddress */
- 0u, /* shaderBindingTableOffset */
- m_testPtr->getShaderRecordSize(ShaderGroups::MISS_GROUP),
- &missShaderBindingGroupShaderRecordDataPtr);
+ auto missShaderBindingTablePtr = de::MovePtr<BufferWithMemory>();
+ if (nMissGroups > 0u)
+ {
+ const void* missShaderBindingGroupShaderRecordDataPtr = m_testPtr->getShaderRecordData( ShaderGroups::MISS_GROUP);
+ missShaderBindingTablePtr = rayTracingPipelinePtr->createShaderBindingTable( deviceInterface,
+ deviceVk,
+ *pipelineVkPtr,
+ allocator,
+ m_rayTracingPropsPtr->getShaderGroupHandleSize (),
+ m_rayTracingPropsPtr->getShaderGroupBaseAlignment (),
+ missGroupIndex,
+ nMissGroups, /* groupCount */
+ 0u, /* additionalBufferCreateFlags */
+ 0u, /* additionalBufferUsageFlags */
+ MemoryRequirement::Any,
+ 0u, /* opaqueCaptureAddress */
+ 0u, /* shaderBindingTableOffset */
+ m_testPtr->getShaderRecordSize(ShaderGroups::MISS_GROUP),
+ &missShaderBindingGroupShaderRecordDataPtr);
+ }
- const void* hitShaderBindingGroupShaderRecordDataPtr = m_testPtr->getShaderRecordData( ShaderGroups::HIT_GROUP);
- const auto hitShaderBindingTablePtr = rayTracingPipelinePtr->createShaderBindingTable( deviceInterface,
- deviceVk,
- *pipelineVkPtr,
- allocator,
- m_rayTracingPropsPtr->getShaderGroupHandleSize (),
- m_rayTracingPropsPtr->getShaderGroupBaseAlignment (),
- hitGroupIndex,
- nHitGroups, /* groupCount */
- 0u, /* additionalBufferCreateFlags */
- 0u, /* additionalBufferUsageFlags */
- MemoryRequirement::Any,
- 0u, /* opaqueCaptureAddress */
- 0u, /* shaderBindingTableOffset */
- m_testPtr->getShaderRecordSize(ShaderGroups::HIT_GROUP),
- &hitShaderBindingGroupShaderRecordDataPtr);
+ auto hitShaderBindingTablePtr = de::MovePtr<BufferWithMemory>();
+ if (nHitGroups > 0u)
+ {
+ const void* hitShaderBindingGroupShaderRecordDataPtr = m_testPtr->getShaderRecordData( ShaderGroups::HIT_GROUP);
+ hitShaderBindingTablePtr = rayTracingPipelinePtr->createShaderBindingTable( deviceInterface,
+ deviceVk,
+ *pipelineVkPtr,
+ allocator,
+ m_rayTracingPropsPtr->getShaderGroupHandleSize (),
+ m_rayTracingPropsPtr->getShaderGroupBaseAlignment (),
+ hitGroupIndex,
+ nHitGroups, /* groupCount */
+ 0u, /* additionalBufferCreateFlags */
+ 0u, /* additionalBufferUsageFlags */
+ MemoryRequirement::Any,
+ 0u, /* opaqueCaptureAddress */
+ 0u, /* shaderBindingTableOffset */
+ m_testPtr->getShaderRecordSize(ShaderGroups::HIT_GROUP),
+ &hitShaderBindingGroupShaderRecordDataPtr);
+ }
{
- const auto resultBufferCreateInfo = makeBufferCreateInfo( resultBufferSize,
- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ const auto resultBufferCreateInfo = makeBufferCreateInfo ( resultBufferSize,
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ const auto resultBufferDataVec = m_testPtr->getResultBufferStartData ();
resultBufferPtr = de::MovePtr<BufferWithMemory>(
new BufferWithMemory( deviceInterface,
@@ -7670,6 +8247,22 @@
allocator,
resultBufferCreateInfo,
MemoryRequirement::HostVisible));
+
+ if (resultBufferDataVec.size() > 0)
+ {
+ DE_ASSERT(static_cast<deUint32>(resultBufferDataVec.size() ) == resultBufferSize);
+
+ memcpy( resultBufferPtr->getAllocation().getHostPtr(),
+ resultBufferDataVec.data(),
+ resultBufferDataVec.size() );
+
+ flushMappedMemoryRange( deviceInterface,
+ deviceVk,
+ resultBufferPtr->getAllocation().getMemory(),
+ resultBufferPtr->getAllocation().getOffset(),
+ resultBufferSize);
+ }
+
}
beginCommandBuffer( deviceInterface,
@@ -7688,24 +8281,27 @@
tlasVkVec.push_back(*currentTLASPtr->getPtr() );
}
- deviceInterface.cmdFillBuffer( *cmdBufferPtr,
- **resultBufferPtr,
- 0, /* dstOffset */
- VK_WHOLE_SIZE,
- 0); /* data */
-
+ if (m_testPtr->getResultBufferStartData().size() == 0)
{
- const auto postFillBarrier = makeBufferMemoryBarrier( VK_ACCESS_TRANSFER_WRITE_BIT, /* srcAccessMask */
- VK_ACCESS_SHADER_WRITE_BIT, /* dstAccessMask */
- **resultBufferPtr,
- 0, /* offset */
- VK_WHOLE_SIZE);
+ deviceInterface.cmdFillBuffer( *cmdBufferPtr,
+ **resultBufferPtr,
+ 0, /* dstOffset */
+ VK_WHOLE_SIZE,
+ 0); /* data */
- cmdPipelineBufferMemoryBarrier( deviceInterface,
- *cmdBufferPtr,
- VK_PIPELINE_STAGE_TRANSFER_BIT, /* srcStageMask */
- VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, /* dstStageMask */
- &postFillBarrier);
+ {
+ const auto postFillBarrier = makeBufferMemoryBarrier( VK_ACCESS_TRANSFER_WRITE_BIT, /* srcAccessMask */
+ VK_ACCESS_SHADER_WRITE_BIT, /* dstAccessMask */
+ **resultBufferPtr,
+ 0, /* offset */
+ VK_WHOLE_SIZE);
+
+ cmdPipelineBufferMemoryBarrier( deviceInterface,
+ *cmdBufferPtr,
+ VK_PIPELINE_STAGE_TRANSFER_BIT, /* srcStageMask */
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, /* dstStageMask */
+ &postFillBarrier);
+ }
}
{
@@ -7767,18 +8363,24 @@
0 /* offset */),
m_rayTracingPropsPtr->getShaderGroupHandleSize(),
m_rayTracingPropsPtr->getShaderGroupHandleSize() );
- const auto missShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress( deviceInterface,
- deviceVk,
- missShaderBindingTablePtr->get(),
- 0 /* offset */),
- m_rayTracingPropsPtr->getShaderGroupHandleSize() + m_testPtr->getShaderRecordSize(ShaderGroups::MISS_GROUP),
- m_rayTracingPropsPtr->getShaderGroupHandleSize());
- const auto hitShaderBindingTableRegion = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress( deviceInterface,
- deviceVk,
- hitShaderBindingTablePtr->get(),
- 0 /* offset */),
- m_rayTracingPropsPtr->getShaderGroupHandleSize() + m_testPtr->getShaderRecordSize(ShaderGroups::HIT_GROUP),
- m_rayTracingPropsPtr->getShaderGroupHandleSize() );
+ const auto missShaderBindingTableRegion = ((nMissGroups > 0u) ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress( deviceInterface,
+ deviceVk,
+ missShaderBindingTablePtr->get(),
+ 0 /* offset */),
+ m_rayTracingPropsPtr->getShaderGroupHandleSize() + m_testPtr->getShaderRecordSize(ShaderGroups::MISS_GROUP),
+ m_rayTracingPropsPtr->getShaderGroupHandleSize())
+ : makeStridedDeviceAddressRegionKHR(DE_NULL,
+ 0, /* stride */
+ 0 /* size */));
+ const auto hitShaderBindingTableRegion = ((nHitGroups > 0u) ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress( deviceInterface,
+ deviceVk,
+ hitShaderBindingTablePtr->get(),
+ 0 /* offset */),
+ m_rayTracingPropsPtr->getShaderGroupHandleSize() + m_testPtr->getShaderRecordSize(ShaderGroups::HIT_GROUP),
+ m_rayTracingPropsPtr->getShaderGroupHandleSize() )
+ : makeStridedDeviceAddressRegionKHR(DE_NULL,
+ 0, /* stride */
+ 0 /* size */));
const auto callableShaderBindingTableRegion = (callableShaderCollectionNames.size() > 0) ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress( deviceInterface,
deviceVk,
@@ -8047,6 +8649,7 @@
break;
}
+ case TestType::RECURSIVE_TRACES_0:
case TestType::RECURSIVE_TRACES_1:
case TestType::RECURSIVE_TRACES_2:
case TestType::RECURSIVE_TRACES_3:
@@ -8077,7 +8680,9 @@
case TestType::RECURSIVE_TRACES_28:
case TestType::RECURSIVE_TRACES_29:
{
- const auto nLevels = static_cast<deUint32>(m_data.type) - static_cast<deUint32>(TestType::RECURSIVE_TRACES_1) + 1;
+ const auto nLevels = ((m_data.type == TestType::RECURSIVE_TRACES_0)
+ ? 0u
+ : (static_cast<deUint32>(m_data.type) - static_cast<deUint32>(TestType::RECURSIVE_TRACES_1) + 1));
m_testPtr.reset(
new RecursiveTracesTest(m_data.geometryType, m_data.asLayout, nLevels)
@@ -8145,6 +8750,22 @@
break;
}
+ case TestType::IGNORE_ANY_HIT_DYNAMICALLY:
+ case TestType::IGNORE_ANY_HIT_STATICALLY:
+ case TestType::TERMINATE_ANY_HIT_DYNAMICALLY:
+ case TestType::TERMINATE_ANY_HIT_STATICALLY:
+ case TestType::TERMINATE_INTERSECTION_DYNAMICALLY:
+ case TestType::TERMINATE_INTERSECTION_STATICALLY:
+ {
+ m_testPtr.reset(
+ new TerminationTest(TerminationTest::getModeFromTestType(m_data.type) )
+ );
+
+ m_testPtr->initPrograms(programCollection);
+
+ break;
+ }
+
default:
{
deAssertFail( "This location should never be reached",
@@ -8246,6 +8867,7 @@
break;
}
+ case TestType::RECURSIVE_TRACES_0:
case TestType::RECURSIVE_TRACES_1:
case TestType::RECURSIVE_TRACES_2:
case TestType::RECURSIVE_TRACES_3:
@@ -8276,7 +8898,9 @@
case TestType::RECURSIVE_TRACES_28:
case TestType::RECURSIVE_TRACES_29:
{
- const auto nLevels = static_cast<deUint32>(m_data.type) - static_cast<deUint32>(TestType::RECURSIVE_TRACES_1) + 1;
+ const auto nLevels = ((m_data.type == TestType::RECURSIVE_TRACES_0)
+ ? 0u
+ : (static_cast<deUint32>(m_data.type) - static_cast<deUint32>(TestType::RECURSIVE_TRACES_1) + 1));
if (m_testPtr == nullptr)
{
@@ -8348,6 +8972,23 @@
break;
}
+ case TestType::IGNORE_ANY_HIT_DYNAMICALLY:
+ case TestType::IGNORE_ANY_HIT_STATICALLY:
+ case TestType::TERMINATE_ANY_HIT_DYNAMICALLY:
+ case TestType::TERMINATE_ANY_HIT_STATICALLY:
+ case TestType::TERMINATE_INTERSECTION_DYNAMICALLY:
+ case TestType::TERMINATE_INTERSECTION_STATICALLY:
+ {
+ if (m_testPtr == nullptr)
+ {
+ m_testPtr.reset(
+ new TerminationTest(TerminationTest::getModeFromTestType(m_data.type) )
+ );
+ }
+
+ break;
+ }
+
default:
{
deAssertFail( "This location should never be reached",
@@ -8630,6 +9271,16 @@
{
const std::string newTestCaseName = "recursiveTraces_" + de::toString(getSuffixForGeometryType(currentGeometryType) ) + "_";
+ // 0 recursion levels.
+ {
+ auto newTestCasePtr = new RayTracingTestCase( testCtx,
+ (newTestCaseName + "0").data(),
+ "Verifies that relevant shader stages can correctly read large ray payloads provided by raygen shader stage.",
+ CaseDef{TestType::RECURSIVE_TRACES_0, currentGeometryType, AccelerationStructureLayout::ONE_TL_ONE_BL_ONE_GEOMETRY});
+
+ miscGroupPtr->addChild(newTestCasePtr);
+ }
+
// TODO: for (deUint32 nLevels = 1; nLevels <= 29; ++nLevels)
for (deUint32 nLevels = 1; nLevels <= 15; ++nLevels)
{
@@ -8642,6 +9293,40 @@
}
}
+ {
+ auto newTestCase1Ptr = new RayTracingTestCase( testCtx,
+ "OpIgnoreIntersectionKHR_AnyHitStatically",
+ "Verifies that OpIgnoreIntersectionKHR works as per spec (static invocations).",
+ CaseDef{static_cast<TestType>(static_cast<deUint32>(TestType::IGNORE_ANY_HIT_STATICALLY) ), GeometryType::TRIANGLES, AccelerationStructureLayout::COUNT});
+ auto newTestCase2Ptr = new RayTracingTestCase( testCtx,
+ "OpIgnoreIntersectionKHR_AnyHitDynamically",
+ "Verifies that OpIgnoreIntersectionKHR works as per spec (dynamic invocations).",
+ CaseDef{static_cast<TestType>(static_cast<deUint32>(TestType::IGNORE_ANY_HIT_DYNAMICALLY) ), GeometryType::TRIANGLES, AccelerationStructureLayout::COUNT});
+ auto newTestCase3Ptr = new RayTracingTestCase( testCtx,
+ "OpTerminateRayKHR_AnyHitStatically",
+ "Verifies that OpTerminateRayKHR works as per spec (static invocations).",
+ CaseDef{static_cast<TestType>(static_cast<deUint32>(TestType::TERMINATE_ANY_HIT_STATICALLY) ), GeometryType::TRIANGLES, AccelerationStructureLayout::COUNT});
+ auto newTestCase4Ptr = new RayTracingTestCase( testCtx,
+ "OpTerminateRayKHR_AnyHitDynamically",
+ "Verifies that OpTerminateRayKHR works as per spec (dynamic invocations).",
+ CaseDef{static_cast<TestType>(static_cast<deUint32>(TestType::TERMINATE_ANY_HIT_DYNAMICALLY) ), GeometryType::TRIANGLES, AccelerationStructureLayout::COUNT});
+ auto newTestCase5Ptr = new RayTracingTestCase( testCtx,
+ "OpTerminateRayKHR_IntersectionStatically",
+ "Verifies that OpTerminateRayKHR works as per spec (static invocations).",
+ CaseDef{static_cast<TestType>(static_cast<deUint32>(TestType::TERMINATE_INTERSECTION_STATICALLY) ), GeometryType::AABB, AccelerationStructureLayout::COUNT});
+ auto newTestCase6Ptr = new RayTracingTestCase( testCtx,
+ "OpTerminateRayKHR_IntersectionDynamically",
+ "Verifies that OpTerminateRayKHR works as per spec (dynamic invocations).",
+ CaseDef{static_cast<TestType>(static_cast<deUint32>(TestType::TERMINATE_INTERSECTION_DYNAMICALLY) ), GeometryType::AABB, AccelerationStructureLayout::COUNT});
+
+ miscGroupPtr->addChild(newTestCase1Ptr);
+ miscGroupPtr->addChild(newTestCase2Ptr);
+ miscGroupPtr->addChild(newTestCase3Ptr);
+ miscGroupPtr->addChild(newTestCase4Ptr);
+ miscGroupPtr->addChild(newTestCase5Ptr);
+ miscGroupPtr->addChild(newTestCase6Ptr);
+ }
+
return miscGroupPtr.release();
}
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingProceduralGeometryTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingProceduralGeometryTests.cpp
new file mode 100644
index 0000000..b02d804
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingProceduralGeometryTests.cpp
@@ -0,0 +1,571 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * 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 procedural geometry with complex bouding box sets
+ *//*--------------------------------------------------------------------*/
+
+#include "vktRayTracingProceduralGeometryTests.hpp"
+#include "vkDefs.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "vkCmdUtil.hpp"
+#include "vkObjUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkBarrierUtil.hpp"
+#include "vkBufferWithMemory.hpp"
+#include "vkImageWithMemory.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkRayTracingUtil.hpp"
+#include "tcuVectorUtil.hpp"
+#include "tcuTexture.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuFloat.hpp"
+
+namespace vkt
+{
+namespace RayTracing
+{
+namespace
+{
+using namespace vk;
+using namespace vkt;
+
+static const VkFlags ALL_RAY_TRACING_STAGES = VK_SHADER_STAGE_RAYGEN_BIT_KHR
+ | VK_SHADER_STAGE_ANY_HIT_BIT_KHR
+ | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR
+ | VK_SHADER_STAGE_MISS_BIT_KHR
+ | VK_SHADER_STAGE_INTERSECTION_BIT_KHR
+ | VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+
+enum class TestType
+{
+ OBJECT_BEHIND_BOUNDING_BOX = 0,
+ TRIANGLE_IN_BETWEEN
+};
+
+class RayTracingProceduralGeometryTestBase : public TestInstance
+{
+public:
+
+ RayTracingProceduralGeometryTestBase (Context& context);
+ ~RayTracingProceduralGeometryTestBase (void) = default;
+
+ tcu::TestStatus iterate (void) override;
+
+protected:
+
+ virtual void setupRayTracingPipeline() = 0;
+ virtual void setupAccelerationStructures() = 0;
+
+private:
+
+ VkWriteDescriptorSetAccelerationStructureKHR makeASWriteDescriptorSet (const VkAccelerationStructureKHR* pAccelerationStructure);
+ void clearBuffer (de::SharedPtr<BufferWithMemory> buffer, VkDeviceSize bufferSize);
+
+protected:
+
+ de::MovePtr<RayTracingPipeline> m_rayTracingPipeline;
+ Move<VkPipelineLayout> m_pipelineLayout;
+ Move<VkPipeline> m_pipeline;
+ de::MovePtr<BufferWithMemory> m_rgenShaderBT;
+ de::MovePtr<BufferWithMemory> m_chitShaderBT;
+ de::MovePtr<BufferWithMemory> m_missShaderBT;
+
+ Move<VkDescriptorSetLayout> m_descriptorSetLayout;
+ Move<VkCommandPool> m_cmdPool;
+ Move<VkCommandBuffer> m_cmdBuffer;
+
+ std::vector<de::SharedPtr<BottomLevelAccelerationStructure> > m_blasVect;
+ de::SharedPtr<TopLevelAccelerationStructure> m_referenceTLAS;
+ de::SharedPtr<TopLevelAccelerationStructure> m_resultTLAS;
+};
+
+RayTracingProceduralGeometryTestBase::RayTracingProceduralGeometryTestBase(Context& context)
+ : vkt::TestInstance (context)
+ , m_referenceTLAS (makeTopLevelAccelerationStructure().release())
+ , m_resultTLAS (makeTopLevelAccelerationStructure().release())
+{
+}
+
+tcu::TestStatus RayTracingProceduralGeometryTestBase::iterate(void)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const VkQueue queue = m_context.getUniversalQueue();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ const deUint32 sgHandleSize = m_context.getRayTracingPipelineProperties().shaderGroupHandleSize;
+ const deUint32 imageSize = 64u;
+
+ const Move<VkDescriptorPool> descriptorPool = DescriptorPoolBuilder()
+ .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 2u)
+ .addType(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2u)
+ .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 2u);
+
+ m_descriptorSetLayout = DescriptorSetLayoutBuilder()
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, ALL_RAY_TRACING_STAGES) // as with single/four aabb's
+ .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, ALL_RAY_TRACING_STAGES) // ssbo with result/reference values
+ .build(vkd, device);
+
+ const Move<VkDescriptorSet> referenceDescriptorSet = makeDescriptorSet(vkd, device, *descriptorPool, *m_descriptorSetLayout);
+ const Move<VkDescriptorSet> resultDescriptorSet = makeDescriptorSet(vkd, device, *descriptorPool, *m_descriptorSetLayout);
+
+ const VkDeviceSize resultBufferSize = imageSize * imageSize * sizeof(int);
+ const VkBufferCreateInfo resultBufferCreateInfo = makeBufferCreateInfo(resultBufferSize, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+ de::SharedPtr<BufferWithMemory> referenceBuffer = de::SharedPtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
+ de::SharedPtr<BufferWithMemory> resultBuffer = de::SharedPtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
+
+ m_rayTracingPipeline = de::newMovePtr<RayTracingPipeline>();
+
+ setupRayTracingPipeline();
+
+ const VkStridedDeviceAddressRegionKHR rgenSBTR = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_rgenShaderBT->get(), 0), sgHandleSize, sgHandleSize);
+ const VkStridedDeviceAddressRegionKHR chitSBTR = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_chitShaderBT->get(), 0), sgHandleSize, sgHandleSize);
+ const VkStridedDeviceAddressRegionKHR missSBTR = makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_missShaderBT->get(), 0), sgHandleSize, sgHandleSize);
+ const VkStridedDeviceAddressRegionKHR callableSBTR = makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+
+ m_cmdPool = createCommandPool(vkd, device, 0, queueFamilyIndex);
+ m_cmdBuffer = allocateCommandBuffer(vkd, device, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ // clear result and reference buffers
+ clearBuffer(resultBuffer, resultBufferSize);
+ clearBuffer(referenceBuffer, resultBufferSize);
+
+ beginCommandBuffer(vkd, *m_cmdBuffer, 0u);
+ {
+ setupAccelerationStructures();
+
+ // update descriptor sets
+ {
+ typedef DescriptorSetUpdateBuilder::Location DSL;
+
+ const VkWriteDescriptorSetAccelerationStructureKHR referenceAS = makeASWriteDescriptorSet(m_referenceTLAS->getPtr());
+ const VkDescriptorBufferInfo referenceSSBO = makeDescriptorBufferInfo(**referenceBuffer, 0u, VK_WHOLE_SIZE);
+ DescriptorSetUpdateBuilder()
+ .writeSingle(*referenceDescriptorSet, DSL::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &referenceAS)
+ .writeSingle(*referenceDescriptorSet, DSL::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &referenceSSBO)
+ .update(vkd, device);
+
+ const VkWriteDescriptorSetAccelerationStructureKHR resultAS = makeASWriteDescriptorSet(m_resultTLAS->getPtr());
+ const VkDescriptorBufferInfo resultSSBO = makeDescriptorBufferInfo(**resultBuffer, 0u, VK_WHOLE_SIZE);
+ DescriptorSetUpdateBuilder()
+ .writeSingle(*resultDescriptorSet, DSL::binding(0u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &resultAS)
+ .writeSingle(*resultDescriptorSet, DSL::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultSSBO)
+ .update(vkd, device);
+ }
+
+ // wait for data transfers
+ const VkMemoryBarrier bufferUploadBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, &bufferUploadBarrier, 1u);
+
+ // wait for as build
+ const VkMemoryBarrier asBuildBarrier = makeMemoryBarrier(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR);
+ cmdPipelineMemoryBarrier(vkd, *m_cmdBuffer, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, &asBuildBarrier, 1u);
+
+ vkd.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, *m_pipeline);
+
+ // generate reference
+ vkd.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, *m_pipelineLayout, 0, 1, &referenceDescriptorSet.get(), 0, DE_NULL);
+ cmdTraceRays(vkd, *m_cmdBuffer, &rgenSBTR, &missSBTR, &chitSBTR, &callableSBTR, imageSize, imageSize, 1);
+
+ // generate result
+ vkd.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, *m_pipelineLayout, 0, 1, &resultDescriptorSet.get(), 0, DE_NULL);
+ cmdTraceRays(vkd, *m_cmdBuffer, &rgenSBTR, &missSBTR, &chitSBTR, &callableSBTR, imageSize, imageSize, 1);
+
+ const VkMemoryBarrier postTraceMemoryBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
+ cmdPipelineMemoryBarrier(vkd, *m_cmdBuffer, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_TRANSFER_BIT, &postTraceMemoryBarrier);
+ }
+ endCommandBuffer(vkd, *m_cmdBuffer);
+
+ submitCommandsAndWait(vkd, device, queue, m_cmdBuffer.get());
+
+ // verify result buffer
+ auto referenceAllocation = referenceBuffer->getAllocation();
+ invalidateMappedMemoryRange(vkd, device, referenceAllocation.getMemory(), referenceAllocation.getOffset(), resultBufferSize);
+
+ auto resultAllocation = resultBuffer->getAllocation();
+ invalidateMappedMemoryRange(vkd, device, resultAllocation.getMemory(), resultAllocation.getOffset(), resultBufferSize);
+
+ tcu::TextureFormat imageFormat (vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+ tcu::PixelBufferAccess referenceAccess (imageFormat, imageSize, imageSize, 1, referenceAllocation.getHostPtr());
+ tcu::PixelBufferAccess resultAccess (imageFormat, imageSize, imageSize, 1, resultAllocation.getHostPtr());
+
+ if (tcu::intThresholdCompare(m_context.getTestContext().getLog(), "Result comparison", "", referenceAccess, resultAccess, tcu::UVec4(0), tcu::COMPARE_LOG_EVERYTHING))
+ return tcu::TestStatus::pass("Pass");
+ return tcu::TestStatus::fail("Fail");
+}
+
+VkWriteDescriptorSetAccelerationStructureKHR RayTracingProceduralGeometryTestBase::makeASWriteDescriptorSet(const VkAccelerationStructureKHR* pAccelerationStructure)
+{
+ return
+ {
+ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ 1u, // deUint32 accelerationStructureCount
+ pAccelerationStructure // const VkAccelerationStructureKHR* pAccelerationStructures
+ };
+}
+
+void RayTracingProceduralGeometryTestBase::clearBuffer(de::SharedPtr<BufferWithMemory> buffer, VkDeviceSize bufferSize)
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ auto& bufferAlloc = buffer->getAllocation();
+ void* bufferPtr = bufferAlloc.getHostPtr();
+
+ deMemset(bufferPtr, 1, static_cast<size_t>(bufferSize));
+ vk::flushAlloc(vkd, device, bufferAlloc);
+}
+
+class ObjectBehindBoundingBoxInstance : public RayTracingProceduralGeometryTestBase
+{
+public:
+
+ ObjectBehindBoundingBoxInstance(Context& context);
+
+ void setupRayTracingPipeline() override;
+ void setupAccelerationStructures() override;
+};
+
+ObjectBehindBoundingBoxInstance::ObjectBehindBoundingBoxInstance(Context& context)
+ : RayTracingProceduralGeometryTestBase(context)
+{
+}
+
+void ObjectBehindBoundingBoxInstance::setupRayTracingPipeline()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ vk::BinaryCollection& bc = m_context.getBinaryCollection();
+ const deUint32 sgHandleSize = m_context.getRayTracingPipelineProperties().shaderGroupHandleSize;
+ const deUint32 sgBaseAlignment = m_context.getRayTracingPipelineProperties().shaderGroupBaseAlignment;
+
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, createShaderModule(vkd, device, bc.get("rgen"), 0), 0);
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR, createShaderModule(vkd, device, bc.get("isec"), 0), 1);
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, bc.get("chit"), 0), 1);
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR, createShaderModule(vkd, device, bc.get("miss"), 0), 2);
+
+ m_pipelineLayout = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
+ m_pipeline = m_rayTracingPipeline->createPipeline(vkd, device, *m_pipelineLayout);
+ m_rgenShaderBT = m_rayTracingPipeline->createShaderBindingTable(vkd, device, *m_pipeline, allocator, sgHandleSize, sgBaseAlignment, 0, 1);
+ m_chitShaderBT = m_rayTracingPipeline->createShaderBindingTable(vkd, device, *m_pipeline, allocator, sgHandleSize, sgBaseAlignment, 1, 1);
+ m_missShaderBT = m_rayTracingPipeline->createShaderBindingTable(vkd, device, *m_pipeline, allocator, sgHandleSize, sgBaseAlignment, 2, 1);
+}
+
+void ObjectBehindBoundingBoxInstance::setupAccelerationStructures()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ // build reference acceleration structure - single aabb big enough to fit whole procedural geometry
+ de::SharedPtr<BottomLevelAccelerationStructure> referenceBLAS(makeBottomLevelAccelerationStructure().release());
+ referenceBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, -64.0 },
+ { 64.0, 64.0, -16.0 },
+ },
+ false,
+ 0
+ );
+ referenceBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(referenceBLAS);
+
+ m_referenceTLAS->setInstanceCount(1);
+ m_referenceTLAS->addInstance(m_blasVect.back());
+ m_referenceTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+
+ // build result acceleration structure - wall of 4 aabb's and generated object is actualy behind it (as it is just 1.0 unit thick)
+ de::SharedPtr<BottomLevelAccelerationStructure> resultBLAS(makeBottomLevelAccelerationStructure().release());
+ resultBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, 0.0 }, // | |
+ { 32.0, 32.0, 1.0 }, // |* |
+ { 32.0, 0.0, 0.0 }, // | |
+ { 64.0, 32.0, 1.0 }, // | *|
+ { 0.0, 32.0, 0.0 }, // |* |
+ { 32.0, 64.0, 1.0 }, // | |
+ { 32.0, 32.0, 0.0 }, // | *|
+ { 64.0, 64.0, 1.0 }, // | |
+ },
+ false,
+ 0
+ );
+ resultBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(resultBLAS);
+
+ m_resultTLAS->setInstanceCount(1);
+ m_resultTLAS->addInstance(m_blasVect.back());
+ m_resultTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+}
+
+class TriangleInBeteenInstance : public RayTracingProceduralGeometryTestBase
+{
+public:
+
+ TriangleInBeteenInstance(Context& context);
+
+ void setupRayTracingPipeline() override;
+ void setupAccelerationStructures() override;
+};
+
+TriangleInBeteenInstance::TriangleInBeteenInstance(Context& context)
+ : RayTracingProceduralGeometryTestBase(context)
+{
+}
+
+void TriangleInBeteenInstance::setupRayTracingPipeline()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
+ vk::BinaryCollection& bc = m_context.getBinaryCollection();
+ const deUint32 sgHandleSize = m_context.getRayTracingPipelineProperties().shaderGroupHandleSize;
+ const deUint32 sgBaseAlignment = m_context.getRayTracingPipelineProperties().shaderGroupBaseAlignment;
+
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, createShaderModule(vkd, device, bc.get("rgen"), 0), 0);
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR, createShaderModule(vkd, device, bc.get("isec"), 0), 1);
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, bc.get("chit"), 0), 1);
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, bc.get("chit_triangle"), 0), 2);
+ m_rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR, createShaderModule(vkd, device, bc.get("miss"), 0), 3);
+
+ m_pipelineLayout = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
+ m_pipeline = m_rayTracingPipeline->createPipeline(vkd, device, *m_pipelineLayout);
+ m_rgenShaderBT = m_rayTracingPipeline->createShaderBindingTable(vkd, device, *m_pipeline, allocator, sgHandleSize, sgBaseAlignment, 0, 1);
+ m_chitShaderBT = m_rayTracingPipeline->createShaderBindingTable(vkd, device, *m_pipeline, allocator, sgHandleSize, sgBaseAlignment, 1, 2);
+ m_missShaderBT = m_rayTracingPipeline->createShaderBindingTable(vkd, device, *m_pipeline, allocator, sgHandleSize, sgBaseAlignment, 3, 1);
+}
+
+void TriangleInBeteenInstance::setupAccelerationStructures()
+{
+ const DeviceInterface& vkd = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ de::SharedPtr<BottomLevelAccelerationStructure> triangleBLAS(makeBottomLevelAccelerationStructure().release());
+ triangleBLAS->setGeometryData(
+ {
+ { 16.0, 16.0, -8.0 },
+ { 56.0, 32.0, -8.0 },
+ { 32.0, 48.0, -8.0 },
+ },
+ true,
+ VK_GEOMETRY_OPAQUE_BIT_KHR
+ );
+ triangleBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(triangleBLAS);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> fullElipsoidBLAS(makeBottomLevelAccelerationStructure().release());
+ fullElipsoidBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, -64.0 },
+ { 64.0, 64.0, -16.0 },
+ },
+ false,
+ 0
+ );
+ fullElipsoidBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(fullElipsoidBLAS);
+
+ // build reference acceleration structure - triangle and a single aabb big enough to fit whole procedural geometry
+ m_referenceTLAS->setInstanceCount(2);
+ m_referenceTLAS->addInstance(fullElipsoidBLAS);
+ m_referenceTLAS->addInstance(triangleBLAS);
+ m_referenceTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+
+ de::SharedPtr<BottomLevelAccelerationStructure> elipsoidWallBLAS(makeBottomLevelAccelerationStructure().release());
+ elipsoidWallBLAS->setGeometryData(
+ {
+ { 0.0, 0.0, 0.0 }, // |* |
+ { 20.0, 64.0, 1.0 },
+ { 20.0, 0.0, 0.0 }, // | * |
+ { 44.0, 64.0, 1.0 },
+ { 44.0, 0.0, 0.0 }, // | *|
+ { 64.0, 64.0, 1.0 },
+ },
+ false,
+ 0
+ );
+ elipsoidWallBLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+ m_blasVect.push_back(elipsoidWallBLAS);
+
+ // build result acceleration structure - triangle and a three aabb's (they are in front of triangle but generate intersections behind it)
+ m_resultTLAS->setInstanceCount(2);
+ m_resultTLAS->addInstance(elipsoidWallBLAS);
+ m_resultTLAS->addInstance(triangleBLAS);
+ m_resultTLAS->createAndBuild(vkd, device, *m_cmdBuffer, allocator);
+}
+
+class RayTracingProceduralGeometryTestCase : public TestCase
+{
+public:
+ RayTracingProceduralGeometryTestCase (tcu::TestContext& context, const char* name, TestType testType);
+ ~RayTracingProceduralGeometryTestCase (void) = default;
+
+ void checkSupport (Context& context) const override;
+ void initPrograms (SourceCollections& programCollection) const override;
+ TestInstance* createInstance (Context& context) const override;
+
+protected:
+ TestType m_testType;
+};
+
+RayTracingProceduralGeometryTestCase::RayTracingProceduralGeometryTestCase(tcu::TestContext& context, const char* name, TestType testType)
+ : TestCase (context, name, "")
+ , m_testType (testType)
+{
+}
+
+void RayTracingProceduralGeometryTestCase::checkSupport(Context& context) const
+{
+ context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+ context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+
+ if (!context.getRayTracingPipelineFeatures().rayTracingPipeline)
+ TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline");
+
+ if (!context.getAccelerationStructureFeatures().accelerationStructure)
+ TCU_THROW(TestError, "VK_KHR_ray_tracing_pipeline requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
+}
+
+void RayTracingProceduralGeometryTestCase::initPrograms(SourceCollections& programCollection) const
+{
+ const vk::ShaderBuildOptions glslBuildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+
+ std::string rgenSource =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "layout(location = 0) rayPayloadEXT int payload;\n"
+
+ "layout(set = 0, binding = 0) uniform accelerationStructureEXT tlas;\n"
+ "layout(set = 0, binding = 1, std430) writeonly buffer Result {\n"
+ " int value[];\n"
+ "} result;\n"
+
+ "void main()\n"
+ "{\n"
+ " float tmin = 0.0;\n"
+ " float tmax = 50.0;\n"
+ " vec3 origin = vec3(float(gl_LaunchIDEXT.x) + 0.5f, float(gl_LaunchIDEXT.y) + 0.5f, 2.0);\n"
+ " vec3 direction = vec3(0.0,0.0,-1.0);\n"
+ " uint resultIndex = gl_LaunchIDEXT.x + gl_LaunchIDEXT.y * gl_LaunchSizeEXT.x;\n"
+
+ " traceRayEXT(tlas, gl_RayFlagsCullBackFacingTrianglesEXT, 0xFF, 0, 0, 0, origin, tmin, direction, tmax, 0);\n"
+ // to be able to display result in cherry this is interpreated as r8g8b8a8 during verification
+ // we are using only red but we need to add alpha (note: r and a may be swapped depending on endianness)
+ " result.value[resultIndex] = payload + 0xFF000000;\n"
+ "};\n";
+ programCollection.glslSources.add("rgen") << glu::RaygenSource(rgenSource) << glslBuildOptions;
+
+ std::string isecSource =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+
+ "void main()\n"
+ "{\n"
+ // note: same elipsoid center and radii are also defined in chit shader
+ " vec3 center = vec3(32.0, 32.0, -30.0);\n"
+ " vec3 radii = vec3(30.0, 15.0, 5.0);\n"
+
+ // simplify to ray sphere intersection
+ " vec3 eliDir = gl_WorldRayOriginEXT - center;\n"
+ " vec3 eliS = eliDir / radii;\n"
+ " vec3 rayS = gl_WorldRayDirectionEXT / radii;\n"
+
+ " float a = dot(rayS, rayS);\n"
+ " float b = dot(eliS, rayS);\n"
+ " float c = dot(eliS, eliS);\n"
+ " float h = b * b - a * (c - 1.0);\n"
+ " if (h < 0.0)\n"
+ " return;\n"
+ " reportIntersectionEXT((-b - sqrt(h)) / a, 0);\n"
+ "}\n";
+ programCollection.glslSources.add("isec") << glu::IntersectionSource(isecSource) << glslBuildOptions;
+
+ std::string chitSource =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "layout(location = 0) rayPayloadInEXT int payload;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ // note: same elipsoid center and radii are also defined in chit shader
+ " vec3 center = vec3(32.0, 32.0, -30.0);\n"
+ " vec3 radii = vec3(30.0, 15.0, 5.0);\n"
+ " vec3 lightDir = normalize(vec3(0.0, 0.0, 1.0));\n"
+ " vec3 hitPos = gl_WorldRayOriginEXT + gl_HitTEXT * gl_WorldRayDirectionEXT;\n"
+ " vec3 hitNormal = normalize((hitPos - center) / radii);\n"
+
+ " payload = 50 + int(200.0 * clamp(dot(hitNormal, lightDir), 0.0, 1.0));\n"
+ "}\n";
+ programCollection.glslSources.add("chit") << glu::ClosestHitSource(chitSource) << glslBuildOptions;
+
+ if (m_testType == TestType::TRIANGLE_IN_BETWEEN)
+ {
+ std::string chitTriangleSource =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "layout(location = 0) rayPayloadInEXT int payload;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " payload = 250;\n"
+ "}\n";
+ programCollection.glslSources.add("chit_triangle") << glu::ClosestHitSource(chitTriangleSource) << glslBuildOptions;
+ }
+
+ std::string missSource =
+ "#version 460 core\n"
+ "#extension GL_EXT_ray_tracing : require\n"
+ "layout(location = 0) rayPayloadInEXT int payload;\n"
+ "void main()\n"
+ "{\n"
+ " payload = 30;\n"
+ "}\n";
+ programCollection.glslSources.add("miss") << glu::MissSource(missSource) << glslBuildOptions;
+}
+
+TestInstance* RayTracingProceduralGeometryTestCase::createInstance(Context& context) const
+{
+ if (m_testType == TestType::TRIANGLE_IN_BETWEEN)
+ return new TriangleInBeteenInstance(context);
+
+ // TestType::OBJECT_BEHIND_BOUNDING_BOX
+ return new ObjectBehindBoundingBoxInstance(context);
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createProceduralGeometryTests(tcu::TestContext& testCtx)
+{
+ de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "procedural_geometry", "Test procedural geometry with complex bouding box sets"));
+
+ group->addChild(new RayTracingProceduralGeometryTestCase(testCtx, "object_behind_bounding_boxes", TestType::OBJECT_BEHIND_BOUNDING_BOX));
+ group->addChild(new RayTracingProceduralGeometryTestCase(testCtx, "triangle_in_between", TestType::TRIANGLE_IN_BETWEEN));
+
+ return group.release();
+}
+
+} // RayTracing
+
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingProceduralGeometryTests.hpp
similarity index 68%
copy from external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
copy to external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingProceduralGeometryTests.hpp
index 1a85ebf..829e099 100644
--- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineVertexOnlyTests.hpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingProceduralGeometryTests.hpp
@@ -1,11 +1,10 @@
-#ifndef _VKTPIPELINEVERTEXONLYTESTS_HPP
-#define _VKTPIPELINEVERTEXONLYTESTS_HPP
-/*------------------------------------------------------------------------
+#ifndef _VKTRAYTRACINGPROCEDURALGEOMETRYTESTS_HPP
+#define _VKTRAYTRACINGPROCEDURALGEOMETRYTESTS_HPP
+/*-------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
- * Copyright (c) 2019 Google LLC
- * Copyright (c) 2019 The Khronos Group 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.
@@ -21,7 +20,7 @@
*
*//*!
* \file
- * \brief Tests using only vertex shader in a graphics pipeline
+ * \brief Test procedural geometry with complex bouding box sets
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
@@ -29,12 +28,12 @@
namespace vkt
{
-namespace pipeline
+namespace RayTracing
{
-tcu::TestCaseGroup* createVertexOnlyTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup* createProceduralGeometryTests (tcu::TestContext& testCtx);
-} // pipeline
+} // RayTracing
} // vkt
-#endif // _VKTPIPELINEVERTEXONLYTESTS_HPP
+#endif // _VKTRAYTRACINGPROCEDURALGEOMETRYTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp
index baf670e..ac61d4b 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp
@@ -30,6 +30,7 @@
#include "vktRayTracingShaderBindingTableTests.hpp"
#include "vktRayTracingTraversalControlTests.hpp"
#include "vktRayTracingAccelerationStructuresTests.hpp"
+#include "vktRayTracingProceduralGeometryTests.hpp"
#include "vktRayTracingBuildIndirectTests.hpp"
#include "vktRayTracingWatertightnessTests.hpp"
#include "vktRayTracingPipelineLibraryTests.hpp"
@@ -39,6 +40,9 @@
#include "vktRayTracingMiscTests.hpp"
#include "vktRayTracingComplexControlFlowTests.hpp"
#include "vktRayTracingBarrierTests.hpp"
+#include "vktRayTracingDataSpillTests.hpp"
+#include "vktRayTracingDirectionTests.hpp"
+#include "vktRayTracingBarycentricCoordinatesTests.hpp"
#include "deUniquePtr.hpp"
@@ -62,6 +66,7 @@
group->addChild(createShaderBindingTableTests(testCtx));
group->addChild(createTraversalControlTests(testCtx));
group->addChild(createAccelerationStructuresTests(testCtx));
+ group->addChild(createProceduralGeometryTests(testCtx));
group->addChild(createBuildIndirectTests(testCtx));
group->addChild(createWatertightnessTests(testCtx));
group->addChild(createPipelineLibraryTests(testCtx));
@@ -71,6 +76,9 @@
group->addChild(createMiscTests(testCtx));
group->addChild(createComplexControlFlowTests(testCtx));
group->addChild(createBarrierTests(testCtx));
+ group->addChild(createDataSpillTests(testCtx));
+ group->addChild(createDirectionTests(testCtx));
+ group->addChild(createBarycentricCoordinatesTests(testCtx));
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingWatertightnessTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingWatertightnessTests.cpp
index 7e26593..a4aba4d 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingWatertightnessTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingWatertightnessTests.cpp
@@ -38,6 +38,8 @@
#include "deRandom.hpp"
+#include <sstream>
+
namespace vkt
{
namespace RayTracing
@@ -66,6 +68,27 @@
deUint32 useManyBottomASes;
};
+ VkFormat getImageFormat (void)
+ {
+ return VK_FORMAT_R32_UINT;
+ }
+
+ VkImageType getImageType (deUint32 depth)
+ {
+ DE_ASSERT(depth > 0u);
+ return ((depth == 1u) ? VK_IMAGE_TYPE_2D : VK_IMAGE_TYPE_3D);
+ }
+
+ VkImageTiling getImageTiling (void)
+ {
+ return VK_IMAGE_TILING_OPTIMAL;
+ }
+
+ VkImageUsageFlags getImageUsage (void)
+ {
+ return (VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+ }
+
enum ShaderGroups
{
FIRST_GROUP = 0,
@@ -126,23 +149,19 @@
VkImageCreateInfo makeImageCreateInfo(deUint32 width, deUint32 height, deUint32 depth, VkFormat format)
{
- const VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
- const auto imageType = (depth == 1) ? VK_IMAGE_TYPE_2D
- : VK_IMAGE_TYPE_3D;
-
const VkImageCreateInfo imageCreateInfo =
{
VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
DE_NULL, // const void* pNext;
- (VkImageCreateFlags)0u, // VkImageCreateFlags flags;
- imageType,
+ 0u, // VkImageCreateFlags flags;
+ getImageType(depth),
format, // VkFormat format;
makeExtent3D(width, height, depth), // VkExtent3D extent;
1u, // deUint32 mipLevels;
1u, // deUint32 arrayLayers;
VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
- VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
- usage, // VkImageUsageFlags usage;
+ getImageTiling(), // VkImageTiling tiling;
+ getImageUsage(), // VkImageUsageFlags usage;
VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
0u, // deUint32 queueFamilyIndexCount;
DE_NULL, // const deUint32* pQueueFamilyIndices;
@@ -222,6 +241,19 @@
const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
TCU_THROW(TestError, "VK_KHR_ray_tracing_pipeline requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
+
+ const auto& vki = context.getInstanceInterface();
+ const auto physDev = context.getPhysicalDevice();
+ const auto format = getImageFormat();
+ const auto formatProps = getPhysicalDeviceImageFormatProperties(vki, physDev, format, getImageType(m_data.depth), getImageTiling(), getImageUsage(), 0u);
+ const auto& maxExtent = formatProps.maxExtent;
+
+ if (m_data.width > maxExtent.width || m_data.height > maxExtent.height || m_data.depth > maxExtent.depth)
+ {
+ std::ostringstream msg;
+ msg << "Result image dimensions not supported (" << getFormatName(format) << " " << m_data.width << "x" << m_data.height << "x" << m_data.depth << ")";
+ TCU_THROW(NotSupportedError, msg.str());
+ }
}
void RayTracingTestCase::initPrograms(SourceCollections& programCollection) const
@@ -572,7 +604,7 @@
const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
const VkQueue queue = m_context.getUniversalQueue();
Allocator& allocator = m_context.getDefaultAllocator();
- const VkFormat format = VK_FORMAT_R32_UINT;
+ const VkFormat format = getImageFormat();
const deUint32 pixelCount = m_data.width * m_data.height * m_data.depth;
const deUint32 shaderGroupHandleSize = getShaderGroupSize(vki, physicalDevice);
const deUint32 shaderGroupBaseAlignment = getShaderGroupBaseAlignment(vki, physicalDevice);
@@ -686,7 +718,7 @@
submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
- invalidateMappedMemoryRange(vkd, device, buffer->getAllocation().getMemory(), buffer->getAllocation().getOffset(), pixelCount * sizeof(deUint32));
+ invalidateAlloc(vkd, device, buffer->getAllocation());
return buffer;
}
@@ -720,8 +752,8 @@
const de::MovePtr<BufferWithMemory> bufferGPU = runTest();
const deUint32* bufferPtrGPU = (deUint32*)bufferGPU->getAllocation().getHostPtr();
- deUint32 failures = 0;
- deUint32 qualityWarningIssued = 0;
+ deUint32 failures = 0u;
+ deUint32 qualityWarningIssued = 0u;
if (!m_useClosedFan)
{
deUint32 pos = 0;
@@ -742,20 +774,19 @@
// See the miss shader for explanation of the magic number.
for (deUint32 pos = 0; pos < m_data.width * m_data.height * m_data.depth; ++pos)
{
- if (bufferPtrGPU[pos] == 10000)
+ if (bufferPtrGPU[pos] == 10000u)
{
- failures++;
+ qualityWarningIssued = 1u;
}
else
- if (bufferPtrGPU[pos] > 1)
+ if (bufferPtrGPU[pos] > 1u)
{
failures ++;
- qualityWarningIssued = 1;
}
}
}
- if (failures == 0)
+ if (failures == 0u)
{
if (qualityWarningIssued)
return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Miss shader invoked for a shared edge/vertex.");
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp
index 53ea47c..3a15c87 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassDepthStencilResolveTests.cpp
@@ -915,6 +915,7 @@
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
DE_NULL,
+ // Note: as per the spec, depth/stencil *resolve* operations are synchronized using the color attachment write access.
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
VK_ACCESS_TRANSFER_READ_BIT,
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassFragmentDensityMapTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassFragmentDensityMapTests.cpp
index c1c058c..7ab111d 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassFragmentDensityMapTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassFragmentDensityMapTests.cpp
@@ -1177,6 +1177,13 @@
if ((imageFormatProperties.sampleCounts & m_testParams.colorSamples) == 0)
TCU_THROW(NotSupportedError, "Color image type not supported");
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().multisampleArrayImage &&
+ (m_testParams.colorSamples != VK_SAMPLE_COUNT_1_BIT) && (m_testParams.viewCount != 1))
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Implementation does not support image array with multiple samples per texel");
+ }
}
FragmentDensityMapTestInstance::FragmentDensityMapTestInstance(Context& context,
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp
index 4904ffb..8df2b9c 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp
@@ -2576,6 +2576,16 @@
}
};
+void checkSupport(Context& context, TestConfig config)
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().multisampleArrayImage &&
+ (config.sampleCount != VK_SAMPLE_COUNT_1_BIT) && (config.layerCount != 1))
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Implementation does not support image array with multiple samples per texel");
+ }
+}
+
std::string formatToName (VkFormat format)
{
const std::string formatStr = de::toString(format);
@@ -2682,7 +2692,7 @@
renderPassType
};
- formatGroup->addChild(new InstanceFactory1<MultisampleRenderPassTestInstance, TestConfig, Programs>(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName.c_str(), testName.c_str(), testConfig));
+ formatGroup->addChild(new InstanceFactory1WithSupport<MultisampleRenderPassTestInstance, TestConfig, FunctionSupport1<TestConfig>, Programs>(testCtx, tcu::NODETYPE_SELF_VALIDATE, testName.c_str(), testName.c_str(), testConfig, typename FunctionSupport1<TestConfig>::Args(checkSupport, testConfig)));
// MaxAttachmenstsRenderPassTest is ment to test extreme cases where applications might consume all available on-chip
// memory. This is achieved by using maxColorAttachments attachments and two subpasses, but during test creation we
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp
index 28dd49c..a150ea8 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleTests.cpp
@@ -716,6 +716,25 @@
dependencies.push_back(dependency);
}
};
+ // the last subpass must synchronize with all prior subpasses
+ for (deUint32 splitSubpassIndex = 0; splitSubpassIndex < (splitSubpassCount - 1); splitSubpassIndex++)
+ {
+ const SubpassDep dependency // VkSubpassDependency || VkSubpassDependency2KHR
+ (
+ // || VkStructureType sType;
+ DE_NULL, // || const void* pNext;
+ splitSubpassIndex + 1, // deUint32 srcSubpass; || deUint32 srcSubpass;
+ splitSubpassCount, // deUint32 dstSubpass; || deUint32 dstSubpass;
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, // VkPipelineStageFlags srcStageMask; || VkPipelineStageFlags srcStageMask;
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask; || VkPipelineStageFlags dstStageMask;
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask; || VkAccessFlags srcAccessMask;
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // VkAccessFlags dstAccessMask; || VkAccessFlags dstAccessMask;
+ VK_DEPENDENCY_BY_REGION_BIT, // VkDependencyFlags dependencyFlags; || VkDependencyFlags dependencyFlags;
+ 0u // || deInt32 viewOffset;
+ );
+ dependencies.push_back(dependency);
+ }
const RenderPassCreateInfo renderPassCreator // VkRenderPassCreateInfo || VkRenderPassCreateInfo2KHR
(
// VkStructureType sType; || VkStructureType sType;
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp
index 85e40e2..840525d 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSparseRenderTargetTests.cpp
@@ -117,8 +117,10 @@
VK_IMAGE_LAYOUT_UNDEFINED
};
- Move<VkImage> destImage = createImage(vk, device, &imageCreateInfo);
+ if (!checkSparseImageFormatSupport(physicalDevice, instance, imageCreateInfo))
+ TCU_THROW(NotSupportedError, "The image format does not support sparse operations");
+ Move<VkImage> destImage = createImage(vk, device, &imageCreateInfo);
allocateAndBindSparseImage(vk, device, physicalDevice, instance, imageCreateInfo, bindSemaphore, sparseQueue, allocator, allocations, mapVkFormat(format), *destImage);
return destImage;
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp
index 748f7f3..7255ae8 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassSubpassDependencyTests.cpp
@@ -857,7 +857,7 @@
{
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType
DE_NULL, // const void* pNext
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
+ 0, // VkAccessFlags srcAccessMask
VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout oldLayout
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout
@@ -866,8 +866,11 @@
**m_images[m_renderPasses.size() - 1], // VkImage image
imageSubresourceRange // VkImageSubresourceRange subresourceRange
};
-
- vkd.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &barrier);
+ // Since the implicit 'end' subpass dependency has VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT in its dstStageMask,
+ // we can't form an execution dependency chain with a specific pipeline stage. The cases that provide an explict
+ // 'end' subpass dependency could use a specific pipline stage, but there isn't a way to distinguish between the
+ // implicit and explicit cases here.
+ vkd.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, DE_NULL, 0u, DE_NULL, 1u, &barrier);
}
// Copy image memory to buffer
@@ -3924,16 +3927,16 @@
deps.push_back(SubpassDependency(VK_SUBPASS_EXTERNAL, // deUint32 srcPass
0, // deUint32 dstPass
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags dstStageMask
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
- VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags dstAccessMask
+ VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
0)); // VkDependencyFlags flags
deps.push_back(SubpassDependency(0, // deUint32 srcPass
VK_SUBPASS_EXTERNAL, // deUint32 dstPass
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags srcStageMask
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags dstStageMask
- VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags srcAccessMask
+ VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
0)); // VkDependencyFlags flags
@@ -4009,10 +4012,10 @@
{
deps.push_back(SubpassDependency(VK_SUBPASS_EXTERNAL, // deUint32 srcPass
0, // deUint32 dstPass
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // VkPipelineStageFlags srcStageMask
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask
- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
- VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags dstAccessMask
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // VkPipelineStageFlags srcStageMask
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags dstStageMask
+ 0, // VkAccessFlags srcAccessMask
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags dstAccessMask
0)); // VkDependencyFlags flags
}
@@ -4118,6 +4121,13 @@
VK_DEPENDENCY_BY_REGION_BIT)); // VkDependencyFlags flags
}
}
+ deps.push_back(SubpassDependency((deUint32)subpassCount - 1, // deUint32 srcPass
+ VK_SUBPASS_EXTERNAL, // deUint32 dstPass
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, // VkPipelineStageFlags srcStageMask
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, // VkPipelineStageFlags dstStageMask
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask
+ VK_DEPENDENCY_BY_REGION_BIT)); // VkDependencyFlags flags
const RenderPass renderPass (attachments, subpasses, deps);
const SubpassTestConfig testConfig (formats[formatNdx], renderSizes[renderSizeNdx], renderPass, renderPassType);
diff --git a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentSparseFillingTests.cpp b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentSparseFillingTests.cpp
index 24a4227..abef672 100644
--- a/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentSparseFillingTests.cpp
+++ b/external/vulkancts/modules/vulkan/renderpass/vktRenderPassUnusedAttachmentSparseFillingTests.cpp
@@ -717,6 +717,20 @@
DE_NULL // const deUint32* pPreserveAttachments
),
};
+ std::vector<SubpassDep> subpassDependencies =
+ {
+ SubpassDep (
+ DE_NULL,
+ 0u, // deUint32 srcPass
+ VK_SUBPASS_EXTERNAL, // deUint32 dstPass
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, // VkPipelineStageFlags srcStageMask
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, // VkPipelineStageFlags dstStageMask
+ VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags srcAccessMask
+ VK_ACCESS_INDIRECT_COMMAND_READ_BIT, // VkAccessFlags dstAccessMask
+ 0, // VkDependencyFlags flags
+ 0 // deInt32 viewOffset
+ ),
+ };
const RenderPassCreateInfo renderPassInfo (
DE_NULL, // const void* pNext
@@ -725,8 +739,8 @@
attachmentDescriptions.data(), // const VkAttachmentDescription* pAttachments
static_cast<deUint32>(subpassDescriptions.size()), // deUint32 subpassCount
subpassDescriptions.data(), // const VkSubpassDescription* pSubpasses
- 0u, // deUint32 dependencyCount
- DE_NULL, // const VkSubpassDependency* pDependencies
+ static_cast<deUint32>(subpassDependencies.size()), // deUint32 dependencyCount
+ subpassDependencies.data(), // const VkSubpassDependency* pDependencies
0u, // deUint32 correlatedViewMaskCount
DE_NULL // const deUint32* pCorrelatedViewMasks
);
diff --git a/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp b/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp
index 291ba37..0801452 100644
--- a/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp
+++ b/external/vulkancts/modules/vulkan/robustness/vktRobustBufferAccessWithVariablePointersTests.cpp
@@ -1675,18 +1675,27 @@
bool isOutOfBoundsPartOk = true;
bool isWithinBoundsPartOk = true;
+ deUint32 inBoundPartSize = distanceToOutOfBounds;
+
+ // For cases that partial element is out of bound, the part within the buffer allocated memory can be buffer content per spec.
+ // We need to check it as a whole part.
+ if (offsetInBytes + elementSize > m_inBufferAccess.allocSize)
+ {
+ inBoundPartSize = static_cast<deInt32>(m_inBufferAccess.allocSize) - static_cast<deInt32>(offsetInBytes);
+ }
+
if (isReadAccess)
{
- isWithinBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, outValuePtr, distanceToOutOfBounds);
- isOutOfBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, (deUint8*)outValuePtr + distanceToOutOfBounds , outValueSize - distanceToOutOfBounds);
+ isWithinBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, outValuePtr, inBoundPartSize);
+ isOutOfBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, (deUint8*)outValuePtr + inBoundPartSize, outValueSize - inBoundPartSize);
}
else
{
- isWithinBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, outValuePtr, distanceToOutOfBounds)
- || isOutBufferValueUnchanged(offsetInBytes, distanceToOutOfBounds);
+ isWithinBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, outValuePtr, inBoundPartSize)
+ || isOutBufferValueUnchanged(offsetInBytes, inBoundPartSize);
- isOutOfBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, (deUint8*)outValuePtr + distanceToOutOfBounds, outValueSize - distanceToOutOfBounds)
- || isOutBufferValueUnchanged(offsetInBytes + distanceToOutOfBounds, outValueSize - distanceToOutOfBounds);
+ isOutOfBoundsPartOk = isValueWithinBufferOrZero(inDataPtr, m_inBufferAccess.allocSize, (deUint8*)outValuePtr + inBoundPartSize, outValueSize - inBoundPartSize)
+ || isOutBufferValueUnchanged(offsetInBytes + inBoundPartSize, outValueSize - inBoundPartSize);
}
logMsg << ", first " << distanceToOutOfBounds << " byte(s) " << (isWithinBoundsPartOk ? "OK": "wrong");
diff --git a/external/vulkancts/modules/vulkan/robustness/vktRobustnessExtsTests.cpp b/external/vulkancts/modules/vulkan/robustness/vktRobustnessExtsTests.cpp
index d4b6dc2..6316920 100644
--- a/external/vulkancts/modules/vulkan/robustness/vktRobustnessExtsTests.cpp
+++ b/external/vulkancts/modules/vulkan/robustness/vktRobustnessExtsTests.cpp
@@ -51,6 +51,7 @@
#include <string>
#include <sstream>
#include <algorithm>
+#include <limits>
namespace vkt
{
@@ -759,9 +760,10 @@
std::stringstream decls, checks;
- const string r64 = formatIsR64(format) ? "64" : "";
- const string i64Type = formatIsR64(format) ? "64_t" : "";
- const string vecType = formatIsFloat(format) ? "vec4" : (formatIsSignedInt(format) ? ("i" + r64 + "vec4") : ("u" + r64 + "vec4"));
+ const string r64 = formatIsR64(format) ? "64" : "";
+ const string i64Type = formatIsR64(format) ? "64_t" : "";
+ const string vecType = formatIsFloat(format) ? "vec4" : (formatIsSignedInt(format) ? ("i" + r64 + "vec4") : ("u" + r64 + "vec4"));
+ const string qLevelType = vecType == "vec4" ? "float" : ((vecType == "ivec4") | (vecType == "i64vec4")) ? ("int" + i64Type) : ("uint" + i64Type);
decls << "uvec4 abs(uvec4 x) { return x; }\n";
if (formatIsR64(format))
@@ -885,12 +887,33 @@
else
bufType = imgprefix + "vec" + std::to_string(numComponents);
+ // For UBO's, which have a declared size in the shader, don't access outside that size.
+ bool declaredSize = false;
+ switch (m_data.descriptorType) {
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+ declaredSize = true;
+ break;
+ default:
+ break;
+ }
+
checks << " int inboundcoords, clampedLayer;\n";
checks << " " << vecType << " expectedIB2;\n";
if (m_data.unroll)
- checks << " [[unroll]] for (int c = -10; c <= 10; ++c) {\n";
+ {
+ if (declaredSize)
+ checks << " [[unroll]] for (int c = 0; c <= 10; ++c) {\n";
+ else
+ checks << " [[unroll]] for (int c = -10; c <= 10; ++c) {\n";
+ }
else
- checks << " [[dont_unroll]] for (int c = 1050; c >= -1050; --c) {\n";
+ {
+ if (declaredSize)
+ checks << " [[dont_unroll]] for (int c = 1023; c >= 0; --c) {\n";
+ else
+ checks << " [[dont_unroll]] for (int c = 1050; c >= -1050; --c) {\n";
+ }
if (m_data.descriptorType == VERTEX_ATTRIBUTE_FETCH)
checks << " int idx = smod(gl_VertexIndex * " << numComponents << ", " << refDataNumElements << ");\n";
@@ -910,9 +933,8 @@
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
- decls << "layout(scalar, set = 0, binding = 1) " << vol << "buffer sbodef0_1 { " << bufType << " val[1024]; } ssbo0_1;\n";
- decls << "layout(scalar, set = 0, binding = 1) " << vol << "buffer sbodef0_1_unsized { " << bufType << " val[]; } ssbo0_1_unsized;\n";
- decls << "layout(scalar, set = 0, binding = 1) " << vol << "buffer sbodef0_1_unsized_pad { vec4 pad; " << bufType << " val[]; } ssbo0_1_unsized_pad;\n";
+ decls << "layout(scalar, set = 0, binding = 1) " << vol << "buffer sbodef0_1 { " << bufType << " val[]; } ssbo0_1;\n";
+ decls << "layout(scalar, set = 0, binding = 1) " << vol << "buffer sbodef0_1_pad { vec4 pad; " << bufType << " val[]; } ssbo0_1_pad;\n";
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
switch(format)
@@ -1302,6 +1324,12 @@
{
checks << " temp = textureSize(texture0_1, 0)" << sizeswiz <<";\n";
checks << " accum += abs(temp);\n";
+
+ // checking textureSize with clearly out of range LOD values
+ checks << " temp = textureSize(texture0_1, " << -i << ")" << sizeswiz <<";\n";
+ checks << " accum += abs(temp);\n";
+ checks << " temp = textureSize(texture0_1, " << (std::numeric_limits<deInt32>::max() - i) << ")" << sizeswiz <<";\n";
+ checks << " accum += abs(temp);\n";
}
else
{
@@ -1330,15 +1358,25 @@
m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
{
// expect zero for runtime-sized array .length()
- checks << " temp = " << vecType << "(ssbo0_1_unsized.val.length());\n";
+ checks << " temp = " << vecType << "(ssbo0_1.val.length());\n";
checks << " accum += abs(temp);\n";
- checks << " temp = " << vecType << "(ssbo0_1_unsized_pad.val.length());\n";
+ checks << " temp = " << vecType << "(ssbo0_1_pad.val.length());\n";
checks << " accum += abs(temp);\n";
}
}
}
checks << " }\n";
+ // outside the coordinates loop because we only need to call it once
+ if (m_data.nullDescriptor &&
+ m_data.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER &&
+ m_data.samples == VK_SAMPLE_COUNT_1_BIT)
+ {
+ checks << " temp_ql = " << qLevelType << "(textureQueryLevels(texture0_1));\n";
+ checks << " temp = " << vecType << "(temp_ql);\n";
+ checks << " accum += abs(temp);\n";
+ }
+
const bool is64BitFormat = formatIsR64(m_data.format);
std::string SupportR64 = (is64BitFormat ?
std::string("#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require\n"
@@ -1365,6 +1403,7 @@
"{\n"
" " << vecType << " accum = " << vecType << "(0);\n"
" " << vecType << " temp;\n"
+ " " << qLevelType << " temp_ql;\n"
<< checks.str() <<
" " << vecType << " color = (accum != " << vecType << "(0)) ? " << vecType << "(0,0,0,0) : " << vecType << "(1,0,0,1);\n"
" imageStore(image0_0, ivec2(gl_GlobalInvocationID.xy), color);\n"
@@ -1391,6 +1430,7 @@
"{\n"
" " << vecType << " accum = " << vecType << "(0);\n"
" " << vecType << " temp;\n"
+ " " << qLevelType << " temp_ql;\n"
<< checks.str() <<
" " << vecType << " color = (accum != " << vecType << "(0)) ? " << vecType << "(0,0,0,0) : " << vecType << "(1,0,0,1);\n"
" imageStore(image0_0, ivec2(gl_LaunchIDNV.xy), color);\n"
@@ -1416,6 +1456,7 @@
"{\n"
" " << vecType << " accum = " << vecType << "(0);\n"
" " << vecType << " temp;\n"
+ " " << qLevelType << " temp_ql;\n"
<< checks.str() <<
" " << vecType << " color = (accum != " << vecType << "(0)) ? " << vecType << "(0,0,0,0) : " << vecType << "(1,0,0,1);\n"
" imageStore(image0_0, ivec2(gl_VertexIndex % " << DIM << ", gl_VertexIndex / " << DIM << "), color);\n"
@@ -1429,6 +1470,22 @@
}
case STAGE_FRAGMENT:
{
+ if (m_data.nullDescriptor &&
+ m_data.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER &&
+ m_data.samples == VK_SAMPLE_COUNT_1_BIT)
+ {
+ // as here we only want to check that textureQueryLod returns 0 when
+ // texture0_1 is null, we don't need to use the actual texture coordinates
+ // (and modify the vertex shader below to do so). Any coordinates are fine.
+ // gl_FragCoord has been selected "randomly", instead of selecting 0 for example.
+ std::string lod_str = (numNormalizedCoords == 1) ? ");" : (numNormalizedCoords == 2) ? "y);" : "yz);";
+ checks << " vec2 lod = textureQueryLod(texture0_1, gl_FragCoord.x" << lod_str << "\n";
+ checks << " temp_ql = " << qLevelType <<
+"(ceil(abs(lod.x) + abs(lod.y)));\n";
+ checks << " temp = " << vecType << "(temp_ql);\n";
+ checks << " accum += abs(temp);\n";
+ }
+
std::stringstream vss;
vss <<
"#version 450 core\n"
@@ -1455,6 +1512,7 @@
"{\n"
" " << vecType << " accum = " << vecType << "(0);\n"
" " << vecType << " temp;\n"
+ " " << qLevelType << " temp_ql;\n"
<< checks.str() <<
" " << vecType << " color = (accum != " << vecType << "(0)) ? " << vecType << "(0,0,0,0) : " << vecType << "(1,0,0,1);\n"
" imageStore(image0_0, ivec2(gl_FragCoord.x, gl_FragCoord.y), color);\n"
@@ -1652,15 +1710,15 @@
{
size = deIntRoundToPow2((int)size, (int)robustness2Properties.robustUniformBufferAccessSizeAlignment);
}
-
- if (m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER ||
- m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
+ else if (m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER ||
+ m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
{
size = deIntRoundToPow2((int)size, (int)robustness2Properties.robustStorageBufferAccessSizeAlignment);
}
-
- if (m_data.descriptorType == VERTEX_ATTRIBUTE_FETCH)
+ else if (m_data.descriptorType == VERTEX_ATTRIBUTE_FETCH)
+ {
size = m_data.bufferLen;
+ }
buffer = de::MovePtr<BufferWithMemory>(new BufferWithMemory(
vk, device, allocator, makeBufferCreateInfo(size,
@@ -1680,8 +1738,8 @@
{
deMemset(bufferPtr, 0, deIntRoundToPow2(m_data.bufferLen, (int)robustness2Properties.robustUniformBufferAccessSizeAlignment));
}
- if (m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER ||
- m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
+ else if (m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER ||
+ m_data.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
{
deMemset(bufferPtr, 0, deIntRoundToPow2(m_data.bufferLen, (int)robustness2Properties.robustStorageBufferAccessSizeAlignment));
}
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp
index 4ac28b1..dd16c4c 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktAtomicOperationTests.cpp
@@ -1000,6 +1000,8 @@
default:
DE_FATAL("Unsupported shader type");
}
+
+ checkSupportShader(ctx, m_shaderType.getType());
}
void AtomicOperationCase::createShaderSpec (void)
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp
index cf9d34b..1315427 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktOpaqueTypeIndexingTests.cpp
@@ -185,6 +185,8 @@
generateSources(m_shaderType, m_shaderSpec, programCollection);
}
+ void checkSupport (Context& context) const;
+
protected:
const char* m_name;
const glu::ShaderType m_shaderType;
@@ -208,6 +210,11 @@
{
}
+void OpaqueTypeIndexingCase::checkSupport (Context& context) const
+{
+ checkSupportShader(context, m_shaderType);
+}
+
class OpaqueTypeIndexingTestInstance : public TestInstance
{
public:
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.cpp
index 76d6de0..1ef5eec 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.cpp
@@ -3511,6 +3511,16 @@
}
}
+void checkSupportShader(Context& context, const glu::ShaderType shaderType)
+{
+ if (shaderType == glu::SHADERTYPE_TESSELLATION_EVALUATION &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().tessellationIsolines)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Tessellation iso lines are not supported by this implementation");
+ }
+}
+
} // shaderexecutor
} // vkt
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.hpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.hpp
index 7174a25..c29d779 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.hpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderExecutor.hpp
@@ -118,6 +118,7 @@
bool executorSupported (glu::ShaderType shaderType);
void generateSources (glu::ShaderType shaderType, const ShaderSpec& shaderSpec, vk::SourceCollections& dst);
ShaderExecutor* createExecutor (Context& context, glu::ShaderType shaderType, const ShaderSpec& shaderSpec, vk::VkDescriptorSetLayout extraResourcesLayout = (vk::VkDescriptorSetLayout)0);
+void checkSupportShader (Context& context, const glu::ShaderType shaderType);
} // shaderexecutor
} // vkt
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderIntegerFunctionTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderIntegerFunctionTests.cpp
index a7d2956..7cf2815 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderIntegerFunctionTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderIntegerFunctionTests.cpp
@@ -296,6 +296,8 @@
generateSources(m_shaderType, m_spec, programCollection);
}
+ void checkSupport (Context& context) const;
+
virtual TestInstance* createInstance (Context& context) const = 0;
protected:
@@ -320,6 +322,11 @@
{
}
+void IntegerFunctionCase::checkSupport (Context& context) const
+{
+ checkSupportShader(context, m_shaderType);
+}
+
// IntegerFunctionTestInstance
class IntegerFunctionTestInstance : public TestInstance
diff --git a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderPackingFunctionTests.cpp b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderPackingFunctionTests.cpp
index 5a1a5d8..e4e6f8f 100644
--- a/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderPackingFunctionTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderexecutor/vktShaderPackingFunctionTests.cpp
@@ -75,6 +75,7 @@
ShaderPackingFunctionCase (tcu::TestContext& testCtx, const char* name, const char* description, glu::ShaderType shaderType);
~ShaderPackingFunctionCase (void);
+ void checkSupport (Context& context) const;
virtual void initPrograms (vk::SourceCollections& programCollection) const
{
generateSources(m_shaderType, m_spec, programCollection);
@@ -99,6 +100,11 @@
{
}
+void ShaderPackingFunctionCase::checkSupport (Context& context) const
+{
+ checkSupportShader(context, m_shaderType);
+}
+
// ShaderPackingFunctionTestInstance
class ShaderPackingFunctionTestInstance : public TestInstance
diff --git a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp
index 46aa0da..5574e8d 100644
--- a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderBuiltinVarTests.cpp
@@ -207,6 +207,7 @@
virtual ~BuiltinGlFrontFacingCase (void);
void initPrograms (SourceCollections& dst) const;
+ void checkSupport (Context& context) const;
TestInstance* createInstance (Context& context) const;
private:
@@ -257,6 +258,16 @@
}
}
+void BuiltinGlFrontFacingCase::checkSupport (Context& context) const
+{
+ if (m_topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().triangleFans)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Triangle fans are not supported by this implementation");
+ }
+}
+
TestInstance* BuiltinGlFrontFacingCase::createInstance (Context& context) const
{
return new BuiltinGlFrontFacingCaseInstance(context, m_topology);
@@ -1006,19 +1017,21 @@
RENDERWIDTH = 16,
RENDERHEIGHT = 16
};
- BuiltinFragCoordMsaaCaseInstance (Context& context, VkSampleCountFlagBits sampleCount);
+ BuiltinFragCoordMsaaCaseInstance (Context& context, VkSampleCountFlagBits sampleCount, bool useEnable);
TestStatus iterate (void);
private:
bool validateSampleLocations (const ConstPixelBufferAccess& sampleLocationBuffer) const;
const tcu::UVec2 m_renderSize;
const VkSampleCountFlagBits m_sampleCount;
+ const bool m_useEnable;
};
-BuiltinFragCoordMsaaCaseInstance::BuiltinFragCoordMsaaCaseInstance (Context& context, VkSampleCountFlagBits sampleCount)
+BuiltinFragCoordMsaaCaseInstance::BuiltinFragCoordMsaaCaseInstance (Context& context, VkSampleCountFlagBits sampleCount, bool useEnable)
: TestInstance (context)
, m_renderSize (RENDERWIDTH, RENDERHEIGHT)
, m_sampleCount (sampleCount)
+ , m_useEnable (useEnable)
{
const InstanceInterface& vki = m_context.getInstanceInterface();
const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
@@ -1251,7 +1264,7 @@
VulkanProgram vulkanProgram(shaders);
frameBufferState.numSamples = m_sampleCount;
- pipelineState.sampleShadingEnable = true;
+ pipelineState.sampleShadingEnable = m_useEnable; // When m_useEnable is false, we rely on the gl_SampleID input to enable sample shading
vulkanProgram.descriptorSetLayout = *descriptorSetLayout;
vulkanProgram.descriptorSet = *descriptorSet;
@@ -1359,6 +1372,18 @@
const UVec2 pixelAddress = UVec2(sampleNdx + m_sampleCount * colNdx, rowNdx);
const Vec4 pixelData = sampleLocationBuffer.getPixel(pixelAddress.x(), pixelAddress.y());
+ if (pixelData.z() != 0.0f)
+ {
+ log << TestLog::Message << "Pixel (" << colNdx << "," << rowNdx << "): has unexpected .z component, expected: 0.0, got: " << pixelData.z() << TestLog::EndMessage;
+ return false;
+ }
+
+ if (pixelData.w() != 1.0f)
+ {
+ log << TestLog::Message << "Pixel (" << colNdx << "," << rowNdx << "): has unexpected .w component, expected: 1.0, got: " << pixelData.w() << TestLog::EndMessage;
+ return false;
+ }
+
locations.push_back(Vec2(pixelData.x(), pixelData.y()));
}
@@ -1406,17 +1431,19 @@
class BuiltinFragCoordMsaaTestCase : public TestCase
{
public:
- BuiltinFragCoordMsaaTestCase (TestContext& testCtx, const char* name, const char* description, VkSampleCountFlagBits sampleCount);
+ BuiltinFragCoordMsaaTestCase (TestContext& testCtx, const char* name, const char* description, VkSampleCountFlagBits sampleCount, bool useEnable);
virtual ~BuiltinFragCoordMsaaTestCase (void);
void initPrograms (SourceCollections& sourceCollections) const;
TestInstance* createInstance (Context& context) const;
private:
const VkSampleCountFlagBits m_sampleCount;
+ const bool m_useEnable;
};
-BuiltinFragCoordMsaaTestCase::BuiltinFragCoordMsaaTestCase (TestContext& testCtx, const char* name, const char* description, VkSampleCountFlagBits sampleCount)
+BuiltinFragCoordMsaaTestCase::BuiltinFragCoordMsaaTestCase (TestContext& testCtx, const char* name, const char* description, VkSampleCountFlagBits sampleCount, bool useEnable)
: TestCase (testCtx, name, description)
, m_sampleCount (sampleCount)
+ , m_useEnable (useEnable)
{
}
@@ -1448,7 +1475,7 @@
<< "{\n"
<< " const int sampleNdx = int(gl_SampleID);\n"
<< " ivec2 imageCoord = ivec2(sampleNdx + int(gl_FragCoord.x) * " << m_sampleCount << ", int(gl_FragCoord.y));\n"
- << " imageStore(storageImage, imageCoord, vec4(gl_FragCoord.xy,vec2(0)));\n"
+ << " imageStore(storageImage, imageCoord, gl_FragCoord);\n"
<< " color = vec4(1.0, 0.0, 0.0, 1.0);\n"
<< "}\n";
programCollection.glslSources.add("FragCoordMsaaFrag") << glu::FragmentSource(fragmentSource.str());
@@ -1457,7 +1484,7 @@
TestInstance* BuiltinFragCoordMsaaTestCase::createInstance (Context& context) const
{
- return new BuiltinFragCoordMsaaCaseInstance(context, m_sampleCount);
+ return new BuiltinFragCoordMsaaCaseInstance(context, m_sampleCount, m_useEnable);
}
class BuiltinFragDepthCase : public TestCase
@@ -2309,6 +2336,7 @@
de::MovePtr<TestCaseGroup> frontFacingGroup (new TestCaseGroup(testCtx, "frontfacing", "Test gl_Frontfacing keyword."));
de::MovePtr<TestCaseGroup> fragDepthGroup (new TestCaseGroup(testCtx, "fragdepth", "Test gl_FragDepth keyword."));
de::MovePtr<TestCaseGroup> fragCoordMsaaGroup (new TestCaseGroup(testCtx, "fragcoord_msaa", "Test interation between gl_FragCoord and msaa"));
+ de::MovePtr<TestCaseGroup> fragCoordMsaaInputGroup (new TestCaseGroup(testCtx, "fragcoord_msaa_input", "Test interation between gl_FragCoord and msaa"));
simpleGroup->addChild(new BuiltinGlFragCoordXYZCase(testCtx, "fragcoord_xyz", "FragCoord xyz test"));
simpleGroup->addChild(new BuiltinGlFragCoordWCase(testCtx, "fragcoord_w", "FragCoord w test"));
@@ -2335,7 +2363,10 @@
};
for (deUint32 caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(fragCoordMsaaCaseList); caseNdx++)
- fragCoordMsaaGroup->addChild(new BuiltinFragCoordMsaaTestCase(testCtx, fragCoordMsaaCaseList[caseNdx].name, fragCoordMsaaCaseList[caseNdx].description, fragCoordMsaaCaseList[caseNdx].sampleCount));
+ {
+ fragCoordMsaaGroup->addChild(new BuiltinFragCoordMsaaTestCase(testCtx, fragCoordMsaaCaseList[caseNdx].name, fragCoordMsaaCaseList[caseNdx].description, fragCoordMsaaCaseList[caseNdx].sampleCount, true));
+ fragCoordMsaaInputGroup->addChild(new BuiltinFragCoordMsaaTestCase(testCtx, fragCoordMsaaCaseList[caseNdx].name, fragCoordMsaaCaseList[caseNdx].description, fragCoordMsaaCaseList[caseNdx].sampleCount, false));
+ }
}
// gl_FrontFacing tests
@@ -2410,6 +2441,7 @@
builtinGroup->addChild(frontFacingGroup.release());
builtinGroup->addChild(fragDepthGroup.release());
builtinGroup->addChild(fragCoordMsaaGroup.release());
+ builtinGroup->addChild(fragCoordMsaaInputGroup.release());
builtinGroup->addChild(simpleGroup.release());
for (deUint16 shaderType = 0; shaderType <= (SHADER_INPUT_BUILTIN_BIT | SHADER_INPUT_VARYING_BIT | SHADER_INPUT_CONSTANT_BIT); ++shaderType)
diff --git a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp
index cdeb0f3..3445809 100644
--- a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureFunctionTests.cpp
@@ -1438,6 +1438,7 @@
enum QueryFunction
{
QUERYFUNCTION_TEXTURESIZE = 0,
+ QUERYFUNCTION_TEXTURESIZEMS,
QUERYFUNCTION_TEXTUREQUERYLOD,
QUERYFUNCTION_TEXTUREQUERYLEVELS,
QUERYFUNCTION_TEXTURESAMPLES,
@@ -1573,14 +1574,14 @@
return str.str();
}
-static bool isValidCase (TextureType type, const tcu::IVec3& textureSize, int lod, int lodBase)
+static bool isValidCase (TextureType type, const tcu::IVec3& textureSize, int lodBase)
{
- const bool isSquare = textureSize.x() == textureSize.y();
- const bool isCubeArray = isSquare && (textureSize.z() % 6) == 0;
- const int maxSize = getMaxTextureSize(type, textureSize);
- const bool isLodValid = (maxSize >> (lod + lodBase)) != 0;
+ const bool isSquare = textureSize.x() == textureSize.y();
+ const bool isCubeArray = isSquare && (textureSize.z() % 6) == 0;
+ const int maxSize = getMaxTextureSize(type, textureSize);
+ const bool isBaseValid = (maxSize >> lodBase) != 0;
- if (!isLodValid)
+ if (!isBaseValid)
return false;
if (type == TEXTURETYPE_CUBE_MAP && !isSquare)
return false;
@@ -1770,7 +1771,7 @@
void TextureSizeInstance::initTexture (void)
{
tcu::TestLog& log = m_context.getTestContext().getLog();
- const int numLevels = m_testSize.lod + m_testSize.lodBase + 1;
+ const int numLevels = deLog2Floor32(getMaxTextureSize(m_textureSpec.type, m_testSize.textureSize)) + 1;
TextureBindingSp textureBinding;
log << tcu::TestLog::Message << "Testing image size " << getTextureSizeString(m_textureSpec.type, m_testSize.textureSize) << tcu::TestLog::EndMessage;
@@ -1867,6 +1868,18 @@
{ tcu::IVec3(128, 64, 32), 3, 1, tcu::IVec3(8, 4, 2) },
{ tcu::IVec3(64, 64, 64), 1, 1, tcu::IVec3(16, 16, 16) },
+ { tcu::IVec3(100, 31, 18), 1, 2, tcu::IVec3(12, 3, 2) },
+ { tcu::IVec3(100, 31, 18), 2, 2, tcu::IVec3(6, 1, 1) },
+ { tcu::IVec3(100, 31, 18), 1, 4, tcu::IVec3(3, 1, 1) },
+
+ // out-of-range mip levels
+ { tcu::IVec3(1, 3, 2), -7, 0, tcu::IVec3(0, 0, 0) },
+ { tcu::IVec3(1, 3, 2), 106, 0, tcu::IVec3(0, 0, 0) },
+ { tcu::IVec3(100, 31, 18), 7, 0, tcu::IVec3(0, 0, 0) },
+ { tcu::IVec3(32, 32, 12), 6, 0, tcu::IVec3(0, 0, 0) },
+ { tcu::IVec3(32, 32, 12), -9, 0, tcu::IVec3(0, 0, 0) },
+ { tcu::IVec3(32, 32, 12), 4396, 0, tcu::IVec3(0, 0, 0) },
+
// w == h and d % 6 == 0 (for cube array)
{ tcu::IVec3(1, 1, 6), 0, 0, tcu::IVec3(1, 1, 6) },
{ tcu::IVec3(32, 32, 12), 0, 0, tcu::IVec3(32, 32, 12) },
@@ -1901,7 +1914,7 @@
bool success = true;
// skip incompatible cases
- if (!isValidCase(m_textureSpec.type, m_testSize.textureSize, m_testSize.lod, m_testSize.lodBase))
+ if (!isValidCase(m_textureSpec.type, m_testSize.textureSize, m_testSize.lodBase))
return true;
// setup texture
@@ -1945,7 +1958,11 @@
for (int ndx = 0; ndx < resultComponents; ndx++)
{
- if (output[ndx] != m_expectedSize[ndx])
+ // We test all levels, but only compare results for valid LoDs. The others give
+ // undefined values.
+ const int maxSize = getMaxTextureSize(m_textureSpec.type, m_testSize.textureSize);
+ const bool isLodValid = (maxSize >> (m_testSize.lod + m_testSize.lodBase)) != 0;
+ if (isLodValid && output[ndx] != m_expectedSize[ndx])
{
success = false;
break;
@@ -2009,6 +2026,202 @@
}
}
+class TextureSizeMSInstance : public TextureQueryInstance
+{
+public:
+ TextureSizeMSInstance (Context& context,
+ const bool isVertexCase,
+ const TextureSpec& textureSpec);
+ virtual ~TextureSizeMSInstance (void);
+
+ virtual tcu::TestStatus iterate (void);
+
+private:
+ void initTexture (vk::VkSampleCountFlagBits samples, const tcu::IVec3 &dim);
+ bool testSize (vk::VkSampleCountFlagBits samples, const tcu::IVec3 &dim);
+
+ unsigned m_iterationCounter;
+ vector<vk::VkSampleCountFlagBits> m_iterations;
+};
+
+TextureSizeMSInstance::TextureSizeMSInstance (Context& context,
+ const bool isVertexCase,
+ const TextureSpec& textureSpec)
+ : TextureQueryInstance (context, isVertexCase, textureSpec)
+ , m_iterationCounter (0)
+{
+ m_renderSize = tcu::UVec2(1, 1);
+
+ // determine available sample counts
+ {
+ const vk::VkFormat format = vk::mapTextureFormat(glu::mapGLInternalFormat(m_textureSpec.format));
+ const vk::VkImageType imageType = getVkImageType(m_textureSpec.type);
+ vk::VkImageFormatProperties properties;
+
+ if (m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(),
+ format,
+ imageType,
+ vk::VK_IMAGE_TILING_OPTIMAL,
+ vk::VK_IMAGE_USAGE_SAMPLED_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+ (vk::VkImageCreateFlags)0,
+ &properties) == vk::VK_ERROR_FORMAT_NOT_SUPPORTED)
+ TCU_THROW(NotSupportedError, "Format not supported");
+
+ // NOTE: The test case initializes MS images (for all supported N of samples), runs a program
+ // which invokes OpImageQuerySize against the image and checks the result.
+ //
+ // Multisample images do not support a sample count of 1, so start from 2 samples.
+ static const vk::VkSampleCountFlagBits sampleFlags[] =
+ {
+ vk::VK_SAMPLE_COUNT_2_BIT,
+ vk::VK_SAMPLE_COUNT_4_BIT,
+ vk::VK_SAMPLE_COUNT_8_BIT,
+ vk::VK_SAMPLE_COUNT_16_BIT,
+ vk::VK_SAMPLE_COUNT_32_BIT,
+ vk::VK_SAMPLE_COUNT_64_BIT
+ };
+
+ for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(sampleFlags); samplesNdx++)
+ {
+ const vk::VkSampleCountFlagBits& flag = sampleFlags[samplesNdx];
+
+ if ((properties.sampleCounts & flag) != 0)
+ m_iterations.push_back(flag);
+ }
+
+ if (m_iterations.empty())
+ {
+ // Sampled images of integer formats may support only 1 sample. Exit the test with "Not supported" in these cases.
+ if (tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER ||
+ tcu::getTextureChannelClass(mapVkFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
+ {
+ TCU_THROW(NotSupportedError, "Skipping validation of integer formats as only VK_SAMPLE_COUNT_1_BIT is supported.");
+ }
+
+ DE_ASSERT(false);
+ }
+ }
+}
+
+TextureSizeMSInstance::~TextureSizeMSInstance (void)
+{
+}
+
+tcu::TestStatus TextureSizeMSInstance::iterate (void)
+{
+ const tcu::IVec3 testSizes[] =
+ {
+ tcu::IVec3(1, 1, 1),
+ tcu::IVec3(1, 2, 1),
+ tcu::IVec3(1, 3, 2),
+ tcu::IVec3(1, 1, 6),
+ tcu::IVec3(32, 32, 12),
+ tcu::IVec3(64, 64, 64),
+ tcu::IVec3(100, 31, 18),
+ tcu::IVec3(100, 128, 32),
+ tcu::IVec3(128, 64, 32),
+ };
+
+ unsigned sampleIdx = m_iterationCounter / DE_LENGTH_OF_ARRAY(testSizes);
+ unsigned dimIdx = m_iterationCounter % DE_LENGTH_OF_ARRAY(testSizes);
+
+ if (m_iterationCounter++ < m_iterations.size() * DE_LENGTH_OF_ARRAY(testSizes))
+ {
+ if (!testSize(m_iterations[sampleIdx], testSizes[dimIdx]))
+ return tcu::TestStatus::fail("Got unexpected result");
+
+ return tcu::TestStatus::incomplete();
+ }
+ else
+ return tcu::TestStatus::pass("Pass");
+}
+
+bool TextureSizeMSInstance::testSize (vk::VkSampleCountFlagBits samples, const tcu::IVec3 &dim)
+{
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+
+ // setup texture
+ initTexture(samples, dim);
+
+ // render
+ TextureQueryInstance::render();
+
+ // test
+ {
+ const tcu::TextureLevel& result = getResultImage();
+ tcu::IVec4 output = result.getAccess().getPixelInt(0, 0);
+ const int resultComponents = glu::getDataTypeScalarSize(getTextureSizeFuncResultType(m_textureSpec.type));
+
+ bool success = true;
+
+ for (int ndx = 0; ndx < resultComponents; ndx++)
+ {
+ if (output[ndx] != dim[ndx])
+ {
+ success = false;
+ break;
+ }
+ }
+
+ if (success)
+ {
+ // success
+ log << tcu::TestLog::Message << "Passed" << tcu::TestLog::EndMessage;
+ return true;
+ }
+ else
+ {
+ // failure
+ std::stringstream resultSizeStr;
+ switch (resultComponents)
+ {
+ case 1:
+ resultSizeStr << output[0];
+ break;
+ case 2:
+ resultSizeStr << output.toWidth<2>();
+ break;
+ case 3:
+ resultSizeStr << output.toWidth<3>();
+ break;
+ default:
+ DE_ASSERT(false);
+ break;
+ }
+ log << tcu::TestLog::Message << "Result: " << resultSizeStr.str() << tcu::TestLog::EndMessage;
+ log << tcu::TestLog::Message << "Failed" << tcu::TestLog::EndMessage;
+ return false;
+ }
+ }
+}
+
+void TextureSizeMSInstance::initTexture (vk::VkSampleCountFlagBits samples, const tcu::IVec3 &dim)
+{
+ tcu::TestLog& log = m_context.getTestContext().getLog();
+ TextureBindingSp textureBinding;
+
+ DE_ASSERT(m_textureSpec.type == TEXTURETYPE_2D || m_textureSpec.type == TEXTURETYPE_2D_ARRAY);
+
+ log << tcu::TestLog::Message << "Image size: " << getTextureSizeString(m_textureSpec.type, dim) << ", samples: " << samples << tcu::TestLog::EndMessage;
+
+ textureBinding = createEmptyTexture(m_textureSpec.format, m_textureSpec.type, dim, m_textureSpec.numLevels, 0 /* lodBase */, m_textureSpec.sampler);
+
+ m_textures.clear();
+ m_textures.push_back(textureBinding);
+
+ // update samples count
+ {
+ DE_ASSERT(m_textures.size() == 1);
+
+ TextureBinding::Parameters params = m_textures[0]->getParameters();
+
+ params.initialization = TextureBinding::INIT_CLEAR;
+ params.samples = samples;
+
+ m_textures[0]->setParameters(params);
+ }
+}
+
class TextureSamplesInstance : public TextureQueryInstance
{
public:
@@ -2286,7 +2499,7 @@
bool success = true;
// skip incompatible cases
- if (!isValidCase(m_textureSpec.type, m_testSize.textureSize, 0, m_testSize.lodBase))
+ if (!isValidCase(m_textureSpec.type, m_testSize.textureSize, m_testSize.lodBase))
return true;
// setup texture
@@ -2685,6 +2898,7 @@
switch (m_function)
{
case QUERYFUNCTION_TEXTURESIZE: return new TextureSizeInstance(context, m_isVertexCase, m_textureSpec);
+ case QUERYFUNCTION_TEXTURESIZEMS: return new TextureSizeMSInstance(context, m_isVertexCase, m_textureSpec);
case QUERYFUNCTION_TEXTUREQUERYLOD: return new TextureQueryLodInstance(context, m_isVertexCase, m_textureSpec);
case QUERYFUNCTION_TEXTUREQUERYLEVELS: return new TextureQueryLevelsInstance(context, m_isVertexCase, m_textureSpec);
case QUERYFUNCTION_TEXTURESAMPLES: return new TextureSamplesInstance(context, m_isVertexCase, m_textureSpec);
@@ -2760,6 +2974,18 @@
break;
}
+ case QUERYFUNCTION_TEXTURESIZEMS:
+ {
+ const int resultComponents = glu::getDataTypeScalarSize(getTextureSizeFuncResultType(m_textureSpec.type));
+
+ op << "textureSize(u_sampler)";
+ for (int ndx = 0; ndx < 3 - resultComponents; ndx++)
+ op << ", 0.0";
+ op << ", 1.0";
+
+ break;
+ }
+
case QUERYFUNCTION_TEXTUREQUERYLOD:
op << "textureQueryLod(u_sampler, v_texCoord), 0.0, 1.0";
break;
@@ -4299,6 +4525,33 @@
queryGroup->addChild(group.release());
}
+ // textureSize() cases for multisample textures
+ {
+ const TexQueryFuncCaseSpec textureSizeMSCases[] =
+ {
+ { "sampler2dms_fixed", "sampler2DMS", tex2DFixed },
+ { "sampler2dms_float", "sampler2DMS", tex2DFloat },
+ { "isampler2dms", "isampler2DMS", tex2DInt },
+ { "usampler2dms", "usampler2DMS", tex2DUint },
+ { "sampler2dmsarray_fixed", "sampler2DMSArray", tex2DArrayFixed },
+ { "sampler2dmsarray_float", "sampler2DMSArray", tex2DArrayFloat },
+ { "isampler2dmsarray", "isampler2DMSArray", tex2DArrayInt },
+ { "usampler2dmsarray", "usampler2DMSArray", tex2DArrayUint },
+ };
+
+ de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(m_testCtx, "texturesizems", "textureSize() Tests for Multisample Textures"));
+
+ for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureSizeMSCases); ++ndx)
+ {
+ const TexQueryFuncCaseSpec& caseSpec = textureSizeMSCases[ndx];
+
+ group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_vertex"), "", caseSpec.samplerName, caseSpec.textureSpec, true, QUERYFUNCTION_TEXTURESIZEMS));
+ group->addChild(new TextureQueryCase(m_testCtx, (std::string(caseSpec.name) + "_fragment"), "", caseSpec.samplerName, caseSpec.textureSpec, false, QUERYFUNCTION_TEXTURESIZEMS));
+ }
+
+ queryGroup->addChild(group.release());
+ }
+
// textureSamples() cases
{
const TexQueryFuncCaseSpec textureSamplesCases[] =
diff --git a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureGatherTests.cpp b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureGatherTests.cpp
index 3c0f70e..eb49f6f 100644
--- a/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureGatherTests.cpp
+++ b/external/vulkancts/modules/vulkan/shaderrender/vktShaderRenderTextureGatherTests.cpp
@@ -26,6 +26,7 @@
#include "vktShaderRenderTextureGatherTests.hpp"
#include "vktShaderRender.hpp"
#include "vkImageUtil.hpp"
+#include "vkQueryUtil.hpp"
#include "gluTextureUtil.hpp"
#include "tcuTexture.hpp"
#include "tcuTextureUtil.hpp"
@@ -1234,12 +1235,16 @@
VK_FALSE, // VkBool32 supportsTextureGatherLODBiasAMD;
};
- vk::VkImageFormatProperties2 properties2;
- deMemset(&properties2, 0, sizeof(properties2));
- properties2.sType = vk::VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ vk::VkImageFormatProperties2 properties2 = vk::initVulkanStructure();
properties2.pNext = &lodGatherProperties;
- VK_CHECK(m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties2(m_context.getPhysicalDevice(), &formatInfo, &properties2));
+ const auto retCode = m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties2(m_context.getPhysicalDevice(), &formatInfo, &properties2);
+
+ if (retCode != vk::VK_SUCCESS && retCode != vk::VK_ERROR_FORMAT_NOT_SUPPORTED)
+ TCU_FAIL("vkGetPhysicalDeviceImageFormatProperties2 returned " + de::toString(retCode));
+
+ if (retCode == vk::VK_ERROR_FORMAT_NOT_SUPPORTED)
+ TCU_THROW(NotSupportedError, "Format does not support the required parameters");
if (!lodGatherProperties.supportsTextureGatherLODBiasAMD)
TCU_THROW(NotSupportedError, "Format does not support texture gather LOD/Bias operations");
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp
index 50e9e55..26fe504 100755
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesShaderIntrinsicsBase.cpp
@@ -361,6 +361,10 @@
case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: src << "Rgba16"; break;
case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: src << "Rgba16"; break;
case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: src << "Rgba16"; break;
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT: src << "Rgba8"; break;
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:src << "Rgba16"; break;
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:src << "Rgba16"; break;
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT: src << "Rgba16"; break;
default:
DE_FATAL("Unexpected texture format");
diff --git a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp
index a8e6471..6725269 100644
--- a/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp
+++ b/external/vulkancts/modules/vulkan/sparse_resources/vktSparseResourcesTestsUtil.cpp
@@ -105,7 +105,11 @@
{ VK_FORMAT_G16_B16R16_2PLANE_420_UNORM },
{ VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM },
{ VK_FORMAT_G16_B16R16_2PLANE_422_UNORM },
- { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM }
+ { VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM },
+ { VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT },
+ { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT },
+ { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT },
+ { VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT },
};
std::copy(begin(ycbcrFormats), end(ycbcrFormats), std::back_inserter(results));
}
@@ -696,6 +700,10 @@
case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: return "rgba16";
case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: return "rgba16";
case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: return "rgba16";
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT: return "rgba8";
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:return "rgba16";
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:return "rgba16";
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT: return "rgba16";
default:
DE_FATAL("Unexpected texture format");
@@ -776,6 +784,10 @@
case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT:
return de::toLower(std::string(getFormatName(format)).substr(10));
default:
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
index ff0e85f..90ab988 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
@@ -4610,9 +4610,12 @@
// Note: RTZ/RNE rounding leniency isn't applied for the checks below:
// Some *variable_pointers* tests store counters in buffer
- // whose value may vary if the same vertex shader may be executed for multiple times
+ // whose value may vary if the same shader may be executed for multiple times
// in this case the output value can be expected value + non-negative integer N
- if (instance.customizedStages == VK_SHADER_STAGE_VERTEX_BIT)
+ if (instance.customizedStages == VK_SHADER_STAGE_VERTEX_BIT ||
+ instance.customizedStages == VK_SHADER_STAGE_GEOMETRY_BIT ||
+ instance.customizedStages == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ||
+ instance.customizedStages == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
{
if (deFloatIsInf(outputFloats[expectedNdx]) || deFloatIsNaN(outputFloats[expectedNdx]))
return tcu::TestStatus::fail("Value returned is invalid");
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
index b4d8ce5..b8b65bc 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
@@ -7979,7 +7979,7 @@
"OpDecorate %group1 RelaxedPrecision\n"
"OpDecorate %group3 RelaxedPrecision\n"
- "OpDecorate %group3 Invariant\n"
+ "OpDecorate %group3 Flat\n"
"OpDecorate %group3 Restrict\n"
"%group0 = OpDecorationGroup\n"
"%group1 = OpDecorationGroup\n"
@@ -18804,7 +18804,8 @@
const ComparisonCase amberTests[] =
{
- { "modfstruct", "modf and modfStruct" }
+ { "modfstruct", "modf and modfStruct" },
+ { "frexpstruct", "frexp and frexpStruct" }
};
for (ComparisonCase test : amberTests)
@@ -18846,7 +18847,8 @@
const ComparisonCase amberTests[] =
{
- { "modfstruct", "modf and modfStruct" }
+ { "modfstruct", "modf and modfStruct" },
+ { "frexpstruct", "frexp and frexpStruct" }
};
for (ComparisonCase test : amberTests)
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
index e20712b..e5cb21f 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVariablePointersTests.cpp
@@ -49,6 +49,7 @@
#include "vktSpvAsmVariablePointersTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktTestGroupUtil.hpp"
+#include "vktAmberTestCase.hpp"
#include <limits>
#include <map>
@@ -218,7 +219,7 @@
stringTemplate +=
physPtrs ?
- "OpExtension \"SPV_EXT_physical_storage_buffer\"\n"
+ "OpExtension \"SPV_KHR_physical_storage_buffer\"\n"
:
"OpExtension \"SPV_KHR_variable_pointers\"\n";
@@ -877,7 +878,7 @@
stringTemplate +=
physPtrs ?
- "OpExtension \"SPV_EXT_physical_storage_buffer\"\n"
+ "OpExtension \"SPV_KHR_physical_storage_buffer\"\n"
:
"OpExtension \"SPV_KHR_variable_pointers\"\n";
@@ -1398,6 +1399,31 @@
}
}
+void addDynamicOffsetComputeGroup (tcu::TestCaseGroup* group)
+{
+ tcu::TestContext &testCtx = group->getTestContext();
+
+ static const char dataDir[] = "spirv_assembly/instruction/compute/variable_pointer/dynamic_offset";
+
+ struct Case
+ {
+ string name;
+ string desc;
+ };
+
+ static const Case cases[] =
+ {
+ { "select_descriptor_array", "Test accessing a descriptor array using a variable pointer from OpSelect" },
+ };
+
+ for (const auto& testCase : cases)
+ {
+ const string fileName = testCase.name + ".amber";
+
+ group->addChild(cts_amber::createAmberTestCase(testCtx, testCase.name.c_str(), testCase.desc.c_str(), dataDir, fileName, {"VK_KHR_variable_pointers", "VK_KHR_storage_buffer_storage_class", "VariablePointerFeatures.variablePointers", "VariablePointerFeatures.variablePointersStorageBuffer"}));
+ }
+}
+
void addVariablePointersGraphicsGroup (tcu::TestCaseGroup* testGroup)
{
tcu::TestContext& testCtx = testGroup->getTestContext();
@@ -2725,13 +2751,16 @@
"nullptr_compute",
"Test the usage of nullptr using the variable pointers extension in a compute shader",
addNullptrVariablePointersComputeGroup);
+ addTestGroup(group.get(), "dynamic_offset",
+ "Testing variable pointers referring to descriptors using dynamic offset",
+ addDynamicOffsetComputeGroup);
return group.release();
}
tcu::TestCaseGroup* createPhysicalPointersComputeGroup (tcu::TestContext& testCtx)
{
- de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "physical_pointers", "Compute tests for SPV_EXT_physical_storage_buffer extension"));
+ de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "physical_pointers", "Compute tests for SPV_KHR_physical_storage_buffer extension"));
addTestGroup(group.get(), "compute", "Test the physical storage buffer extension using a compute shader", addPhysicalPointersComputeGroup);
addTestGroup(group.get(),
"complex_types_compute",
diff --git a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVectorShuffleTests.cpp b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVectorShuffleTests.cpp
index 25daa4e..93c8862 100644
--- a/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVectorShuffleTests.cpp
+++ b/external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmVectorShuffleTests.cpp
@@ -38,18 +38,19 @@
// Shader test files are saved in <path>/external/vulkancts/data/vulkan/amber/<data_dir>/<basename>.amber
struct Case {
- const char* basename;
- const char* description;
+ const char* basename;
+ const char* description;
+ std::vector<std::string> requirements;
};
const Case cases[] =
{
- { "vector_shuffle", "OpVectorShuffle with indices including -1" },
+ { "vector_shuffle", "OpVectorShuffle with indices including -1" , { "VariablePointerFeatures.variablePointers" } },
};
for (unsigned i = 0; i < sizeof(cases)/sizeof(cases[0]) ; ++i)
{
std::string file = std::string(cases[i].basename) + ".amber";
- cts_amber::AmberTestCase *testCase = cts_amber::createAmberTestCase(testCtx, cases[i].basename, cases[i].description, data_dir, file);
+ cts_amber::AmberTestCase *testCase = cts_amber::createAmberTestCase(testCtx, cases[i].basename, cases[i].description, data_dir, file, cases[i].requirements);
tests->addChild(testCase);
}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
index d9182f3..3841d9b 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsArithmeticTests.cpp
@@ -289,6 +289,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
index 3453168..f7dcdeb 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotBroadcastTests.cpp
@@ -310,7 +310,7 @@
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
-
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp
index c622f7a..7828a4c 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotMasksTests.cpp
@@ -441,6 +441,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
index eb039a7..a93b61e 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotOtherTests.cpp
@@ -507,6 +507,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
index b8260e7..0ffb2e5 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBallotTests.cpp
@@ -955,6 +955,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
index 9d0b8c9..d347479 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBasicTests.cpp
@@ -1895,6 +1895,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp
index 047ddea..92da08e 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinMaskVarTests.cpp
@@ -146,74 +146,32 @@
std::string subgroupMask (const CaseDefinition& caseDef)
{
+ std::string comp;
+ if (caseDef.varName == "gl_SubgroupEqMask")
+ comp = "==";
+ else if (caseDef.varName == "gl_SubgroupGeMask")
+ comp = ">=";
+ else if (caseDef.varName == "gl_SubgroupGtMask")
+ comp = ">";
+ else if (caseDef.varName == "gl_SubgroupLeMask")
+ comp = "<=";
+ else if (caseDef.varName == "gl_SubgroupLtMask")
+ comp = "<";
+
std::ostringstream bdy;
bdy << " uint tempResult = 0x1;\n"
- << " uint bit = 0x1;\n"
- << " uint bitCount = 0x0;\n"
<< " uvec4 mask = subgroupBallot(true);\n"
<< " const uvec4 var = " << caseDef.varName << ";\n"
<< " for (uint i = 0; i < gl_SubgroupSize; i++)\n"
- << " {\n";
-
- if ("gl_SubgroupEqMask" == caseDef.varName)
- {
- bdy << " if ((i == gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
- << " {\n"
- << " tempResult = 0;\n"
- << " }\n";
- }
- else if ("gl_SubgroupGeMask" == caseDef.varName)
- {
- bdy << " if ((i >= gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
- << " {\n"
- << " tempResult = 0;\n"
- << " }\n";
- }
- else if ("gl_SubgroupGtMask" == caseDef.varName)
- {
- bdy << " if ((i > gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
- << " {\n"
- << " tempResult = 0;\n"
- << " }\n";
- }
- else if ("gl_SubgroupLeMask" == caseDef.varName)
- {
- bdy << " if ((i <= gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
- << " {\n"
- << " tempResult = 0;\n"
- << " }\n";
- }
- else if ("gl_SubgroupLtMask" == caseDef.varName)
- {
- bdy << " if ((i < gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
- << " {\n"
- << " tempResult = 0;\n"
- << " }\n";
- }
-
- bdy << " }\n"
- << " for (uint i = 0; i < 32; i++)\n"
<< " {\n"
- << " if ((var.x & bit) > 0)\n"
+ << " if ((i " << comp << " gl_SubgroupInvocationID) ^^ subgroupBallotBitExtract(var, i))\n"
<< " {\n"
- << " bitCount++;\n"
+ << " tempResult = 0;\n"
<< " }\n"
- << " if ((var.y & bit) > 0)\n"
- << " {\n"
- << " bitCount++;\n"
- << " }\n"
- << " if ((var.z & bit) > 0)\n"
- << " {\n"
- << " bitCount++;\n"
- << " }\n"
- << " if ((var.w & bit) > 0)\n"
- << " {\n"
- << " bitCount++;\n"
- << " }\n"
- << " bit = bit<<1;\n"
<< " }\n"
- << " if (subgroupBallotBitCount(var) != bitCount)\n"
+ << " uint c = bitCount(var.x) + bitCount(var.y) + bitCount(var.z) + bitCount(var.w);\n"
+ << " if (subgroupBallotBitCount(var) != c)\n"
<< " {\n"
<< " tempResult = 0;\n"
<< " }\n";
@@ -1394,6 +1352,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest(Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp
index afb033b..d9bd964 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsBuiltinVarTests.cpp
@@ -1624,6 +1624,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
index 1e9ff24..2f6e5e3 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsClusteredTests.cpp
@@ -208,6 +208,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp
index 3f0e552..45e8bf1 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsPartitionedTests.cpp
@@ -611,6 +611,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
index 004104b..37175e9 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsQuadTests.cpp
@@ -253,6 +253,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
index 82a828c..3ef66dd 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShapeTests.cpp
@@ -505,6 +505,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
index 457167a..c5e4bbc 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsShuffleTests.cpp
@@ -501,6 +501,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsSizeControlTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsSizeControlTests.cpp
index 29b799d..6d37394 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsSizeControlTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsSizeControlTests.cpp
@@ -660,6 +660,13 @@
}
}
+void supportedCheckFeaturesShader (Context& context, CaseDefinition caseDef)
+{
+ supportedCheckFeatures(context, caseDef);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
+}
+
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
{
struct internalDataStruct internalData =
@@ -1020,12 +1027,12 @@
const CaseDefinition caseDefCompute = {VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE};
addFunctionCaseWithPrograms(computeGroup.get(), "allow_varying_subgroup_size", "", supportedCheckFeatures, initPrograms, test, caseDefCompute);
const CaseDefinition caseDefAllGraphics = {VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE};
- addFunctionCaseWithPrograms(graphicsGroup.get(), "allow_varying_subgroup_size", "", supportedCheckFeatures, initPrograms, test, caseDefAllGraphics);
+ addFunctionCaseWithPrograms(graphicsGroup.get(), "allow_varying_subgroup_size", "", supportedCheckFeaturesShader, initPrograms, test, caseDefAllGraphics);
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDefStage = {VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_NONE};
- addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDefStage.shaderStage) + "_allow_varying_subgroup_size", "", supportedCheckFeatures, initFrameBufferPrograms, noSSBOtest, caseDefStage);
+ addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDefStage.shaderStage) + "_allow_varying_subgroup_size", "", supportedCheckFeaturesShader, initFrameBufferPrograms, noSSBOtest, caseDefStage);
}
}
@@ -1045,20 +1052,20 @@
// Tests to check setting a required subgroup size value.
{
const CaseDefinition caseDefAllGraphicsMax = {0u, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX};
- addFunctionCaseWithPrograms(graphicsGroup.get(), "required_subgroup_size_max", "", supportedCheckFeatures, initPrograms, testRequireSubgroupSize, caseDefAllGraphicsMax);
+ addFunctionCaseWithPrograms(graphicsGroup.get(), "required_subgroup_size_max", "", supportedCheckFeaturesShader, initPrograms, testRequireSubgroupSize, caseDefAllGraphicsMax);
const CaseDefinition caseDefComputeMax = {0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX};
addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_max", "", supportedCheckFeatures, initPrograms, testRequireSubgroupSize, caseDefComputeMax);
const CaseDefinition caseDefAllGraphicsMin = {0u, VK_SHADER_STAGE_ALL_GRAPHICS, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN};
- addFunctionCaseWithPrograms(graphicsGroup.get(), "required_subgroup_size_min", "", supportedCheckFeatures, initPrograms, testRequireSubgroupSize, caseDefAllGraphicsMin);
+ addFunctionCaseWithPrograms(graphicsGroup.get(), "required_subgroup_size_min", "", supportedCheckFeaturesShader, initPrograms, testRequireSubgroupSize, caseDefAllGraphicsMin);
const CaseDefinition caseDefComputeMin = {0u, VK_SHADER_STAGE_COMPUTE_BIT, DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN};
addFunctionCaseWithPrograms(computeGroup.get(), "required_subgroup_size_min", "", supportedCheckFeatures, initPrograms, testRequireSubgroupSize, caseDefComputeMin);
for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex)
{
const CaseDefinition caseDefStageMax = {0u, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_MAX};
- addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDefStageMax.shaderStage) + "_required_subgroup_size_max", "", supportedCheckFeatures, initFrameBufferPrograms, noSSBOtestRequireSubgroupSize, caseDefStageMax);
+ addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDefStageMax.shaderStage) + "_required_subgroup_size_max", "", supportedCheckFeaturesShader, initFrameBufferPrograms, noSSBOtestRequireSubgroupSize, caseDefStageMax);
const CaseDefinition caseDefStageMin = {0u, stages[stageIndex], DE_FALSE, REQUIRED_SUBGROUP_SIZE_MIN};
- addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDefStageMin.shaderStage) + "_required_subgroup_size_min", "", supportedCheckFeatures, initFrameBufferPrograms, noSSBOtestRequireSubgroupSize, caseDefStageMin);
+ addFunctionCaseWithPrograms(framebufferGroup.get(), getShaderStageName(caseDefStageMin.shaderStage) + "_required_subgroup_size_min", "", supportedCheckFeaturesShader, initFrameBufferPrograms, noSSBOtestRequireSubgroupSize, caseDefStageMin);
}
}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
index b03ecbe..c7264401 100644
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.cpp
@@ -4094,3 +4094,13 @@
return makeComputeTestRequiredSubgroupSize(context, format, inputs, inputsCount, internalData, checkResult, pipelineShaderStageCreateFlags,
numWorkgroups, requiredSubgroupSize != 0u, subgroupSize, localSizesToTest, localSizesToTestCount);
}
+
+void vkt::subgroups::supportedCheckShader(Context& context, const vk::VkShaderStageFlags shaderStage)
+{
+ if ((VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) & shaderStage &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().tessellationIsolines)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Tessellation iso lines are not supported by this implementation");
+ }
+}
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
index 167d42c..0d49ee0 100644
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsTestsUtils.hpp
@@ -281,6 +281,8 @@
deUint32 subgroupSize),
const deUint32 pipelineShaderStageCreateFlags, const deUint32 numWorkgroups[3],
const deBool isRequiredSubgroupSize, const deUint32 subgroupSize, const deUint32 localSizesToTest[][3], const deUint32 localSizesToTestCount);
+
+void supportedCheckShader(Context& context, const vk::VkShaderStageFlags shaderStage);
} // subgroups
} // vkt
diff --git a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
index 2228170..1a6e2a4 100755
--- a/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
+++ b/external/vulkancts/modules/vulkan/subgroups/vktSubgroupsVoteTests.cpp
@@ -679,6 +679,8 @@
}
*caseDef.geometryPointSizeSupported = subgroups::isTessellationAndGeometryPointSizeSupported(context);
+
+ vkt::subgroups::supportedCheckShader(context, caseDef.shaderStage);
}
tcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef)
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.cpp
index d4a92d3..b37af2b 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicEventTests.cpp
@@ -47,7 +47,7 @@
VkEventCreateFlags flags;
};
-tcu::TestStatus hostResetSetEventCase (Context& context)
+tcu::TestStatus hostResetSetEventCase (Context& context, TestConfig config)
{
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice device = context.getDevice();
@@ -60,6 +60,8 @@
VkEvent event;
Move<VkEvent> ptrEvent;
+ DE_UNREF(config);
+
if (VK_SUCCESS != vk.createEvent(device, &eventInfo, DE_NULL, &event))
return tcu::TestStatus::fail("Couldn't create event");
@@ -344,6 +346,9 @@
{
if (config.type == SynchronizationType::SYNCHRONIZATION2)
context.requireDeviceFunctionality("VK_KHR_synchronization2");
+
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") && !context.getPortabilitySubsetFeatures().events)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
}
} // anonymous
@@ -358,7 +363,7 @@
de::MovePtr<tcu::TestCaseGroup> basicTests (new tcu::TestCaseGroup(testCtx, "event", "Basic event tests"));
- addFunctionCase(basicTests.get(), "host_set_reset", "Basic event tests set and reset on host", hostResetSetEventCase);
+ addFunctionCase(basicTests.get(), "host_set_reset", "Basic event tests set and reset on host", checkSupport, hostResetSetEventCase, config);
addFunctionCase(basicTests.get(), "device_set_reset", "Basic event tests set and reset on device", checkSupport, deviceResetSetEventCase, config);
addFunctionCase(basicTests.get(), "single_submit_multi_command_buffer", "Wait and set event single submission on device", checkSupport, singleSubmissionCase, config);
addFunctionCase(basicTests.get(), "multi_submit_multi_command_buffer", "Wait and set event mutli submission on device", checkSupport, multiSubmissionCase, config);
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
index ab67d95..e324e20 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationBasicSemaphoreTests.cpp
@@ -30,10 +30,10 @@
#include "vkPlatform.hpp"
#include "vkQueryUtil.hpp"
#include "vkCmdUtil.hpp"
-
-
#include "vkRef.hpp"
+#include <thread>
+
#include "tcuCommandLine.hpp"
namespace vkt
@@ -177,9 +177,6 @@
tcu::TestStatus basicChainTimelineCase (Context& context, TestConfig config)
{
- if (!context.getTimelineSemaphoreFeatures().timelineSemaphore)
- TCU_THROW(NotSupportedError, "Timeline semaphore not supported");
-
VkResult err = VK_SUCCESS;
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice& device = context.getDevice();
@@ -245,6 +242,83 @@
return tcu::TestStatus::fail("Basic semaphore chain test failed");
}
+tcu::TestStatus basicThreadTimelineCase(Context& context, TestConfig)
+{
+ const DeviceInterface& vk = context.getDeviceInterface();
+ const VkDevice& device = context.getDevice();
+ const VkSemaphoreTypeCreateInfo scti = { VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR, DE_NULL, VK_SEMAPHORE_TYPE_TIMELINE_KHR, 0 };
+ const VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, &scti, 0 };
+ const VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, DE_NULL, 0 };
+ const vk::Unique<vk::VkSemaphore> semaphore (createSemaphore(vk, device, &sci));
+ const Unique<VkFence> fence (createFence(vk, device, &fci));
+ const deUint64 waitTimeout = 50ull * 1000000ull; // miliseconds
+ VkResult threadResult = VK_SUCCESS;
+
+ // helper creating VkSemaphoreSignalInfo
+ auto makeSemaphoreSignalInfo = [&semaphore](deUint64 value) -> VkSemaphoreSignalInfo
+ {
+ return
+ {
+ VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ *semaphore, // VkSemaphore semaphore
+ value // deUint64 value
+ };
+ };
+
+ // helper creating VkSemaphoreWaitInfo
+ auto makeSemaphoreWaitInfo = [&semaphore](deUint64* valuePtr) -> VkSemaphoreWaitInfo
+ {
+ return
+ {
+ VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, // VkStructureType sType
+ DE_NULL, // const void* pNext
+ VK_SEMAPHORE_WAIT_ANY_BIT, // VkSemaphoreWaitFlags flags;
+ 1u, // deUint32 semaphoreCount;
+ &*semaphore, // const VkSemaphore* pSemaphores;
+ valuePtr // const deUint64* pValues;
+ };
+ };
+
+ // start thread - semaphore has value 0
+ de::MovePtr<std::thread> thread(new std::thread([=, &vk, &threadResult]
+ {
+ // wait till semaphore has value 1
+ deUint64 waitValue = 1;
+ VkSemaphoreWaitInfo waitOne = makeSemaphoreWaitInfo(&waitValue);
+ threadResult = vk.waitSemaphores(device, &waitOne, waitTimeout);
+
+ if (threadResult == VK_SUCCESS)
+ {
+ // signal semaphore with value 2
+ VkSemaphoreSignalInfo signalTwo = makeSemaphoreSignalInfo(2);
+ threadResult = vk.signalSemaphore(device, &signalTwo);
+ }
+ }));
+
+ // wait some time to give thread chance to start
+ deSleep(1); // milisecond
+
+ // signal semaphore with value 1
+ VkSemaphoreSignalInfo signalOne = makeSemaphoreSignalInfo(1);
+ vk.signalSemaphore(device, &signalOne);
+
+ // wait till semaphore has value 2
+ deUint64 waitValue = 2;
+ VkSemaphoreWaitInfo waitTwo = makeSemaphoreWaitInfo(&waitValue);
+ VkResult mainResult = vk.waitSemaphores(device, &waitTwo, waitTimeout);
+
+ thread->join();
+
+ if (mainResult == VK_SUCCESS)
+ return tcu::TestStatus::pass("Pass");
+
+ if ((mainResult == VK_TIMEOUT) || (threadResult == VK_TIMEOUT))
+ return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Reached wait timeout");
+
+ return tcu::TestStatus::fail("Fail");
+}
+
tcu::TestStatus basicMultiQueueCase(Context& context, TestConfig config)
{
enum { NO_MATCH_FOUND = ~((deUint32)0) };
@@ -522,6 +596,10 @@
addFunctionCase(basicTests.get(), "multi_queue", "Basic timeline semaphore tests with multi queue", checkSupport, basicMultiQueueCase, config);
addFunctionCase(basicTests.get(), "chain", "Timeline semaphore chain test", checkSupport, basicChainTimelineCase, config);
+ // dont repeat this test for synchronization2
+ if (type == SynchronizationType::LEGACY)
+ addFunctionCase(basicTests.get(), "two_threads","Timeline semaphore used by two threads", checkSupport, basicThreadTimelineCase, config);
+
return basicTests.release();
}
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp
index 8e3d305..cf19295 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationCrossInstanceSharingTests.cpp
@@ -202,6 +202,11 @@
{
TCU_THROW(NotSupportedError, "Handle requires dedicated allocation, but test uses suballocated memory");
}
+
+ if (!(formatProperties.imageFormatProperties.sampleCounts & config.resource.imageSamples)) {
+ TCU_THROW(NotSupportedError, "Specified sample count for format not supported");
+ }
+
}
else
{
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
index 333f302..959f5ec 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperation.cpp
@@ -2652,9 +2652,7 @@
const DeviceInterface& vk = m_context.getDeviceInterface();
SynchronizationWrapperPtr synchronizationWrapper = getSynchronizationWrapper(m_context.getSynchronizationType(), vk, DE_FALSE);
- const VkImageMemoryBarrier2KHR imageMemoryBarriers2[]
- {
- makeImageMemoryBarrier2(
+ const VkImageMemoryBarrier2KHR imageMemoryBarriers2 = makeImageMemoryBarrier2(
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags2KHR srcStageMask
(VkAccessFlags)0, // VkAccessFlags2KHR srcAccessMask
m_pipelineStage, // VkPipelineStageFlags2KHR dstStageMask
@@ -2663,18 +2661,7 @@
VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout
m_outResource.getImage().handle, // VkImage image
m_outResource.getImage().subresourceRange // VkImageSubresourceRange subresourceRange
- ),
- makeImageMemoryBarrier2(
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // VkPipelineStageFlags2KHR srcStageMask
- (VkAccessFlags)0, // VkAccessFlags2KHR srcAccessMask
- m_pipelineStage, // VkPipelineStageFlags2KHR dstStageMask
- VK_ACCESS_2_SHADER_READ_BIT_KHR, // VkAccessFlags2KHR dstAccessMask
- VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout
- VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout
- m_inResource.getImage().handle, // VkImage image
- m_inResource.getImage().subresourceRange // VkImageSubresourceRange subresourceRange
- )
- };
+ );
VkDependencyInfoKHR dependencyInfo
{
VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR, // VkStructureType sType
@@ -2684,8 +2671,8 @@
DE_NULL, // const VkMemoryBarrier2KHR* pMemoryBarriers
0u, // deUint32 bufferMemoryBarrierCount
DE_NULL, // const VkBufferMemoryBarrier2KHR* pBufferMemoryBarriers
- 2, // deUint32 imageMemoryBarrierCount
- imageMemoryBarriers2 // const VkImageMemoryBarrier2KHR* pImageMemoryBarriers
+ 1, // deUint32 imageMemoryBarrierCount
+ &imageMemoryBarriers2 // const VkImageMemoryBarrier2KHR* pImageMemoryBarriers
};
synchronizationWrapper->cmdPipelineBarrier(cmdBuffer, &dependencyInfo);
}
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp
index 0c7f157..61c1678 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationOperationSingleQueueTests.cpp
@@ -281,7 +281,7 @@
&signalSemaphoreSubmitInfo
);
synchronizationWrapper->addSubmitInfo(
- 0u,
+ 1u,
&waitSemaphoreSubmitInfo,
1u,
&commandBufferSubmitInfo[READ],
@@ -640,6 +640,13 @@
{
if (m_type == SynchronizationType::SYNCHRONIZATION2)
context.requireDeviceFunctionality("VK_KHR_synchronization2");
+
+ if (SYNC_PRIMITIVE_EVENT == m_syncPrimitive &&
+ context.isDeviceFunctionalitySupported("VK_KHR_portability_subset") &&
+ !context.getPortabilitySubsetFeatures().events)
+ {
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Events are not supported by this implementation");
+ }
}
TestInstance* createInstance (Context& context) const
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp
index 61dc796..6e8b640 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationSignalOrderTests.cpp
@@ -29,6 +29,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktSynchronizationUtil.hpp"
#include "vktExternalMemoryUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkBarrierUtil.hpp"
#include "vkDefs.hpp"
@@ -40,6 +41,7 @@
#include "vkTypeUtil.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
#include "deRandom.hpp"
#include "deThread.hpp"
@@ -93,7 +95,7 @@
VK_CHECK(vk.signalSemaphore(device, &ssi));
}
-Move<VkDevice> createDevice (const Context& context)
+Move<VkDevice> createTestDevice (const Context& context)
{
const float priority = 0.0f;
const std::vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), context.getPhysicalDevice());
@@ -170,7 +172,8 @@
0u
};
- return createDevice(context.getPlatformInterface(), context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &createInfo);
+ const auto validation = context.getTestContext().getCommandLine().isValidationEnabled();
+ return createCustomDevice(validation, context.getPlatformInterface(), context.getInstance(), context.getInstanceInterface(), context.getPhysicalDevice(), &createInfo);
}
catch (const vk::Error& error)
{
@@ -185,7 +188,7 @@
class SingletonDevice
{
SingletonDevice (const Context& context)
- : m_logicalDevice (createDevice(context))
+ : m_logicalDevice (createTestDevice(context))
{
}
@@ -499,7 +502,7 @@
{
VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR,
DE_NULL,
- VK_SEMAPHORE_TYPE_TIMELINE_KHR,
+ semaphoreType,
0,
};
const VkPhysicalDeviceExternalSemaphoreInfo info =
diff --git a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp
index d5f9d75..8440274 100644
--- a/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp
+++ b/external/vulkancts/modules/vulkan/synchronization/vktSynchronizationTimelineSemaphoreTests.cpp
@@ -29,6 +29,7 @@
#include "vktTestCaseUtil.hpp"
#include "vktSynchronizationUtil.hpp"
#include "vktExternalMemoryUtil.hpp"
+#include "vktCustomInstancesDevices.hpp"
#include "vkBarrierUtil.hpp"
#include "vkDefs.hpp"
@@ -41,6 +42,7 @@
#include "vkBufferWithMemory.hpp"
#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
#include "deClock.h"
#include "deRandom.hpp"
@@ -632,6 +634,7 @@
const DeviceInterface& vk = context.getDeviceInterface();
const VkDevice& device = context.getDevice();
+ const VkQueue queue = context.getUniversalQueue();
const deUint64 maxTimelineValueDifference = getMaxTimelineSemaphoreValueDifference(context.getInstanceInterface(), context.getPhysicalDevice());
de::Random rng (1234);
const deUint64 nonZeroValue = 1 + rng.getUint64() % (maxTimelineValueDifference - 1);
@@ -656,6 +659,26 @@
if (result != VK_SUCCESS)
return tcu::TestStatus::fail("Wait zero initial value failed");
+ {
+ VkSemaphoreSubmitInfoKHR waitSemaphoreSubmitInfo = makeCommonSemaphoreSubmitInfo(*semaphoreDefaultValue, initialValue, VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR);
+ SynchronizationWrapperPtr synchronizationWrapper = getSynchronizationWrapper(type, vk, DE_TRUE);
+
+ synchronizationWrapper->addSubmitInfo(
+ 1u, // deUint32 waitSemaphoreInfoCount
+ &waitSemaphoreSubmitInfo, // const VkSemaphoreSubmitInfoKHR* pWaitSemaphoreInfos
+ 0u, // deUint32 commandBufferInfoCount
+ DE_NULL, // const VkCommandBufferSubmitInfoKHR* pCommandBufferInfos
+ 0u, // deUint32 signalSemaphoreInfoCount
+ DE_NULL, // const VkSemaphoreSubmitInfoKHR* pSignalSemaphoreInfos
+ DE_TRUE,
+ DE_FALSE
+ );
+
+ VK_CHECK(synchronizationWrapper->queueSubmit(queue, DE_NULL));
+
+ VK_CHECK(vk.deviceWaitIdle(device));
+ }
+
VK_CHECK(vk.getSemaphoreCounterValue(device, *semaphoreDefaultValue, &value));
if (value != initialValue)
return tcu::TestStatus::fail("Invalid zero initial value");
@@ -1256,7 +1279,7 @@
return infos;
}
-Move<VkDevice> createDevice(const Context& context, SynchronizationType type)
+Move<VkDevice> createTestDevice(const Context& context, SynchronizationType type)
{
const std::vector<VkQueueFamilyProperties> queueFamilyProperties = getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), context.getPhysicalDevice());
std::vector<VkDeviceQueueCreateInfo> queueCreateInfos = getQueueCreateInfo(queueFamilyProperties);
@@ -1302,8 +1325,10 @@
queueCreateInfo.pQueuePriorities = &(*queuePriorities.back().get())[0];
}
- return createDevice(context.getPlatformInterface(), context.getInstance(),
- context.getInstanceInterface(), context.getPhysicalDevice(), &deviceInfo);
+ const auto validation = context.getTestContext().getCommandLine().isValidationEnabled();
+
+ return createCustomDevice(validation, context.getPlatformInterface(), context.getInstance(),
+ context.getInstanceInterface(), context.getPhysicalDevice(), &deviceInfo);
}
@@ -1311,7 +1336,7 @@
class SingletonDevice
{
SingletonDevice (const Context& context, SynchronizationType type)
- : m_logicalDevice (createDevice(context, type))
+ : m_logicalDevice (createTestDevice(context, type))
{
}
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationCoordinatesTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationCoordinatesTests.cpp
index ee71ae4..54eaf11 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationCoordinatesTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationCoordinatesTests.cpp
@@ -371,6 +371,7 @@
const bool executionModeInEvaluationShader = true);
void initPrograms (SourceCollections& programCollection) const;
+ void checkSupport (Context& context) const;
TestInstance* createInstance (Context& context) const;
private:
@@ -390,6 +391,15 @@
{
}
+void TessCoordTest::checkSupport (Context& context) const
+{
+ if (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR* const features = getPortability(context))
+ {
+ checkPointMode(*features);
+ checkPrimitive(*features, m_primitiveType);
+ }
+}
+
void TessCoordTest::initPrograms (SourceCollections& programCollection) const
{
if (m_executionModeInEvaluationShader)
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationFractionalSpacingTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationFractionalSpacingTests.cpp
index 62d30b2..72e2a5c 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationFractionalSpacingTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationFractionalSpacingTests.cpp
@@ -649,6 +649,15 @@
return (success ? tcu::TestStatus::pass("OK") : tcu::TestStatus::fail("Failure"));
}
+void checkSupportTess(Context& context, const TestParams)
+{
+ if (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR* const features = getPortability(context))
+ {
+ checkPointMode(*features);
+ checkIsolines(*features);
+ }
+}
+
} // anonymous
//! These tests correspond to dEQP-GLES31.functional.tessellation.fractional_spacing.*
@@ -657,10 +666,10 @@
{
de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "fractional_spacing", "Test fractional spacing modes"));
- addFunctionCaseWithPrograms(group.get(), "glsl_odd", "", initPrograms, test, TestParams(SHADER_LANGUAGE_GLSL, SPACINGMODE_FRACTIONAL_ODD));
- addFunctionCaseWithPrograms(group.get(), "glsl_even", "", initPrograms, test, TestParams(SHADER_LANGUAGE_GLSL, SPACINGMODE_FRACTIONAL_EVEN));
- addFunctionCaseWithPrograms(group.get(), "hlsl_odd", "", initPrograms, test, TestParams(SHADER_LANGUAGE_HLSL, SPACINGMODE_FRACTIONAL_ODD));
- addFunctionCaseWithPrograms(group.get(), "hlsl_even", "", initPrograms, test, TestParams(SHADER_LANGUAGE_HLSL, SPACINGMODE_FRACTIONAL_EVEN));
+ addFunctionCaseWithPrograms(group.get(), "glsl_odd", "", checkSupportTess, initPrograms, test, TestParams(SHADER_LANGUAGE_GLSL, SPACINGMODE_FRACTIONAL_ODD));
+ addFunctionCaseWithPrograms(group.get(), "glsl_even", "", checkSupportTess, initPrograms, test, TestParams(SHADER_LANGUAGE_GLSL, SPACINGMODE_FRACTIONAL_EVEN));
+ addFunctionCaseWithPrograms(group.get(), "hlsl_odd", "", checkSupportTess, initPrograms, test, TestParams(SHADER_LANGUAGE_HLSL, SPACINGMODE_FRACTIONAL_ODD));
+ addFunctionCaseWithPrograms(group.get(), "hlsl_even", "", checkSupportTess, initPrograms, test, TestParams(SHADER_LANGUAGE_HLSL, SPACINGMODE_FRACTIONAL_EVEN));
return group.release();
}
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPassthroughTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPassthroughTests.cpp
index b005e6d..2c3ca8c 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPassthroughTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPassthroughTests.cpp
@@ -127,6 +127,7 @@
{
public:
void initPrograms (vk::SourceCollections& programCollection) const;
+ void checkSupport (Context& context) const;
TestInstance* createInstance (Context& context) const;
IdentityGeometryShaderTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TessPrimitiveType primitiveType)
@@ -139,6 +140,11 @@
const TessPrimitiveType m_primitiveType;
};
+void IdentityGeometryShaderTestCase::checkSupport (Context& context) const
+{
+ checkSupportPrimitive(context, m_primitiveType);
+}
+
void IdentityGeometryShaderTestCase::initPrograms (vk::SourceCollections& programCollection) const
{
addVertexAndFragmentShaders(programCollection);
@@ -216,6 +222,7 @@
{
public:
void initPrograms (vk::SourceCollections& programCollection) const;
+ void checkSupport (Context& context) const;
TestInstance* createInstance (Context& context) const;
IdentityTessellationShaderTestCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TessPrimitiveType primitiveType)
@@ -228,6 +235,11 @@
const TessPrimitiveType m_primitiveType;
};
+void IdentityTessellationShaderTestCase::checkSupport (Context& context) const
+{
+ checkSupportPrimitive(context, m_primitiveType);
+}
+
//! Geometry shader used in passthrough tessellation shader case.
std::string generateGeometryShader (const TessPrimitiveType primitiveType, const std::string& colorSourceName)
{
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPointSizeTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPointSizeTests.cpp
index 5df3ed1..3dc453e 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPointSizeTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationGeometryPointSizeTests.cpp
@@ -435,6 +435,13 @@
return buf.str();
}
+void checkSupportTess (Context& context, const Flags flags)
+{
+ if (isTessellationStage(flags))
+ if (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR* const features = getPortability(context))
+ checkPointMode(*features);
+}
+
} // anonymous
//! Ported from dEQP-GLES31.functional.tessellation_geometry_interaction.point_size.*
@@ -459,7 +466,7 @@
const std::string name = getTestCaseName (caseFlags[ndx]);
const std::string desc = getTestCaseDescription(caseFlags[ndx]);
- addFunctionCaseWithPrograms(group.get(), name, desc, initPrograms, test, caseFlags[ndx]);
+ addFunctionCaseWithPrograms(group.get(), name, desc, checkSupportTess, initPrograms, test, caseFlags[ndx]);
}
return group.release();
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationInvarianceTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationInvarianceTests.cpp
index 01cb0ff..3be1785 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationInvarianceTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationInvarianceTests.cpp
@@ -1027,6 +1027,12 @@
return new OuterEdgeDivisionTestInstance(context, m_caseDef);
};
+ void checkSupport (Context& context) const
+ {
+ if (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR* const features = getPortability(context))
+ checkPointMode(*features);
+ }
+
private:
const CaseDefinition m_caseDef;
};
@@ -1051,6 +1057,11 @@
return new OuterEdgeIndexIndependenceTestInstance(context, m_caseDef);
};
+ void checkSupport (Context& context) const
+ {
+ checkSupportCase(context, m_caseDef);
+ }
+
private:
const CaseDefinition m_caseDef;
};
@@ -1075,6 +1086,11 @@
return new SymmetricOuterEdgeTestInstance(context, m_caseDef);
};
+ void checkSupport (Context& context) const
+ {
+ checkSupportCase(context, m_caseDef);
+ }
+
private:
const CaseDefinition m_caseDef;
};
@@ -1266,6 +1282,7 @@
virtual ~InvarianceTestCase (void) {}
void initPrograms (SourceCollections& programCollection) const;
+ void checkSupport (Context& context) const;
TestInstance* createInstance (Context& context) const;
private:
@@ -1277,6 +1294,11 @@
addDefaultPrograms(programCollection, m_caseDef.primitiveType, m_caseDef.spacingMode, m_caseDef.windingUsage, getPointModeUsage(m_caseDef.usePointMode));
}
+void InvarianceTestCase::checkSupport (Context& context) const
+{
+ checkSupportCase(context, m_caseDef);
+}
+
class InvarianceTestInstance : public TestInstance
{
public:
@@ -2137,13 +2159,13 @@
tcu::TestCase* makeTessCoordRangeTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TessPrimitiveType primitiveType, const SpacingMode spacingMode, const Winding winding, const bool usePointMode)
{
const CaseDefinition caseDef = { CASETYPE_TESS_COORD_RANGE, primitiveType, spacingMode, winding, usePointMode };
- return createFunctionCaseWithPrograms(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, description, initPrograms, test, caseDef);
+ return createFunctionCaseWithPrograms(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, description, checkSupportCase, initPrograms, test, caseDef);
}
tcu::TestCase* makeOneMinusTessCoordTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const TessPrimitiveType primitiveType, const SpacingMode spacingMode, const Winding winding, const bool usePointMode)
{
const CaseDefinition caseDef = { CASETYPE_ONE_MINUS_TESS_COORD, primitiveType, spacingMode, winding, usePointMode };
- return createFunctionCaseWithPrograms(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, description, initPrograms, test, caseDef);
+ return createFunctionCaseWithPrograms(testCtx, tcu::NODETYPE_SELF_VALIDATE, name, description, checkSupportCase, initPrograms, test, caseDef);
}
} // TessCoordComponent ns
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationMiscDrawTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationMiscDrawTests.cpp
index 458d6a7..610628a 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationMiscDrawTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationMiscDrawTests.cpp
@@ -585,7 +585,7 @@
const SpacingMode spacingMode = static_cast<SpacingMode>(spacingModeNdx);
const std::string caseName = std::string() + "isolines_" + getSpacingModeShaderName(spacingMode);
- addFunctionCaseWithPrograms(group.get(), caseName, "Basic isolines render test",
+ addFunctionCaseWithPrograms(group.get(), caseName, "Basic isolines render test", checkSupportCase,
initProgramsIsolinesCase, runTest, makeCaseDefinition(TESSPRIMITIVETYPE_ISOLINES, spacingMode, getReferenceImagePathPrefix(caseName)));
}
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationPrimitiveDiscardTests.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationPrimitiveDiscardTests.cpp
index 1927ea9..4b7fd86 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationPrimitiveDiscardTests.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationPrimitiveDiscardTests.cpp
@@ -626,7 +626,7 @@
+ (caseDef.usePointMode ? "_point_mode" : "")
+ (caseDef.useLessThanOneInnerLevels ? "" : "_valid_levels");
- addFunctionCaseWithPrograms(group.get(), caseName, "", initPrograms, test, caseDef);
+ addFunctionCaseWithPrograms(group.get(), caseName, "", checkSupportCase, initPrograms, test, caseDef);
}
return group.release();
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp
index 106ee04..b1597b3 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp
@@ -436,6 +436,7 @@
public:
UserDefinedIOTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const CaseDefinition caseDef);
void initPrograms (vk::SourceCollections& programCollection) const;
+ void checkSupport (Context& context) const;
TestInstance* createInstance (Context& context) const;
private:
@@ -449,6 +450,11 @@
std::string m_tesStatements;
};
+void UserDefinedIOTest::checkSupport (Context& context) const
+{
+ checkSupportCase(context, m_caseDef);
+}
+
UserDefinedIOTest::UserDefinedIOTest (tcu::TestContext& testCtx, const std::string& name, const std::string& description, const CaseDefinition caseDef)
: TestCase (testCtx, name, description)
, m_caseDef (caseDef)
diff --git a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.hpp b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.hpp
index 9b7ba42..09c74ea 100644
--- a/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.hpp
+++ b/external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.hpp
@@ -31,6 +31,7 @@
#include "vkRefUtil.hpp"
#include "vkQueryUtil.hpp"
#include "vkObjUtil.hpp"
+#include "vktTestCase.hpp"
#include "tcuVector.hpp"
#include "tcuMaybe.hpp"
@@ -372,6 +373,37 @@
}
}
+static inline const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR* getPortability (const Context& context)
+{
+ if (context.isDeviceFunctionalitySupported("VK_KHR_portability_subset"))
+ return &context.getPortabilitySubsetFeatures();
+ return DE_NULL;
+}
+
+static inline void checkIsolines (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR& features)
+{
+ if (!features.tessellationIsolines)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Tessellation iso lines are not supported by this implementation");
+}
+
+static inline void checkPrimitive (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR& features, const TessPrimitiveType primitive)
+{
+ if (primitive == TESSPRIMITIVETYPE_ISOLINES)
+ checkIsolines(features);
+}
+
+static inline void checkSupportPrimitive (Context& context, const TessPrimitiveType primitive)
+{
+ if (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR* const features = getPortability(context))
+ checkPrimitive(*features, primitive);
+}
+
+static inline void checkPointMode (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR& features)
+{
+ if (!features.tessellationPointMode)
+ TCU_THROW(NotSupportedError, "VK_KHR_portability_subset: Tessellation point mode is not supported by this implementation");
+}
+
template<typename T>
inline std::size_t sizeInBytes (const std::vector<T>& vec)
{
@@ -448,6 +480,34 @@
return results;
}
+template <typename CaseDef, typename = bool>
+struct PointMode
+{
+ static void check(const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR&, const CaseDef)
+ {
+ }
+};
+
+template <typename CaseDef>
+struct PointMode<CaseDef, decltype(CaseDef().usePointMode)>
+{
+ static void check(const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR& features, const CaseDef caseDef)
+ {
+ if (caseDef.usePointMode)
+ checkPointMode(features);
+ }
+};
+
+template <typename CaseDef>
+void checkSupportCase (Context& context, const CaseDef caseDef)
+{
+ if (const vk::VkPhysicalDevicePortabilitySubsetFeaturesKHR* const features = getPortability(context))
+ {
+ PointMode<CaseDef>::check(*features, caseDef);
+ checkPrimitive(*features, caseDef.primitiveType);
+ }
+}
+
} // tessellation
} // vkt
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureCompressedFormatTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureCompressedFormatTests.cpp
index 9ea2c51..65a2b14 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureCompressedFormatTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureCompressedFormatTests.cpp
@@ -392,6 +392,8 @@
return isOk ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Image verification failed");
}
+} // anonymous
+
void populateTextureCompressedFormatTests (tcu::TestCaseGroup* compressedTextureTests)
{
tcu::TestContext& testCtx = compressedTextureTests->getTestContext();
@@ -443,8 +445,6 @@
}
}
-} // anonymous
-
tcu::TestCaseGroup* createTextureCompressedFormatTests (tcu::TestContext& testCtx)
{
return createTestGroup(testCtx, "compressed", "Texture compressed format tests.", populateTextureCompressedFormatTests);
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureFilteringExplicitLodTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureFilteringExplicitLodTests.cpp
index 979103e..0d4e6ab 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureFilteringExplicitLodTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureFilteringExplicitLodTests.cpp
@@ -28,6 +28,7 @@
#include "vktSampleVerifier.hpp"
#include "vktShaderExecutor.hpp"
#include "vktTestCaseUtil.hpp"
+#include "vktTextureTestUtil.hpp"
#include "vkDeviceUtil.hpp"
#include "vkImageUtil.hpp"
@@ -952,6 +953,11 @@
void initSpec (void);
+ void checkSupport (Context& context) const
+ {
+ util::checkTextureSupport(context, m_testCaseData.imParams.format);
+ }
+
virtual void initPrograms (vk::SourceCollections& programCollection) const
{
generateSources(m_testCaseData.shaderType, m_shaderSpec, programCollection);
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp
index c7bac52..148a5fc 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp
@@ -1045,6 +1045,9 @@
(tcu::TexVerifierUtil::isLinearFilter(minFilter) || tcu::TexVerifierUtil::isLinearFilter(magFilter) ||
tcu::TexVerifierUtil::isCubicFilter(minFilter) || tcu::TexVerifierUtil::isCubicFilter(magFilter)));
}
+
+} // anonymous
+
void populateTextureFilteringTests (tcu::TestCaseGroup* textureFilteringTests)
{
tcu::TestContext& testCtx = textureFilteringTests->getTestContext();
@@ -1781,8 +1784,6 @@
}
}
-} // anonymous
-
tcu::TestCaseGroup* createTextureFilteringTests (tcu::TestContext& testCtx)
{
return createTestGroup(testCtx, "filtering", "Texture filtering tests.", populateTextureFilteringTests);
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp
index bf637c8..b21c0f8 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp
@@ -1698,6 +1698,8 @@
}
};
+} // anonymous
+
void populateTextureMipmappingTests (tcu::TestCaseGroup* textureMipmappingTests)
{
tcu::TestContext& testCtx = textureMipmappingTests->getTestContext();
@@ -2164,8 +2166,6 @@
}
}
-} // anonymous
-
tcu::TestCaseGroup* createTextureMipmappingTests (tcu::TestContext& testCtx)
{
return createTestGroup(testCtx, "mipmap", "Texture mipmapping tests.", populateTextureMipmappingTests);
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureShadowTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureShadowTests.cpp
index 764167c..3066c43 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureShadowTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureShadowTests.cpp
@@ -813,6 +813,8 @@
return m_caseNdx < (int)m_cases.size() ? tcu::TestStatus::incomplete() : tcu::TestStatus::pass("Pass");
}
+} // anonymous
+
void populateTextureShadowTests (tcu::TestCaseGroup* textureShadowTests)
{
tcu::TestContext& testCtx = textureShadowTests->getTestContext();
@@ -995,8 +997,6 @@
}
}
-} // anonymous
-
tcu::TestCaseGroup* createTextureShadowTests (tcu::TestContext& testCtx)
{
return createTestGroup(testCtx, "shadow", "Texture shadow tests.", populateTextureShadowTests);
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureSwizzleTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureSwizzleTests.cpp
index 729674f..c01a2bb 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureSwizzleTests.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureSwizzleTests.cpp
@@ -283,6 +283,8 @@
return isOk ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Image verification failed");
}
+} // anonymous
+
void populateTextureSwizzleTests (tcu::TestCaseGroup* textureSwizzleTests)
{
tcu::TestContext& testCtx = textureSwizzleTests->getTestContext();
@@ -523,8 +525,6 @@
textureSwizzleTests->addChild(groupTexCoord.release());
}
-} // anonymous
-
tcu::TestCaseGroup* createTextureSwizzleTests (tcu::TestContext& testCtx)
{
return createTestGroup(testCtx, "swizzle", "Texture swizzle tests.", populateTextureSwizzleTests);
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp
index 14b2cbe..477f5a4 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp
@@ -1251,7 +1251,8 @@
samplerCreateInfo.maxAnisotropy = maxAnisotropy;
}
- if (samplerCreateInfo.magFilter == VK_FILTER_LINEAR || samplerCreateInfo.minFilter == VK_FILTER_LINEAR || samplerCreateInfo.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR)
+ bool linFilt = (samplerCreateInfo.magFilter == VK_FILTER_LINEAR || samplerCreateInfo.minFilter == VK_FILTER_LINEAR || samplerCreateInfo.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR);
+ if (linFilt && samplerCreateInfo.compareEnable == VK_FALSE)
{
const pipeline::TestTexture& testTexture = m_textureBindings[texUnit]->getTestTexture();
const VkFormat textureFormat = testTexture.isCompressed() ? mapCompressedTextureFormat(testTexture.getCompressedLevel(0, 0).getFormat())
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.hpp b/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.hpp
index 7acf075..dae4252 100644
--- a/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.hpp
+++ b/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.hpp
@@ -171,6 +171,9 @@
vk::VkComponentMapping m_componentMapping;
};
+void checkTextureSupport (Context& context, const vk::VkFormat imageFormat, const vk::VkComponentMapping& imageComponents,
+ const vk::VkFormat viewFormat, const vk::VkComponentMapping& viewComponents);
+
typedef de::SharedPtr<TextureBinding> TextureBindingSp;
class TextureRenderer
@@ -321,6 +324,7 @@
{
initializePrograms(programCollection, m_testsParameters.texCoordPrecision, m_testsParameters.programs);
}
+
virtual void checkSupport (Context& context) const
{
checkTextureSupport(context, m_testsParameters);
diff --git a/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp b/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp
index 19b74c3..0c460b2 100644
--- a/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp
+++ b/external/vulkancts/modules/vulkan/transform_feedback/vktTransformFeedbackSimpleTests.cpp
@@ -44,6 +44,7 @@
#include <iostream>
#include <functional>
#include <set>
+#include <algorithm>
namespace vkt
{
@@ -87,6 +88,7 @@
TEST_TYPE_QUERY_GET,
TEST_TYPE_QUERY_COPY,
TEST_TYPE_QUERY_RESET,
+ TEST_TYPE_MULTIQUERY,
TEST_TYPE_LAST
};
@@ -110,6 +112,12 @@
bool noOffsetArray;
};
+struct TransformFeedbackQuery
+{
+ deUint32 written;
+ deUint32 attempts;
+};
+
const deUint32 MINIMUM_TF_BUFFER_SIZE = (1<<27);
const deUint32 IMAGE_SIZE = 64u;
@@ -385,7 +393,6 @@
TransformFeedbackTestInstance (Context& context, const TestParameters& parameters);
protected:
void validateLimits ();
- deUint32 getNextChunkSize (const deUint32 usedBytes, const deUint32 bufBytes);
std::vector<VkDeviceSize> generateSizesList (const size_t bufBytes, const size_t chunkCount);
std::vector<VkDeviceSize> generateOffsetsList (const std::vector<VkDeviceSize>& sizesList);
void verifyTransformFeedbackBuffer (const MovePtr<Allocation>& bufAlloc,
@@ -1011,7 +1018,7 @@
invalidateAlloc(vk, device, *bufAlloc);
- const deUint32 numPoints = static_cast<deUint32>(bufBytes / sizeof(float));
+ const deUint32 numPoints = bufBytes / static_cast<deUint32>(sizeof(float));
const deUint8* tfDataBytes = (deUint8*)bufAlloc->getHostPtr();
const float* tfData = (float*)&tfDataBytes[offset];
@@ -1880,6 +1887,210 @@
return tcu::TestStatus::pass("Pass");
}
+class TransformFeedbackMultiQueryTestInstance : public TransformFeedbackTestInstance
+{
+public:
+ TransformFeedbackMultiQueryTestInstance (Context& context, const TestParameters& parameters);
+
+protected:
+ std::vector<VkDeviceSize> generateSizesList (const size_t bufBytes, const size_t chunkCount);
+ void verifyTransformFeedbackBuffer (const MovePtr<Allocation>& bufAlloc, const deUint32 bufBytes, const deUint32 bufOffset, const float expected);
+ tcu::TestStatus iterate (void);
+};
+
+TransformFeedbackMultiQueryTestInstance::TransformFeedbackMultiQueryTestInstance (Context& context, const TestParameters& parameters)
+ : TransformFeedbackTestInstance (context, parameters)
+{
+ const InstanceInterface& vki = m_context.getInstanceInterface();
+ const VkPhysicalDevice physDevice = m_context.getPhysicalDevice();
+ const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
+ const VkPhysicalDeviceTransformFeedbackFeaturesEXT& transformFeedbackFeatures = m_context.getTransformFeedbackFeaturesEXT();
+ const deUint32 streamsSupported = m_transformFeedbackProperties.maxTransformFeedbackStreams;
+ const deUint32 streamsRequired = m_parameters.streamId + 1;
+ const deUint32 tfBuffersSupported = m_transformFeedbackProperties.maxTransformFeedbackBuffers;
+ const deUint32 tfBuffersRequired = m_parameters.partCount;
+ const deUint32 bytesPerVertex = m_parameters.bufferSize / m_parameters.partCount;
+ const deUint32 tfStreamDataSizeSupported = m_transformFeedbackProperties.maxTransformFeedbackStreamDataSize;
+ const deUint32 tfBufferDataSizeSupported = m_transformFeedbackProperties.maxTransformFeedbackBufferDataSize;
+ const deUint32 tfBufferDataStrideSupported = m_transformFeedbackProperties.maxTransformFeedbackBufferDataStride;
+
+ DE_ASSERT(m_parameters.partCount == 2u);
+
+ if (!features.geometryShader)
+ TCU_THROW(NotSupportedError, "Missing feature: geometryShader");
+
+ if (transformFeedbackFeatures.geometryStreams == DE_FALSE)
+ TCU_THROW(NotSupportedError, "geometryStreams feature is not supported");
+
+ if (streamsSupported < streamsRequired)
+ TCU_THROW(NotSupportedError, std::string("maxTransformFeedbackStreams=" + de::toString(streamsSupported) + ", while test requires " + de::toString(streamsRequired)).c_str());
+
+ if (tfBuffersSupported < tfBuffersRequired)
+ TCU_THROW(NotSupportedError, std::string("maxTransformFeedbackBuffers=" + de::toString(tfBuffersSupported) + ", while test requires " + de::toString(tfBuffersRequired)).c_str());
+
+ if (tfStreamDataSizeSupported < bytesPerVertex)
+ TCU_THROW(NotSupportedError, std::string("maxTransformFeedbackStreamDataSize=" + de::toString(tfStreamDataSizeSupported) + ", while test requires " + de::toString(bytesPerVertex)).c_str());
+
+ if (tfBufferDataSizeSupported < bytesPerVertex)
+ TCU_THROW(NotSupportedError, std::string("maxTransformFeedbackBufferDataSize=" + de::toString(tfBufferDataSizeSupported) + ", while test requires " + de::toString(bytesPerVertex)).c_str());
+
+ if (tfBufferDataStrideSupported < bytesPerVertex)
+ TCU_THROW(NotSupportedError, std::string("maxTransformFeedbackBufferDataStride=" + de::toString(tfBufferDataStrideSupported) + ", while test requires " + de::toString(bytesPerVertex)).c_str());
+
+ if (m_transformFeedbackProperties.transformFeedbackQueries == DE_FALSE)
+ TCU_THROW(NotSupportedError, "transformFeedbackQueries feature is not supported");
+}
+
+std::vector<VkDeviceSize> TransformFeedbackMultiQueryTestInstance::generateSizesList (const size_t bufBytes, const size_t chunkCount)
+{
+ const VkDeviceSize chunkSize = bufBytes / chunkCount;
+ std::vector<VkDeviceSize> result (chunkCount, chunkSize);
+
+ DE_ASSERT(chunkSize * chunkCount == bufBytes);
+ DE_ASSERT(bufBytes <= MINIMUM_TF_BUFFER_SIZE);
+ DE_ASSERT(bufBytes % sizeof(deUint32) == 0);
+ DE_ASSERT(chunkCount > 0);
+ DE_ASSERT(result.size() == chunkCount);
+
+ return result;
+}
+
+void TransformFeedbackMultiQueryTestInstance::verifyTransformFeedbackBuffer (const MovePtr<Allocation>& bufAlloc, const deUint32 bufBytes, const deUint32 bufOffset, const float expected)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+
+ invalidateAlloc(vk, device, *bufAlloc);
+
+ const deUint32 numPoints = bufBytes / static_cast<deUint32>(sizeof(float));
+ const deUint8* tfDataRaw = reinterpret_cast<const deUint8*>(bufAlloc->getHostPtr());
+ const float* tfData = reinterpret_cast<const float*>(&tfDataRaw[bufOffset]);
+
+ for (deUint32 i = 0; i < numPoints; ++i)
+ if (tfData[i] != expected)
+ TCU_FAIL(std::string("Failed at item ") + de::toString(i) + " received:" + de::toString(tfData[i]) + " expected:" + de::toString(expected));
+}
+
+tcu::TestStatus TransformFeedbackMultiQueryTestInstance::iterate (void)
+{
+ const DeviceInterface& vk = m_context.getDeviceInterface();
+ const VkDevice device = m_context.getDevice();
+ const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
+ const std::vector<deUint32> queueFamilyIndices = { queueFamilyIndex };
+ const VkQueue queue = m_context.getUniversalQueue();
+ Allocator& allocator = m_context.getDefaultAllocator();
+
+ const Unique<VkRenderPass> renderPass (makeRenderPass (vk, device, VK_FORMAT_UNDEFINED));
+
+ const Unique<VkShaderModule> vertModule (createShaderModule (vk, device, m_context.getBinaryCollection().get("vert"), 0u));
+ const Unique<VkShaderModule> geomModule (createShaderModule (vk, device, m_context.getBinaryCollection().get("geom"), 0u));
+
+ const Unique<VkFramebuffer> framebuffer (makeFramebuffer (vk, device, *renderPass, 0u, DE_NULL, m_imageExtent2D.width, m_imageExtent2D.height));
+ const Unique<VkPipelineLayout> pipelineLayout (TransformFeedback::makePipelineLayout (vk, device));
+ const Unique<VkPipeline> pipeline (makeGraphicsPipeline (vk, device, *pipelineLayout, *renderPass, *vertModule, DE_NULL, DE_NULL, *geomModule, DE_NULL, m_imageExtent2D, 0u));
+ const Unique<VkCommandPool> cmdPool (createCommandPool (vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
+ const Unique<VkCommandBuffer> cmdBuffer (allocateCommandBuffer (vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+
+ const VkBufferCreateInfo tfBufCreateInfo = makeBufferCreateInfo(m_parameters.bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT);
+ const Move<VkBuffer> tfBuf = createBuffer(vk, device, &tfBufCreateInfo);
+ const std::vector<VkBuffer> tfBufArray = std::vector<VkBuffer>(m_parameters.partCount, *tfBuf);
+ const MovePtr<Allocation> tfBufAllocation = allocator.allocate(getBufferMemoryRequirements(vk, device, *tfBuf), MemoryRequirement::HostVisible);
+ const VkMemoryBarrier tfMemoryBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, VK_ACCESS_HOST_READ_BIT);
+ const std::vector<VkDeviceSize> tfBufBindingSizes = generateSizesList(m_parameters.bufferSize, m_parameters.partCount);
+ const std::vector<VkDeviceSize> tfBufBindingOffsets = generateOffsetsList(tfBufBindingSizes);
+ const std::vector<float> tfBufExpectedValues = { 0.5f, 0.5f + float(m_parameters.streamId) };
+ const deUint32 maxBufferSizeBytes = static_cast<deUint32>(*std::max_element(tfBufBindingSizes.begin(), tfBufBindingSizes.end()));
+ const deUint32 bytesPerVertex = static_cast<deUint32>(4 * sizeof(float));
+ const deUint32 numVerticesInBuffer = maxBufferSizeBytes / bytesPerVertex;
+ const deUint32 numDrawVertices = numVerticesInBuffer / 2;
+
+ const deUint32 queryIndex = 0u;
+ const deUint32 queryCountersNumber = 2u;
+ const deUint32 queryStride = sizeof(TransformFeedbackQuery);
+ const deUint32 queryDataSize = queryCountersNumber * queryStride;
+ const VkQueryPoolCreateInfo queryPoolCreateInfo = makeQueryPoolCreateInfo(queryCountersNumber);
+ const Unique<VkQueryPool> queryPool (createQueryPool(vk, device, &queryPoolCreateInfo));
+ const deUint32 queryInvalidCounterValue = 999999u;
+ std::vector<TransformFeedbackQuery> queryResultData (queryCountersNumber, TransformFeedbackQuery{ queryInvalidCounterValue, queryInvalidCounterValue });
+ const std::vector<TransformFeedbackQuery> queryExpectedData ({ TransformFeedbackQuery{ numVerticesInBuffer, 3 * numDrawVertices }, TransformFeedbackQuery{ numDrawVertices, numDrawVertices } });
+
+ const VkBufferCreateInfo queryBufferCreateInfo = makeBufferCreateInfo(queryDataSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, queueFamilyIndices);
+ const Move<VkBuffer> queryPoolResultsBuffer = createBuffer(vk, device, &queryBufferCreateInfo);
+ const MovePtr<Allocation> queryPoolResultsBufferAlloc = allocator.allocate(getBufferMemoryRequirements(vk, device, *queryPoolResultsBuffer), MemoryRequirement::HostVisible);
+
+ DE_ASSERT(queryCountersNumber == queryExpectedData.size());
+
+ VK_CHECK(vk.bindBufferMemory(device, *queryPoolResultsBuffer, queryPoolResultsBufferAlloc->getMemory(), queryPoolResultsBufferAlloc->getOffset()));
+
+ VK_CHECK(vk.bindBufferMemory(device, *tfBuf, tfBufAllocation->getMemory(), tfBufAllocation->getOffset()));
+
+ beginCommandBuffer(vk, *cmdBuffer);
+ {
+ vk.cmdResetQueryPool(*cmdBuffer, *queryPool, queryIndex, queryCountersNumber);
+
+ beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, makeRect2D(m_imageExtent2D));
+ {
+ vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
+
+ vk.cmdBindTransformFeedbackBuffersEXT(*cmdBuffer, 0u, m_parameters.partCount, &tfBufArray[0], &tfBufBindingOffsets[0], &tfBufBindingSizes[0]);
+
+ vk.cmdBeginQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex + 0, 0u, 0u);
+ vk.cmdBeginQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex + 1, 0u, m_parameters.streamId);
+ {
+ vk.cmdBeginTransformFeedbackEXT(*cmdBuffer, 0, 0, DE_NULL, DE_NULL);
+ {
+ vk.cmdDraw(*cmdBuffer, numDrawVertices, 1u, 0u, 0u);
+ }
+ vk.cmdEndTransformFeedbackEXT(*cmdBuffer, 0, 0, DE_NULL, DE_NULL);
+ }
+ vk.cmdEndQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex + 1, m_parameters.streamId);
+ vk.cmdEndQueryIndexedEXT(*cmdBuffer, *queryPool, queryIndex + 0, 0);
+ }
+ endRenderPass(vk, *cmdBuffer);
+
+ vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1u, &tfMemoryBarrier, 0u, DE_NULL, 0u, DE_NULL);
+ }
+ endCommandBuffer(vk, *cmdBuffer);
+ submitCommandsAndWait(vk, device, queue, *cmdBuffer);
+
+ vk.getQueryPoolResults(device, *queryPool, queryIndex, queryCountersNumber, queryDataSize, queryResultData.data(), queryStride, (vk::VK_QUERY_RESULT_WAIT_BIT));
+
+ DE_ASSERT(queryResultData.size() == queryCountersNumber && queryExpectedData.size() == queryCountersNumber);
+ DE_ASSERT(queryCountersNumber > 0);
+
+ for (size_t counterNdx = 0; counterNdx < queryCountersNumber; ++counterNdx)
+ {
+ const TransformFeedbackQuery& result = queryResultData[counterNdx];
+ const TransformFeedbackQuery& expected = queryExpectedData[counterNdx];
+
+ DE_ASSERT(expected.written != queryInvalidCounterValue);
+ DE_ASSERT(expected.attempts != queryInvalidCounterValue);
+
+ if (result.written == queryInvalidCounterValue || result.attempts == queryInvalidCounterValue)
+ return tcu::TestStatus::fail("Query counters read failed");
+
+ if (result.written != expected.written)
+ {
+ const std::string comment = "At counter " + de::toString(counterNdx) + " vertices written " + de::toString(result.written) + ", while expected " + de::toString(expected.written);
+
+ return tcu::TestStatus::fail(comment.c_str());
+ }
+
+
+ if (result.attempts != expected.attempts)
+ {
+ const std::string comment = "At counter " + de::toString(counterNdx) + " attempts committed " + de::toString(result.attempts) + ", while expected " + de::toString(expected.attempts);
+
+ return tcu::TestStatus::fail(comment.c_str());
+ }
+
+ verifyTransformFeedbackBuffer(tfBufAllocation, bytesPerVertex * expected.written, static_cast<deUint32>(tfBufBindingOffsets[counterNdx]), tfBufExpectedValues[counterNdx]);
+ }
+
+ return tcu::TestStatus::pass("Pass");
+}
+
+
class TransformFeedbackTestCase : public vkt::TestCase
{
public:
@@ -1960,6 +2171,9 @@
m_parameters.testType == TEST_TYPE_QUERY_RESET)
return new TransformFeedbackQueryTestInstance(context, m_parameters);
+ if (m_parameters.testType == TEST_TYPE_MULTIQUERY)
+ return new TransformFeedbackMultiQueryTestInstance(context, m_parameters);
+
TCU_THROW(InternalError, "Specified test type not found");
}
@@ -2024,7 +2238,6 @@
<< "} uInput;\n"
<< "void main(void)\n"
<< "{\n"
- << " //idx_out = uInput.start + gl_VertexIndex;\n" // TODO
<< "}\n";
programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
}
@@ -2524,6 +2737,67 @@
return;
}
+ if (m_parameters.testType == TEST_TYPE_MULTIQUERY)
+ {
+ // vertex shader
+ {
+ std::ostringstream src;
+ src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+ << "\n"
+ << "layout(location = 0) out ivec4 out0;\n"
+ << "\n"
+ << "void main(void)\n"
+ << "{\n"
+ << " out0 = ivec4(gl_VertexIndex);\n"
+ << "}\n";
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+ }
+
+ // geometry shader
+ {
+ const deUint32 s = m_parameters.streamId;
+ std::ostringstream src;
+
+ DE_ASSERT(s != 0);
+
+ src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+ << "\n"
+ << "layout(points) in;\n"
+ << "\n"
+ << "layout(points, max_vertices = 4) out;\n"
+ << "\n"
+ << "layout(stream = " << 0 << ", xfb_buffer = 0, xfb_offset = 0, xfb_stride = 16, location = 0) out vec4 out0;\n"
+ << "layout(stream = " << s << ", xfb_buffer = 1, xfb_offset = 0, xfb_stride = 16, location = 1) out vec4 out1;\n"
+ << "\n"
+ << "void main(void)\n"
+ << "{\n"
+ << " const int n0 = 3;\n"
+ << " const int n1 = 1;\n"
+ << " const float c0 = 0.5f;\n"
+ << " const float c1 = 0.5f + float(" << s << ");\n"
+ << "\n"
+ << " for (int j = 0; j < n0; j++)\n"
+ << " {\n"
+ << " out0 = vec4(c0);\n"
+ << " EmitStreamVertex(0);\n"
+ << " EndStreamPrimitive(0);\n"
+ << " }\n"
+ << "\n"
+ << " for (int j = 0; j < n1; j++)\n"
+ << " {\n"
+ << " out1 = vec4(c1);\n"
+ << " EmitStreamVertex(" << s << ");\n"
+ << " EndStreamPrimitive(" << s << ");\n"
+ << " }\n"
+ << "}\n";
+
+ programCollection.glslSources.add("geom") << glu::GeometrySource(src.str());
+ }
+
+ return;
+ }
+
DE_ASSERT(0 && "Unknown test");
}
@@ -2724,6 +2998,21 @@
group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(streamId)).c_str(), "Simultaneous multiple streams usage test", parameters));
}
}
+
+ {
+ const TestType testType = TEST_TYPE_MULTIQUERY;
+ const std::string testName = "multiquery";
+
+ for (deUint32 bufferCountsNdx = 0; bufferCountsNdx < DE_LENGTH_OF_ARRAY(usedStreamId); ++bufferCountsNdx)
+ {
+ const deUint32 streamId = usedStreamId[bufferCountsNdx];
+ const deUint32 streamsUsed = 2u;
+ const deUint32 maxBytesPerVertex = 256u;
+ const TestParameters parameters = { testType, maxBytesPerVertex * streamsUsed, streamsUsed, streamId, 0u, 0u, STREAM_ID_0_NORMAL, false, false };
+
+ group->addChild(new TransformFeedbackTestCase(group->getTestContext(), (testName + "_" + de::toString(streamId)).c_str(), "Simultaneous multiple queries usage test", parameters));
+ }
+ }
}
void createTransformFeedbackAndStreamsSimpleTests (tcu::TestCaseGroup* group)
diff --git a/external/vulkancts/modules/vulkan/util/CMakeLists.txt b/external/vulkancts/modules/vulkan/util/CMakeLists.txt
index 1c288d9..64e6bcc 100644
--- a/external/vulkancts/modules/vulkan/util/CMakeLists.txt
+++ b/external/vulkancts/modules/vulkan/util/CMakeLists.txt
@@ -7,6 +7,7 @@
vktDrawUtil.hpp
vktExternalMemoryUtil.cpp
vktExternalMemoryUtil.hpp
+ vktConstexprVectorUtil.hpp
)
set(DEQP_VK_UTIL_LIBS
diff --git a/external/vulkancts/modules/vulkan/util/vktConstexprVectorUtil.hpp b/external/vulkancts/modules/vulkan/util/vktConstexprVectorUtil.hpp
new file mode 100644
index 0000000..792d211
--- /dev/null
+++ b/external/vulkancts/modules/vulkan/util/vktConstexprVectorUtil.hpp
@@ -0,0 +1,87 @@
+#ifndef _VKTCONSTEXPRVECTORUTIL_HPP
+#define _VKTCONSTEXPRVECTORUTIL_HPP
+/*------------------------------------------------------------------------
+ * Vulkan CTS Framework
+ * ------------------------
+ *
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Advanced Micro Devices, 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 Compile time friendly dynamic sized array with maximum capacity
+ */
+/*--------------------------------------------------------------------*/
+
+#include <cstddef>
+#include <array>
+
+namespace vkt
+{
+/*--------------------------------------------------------------------*//*!
+ * \brief Constexpr compatable vector with checked maximum capacity
+ *
+ * \note Unlike std::array, size() and max_size() are different values
+ * This makes behaviour more similar to that of std::vector.
+ *//*--------------------------------------------------------------------*/
+template<typename _t, size_t CAPACITY>
+class ConstexprVector
+{
+public:
+ using value_type = _t;
+ using size_type = ::std::size_t;
+ using difference_type = ::std::ptrdiff_t;
+ using const_reference = const value_type&;
+ using const_pointer = const value_type*;
+ using const_iterator = const value_type*;
+
+ inline constexpr ConstexprVector() noexcept : values{}, count{0} {};
+
+ /*--------------------------------------------------------------------*//*!
+ * MSVC v140 chokes on this if it is a raw variadic template list.
+ * By providing a single argument lead for type deduction it seems to fix
+ * things. Marking constructor as explicit since this effectively becomes
+ * a single argument constructor.
+ *//*--------------------------------------------------------------------*/
+ template<typename _arg_t, typename... _args_t>
+ inline constexpr explicit ConstexprVector(const _arg_t& arg1, const _args_t&... args) noexcept :
+ values{arg1, args...},
+ count{sizeof...(_args_t) + 1}
+ {
+ static_assert((sizeof...(_args_t) + 1) <= CAPACITY, "Not enough capacity to store values");
+ }
+
+ inline constexpr const_reference at(size_type pos) const noexcept { return values[pos]; }
+ inline constexpr const_reference operator[](size_type pos) const noexcept { return values[pos]; }
+ inline constexpr const_reference front() const noexcept { return values[0]; }
+ inline constexpr const_reference back() const noexcept { return values[count - 1]; }
+ inline constexpr const_pointer data() const noexcept { return values; }
+ inline constexpr const_iterator begin() const noexcept { return &values[0]; }
+ inline constexpr const_iterator cbegin() const noexcept { return &values[0]; }
+ inline constexpr const_iterator end() const noexcept { return &values[count]; }
+ inline constexpr const_iterator cend() const noexcept { return &values[count]; }
+ inline constexpr bool empty() const noexcept { return count == 0; }
+ inline constexpr size_type size() const noexcept { return count; }
+ inline constexpr size_type max_size() const noexcept { return CAPACITY; }
+
+private:
+ value_type values[CAPACITY];
+ size_type count;
+};
+
+} // namespace vkt
+
+#endif // _VKTCONSTEXPRVECTORUTIL_HPP
diff --git a/external/vulkancts/modules/vulkan/vktTestCase.cpp b/external/vulkancts/modules/vulkan/vktTestCase.cpp
index 10f3a27..f8a426c 100644
--- a/external/vulkancts/modules/vulkan/vktTestCase.cpp
+++ b/external/vulkancts/modules/vulkan/vktTestCase.cpp
@@ -66,7 +66,9 @@
"VK_EXT_",
"VK_KHX_",
"VK_NV_cooperative_matrix",
+ "VK_EXT_extended_dynamic_state2",
"VK_NV_ray_tracing",
+ "VK_NV_inherited_viewport_scissor",
"VK_AMD_mixed_attachment_samples",
"VK_AMD_shader_fragment_mask",
"VK_AMD_buffer_marker",
@@ -367,7 +369,7 @@
deUint32 sanitizeApiVersion(deUint32 v)
{
- return VK_MAKE_VERSION( VK_VERSION_MAJOR(v), VK_VERSION_MINOR(v), 0 );
+ return VK_MAKE_VERSION(VK_API_VERSION_MAJOR(v), VK_API_VERSION_MINOR(v), 0 );
}
de::MovePtr<vk::DebugReportRecorder> createDebugReportRecorder (const vk::PlatformInterface& vkp, const vk::InstanceInterface& vki, vk::VkInstance instance, bool printValidationErrors)
diff --git a/external/vulkancts/modules/vulkan/vktTestPackage.cpp b/external/vulkancts/modules/vulkan/vktTestPackage.cpp
index ef2401b..f937b93 100644
--- a/external/vulkancts/modules/vulkan/vktTestPackage.cpp
+++ b/external/vulkancts/modules/vulkan/vktTestPackage.cpp
@@ -194,6 +194,8 @@
virtual tcu::TestNode::IterateResult iterate (tcu::TestCase* testCase);
private:
+ void logUnusedShaders (tcu::TestCase* testCase);
+
bool spirvVersionSupported(vk::SpirvVersion);
vk::BinaryCollection m_progCollection;
vk::BinaryRegistryReader m_prebuiltBinRegistry;
@@ -340,7 +342,7 @@
m_context.resultSetOnValidation(false);
}
-void TestCaseExecutor::deinit (tcu::TestCase*)
+void TestCaseExecutor::deinit (tcu::TestCase* testCase)
{
delete m_instance;
m_instance = DE_NULL;
@@ -350,6 +352,46 @@
// Collect and report any debug messages
if (m_context.hasDebugReportRecorder())
collectAndReportDebugMessages(m_context.getDebugReportRecorder(), m_context);
+
+ if (testCase != DE_NULL)
+ logUnusedShaders(testCase);
+}
+
+void TestCaseExecutor::logUnusedShaders (tcu::TestCase* testCase)
+{
+ const qpTestResult testResult = testCase->getTestContext().getTestResult();
+
+ if (testResult == QP_TEST_RESULT_PASS || testResult == QP_TEST_RESULT_QUALITY_WARNING || testResult == QP_TEST_RESULT_COMPATIBILITY_WARNING)
+ {
+ bool unusedShaders = false;
+
+ for (vk::BinaryCollection::Iterator it = m_progCollection.begin(); it != m_progCollection.end(); ++it)
+ {
+ if (!it.getProgram().getUsed())
+ {
+ unusedShaders = true;
+
+ break;
+ }
+ }
+
+ if (unusedShaders)
+ {
+ std::string message;
+
+ for (vk::BinaryCollection::Iterator it = m_progCollection.begin(); it != m_progCollection.end(); ++it)
+ {
+ if (!it.getProgram().getUsed())
+ message += it.getName() + ",";
+ }
+
+ message.resize(message.size() - 1);
+
+ message = std::string("Unused shaders: ") + message;
+
+ m_context.getTestContext().getLog() << TestLog::Message << message << TestLog::EndMessage;
+ }
+ }
}
tcu::TestNode::IterateResult TestCaseExecutor::iterate (tcu::TestCase*)
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
index 6bd8962..6339d2a 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.cpp
@@ -43,6 +43,8 @@
#include "vkAllocationCallbackUtil.hpp"
#include "vkCmdUtil.hpp"
#include "vkObjUtil.hpp"
+#include "tcuSurface.hpp"
+#include "vkImageUtil.hpp"
#include "tcuTestLog.hpp"
#include "tcuFormatUtil.hpp"
@@ -326,12 +328,31 @@
VkSurfaceKHR surface,
VkSurfaceFormatKHR surfaceFormat,
const tcu::UVec2& desiredSize,
- deUint32 desiredImageCount)
+ deUint32 desiredImageCount,
+ VkColorSpaceKHR desiredColorspace = VK_COLOR_SPACE_MAX_ENUM_KHR)
{
+ bool setColorspaceManually = desiredColorspace != VK_COLOR_SPACE_MAX_ENUM_KHR;
+
const VkSurfaceCapabilitiesKHR capabilities = getPhysicalDeviceSurfaceCapabilities(vki,
physicalDevice,
surface);
const PlatformProperties& platformProperties = getPlatformProperties(wsiType);
+ const VkSurfaceCapabilitiesKHR surfaceCapabilities = getPhysicalDeviceSurfaceCapabilities(vki,physicalDevice, surface);
+
+ // Check that the device has at least one supported alpha compositing mode
+ // and pick the first supported mode to be used.
+ vk::VkCompositeAlphaFlagsKHR alpha = 0;
+ for (deUint32 i = 1u; i <= surfaceCapabilities.supportedCompositeAlpha; i <<= 1u)
+ {
+ if ((i & surfaceCapabilities.supportedCompositeAlpha) != 0)
+ {
+ alpha = i;
+ break;
+ }
+ }
+ if (alpha == 0)
+ TCU_THROW(NotSupportedError, "No supported composite alphas available.");
+
const VkSurfaceTransformFlagBitsKHR transform = (capabilities.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) ? VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR : capabilities.currentTransform;
const VkSwapchainCreateInfoKHR parameters =
{
@@ -341,16 +362,15 @@
surface,
de::clamp(desiredImageCount, capabilities.minImageCount, capabilities.maxImageCount > 0 ? capabilities.maxImageCount : capabilities.minImageCount + desiredImageCount),
surfaceFormat.format,
- surfaceFormat.colorSpace,
- (platformProperties.swapchainExtent == PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE
- ? capabilities.currentExtent : vk::makeExtent2D(desiredSize.x(), desiredSize.y())),
+ (setColorspaceManually ? desiredColorspace : surfaceFormat.colorSpace),
+ (platformProperties.swapchainExtent == PlatformProperties::SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE ? capabilities.currentExtent : vk::makeExtent2D(desiredSize.x(), desiredSize.y())),
1u, // imageArrayLayers
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
VK_SHARING_MODE_EXCLUSIVE,
0u,
(const deUint32*)DE_NULL,
transform,
- VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
+ static_cast<VkCompositeAlphaFlagBitsKHR>(alpha),
VK_PRESENT_MODE_FIFO_KHR,
VK_FALSE, // clipped
(VkSwapchainKHR)0 // oldSwapchain
@@ -401,6 +421,46 @@
return buffers;
}
+tcu::Vec4 getPixel (const DeviceInterface& vkd,
+ const VkDevice device,
+ const VkQueue queue,
+ const VkCommandPool& commandPool,
+ Allocator& allocator,
+ const tcu::UVec2 size,
+ const tcu::TextureFormat textureFormat,
+ const VkImage* image)
+{
+ Move<VkCommandBuffer> commandBuffer;
+ Move<VkBuffer> resultBuffer;
+ de::MovePtr<Allocation> resultBufferMemory;
+
+ commandBuffer = allocateCommandBuffer(vkd, device, commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ // Result Buffer
+ {
+ const VkDeviceSize bufferSize = textureFormat.getPixelSize() * size.x() * size.y();
+ const VkBufferCreateInfo createInfo = makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+
+ resultBuffer = createBuffer(vkd, device, &createInfo);
+ resultBufferMemory = allocator.allocate(getBufferMemoryRequirements(vkd, device, *resultBuffer), MemoryRequirement::HostVisible);
+
+ VK_CHECK(vkd.bindBufferMemory(device, *resultBuffer, resultBufferMemory->getMemory(), resultBufferMemory->getOffset()));
+ }
+
+ beginCommandBuffer(vkd, *commandBuffer, 0u);
+ {
+ copyImageToBuffer(vkd, *commandBuffer, *image, *resultBuffer, tcu::IVec2(size.x(), size.y()), VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR);
+ }
+ endCommandBuffer(vkd, *commandBuffer);
+ submitCommandsAndWait(vkd, device, queue, commandBuffer.get());
+
+ tcu::ConstPixelBufferAccess resultAccess(textureFormat,
+ tcu::IVec3(size.x(), size.y(), 1),
+ resultBufferMemory->getHostPtr());
+
+ return (resultAccess.getPixel(128, 128));
+}
+
tcu::TestStatus basicExtensionTest (Context& context, Type wsiType)
{
const tcu::UVec2 desiredSize (256, 256);
@@ -432,6 +492,177 @@
return tcu::TestStatus::pass("Extension tests succeeded");
}
+struct TestParams
+{
+ Type wsiType;
+ VkFormat format;
+};
+
+// Create swapchain with multiple images on different colorspaces and compare pixels on those images.
+tcu::TestStatus colorspaceCompareTest (Context& context, TestParams params)
+{
+ if (!context.isInstanceFunctionalitySupported("VK_EXT_swapchain_colorspace"))
+ TCU_THROW(NotSupportedError, "Extension VK_EXT_swapchain_colorspace not supported");
+
+ const tcu::UVec2 desiredSize (256, 256);
+ const InstanceHelper instHelper (context, params.wsiType);
+ const NativeObjects native (context, instHelper.supportedExtensions, params.wsiType, tcu::just(desiredSize));
+ const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, instHelper.instance, params.wsiType, *native.display, *native.window));
+ const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface);
+
+ const vector<VkSurfaceFormatKHR> queriedFormats = getPhysicalDeviceSurfaceFormats(instHelper.vki,
+ devHelper.physicalDevice,
+ *surface);
+
+ vector<vk::VkColorSpaceKHR> supportedColorSpaces;
+ for (const auto& queriedFormat : queriedFormats)
+ {
+ if (queriedFormat.format == params.format)
+ {
+ supportedColorSpaces.push_back(queriedFormat.colorSpace);
+ }
+ }
+
+ // Not supported if there's no color spaces for the format.
+ if(supportedColorSpaces.size() < 2)
+ TCU_THROW(NotSupportedError, "Format not supported");
+
+ // Surface format is used to create the swapchain.
+ VkSurfaceFormatKHR surfaceFormat =
+ {
+ params.format, // format
+ supportedColorSpaces.at(0) // colorSpace
+ };
+
+ tcu::Vec4 referenceColorspacePixel;
+ const tcu::TextureFormat textureFormat = vk::mapVkFormat(surfaceFormat.format);
+ const DeviceInterface& vkd = devHelper.vkd;
+ const VkDevice device = *devHelper.device;
+ SimpleAllocator allocator (vkd,
+ device,
+ getPhysicalDeviceMemoryProperties(instHelper.vki,
+ context.getPhysicalDevice()));
+
+ for (size_t colorspaceNdx = 0; colorspaceNdx < supportedColorSpaces.size(); ++colorspaceNdx)
+ {
+ const VkSwapchainCreateInfoKHR swapchainInfo = getBasicSwapchainParameters(params.wsiType,
+ instHelper.vki,
+ devHelper.physicalDevice,
+ *surface,
+ surfaceFormat,
+ desiredSize,
+ 2,
+ supportedColorSpaces[colorspaceNdx]);
+ const Unique<VkSwapchainKHR> swapchain (createSwapchainKHR(vkd, device, &swapchainInfo));
+ const vector<VkImage> swapchainImages = getSwapchainImages(vkd, device, *swapchain);
+ const vector<VkExtensionProperties> deviceExtensions (enumerateDeviceExtensionProperties(instHelper.vki, devHelper.physicalDevice, DE_NULL));
+
+ const WsiTriangleRenderer renderer(vkd,
+ device,
+ allocator,
+ context.getBinaryCollection(),
+ true,
+ swapchainImages,
+ swapchainImages,
+ swapchainInfo.imageFormat,
+ tcu::UVec2(swapchainInfo.imageExtent.width, swapchainInfo.imageExtent.height));
+
+ const Move<VkCommandPool> commandPool (createCommandPool(vkd,
+ device,
+ VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
+ devHelper.queueFamilyIndex));
+ const Move<VkSemaphore> imageReadySemaphore = createSemaphore(vkd, device);
+ const Move<VkSemaphore> renderingCompleteSemaphore = createSemaphore(vkd, device);
+ const Move<VkCommandBuffer> commandBuffer = allocateCommandBuffer(vkd,
+ device,
+ *commandPool,
+ VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+
+ try
+ {
+ deUint32 imageNdx = ~0u;
+
+ {
+ const VkResult acquireResult = vkd.acquireNextImageKHR(device,
+ *swapchain,
+ std::numeric_limits<deUint64>::max(),
+ imageReadySemaphore.get(),
+ DE_NULL,
+ &imageNdx);
+
+ if (acquireResult == VK_SUBOPTIMAL_KHR)
+ {
+ context.getTestContext().getLog() << TestLog::Message << "Got " << acquireResult
+ << TestLog::EndMessage;
+ }
+ else
+ {
+ VK_CHECK(acquireResult);
+ }
+ }
+
+ TCU_CHECK((size_t) imageNdx < swapchainImages.size());
+
+ {
+ const VkPipelineStageFlags waitDstStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ const VkSubmitInfo submitInfo =
+ {
+ VK_STRUCTURE_TYPE_SUBMIT_INFO,
+ DE_NULL,
+ 0u,
+ &imageReadySemaphore.get(),
+ &waitDstStage,
+ 1u,
+ &commandBuffer.get(),
+ 1u,
+ &renderingCompleteSemaphore.get()
+ };
+ const VkPresentInfoKHR presentInfo =
+ {
+ VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
+ DE_NULL,
+ 1u,
+ &renderingCompleteSemaphore.get(),
+ 1u,
+ &swapchain.get(),
+ &imageNdx,
+ (VkResult *) DE_NULL
+ };
+
+ renderer.recordFrame(commandBuffer.get(), imageNdx, 0);
+ VK_CHECK(vkd.queueSubmit(devHelper.queue, 1u, &submitInfo, DE_NULL));
+ VK_CHECK_WSI(vkd.queuePresentKHR(devHelper.queue, &presentInfo));
+ }
+
+ // Set reference pixelBufferAccess for comparison.
+ if (colorspaceNdx == 0)
+ {
+ referenceColorspacePixel = getPixel(vkd, device, devHelper.queue, commandPool.get(),
+ allocator, desiredSize, textureFormat,
+ &swapchainImages[imageNdx]);
+ continue;
+ }
+
+ // Compare pixels from images to make sure the colorspace makes no difference.
+ if (referenceColorspacePixel == getPixel(vkd, device, devHelper.queue, commandPool.get(),
+ allocator, desiredSize, textureFormat,
+ &swapchainImages[imageNdx]))
+ continue;
+ else
+ return tcu::TestStatus::fail("Colorspace comparison test failed");
+ VK_CHECK(vkd.deviceWaitIdle(device));
+ }
+ catch (...)
+ {
+ // Make sure device is idle before destroying resources
+ vkd.deviceWaitIdle(device);
+ throw;
+ }
+ }
+
+ return tcu::TestStatus::pass("Colorspace comparison test succeeded");
+}
+
tcu::TestStatus surfaceFormatRenderTest (Context& context,
Type wsiType,
const InstanceHelper& instHelper,
@@ -457,7 +688,7 @@
device,
allocator,
context.getBinaryCollection(),
- false,
+ true,
swapchainImages,
swapchainImages,
swapchainInfo.imageFormat,
@@ -619,11 +850,17 @@
return tcu::TestStatus::pass("Rendering tests succeeded");
}
-void getBasicRenderPrograms (SourceCollections& dst, Type)
+// We need different versions of this function in order to invoke
+// different overloaded versions of addFunctionCaseWithPrograms.
+void getBasicRenderPrograms2 (SourceCollections& dst, TestParams)
{
WsiTriangleRenderer::getPrograms(dst);
}
+void getBasicRenderPrograms (SourceCollections& dst, Type)
+{
+ WsiTriangleRenderer::getPrograms(dst);
+}
} // anonymous
void createColorSpaceTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType)
@@ -633,5 +870,30 @@
addFunctionCaseWithPrograms(testGroup, "hdr", "Basic Rendering Tests with HDR", getBasicRenderPrograms, surfaceFormatRenderWithHdrTests, wsiType);
}
+void createColorspaceCompareTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType)
+{
+ const VkFormat formatList[] = {
+ VK_FORMAT_B8G8R8A8_UNORM,
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_FORMAT_R8G8B8A8_SRGB,
+ VK_FORMAT_R5G6B5_UNORM_PACK16,
+ VK_FORMAT_A2B10G10R10_UNORM_PACK32,
+ VK_FORMAT_R16G16B16A16_SFLOAT
+ };
+
+ // Create test for every format.
+ for (const VkFormat& format : formatList)
+ {
+ const char* const enumName = getFormatName(format);
+ const string caseName = de::toLower(string(enumName).substr(10));
+ const TestParams params =
+ {
+ wsiType,
+ format
+ };
+ addFunctionCaseWithPrograms(testGroup, caseName, "", getBasicRenderPrograms2, colorspaceCompareTest, params);
+ }
+}
+
} // wsi
} // vkt
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.hpp b/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.hpp
index 38d688a..86faef6 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.hpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiColorSpaceTests.hpp
@@ -32,7 +32,8 @@
namespace wsi
{
-void createColorSpaceTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType);
+void createColorSpaceTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType);
+void createColorspaceCompareTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType);
} // wsi
} // vkt
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayControlTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayControlTests.cpp
index e95be04..9b0a0be 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayControlTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayControlTests.cpp
@@ -94,15 +94,15 @@
return 0;
}
-Move<VkDevice> createDevice (const vk::Platform& platform,
- const PlatformInterface& vkp,
- const VkInstance instance,
- const InstanceInterface& vki,
- VkPhysicalDevice physicalDevice,
- const Extensions& supportedExtensions,
- const deUint32 queueFamilyIndex,
- bool validationEnabled,
- const VkAllocationCallbacks* pAllocator = DE_NULL)
+Move<VkDevice> createTestDevice (const vk::Platform& platform,
+ const PlatformInterface& vkp,
+ const VkInstance instance,
+ const InstanceInterface& vki,
+ VkPhysicalDevice physicalDevice,
+ const Extensions& supportedExtensions,
+ const deUint32 queueFamilyIndex,
+ bool validationEnabled,
+ const VkAllocationCallbacks* pAllocator = DE_NULL)
{
const float queuePriorities[] = { 1.0f };
bool displayAvailable = true;
@@ -715,7 +715,7 @@
, m_queueFamilyIndex (chooseQueueFamilyIndex(m_vki, m_physicalDevice, m_surface))
, m_deviceExtensions (enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL))
- , m_device (createDevice(context.getTestContext().getPlatform().getVulkanPlatform(), m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, context.getTestContext().getCommandLine().isValidationEnabled()))
+ , m_device (createTestDevice(context.getTestContext().getPlatform().getVulkanPlatform(), m_vkp, m_instance, m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, context.getTestContext().getCommandLine().isValidationEnabled()))
, m_vkd (m_vkp, m_instance, *m_device)
, m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u))
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
index 8688a0e..bd19e55 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiSwapchainTests.cpp
@@ -948,6 +948,7 @@
failingAllocator.getCallbacks()));
const DeviceHelper devHelper (context, instHelper.vki, instHelper.instance, *surface, vector<string>(), failingAllocator.getCallbacks());
const vector<VkSwapchainCreateInfoKHR> allCases (generateSwapchainParameterCases(params.wsiType, params.dimension, instHelper.vki, devHelper.physicalDevice, *surface));
+ const VkSurfaceCapabilitiesKHR capabilities(getPhysicalDeviceSurfaceCapabilities(instHelper.vki, devHelper.physicalDevice, *surface));
if (maxCases < allCases.size())
log << TestLog::Message << "Note: Will only test first " << maxCases << " cases out of total of " << allCases.size() << " parameter combinations" << TestLog::EndMessage;
@@ -958,7 +959,11 @@
for (deUint32 numPassingAllocs = 0; numPassingAllocs <= maxAllocs; ++numPassingAllocs)
{
- bool gotOOM = false;
+ bool gotOOM = false;
+ VkSwapchainCreateInfoKHR curParams = allCases[caseNdx];
+ curParams.surface = *surface;
+ curParams.queueFamilyIndexCount = 1u;
+ curParams.pQueueFamilyIndices = &devHelper.queueFamilyIndex;
failingAllocator.reset(DeterministicFailAllocator::MODE_COUNT_AND_FAIL, numPassingAllocs);
@@ -966,19 +971,11 @@
try
{
- VkSwapchainCreateInfoKHR curParams = allCases[caseNdx];
-
// With concurrent sharing mode, at least two queues are needed.
if (curParams.imageSharingMode == VK_SHARING_MODE_CONCURRENT)
continue;
- curParams.surface = *surface;
- curParams.queueFamilyIndexCount = 1u;
- curParams.pQueueFamilyIndices = &devHelper.queueFamilyIndex;
-
- {
- const Unique<VkSwapchainKHR> swapchain (createSwapchainKHR(devHelper.vkd, *devHelper.device, &curParams, failingAllocator.getCallbacks()));
- }
+ const Unique<VkSwapchainKHR> swapchain (createSwapchainKHR(devHelper.vkd, *devHelper.device, &curParams, failingAllocator.getCallbacks()));
}
catch (const OutOfMemoryError& e)
{
@@ -996,7 +993,16 @@
break;
}
else if (numPassingAllocs == maxAllocs)
+ {
+ // The maxExtents case might not be able to create the requested surface due to insufficient
+ // memory, so in this case *only* we allow the OOM exception upto maxAllocs.
+ if (params.dimension == TEST_DIMENSION_IMAGE_EXTENT &&
+ capabilities.maxImageExtent.width == curParams.imageExtent.width &&
+ capabilities.maxImageExtent.height == curParams.imageExtent.height)
+ break;
+
results.addResult(QP_TEST_RESULT_QUALITY_WARNING, "Creating swapchain did not succeed, callback limit exceeded");
+ }
}
context.getTestContext().touchWatchdog();
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp
index 167dc3d..aaa0942 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiTests.cpp
@@ -51,6 +51,7 @@
addTestGroup(testGroup, "display_timing", "Display Timing Tests", createDisplayTimingTests, wsiType);
addTestGroup(testGroup, "shared_presentable_image", "VK_KHR_shared_presentable_image tests", createSharedPresentableImageTests, wsiType);
addTestGroup(testGroup, "colorspace", "ColorSpace tests", createColorSpaceTests, wsiType);
+ addTestGroup(testGroup, "colorspace_compare", "ColorSpace compare tests", createColorspaceCompareTests, wsiType);
addTestGroup(testGroup, "full_screen_exclusive", "VK_EXT_full_screen_exclusive tests", createFullScreenExclusiveTests, wsiType);
}
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp
index f280af9..adc7d87 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrConversionTests.cpp
@@ -1204,7 +1204,11 @@
vk::VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,
vk::VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,
vk::VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16,
- vk::VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM
+ vk::VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,
+ vk::VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT,
+ vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT,
+ vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT,
+ vk::VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT,
};
const std::vector<vk::VkFormat> xChromaSubsampledFormats =
{
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp
index aba0dd8..6eca65a 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrCopyTests.cpp
@@ -424,6 +424,10 @@
case vk::VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
case vk::VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
case vk::VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
+ case vk::VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT:
+ case vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:
+ case vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:
+ case vk::VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT:
DE_FATAL("Plane formats not supported");
return ~0u;
@@ -642,7 +646,7 @@
vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
DE_NULL,
vk::VK_ACCESS_TRANSFER_WRITE_BIT,
- vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ vk::VK_ACCESS_TRANSFER_READ_BIT | vk::VK_ACCESS_TRANSFER_WRITE_BIT,
vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_QUEUE_FAMILY_IGNORED,
@@ -870,7 +874,11 @@
vk::VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
vk::VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,
vk::VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,
- vk::VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM
+ vk::VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,
+ vk::VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT,
+ vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT,
+ vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT,
+ vk::VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT,
};
const struct
{
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFilteringTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFilteringTests.cpp
index e1155e3..6073e0d 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFilteringTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFilteringTests.cpp
@@ -63,8 +63,7 @@
protected:
- VkSamplerCreateInfo getSamplerInfo (VkFilter minMagFilter,
- const VkSamplerYcbcrConversionInfo* samplerConversionInfo = DE_NULL);
+ VkSamplerCreateInfo getSamplerInfo (const VkSamplerYcbcrConversionInfo* samplerConversionInfo);
Move<VkDescriptorSetLayout> createDescriptorSetLayout (VkSampler sampler);
Move<VkDescriptorPool> createDescriptorPool (const deUint32 combinedSamplerDescriptorCount);
Move<VkDescriptorSet> createDescriptorSet (VkDescriptorPool descPool,
@@ -107,15 +106,15 @@
{
}
-VkSamplerCreateInfo LinearFilteringTestInstance::getSamplerInfo(VkFilter minMagFilter, const VkSamplerYcbcrConversionInfo* samplerConversionInfo)
+VkSamplerCreateInfo LinearFilteringTestInstance::getSamplerInfo(const VkSamplerYcbcrConversionInfo* samplerConversionInfo)
{
return
{
VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
samplerConversionInfo,
0u,
- minMagFilter, // magFilter
- minMagFilter, // minFilter
+ VK_FILTER_LINEAR, // magFilter
+ VK_FILTER_LINEAR, // minFilter
VK_SAMPLER_MIPMAP_MODE_NEAREST, // mipmapMode
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // addressModeU
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // addressModeV
@@ -294,7 +293,7 @@
auto physicalDevice (m_context.getPhysicalDevice());
const Unique<VkSamplerYcbcrConversion> conversion (createYCbCrConversion());
const VkSamplerYcbcrConversionInfo samplerConvInfo { VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, DE_NULL, *conversion };
- const VkSamplerCreateInfo samplerCreateInfo (getSamplerInfo(VK_FILTER_LINEAR, &samplerConvInfo));
+ const VkSamplerCreateInfo samplerCreateInfo (getSamplerInfo(&samplerConvInfo));
const Unique<VkSampler> sampler (createSampler(m_vkd, m_device, &samplerCreateInfo));
deUint32 combinedSamplerDescriptorCount = 1;
@@ -607,7 +606,8 @@
if ((featureFlags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) == 0)
TCU_THROW(NotSupportedError, "Linear filtering not supported for format");
- if ((featureFlags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT) == 0)
+ if (m_chromaFiltering != VK_FILTER_LINEAR &&
+ (featureFlags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT) == 0)
TCU_THROW(NotSupportedError, "Different chroma, min, and mag filters not supported for format");
}
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp
index 2e73821..9b2d7e1 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrFormatTests.cpp
@@ -627,6 +627,14 @@
group->addChild(createTestGroup<VkFormat>(group->getTestContext(), formatName, "", populatePerFormatGroup, format));
}
+
+ for (int formatNdx = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT; formatNdx <= VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT; formatNdx++)
+ {
+ const VkFormat format = (VkFormat)formatNdx;
+ const string formatName = de::toLower(de::toString(format).substr(10));
+
+ group->addChild(createTestGroup<VkFormat>(group->getTestContext(), formatName, "", populatePerFormatGroup, format));
+ }
}
} // namespace
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrImageQueryTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrImageQueryTests.cpp
index 09d91f8..aa93e01 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrImageQueryTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrImageQueryTests.cpp
@@ -417,6 +417,8 @@
};
deUint32 combinedSamplerDescriptorCount = 1;
+
+ if (isYCbCrImage)
{
const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
{
@@ -596,6 +598,8 @@
};
deUint32 combinedSamplerDescriptorCount = 1;
+
+ if (isYCbCrImage)
{
const VkPhysicalDeviceImageFormatInfo2 imageFormatInfo =
{
@@ -828,6 +832,16 @@
if (getPlaneCount(format) > 1)
addImageQueryCase(group, TestParameters(params.query, format, (VkImageCreateFlags)VK_IMAGE_CREATE_DISJOINT_BIT, params.shaderType));
}
+
+ for (int formatNdx = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT; formatNdx <= VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT; formatNdx++)
+ {
+ const VkFormat format = (VkFormat)formatNdx;
+
+ addImageQueryCase(group, TestParameters(params.query, format, 0u, params.shaderType));
+
+ if (getPlaneCount(format) > 1)
+ addImageQueryCase(group, TestParameters(params.query, format, (VkImageCreateFlags)VK_IMAGE_CREATE_DISJOINT_BIT, params.shaderType));
+ }
}
void populateQueryGroup (tcu::TestCaseGroup* group, QueryType query)
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrStorageImageWriteTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrStorageImageWriteTests.cpp
index aa160c5..6265c37 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrStorageImageWriteTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrStorageImageWriteTests.cpp
@@ -587,6 +587,10 @@
case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM: return "rgba16";
case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM: return "rgba16";
case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM: return "rgba16";
+ case VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT: return "rgba8";
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:return "rgba16";
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:return "rgba16";
+ case VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT: return "rgba16";
default:
DE_FATAL("Unexpected texture format");
@@ -675,7 +679,7 @@
{
const std::vector<tcu::UVec3> availableSizes{ tcu::UVec3(512u, 512u, 1u), tcu::UVec3(1024u, 128u, 1u), tcu::UVec3(66u, 32u, 1u) };
- for (int formatNdx = VK_YCBCR_FORMAT_FIRST; formatNdx < VK_YCBCR_FORMAT_LAST; formatNdx++)
+ auto addTests = [&](int formatNdx)
{
const VkFormat format = (VkFormat)formatNdx;
tcu::UVec3 imageSizeAlignment = getImageSizeAlignment(format);
@@ -702,7 +706,18 @@
formatGroup->addChild(sizeGroup.release());
}
testGroup->addChild(formatGroup.release());
+ };
+
+ for (int formatNdx = VK_YCBCR_FORMAT_FIRST; formatNdx < VK_YCBCR_FORMAT_LAST; formatNdx++)
+ {
+ addTests(formatNdx);
}
+
+ for (int formatNdx = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT; formatNdx <= VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT; formatNdx++)
+ {
+ addTests(formatNdx);
+ }
+
return testGroup.release();
}
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
index 848ef86..9f3f798 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
@@ -392,7 +392,7 @@
VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_IGNORED,
image,
- { aspect, 0u, 1u, arrayLayer, 1u }
+ { (VkImageAspectFlags)aspect, 0u, 1u, arrayLayer, 1u }
};
vkd.cmdPipelineBarrier(*cmdBuffer,
@@ -421,7 +421,7 @@
VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_IGNORED,
image,
- { aspect, 0u, 1u, arrayLayer, 1u }
+ { (VkImageAspectFlags)aspect, 0u, 1u, arrayLayer, 1u }
};
vkd.cmdPipelineBarrier(*cmdBuffer,
@@ -1109,6 +1109,7 @@
case vk::VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
case vk::VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
case vk::VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
+ case vk::VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT:
return tcu::UVec4(8, 8, 8, 0);
case vk::VK_FORMAT_R10X6_UNORM_PACK16:
@@ -1127,6 +1128,7 @@
case vk::VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
case vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
case vk::VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
+ case vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:
return tcu::UVec4(10, 10, 10, 0);
case vk::VK_FORMAT_R12X4_UNORM_PACK16:
@@ -1143,6 +1145,7 @@
case vk::VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
case vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
case vk::VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
+ case vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:
return tcu::UVec4(12, 12, 12, 12);
case vk::VK_FORMAT_G16B16G16R16_422_UNORM:
@@ -1152,6 +1155,7 @@
case vk::VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
case vk::VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
case vk::VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
+ case vk::VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT:
return tcu::UVec4(16, 16, 16, 0);
default:
@@ -1198,24 +1202,28 @@
case vk::VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
case vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
case vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case vk::VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT:
case vk::VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
case vk::VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
case vk::VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
case vk::VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
case vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
case vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case vk::VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT:
case vk::VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
case vk::VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
case vk::VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
case vk::VK_FORMAT_G16B16G16R16_422_UNORM:
case vk::VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
case vk::VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
+ case vk::VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT:
case vk::VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
case vk::VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
case vk::VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
case vk::VK_FORMAT_G8B8G8R8_422_UNORM:
case vk::VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
case vk::VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
+ case vk::VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT:
case vk::VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
case vk::VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
case vk::VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrViewTests.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrViewTests.cpp
index 0cba5fe..abac440 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrViewTests.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrViewTests.cpp
@@ -689,13 +689,13 @@
const VkImageCreateFlags baseFlags = (VkImageCreateFlags)VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
| (viewType == TestParameters::VIEWTYPE_MEMORY_ALIAS ? (VkImageCreateFlags)VK_IMAGE_CREATE_ALIAS_BIT : 0u);
- for (int formatNdx = VK_YCBCR_FORMAT_FIRST; formatNdx < VK_YCBCR_FORMAT_LAST; formatNdx++)
+ auto addTests = [&](int formatNdx)
{
const VkFormat format = (VkFormat)formatNdx;
const deUint32 numPlanes = getPlaneCount(format);
if (numPlanes == 1)
- continue; // Plane views not possible
+ return; // Plane views not possible
for (int isDisjoint = 0; isDisjoint < 2; ++isDisjoint)
{
@@ -708,6 +708,16 @@
for (deUint32 planeNdx = 0; planeNdx < numPlanes; ++planeNdx)
addPlaneViewCase(group, TestParameters(viewType, format, size, flags, planeNdx, shaderType));
}
+ };
+
+ for (int formatNdx = VK_YCBCR_FORMAT_FIRST; formatNdx < VK_YCBCR_FORMAT_LAST; formatNdx++)
+ {
+ addTests(formatNdx);
+ }
+
+ for (int formatNdx = VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT; formatNdx < VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT; formatNdx++)
+ {
+ addTests(formatNdx);
}
}
diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt
index bcb1ee7..81275e2 100644
--- a/external/vulkancts/mustpass/master/vk-default.txt
+++ b/external/vulkancts/mustpass/master/vk-default.txt
Binary files differ
diff --git a/external/vulkancts/mustpass/master/waivers.xml b/external/vulkancts/mustpass/master/waivers.xml
index 9205865..ad24da0 100644
--- a/external/vulkancts/mustpass/master/waivers.xml
+++ b/external/vulkancts/mustpass/master/waivers.xml
@@ -204,13 +204,24 @@
<waiver vendorName="Broadcom" vendorId="0x14E4" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/757">
<description>On affected devices depth clipping is incorrectly disabled when the viewport minDepth is equal to maxDepth.</description>
<device_list>
- <d>0x8E002214</d>
<d>0x001E43CB</d>
<d>0xBE485FD3</d>
</device_list>
<t>dEQP-VK.draw.inverted_depth_ranges.nodepthclamp_deltazero</t>
</waiver>
+ <waiver vendorName="Broadcom" vendorId="0x14E4" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/2804">
+ <description>On affected devices depth exponent is incorrectly ignored when calculating floating-point depth bias.</description>
+ <device_list>
+ <d>0x001E43CB</d>
+ <d>0xBE485FD3</d>
+ <d>0xC8D064C2</d>
+ <d>0x7BECF276</d>
+ <d>0x1AB5C29F</d>
+ </device_list>
+ <t>dEQP-VK.rasterization.depth_bias.d32_sfloat</t>
+ </waiver>
+
<waiver vendorName="NVIDIA" vendorId="0x10DE" url="https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/1356">
<description>The affected GPUs are unable to reliably synchronize memory accesses at device scope.</description>
<device_list>
@@ -419,4 +430,4 @@
<t>dEQP-VK.memory_model.*core11*.device.*</t>
</waiver>
-</waiver_list>
\ No newline at end of file
+</waiver_list>
diff --git a/external/vulkancts/scripts/gen_framework.py b/external/vulkancts/scripts/gen_framework.py
index 0bc0cd1..427e062 100755
--- a/external/vulkancts/scripts/gen_framework.py
+++ b/external/vulkancts/scripts/gen_framework.py
@@ -155,6 +155,8 @@
name = name.replace("VULKAN_12_PROPERTIES", "VULKAN_1_2_PROPERTIES")
name = name.replace("INT_8_", "INT8_")
name = name.replace("AABBNV", "AABB_NV")
+ name = name.replace("_H_264_", "_H264_")
+ name = name.replace("_H_265_", "_H265_")
return prefix + name
@@ -296,6 +298,9 @@
def getAsString (self, separator):
return '%s%s%s%s%s' % (self.getType(), separator, self.name, self.arraySize, self.fieldWidth)
+ def getAsStringForArgumentList (self, separator):
+ return '%s%s%s%s' % (self.getType(), separator, self.name, self.arraySize)
+
def __repr__ (self):
return '<%s> <%s> <%s>' % (self.type, self.name, self.arraySize)
@@ -474,9 +479,9 @@
return enums
def parseCompositeType (type, name, src):
- typeNamePtrn = r'(' + TYPE_PTRN + r')(\s+' + IDENT_PTRN + r')((\[[^\]]+\]|:[0-9]+)*)\s*;'
+ typeNamePtrn = r'(' + TYPE_PTRN + r')(\s+' + IDENT_PTRN + r')((\[[^\]]+\]|\s*:\s*[0-9]+)*)\s*;'
matches = re.findall(typeNamePtrn, src)
- members = [Variable(t.strip(), n.strip(), a.strip()) for t, n, a, _ in matches]
+ members = [Variable(t.strip(), n.strip(), a.replace(' ', '')) for t, n, a, _ in matches]
return CompositeType(type, name, members)
def parseCompositeTypes (src):
@@ -641,6 +646,7 @@
extNameUpper = extNameUpper.replace("VK_EXT_ROBUSTNESS2", "VK_EXT_ROBUSTNESS_2")
extNameUpper = extNameUpper.replace("VK_EXT_FRAGMENT_DENSITY_MAP2", "VK_EXT_FRAGMENT_DENSITY_MAP_2")
extNameUpper = extNameUpper.replace("VK_AMD_SHADER_CORE_PROPERTIES2", "VK_AMD_SHADER_CORE_PROPERTIES_2")
+ extNameUpper = extNameUpper.replace("VK_EXT_EXTENDED_DYNAMIC_STATE2", "VK_EXT_EXTENDED_DYNAMIC_STATE_2")
# SPEC_VERSION enums
if definition[0].startswith(extNameUpper) and definition[1].isdigit():
return False
@@ -890,8 +896,8 @@
yield "typedef deUint32 %s;" % bitfield.name
def genBitfield64Src (bitfield64):
+ yield "typedef deUint64 %s;" % bitfield64.name
if len(bitfield64.values) > 0:
- yield "typedef deUint64 %s;" % bitfield64.name
ptrn = "static const " + bitfield64.name + " %s\t= %s;"
for line in indentLines([ptrn % v for v in bitfield64.values]):
yield line
@@ -1018,7 +1024,7 @@
writeInlFile(filename, INL_HEADER, gen())
def argListToStr (args):
- return ", ".join(v.getAsString(' ') for v in args)
+ return ", ".join(v.getAsStringForArgumentList(' ') for v in args)
def writeInterfaceDecl (api, filename, functionTypes, concrete):
def genProtos ():
@@ -1176,9 +1182,10 @@
elif member.getType() == PLATFORM_TYPE_NAMESPACE + "::Win32LPCWSTR":
valFmt = "getWStr(value.%s)" % member.name
elif member.arraySize != '':
+ singleDimensional = not '][' in member.arraySize
if member.name in ["extensionName", "deviceName", "layerName", "description"]:
valFmt = "(const char*)value.%s" % member.name
- elif member.getType() == 'char' or member.getType() == 'deUint8':
+ elif singleDimensional and (member.getType() == 'char' or member.getType() == 'deUint8'):
newLine = "'\\n' << "
valFmt = "tcu::formatArray(tcu::Format::HexIterator<%s>(DE_ARRAY_BEGIN(value.%s)), tcu::Format::HexIterator<%s>(DE_ARRAY_END(value.%s)))" % (member.getType(), member.name, member.getType(), member.name)
else:
@@ -1455,6 +1462,23 @@
"VkQueueFamilyProperties",
"VkMemoryType",
"VkMemoryHeap",
+ "StdVideoH264SpsVuiFlags",
+ "StdVideoH264SpsFlags",
+ "StdVideoH264PpsFlags",
+ "StdVideoDecodeH264PictureInfoFlags",
+ "StdVideoDecodeH264ReferenceInfoFlags",
+ "StdVideoDecodeH264MvcElementFlags",
+ "StdVideoEncodeH264SliceHeaderFlags",
+ "StdVideoEncodeH264PictureInfoFlags",
+ "StdVideoEncodeH264RefMgmtFlags",
+ "StdVideoH265HrdFlags",
+ "StdVideoH265VpsFlags",
+ "StdVideoH265SpsVuiFlags",
+ "StdVideoH265SpsFlags",
+ "StdVideoH265PpsFlags",
+ "StdVideoDecodeH265PictureInfoFlags",
+ "StdVideoDecodeH265ReferenceInfoFlags",
+ "StdVideoEncodeH265PictureInfoFlags"
])
COMPOSITE_TYPES = set([t.name for t in api.compositeTypes if not t.isAlias])
@@ -1482,8 +1506,10 @@
if not isSimpleStruct(type) or type.isAlias:
continue
+ name = type.name[2:] if type.name[:2].lower() == "vk" else type.name
+
yield ""
- yield "inline %s make%s (%s)" % (type.name, type.name[2:], argListToStr(type.members))
+ yield "inline %s make%s (%s)" % (type.name, name, argListToStr(type.members))
yield "{"
yield "\t%s res;" % type.name
for line in indentLines(["\tres.%s\t= %s;" % (m.name, m.name) for m in type.members]):
@@ -2338,16 +2364,36 @@
stream.append('};\n')
writeInlFile(filename, INL_HEADER, stream)
+def preprocessTopInclude(src, dir):
+ pattern = r'#include\s+"([^\n]+)"'
+ while True:
+ inc = re.search(pattern, src)
+ if inc is None:
+ return src
+ incFileName = inc.string[inc.start(1):inc.end(1)]
+ patternIncNamed = r'#include\s+"' + incFileName + '"'
+ incBody = readFile(os.path.join(dir, incFileName)) if incFileName != 'vk_platform.h' else ''
+ incBodySanitized = re.sub(pattern, '', incBody)
+ bodyEndSanitized = re.sub(patternIncNamed, '', src[inc.end(0):])
+ src = src[0:inc.start(0)] + incBodySanitized + bodyEndSanitized
+ return src
+
if __name__ == "__main__":
# Read all .h files, with vulkan_core.h first
files = os.listdir(VULKAN_H_DIR)
files = [f for f in files if f.endswith(".h")]
files.sort()
files.remove("vulkan_core.h")
- files.insert(0, "vulkan_core.h")
+ first = ["vk_video/vulkan_video_codecs_common.h", "vulkan_core.h"]
+ files = first + files
+
src = ""
for file in files:
- src += readFile(os.path.join(VULKAN_H_DIR,file))
+ src += preprocessTopInclude(readFile(os.path.join(VULKAN_H_DIR,file)), VULKAN_H_DIR)
+
+ src = re.sub('\s*//[^\n]*', '', src)
+ src = re.sub('\n\n', '\n', src)
+
api = parseAPI(src)
platformFuncs = [Function.TYPE_PLATFORM]
diff --git a/external/vulkancts/scripts/gen_framework_c.py b/external/vulkancts/scripts/gen_framework_c.py
index f1c3099..ca99329 100644
--- a/external/vulkancts/scripts/gen_framework_c.py
+++ b/external/vulkancts/scripts/gen_framework_c.py
@@ -22,14 +22,23 @@
import os
import sys
-
+import re
sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "..", "scripts"))
from build.common import DEQP_DIR
from khr_util.format import writeInlFile
-VULKAN_H = os.path.join(os.path.dirname(__file__), "src", "vulkan_core.h")
+VULKAN_H = [
+ os.path.join(os.path.dirname(__file__), "src", "vk_video", "vulkan_video_codecs_common.h"),
+ os.path.join(os.path.dirname(__file__), "src", "vk_video", "vulkan_video_codec_h264std.h"),
+ os.path.join(os.path.dirname(__file__), "src", "vk_video", "vulkan_video_codec_h264std_encode.h"),
+ os.path.join(os.path.dirname(__file__), "src", "vk_video", "vulkan_video_codec_h265std.h"),
+ os.path.join(os.path.dirname(__file__), "src", "vk_video", "vulkan_video_codec_h264std_decode.h"),
+ os.path.join(os.path.dirname(__file__), "src", "vk_video", "vulkan_video_codec_h265std_decode.h"),
+ os.path.join(os.path.dirname(__file__), "src", "vulkan_core.h"),
+ ]
+#VULKAN_H = os.path.join(os.path.dirname(__file__), "src", "vulkan_core.h")
VULKAN_DIR = os.path.join(os.path.dirname(__file__), "..", "framework", "vulkan")
INL_HEADER = """\
@@ -57,7 +66,7 @@
def writeVulkanCHeader (src, filename):
def gen ():
- dst = src.replace('#include "vk_platform.h"','')
+ dst = re.sub(r'(#include "[^\s,\n}]+")', '', src)
for old_type, new_type in TYPE_SUBSTITUTIONS:
dst = dst.replace(old_type, new_type)
@@ -65,5 +74,8 @@
writeInlFile(filename, INL_HEADER, gen())
if __name__ == "__main__":
- src = readFile(VULKAN_H)
+ src = ""
+ for file in VULKAN_H:
+ src += readFile(file)
+
writeVulkanCHeader (src, os.path.join(VULKAN_DIR, "vkVulkan_c.inl"))
diff --git a/external/vulkancts/scripts/src/extensions_data.txt b/external/vulkancts/scripts/src/extensions_data.txt
index da4a043..319bce3 100644
--- a/external/vulkancts/scripts/src/extensions_data.txt
+++ b/external/vulkancts/scripts/src/extensions_data.txt
@@ -92,3 +92,4 @@
VK_KHR_zero_initialize_workgroup_memory DEVICE
VK_KHR_workgroup_memory_explicit_layout DEVICE
VK_KHR_synchronization2 DEVICE
+VK_EXT_color_write_enable DEVICE
diff --git a/external/vulkancts/scripts/src/mandatory_features.txt b/external/vulkancts/scripts/src/mandatory_features.txt
index c0e086d..cbe42e6 100644
--- a/external/vulkancts/scripts/src/mandatory_features.txt
+++ b/external/vulkancts/scripts/src/mandatory_features.txt
@@ -41,11 +41,14 @@
VkPhysicalDeviceVulkan12Features FEATURES ( imagelessFramebuffer ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
VkPhysicalDeviceVulkan12Features FEATURES ( uniformBufferStandardLayout ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR FEATURES ( separateDepthStencilLayouts ) REQUIREMENTS ( VK_KHR_separate_depth_stencil_layouts )
+VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT FEATURES ( pipelineCreationCacheControl ) REQUIREMENTS ( VK_EXT_pipeline_creation_cache_control )
VkPhysicalDeviceVulkan12Features FEATURES ( separateDepthStencilLayouts ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
VkPhysicalDeviceHostQueryResetFeaturesEXT FEATURES ( hostQueryReset ) REQUIREMENTS ( VK_EXT_host_query_reset )
VkPhysicalDeviceVulkan12Features FEATURES ( hostQueryReset ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
VkPhysicalDeviceTimelineSemaphoreFeaturesKHR FEATURES ( timelineSemaphore ) REQUIREMENTS ( VK_KHR_timeline_semaphore )
VkPhysicalDeviceVulkan12Features FEATURES ( timelineSemaphore ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" )
+VkPhysicalDeviceFeatures FEATURES ( shaderSampledImageArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
+VkPhysicalDeviceFeatures FEATURES ( shaderStorageBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
VkPhysicalDeviceVulkan12Features FEATURES ( shaderUniformTexelBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
VkPhysicalDeviceVulkan12Features FEATURES ( shaderStorageTexelBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
VkPhysicalDeviceVulkan12Features FEATURES ( shaderSampledImageArrayNonUniformIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" physicalDeviceVulkan12Features.descriptorIndexing )
@@ -88,6 +91,45 @@
VkPhysicalDeviceVulkan12Features FEATURES ( shaderOutputLayer ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_EXT_shader_viewport_index_layer )
VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR FEATURES ( shaderTerminateInvocation ) REQUIREMENTS ( VK_KHR_shader_terminate_invocation )
VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT FEATURES ( shaderImageInt64Atomics ) REQUIREMENTS ( VK_EXT_shader_image_atomic_int64 )
-VkPhysicalDevice4444FormatsFeaturesEXT FEATURES ( formatA4R4G4B4 ) REQUIREMENTS ( VK_EXT_4444_formats )
+VkPhysicalDevice4444FormatsFeaturesEXT FEATURES ( formatA4R4G4B4 ) REQUIREMENTS ( VK_EXT_4444_formats )
VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR FEATURES ( shaderZeroInitializeWorkgroupMemory ) REQUIREMENTS ( VK_KHR_zero_initialize_workgroup_memory )
-VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR FEATURES ( workgroupMemoryExplicitLayout workgroupMemoryExplicitLayoutScalarBlockLayout workgroupMemoryExplicitLayout8BitAccess workgroupMemoryExplicitLayout16BitAccess ) REQUIREMENTS ( VK_KHR_workgroup_memory_explicit_layout )
+VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR FEATURES ( workgroupMemoryExplicitLayout workgroupMemoryExplicitLayoutScalarBlockLayout workgroupMemoryExplicitLayout8BitAccess workgroupMemoryExplicitLayout16BitAccess ) REQUIREMENTS ( VK_KHR_workgroup_memory_explicit_layout )
+VkPhysicalDeviceAccelerationStructureFeaturesKHR FEATURES ( accelerationStructure ) REQUIREMENTS ( VK_KHR_acceleration_structure )
+VkPhysicalDeviceAccelerationStructureFeaturesKHR FEATURES ( descriptorBindingAccelerationStructureUpdateAfterBind ) REQUIREMENTS ( VK_KHR_acceleration_structure )
+VkPhysicalDeviceFeatures FEATURES ( shaderSampledImageArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceFeatures FEATURES ( shaderStorageBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( shaderUniformTexelBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( shaderStorageTexelBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( shaderSampledImageArrayNonUniformIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( shaderStorageBufferArrayNonUniformIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( shaderUniformTexelBufferArrayNonUniformIndexing ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( descriptorBindingSampledImageUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( descriptorBindingStorageImageUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( descriptorBindingStorageBufferUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( descriptorBindingUniformTexelBufferUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( descriptorBindingStorageTexelBufferUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( descriptorBindingUpdateUnusedWhilePending ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( descriptorBindingPartiallyBound ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( runtimeDescriptorArray ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceVulkan12Features FEATURES ( bufferDeviceAddress ) REQUIREMENTS ( "ApiVersion(1, 2, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceBufferDeviceAddressFeaturesKHR FEATURES ( bufferDeviceAddress ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( shaderUniformTexelBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( shaderStorageTexelBufferArrayDynamicIndexing ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( shaderSampledImageArrayNonUniformIndexing ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( shaderStorageBufferArrayNonUniformIndexing ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( shaderUniformTexelBufferArrayNonUniformIndexing ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( descriptorBindingSampledImageUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( descriptorBindingStorageImageUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( descriptorBindingStorageBufferUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( descriptorBindingUniformTexelBufferUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( descriptorBindingStorageTexelBufferUpdateAfterBind ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( descriptorBindingUpdateUnusedWhilePending ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( descriptorBindingPartiallyBound ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceDescriptorIndexingFeaturesEXT FEATURES ( runtimeDescriptorArray ) REQUIREMENTS ( "ApiVersion(1, 1, 0)" VK_KHR_acceleration_structure )
+VkPhysicalDeviceRayTracingPipelineFeaturesKHR FEATURES ( rayTracingPipeline rayTracingPipelineTraceRaysIndirect) REQUIREMENTS ( VK_KHR_ray_tracing_pipeline )
+VkPhysicalDeviceRayTracingPipelineFeaturesKHR FEATURES ( rayTraversalPrimitiveCulling ) REQUIREMENTS ( VK_KHR_ray_tracing_pipeline VK_KHR_ray_query )
+VkPhysicalDeviceRayQueryFeaturesKHR FEATURES ( rayQuery ) REQUIREMENTS ( VK_KHR_ray_query )
+VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT FEATURES ( vertexInputDynamicState ) REQUIREMENTS ( VK_EXT_vertex_input_dynamic_state )
+VkPhysicalDeviceColorWriteEnableFeaturesEXT FEATURES ( colorWriteEnable ) REQUIREMENTS ( VK_EXT_color_write_enable )
+VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT FEATURES ( ycbcr2plane444Formats ) REQUIREMENTS ( VK_EXT_ycbcr_2plane_444_formats )
+VkPhysicalDeviceExtendedDynamicState2FeaturesEXT FEATURES ( extendedDynamicState2 ) REQUIREMENTS ( VK_EXT_extended_dynamic_state2 )
diff --git a/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std.h b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std.h
new file mode 100644
index 0000000..f8c0cef
--- /dev/null
+++ b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std.h
@@ -0,0 +1,299 @@
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H264STD_H_
+#define VULKAN_VIDEO_CODEC_H264STD_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "vk_video/vulkan_video_codecs_common.h"
+
+// Vulkan 0.9 provisional Vulkan video H.264 encode and decode std specification version number
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9 VK_MAKE_VIDEO_STD_VERSION(0, 9, 0) // Patch version should always be set to 0
+
+// Format must be in the form XX.XX where the first two digits are the major and the second two, the minor.
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_API_VERSION_0_9
+#define VK_STD_VULKAN_VIDEO_CODEC_H264_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264"
+
+// *************************************************
+// Video H.264 common definitions:
+// *************************************************
+
+typedef enum StdVideoH264ChromaFormatIdc {
+ std_video_h264_chroma_format_idc_monochrome = 0,
+ std_video_h264_chroma_format_idc_420 = 1,
+ std_video_h264_chroma_format_idc_422 = 2,
+ std_video_h264_chroma_format_idc_444 = 3,
+} StdVideoH264ChromaFormatIdc;
+
+typedef enum StdVideoH264ProfileIdc {
+ std_video_h264_profile_idc_baseline = 66, /* Only constrained baseline is supported */
+ std_video_h264_profile_idc_main = 77,
+ std_video_h264_profile_idc_high = 100,
+ std_video_h264_profile_idc_high_444_predictive = 244,
+ std_video_h264_profile_idc_invalid = 0x7FFFFFFF
+} StdVideoH264ProfileIdc;
+
+typedef enum StdVideoH264Level {
+ std_video_h264_level_1_0 = 0,
+ std_video_h264_level_1_1 = 1,
+ std_video_h264_level_1_2 = 2,
+ std_video_h264_level_1_3 = 3,
+ std_video_h264_level_2_0 = 4,
+ std_video_h264_level_2_1 = 5,
+ std_video_h264_level_2_2 = 6,
+ std_video_h264_level_3_0 = 7,
+ std_video_h264_level_3_1 = 8,
+ std_video_h264_level_3_2 = 9,
+ std_video_h264_level_4_0 = 10,
+ std_video_h264_level_4_1 = 11,
+ std_video_h264_level_4_2 = 12,
+ std_video_h264_level_5_0 = 13,
+ std_video_h264_level_5_1 = 14,
+ std_video_h264_level_5_2 = 15,
+ std_video_h264_level_6_0 = 16,
+ std_video_h264_level_6_1 = 17,
+ std_video_h264_level_6_2 = 18,
+ std_video_h264_level_invalid = 0x7FFFFFFF
+} StdVideoH264Level;
+
+typedef enum StdVideoH264PocType {
+ std_video_h264_poc_type_0 = 0,
+ std_video_h264_poc_type_1 = 1,
+ std_video_h264_poc_type_2 = 2,
+ std_video_h264_poc_type_invalid = 0x7FFFFFFF
+} StdVideoH264PocType;
+
+typedef enum StdVideoH264AspectRatioIdc {
+ std_video_h264_aspect_ratio_idc_unspecified = 0,
+ std_video_h264_aspect_ratio_idc_square = 1,
+ std_video_h264_aspect_ratio_idc_12_11 = 2,
+ std_video_h264_aspect_ratio_idc_10_11 = 3,
+ std_video_h264_aspect_ratio_idc_16_11 = 4,
+ std_video_h264_aspect_ratio_idc_40_33 = 5,
+ std_video_h264_aspect_ratio_idc_24_11 = 6,
+ std_video_h264_aspect_ratio_idc_20_11 = 7,
+ std_video_h264_aspect_ratio_idc_32_11 = 8,
+ std_video_h264_aspect_ratio_idc_80_33 = 9,
+ std_video_h264_aspect_ratio_idc_18_11 = 10,
+ std_video_h264_aspect_ratio_idc_15_11 = 11,
+ std_video_h264_aspect_ratio_idc_64_33 = 12,
+ std_video_h264_aspect_ratio_idc_160_99 = 13,
+ std_video_h264_aspect_ratio_idc_4_3 = 14,
+ std_video_h264_aspect_ratio_idc_3_2 = 15,
+ std_video_h264_aspect_ratio_idc_2_1 = 16,
+ std_video_h264_aspect_ratio_idc_extended_sar = 255,
+ std_video_h264_aspect_ratio_idc_invalid = 0x7FFFFFFF
+} StdVideoH264AspectRatioIdc;
+
+typedef enum StdVideoH264WeightedBiPredIdc {
+ std_video_h264_default_weighted_b_slices_prediction_idc = 0,
+ std_video_h264_explicit_weighted_b_slices_prediction_idc = 1,
+ std_video_h264_implicit_weighted_b_slices_prediction_idc = 2,
+ std_video_h264_invalid_weighted_b_slices_prediction_idc = 0x7FFFFFFF
+} StdVideoH264WeightedBiPredIdc;
+
+typedef enum StdVideoH264ModificationOfPicNumsIdc {
+ std_video_h264_modification_of_pic_nums_idc_short_term_subtract = 0,
+ std_video_h264_modification_of_pic_nums_idc_short_term_add = 1,
+ std_video_h264_modification_of_pic_nums_idc_long_term = 2,
+ std_video_h264_modification_of_pic_nums_idc_end = 3,
+ std_video_h264_modification_of_pic_nums_idc_invalid = 0x7FFFFFFF
+} StdVideoH264ModificationOfPicNumsIdc;
+
+typedef enum StdVideoH264MemMgmtControlOp {
+ std_video_h264_mem_mgmt_control_op_end = 0,
+ std_video_h264_mem_mgmt_control_op_unmark_short_term = 1,
+ std_video_h264_mem_mgmt_control_op_unmark_long_term = 2,
+ std_video_h264_mem_mgmt_control_op_mark_long_term = 3,
+ std_video_h264_mem_mgmt_control_op_set_max_long_term_index = 4,
+ std_video_h264_mem_mgmt_control_op_unmark_all = 5,
+ std_video_h264_mem_mgmt_control_op_mark_current_as_long_term = 6,
+ std_video_h264_mem_mgmt_control_op_invalid = 0x7FFFFFFF
+} StdVideoH264MemMgmtControlOp;
+
+typedef enum StdVideoH264CabacInitIdc {
+ std_video_h264_cabac_init_idc_0 = 0,
+ std_video_h264_cabac_init_idc_1 = 1,
+ std_video_h264_cabac_init_idc_2 = 2,
+ std_video_h264_cabac_init_idc_invalid = 0x7FFFFFFF
+} StdVideoH264CabacInitIdc;
+
+typedef enum StdVideoH264DisableDeblockingFilterIdc {
+ std_video_h264_disable_deblocking_filter_idc_disabled = 0,
+ std_video_h264_disable_deblocking_filter_idc_enabled = 1,
+ std_video_h264_disable_deblocking_filter_idc_partial = 2,
+ std_video_h264_disable_deblocking_filter_idc_invalid = 0x7FFFFFFF
+} StdVideoH264DisableDeblockingFilterIdc;
+
+typedef enum StdVideoH264PictureType {
+ std_video_h264_picture_type_i = 0,
+ std_video_h264_picture_type_p = 1,
+ std_video_h264_picture_type_b = 2,
+ std_video_h264_picture_type_invalid = 0x7FFFFFFF
+} StdVideoH264PictureType;
+
+typedef enum StdVideoH264SliceType {
+ std_video_h264_slice_type_i = 0,
+ std_video_h264_slice_type_p = 1,
+ std_video_h264_slice_type_b = 2,
+ std_video_h264_slice_type_invalid = 0x7FFFFFFF
+} StdVideoH264SliceType;
+
+typedef enum StdVideoH264NonVclNaluType {
+ std_video_h264_non_vcl_nalu_type_sps = 0,
+ std_video_h264_non_vcl_nalu_type_pps = 1,
+ std_video_h264_non_vcl_nalu_type_aud = 2,
+ std_video_h264_non_vcl_nalu_type_prefix = 3,
+ std_video_h264_non_vcl_nalu_type_end_of_sequence = 4,
+ std_video_h264_non_vcl_nalu_type_end_of_stream = 5,
+ std_video_h264_non_vcl_nalu_type_precoded = 6,
+ std_video_h264_non_vcl_nalu_type_invalid = 0x7FFFFFFF
+} StdVideoH264NonVclNaluType;
+
+typedef struct StdVideoH264SpsVuiFlags {
+ uint32_t aspect_ratio_info_present_flag:1;
+ uint32_t overscan_info_present_flag:1;
+ uint32_t overscan_appropriate_flag:1;
+ uint32_t video_signal_type_present_flag:1;
+ uint32_t video_full_range_flag:1;
+ uint32_t color_description_present_flag:1;
+ uint32_t chroma_loc_info_present_flag:1;
+ uint32_t timing_info_present_flag:1;
+ uint32_t fixed_frame_rate_flag:1;
+ uint32_t bitstream_restriction_flag:1;
+ uint32_t nal_hrd_parameters_present_flag:1;
+ uint32_t vcl_hrd_parameters_present_flag:1;
+} StdVideoH264SpsVuiFlags;
+
+typedef struct StdVideoH264HrdParameters {
+ uint8_t cpb_cnt_minus1;
+ uint8_t bit_rate_scale;
+ uint8_t cpb_size_scale;
+ uint32_t bit_rate_value_minus1[32];
+ uint32_t cpb_size_value_minus1[32];
+ uint8_t cbr_flag[32];
+ uint32_t initial_cpb_removal_delay_length_minus1;
+ uint32_t cpb_removal_delay_length_minus1;
+ uint32_t dpb_output_delay_length_minus1;
+ uint32_t time_offset_length;
+} StdVideoH264HrdParameters;
+
+typedef struct StdVideoH264SequenceParameterSetVui {
+ StdVideoH264AspectRatioIdc aspect_ratio_idc;
+ uint16_t sar_width;
+ uint16_t sar_height;
+ uint8_t video_format;
+ uint8_t color_primaries;
+ uint8_t transfer_characteristics;
+ uint8_t matrix_coefficients;
+ uint32_t num_units_in_tick;
+ uint32_t time_scale;
+ StdVideoH264HrdParameters hrd_parameters;
+ uint8_t num_reorder_frames;
+ uint8_t max_dec_frame_buffering;
+ StdVideoH264SpsVuiFlags flags;
+} StdVideoH264SequenceParameterSetVui;
+
+typedef struct StdVideoH264SpsFlags {
+ uint32_t constraint_set0_flag:1;
+ uint32_t constraint_set1_flag:1;
+ uint32_t constraint_set2_flag:1;
+ uint32_t constraint_set3_flag:1;
+ uint32_t constraint_set4_flag:1;
+ uint32_t constraint_set5_flag:1;
+ uint32_t direct_8x8_inference_flag:1;
+ uint32_t mb_adaptive_frame_field_flag:1;
+ uint32_t frame_mbs_only_flag:1;
+ uint32_t delta_pic_order_always_zero_flag:1;
+ uint32_t residual_colour_transform_flag:1;
+ uint32_t gaps_in_frame_num_value_allowed_flag:1;
+ uint32_t first_picture_after_seek_flag:1; // where is this being documented?
+ uint32_t qpprime_y_zero_transform_bypass_flag:1;
+ uint32_t frame_cropping_flag:1;
+ uint32_t scaling_matrix_present_flag:1;
+ uint32_t vui_parameters_present_flag:1;
+} StdVideoH264SpsFlags;
+
+typedef struct StdVideoH264ScalingLists
+{
+ // scaling_list_present_mask has one bit for each
+ // seq_scaling_list_present_flag[i] for SPS OR
+ // pic_scaling_list_present_flag[i] for PPS,
+ // bit 0 - 5 are for each entry of ScalingList4x4
+ // bit 6 - 7 are for each entry plus 6 for ScalingList8x8
+ uint8_t scaling_list_present_mask;
+ // use_default_scaling_matrix_mask has one bit for each
+ // UseDefaultScalingMatrix4x4Flag[ i ] and
+ // UseDefaultScalingMatrix8x8Flag[ i - 6 ] for SPS OR PPS
+ // bit 0 - 5 are for each entry of ScalingList4x4
+ // bit 6 - 7 are for each entry plus 6 for ScalingList8x8
+ uint8_t use_default_scaling_matrix_mask;
+ uint8_t ScalingList4x4[6][16];
+ uint8_t ScalingList8x8[2][64];
+} StdVideoH264ScalingLists;
+
+typedef struct StdVideoH264SequenceParameterSet
+{
+ StdVideoH264ProfileIdc profile_idc;
+ StdVideoH264Level level_idc;
+ uint8_t seq_parameter_set_id;
+ StdVideoH264ChromaFormatIdc chroma_format_idc;
+ uint8_t bit_depth_luma_minus8;
+ uint8_t bit_depth_chroma_minus8;
+ uint8_t log2_max_frame_num_minus4;
+ StdVideoH264PocType pic_order_cnt_type;
+ uint8_t log2_max_pic_order_cnt_lsb_minus4;
+ int32_t offset_for_non_ref_pic;
+ int32_t offset_for_top_to_bottom_field;
+ uint8_t num_ref_frames_in_pic_order_cnt_cycle;
+ uint8_t max_num_ref_frames;
+ uint32_t pic_width_in_mbs_minus1;
+ uint32_t pic_height_in_map_units_minus1;
+ uint32_t frame_crop_left_offset;
+ uint32_t frame_crop_right_offset;
+ uint32_t frame_crop_top_offset;
+ uint32_t frame_crop_bottom_offset;
+ StdVideoH264SpsFlags flags;
+ int32_t offset_for_ref_frame[255]; // The number of valid values are defined by the num_ref_frames_in_pic_order_cnt_cycle
+ StdVideoH264ScalingLists* pScalingLists; // Must be a valid pointer if scaling_matrix_present_flag is set
+ StdVideoH264SequenceParameterSetVui* pSequenceParameterSetVui; // Must be a valid pointer if StdVideoH264SpsFlags:vui_parameters_present_flag is set
+} StdVideoH264SequenceParameterSet;
+
+typedef struct StdVideoH264PpsFlags {
+ uint32_t transform_8x8_mode_flag:1;
+ uint32_t redundant_pic_cnt_present_flag:1;
+ uint32_t constrained_intra_pred_flag:1;
+ uint32_t deblocking_filter_control_present_flag:1;
+ uint32_t weighted_bipred_idc_flag:1;
+ uint32_t weighted_pred_flag:1;
+ uint32_t pic_order_present_flag:1;
+ uint32_t entropy_coding_mode_flag:1;
+ uint32_t scaling_matrix_present_flag:1;
+} StdVideoH264PpsFlags;
+
+typedef struct StdVideoH264PictureParameterSet
+{
+ uint8_t seq_parameter_set_id;
+ uint8_t pic_parameter_set_id;
+ uint8_t num_ref_idx_l0_default_active_minus1;
+ uint8_t num_ref_idx_l1_default_active_minus1;
+ StdVideoH264WeightedBiPredIdc weighted_bipred_idc;
+ int8_t pic_init_qp_minus26;
+ int8_t pic_init_qs_minus26;
+ int8_t chroma_qp_index_offset;
+ int8_t second_chroma_qp_index_offset;
+ StdVideoH264PpsFlags flags;
+ StdVideoH264ScalingLists* pScalingLists; // Must be a valid pointer if StdVideoH264PpsFlags::scaling_matrix_present_flag is set.
+} StdVideoH264PictureParameterSet;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H264STD_H_
diff --git a/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std_decode.h b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std_decode.h
new file mode 100644
index 0000000..2b4fc64
--- /dev/null
+++ b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std_decode.h
@@ -0,0 +1,87 @@
+/*
+** Copyright (c) 2019-2020 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H264STD_DECODE_H_
+#define VULKAN_VIDEO_CODEC_H264STD_DECODE_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "vk_video/vulkan_video_codec_h264std.h"
+
+// *************************************************
+// Video H.264 Decode related parameters:
+// *************************************************
+
+typedef struct StdVideoDecodeH264PictureInfoFlags {
+ uint32_t field_pic_flag:1; // Is field picture
+ uint32_t is_intra:1; // Is intra picture
+ uint32_t bottom_field_flag:1; // bottom (true) or top (false) field if field_pic_flag is set.
+ uint32_t is_reference:1; // This only applies to picture info, and not to the DPB lists.
+ uint32_t complementary_field_pair:1; // complementary field pair, complementary non-reference field pair, complementary reference field pair
+} StdVideoDecodeH264PictureInfoFlags;
+
+typedef struct StdVideoDecodeH264PictureInfo {
+ uint8_t seq_parameter_set_id; // Selecting SPS from the Picture Parameters
+ uint8_t pic_parameter_set_id; // Selecting PPS from the Picture Parameters and the SPS
+ uint16_t reserved; // for structure members 32-bit packing/alignment
+ uint16_t frame_num; // 7.4.3 Slice header semantics
+ uint16_t idr_pic_id; // 7.4.3 Slice header semantics
+ // PicOrderCnt is based on TopFieldOrderCnt and BottomFieldOrderCnt. See 8.2.1 Decoding process for picture order count type 0 - 2
+ int32_t PicOrderCnt[2]; // TopFieldOrderCnt and BottomFieldOrderCnt fields.
+ StdVideoDecodeH264PictureInfoFlags flags;
+} StdVideoDecodeH264PictureInfo;
+
+typedef struct StdVideoDecodeH264ReferenceInfoFlags {
+ uint32_t top_field_flag:1; // Reference is used for top field reference.
+ uint32_t bottom_field_flag:1; // Reference is used for bottom field reference.
+ uint32_t is_long_term:1; // this is a long term reference
+ uint32_t is_non_existing:1; // Must be handled in accordance with 8.2.5.2: Decoding process for gaps in frame_num
+} StdVideoDecodeH264ReferenceInfoFlags;
+
+typedef struct StdVideoDecodeH264ReferenceInfo {
+ // FrameNum = is_long_term ? long_term_frame_idx : frame_num
+ uint16_t FrameNum; // 7.4.3.3 Decoded reference picture marking semantics
+ uint16_t reserved; // for structure members 32-bit packing/alignment
+ int32_t PicOrderCnt[2]; // TopFieldOrderCnt and BottomFieldOrderCnt fields.
+ StdVideoDecodeH264ReferenceInfoFlags flags;
+} StdVideoDecodeH264ReferenceInfo;
+
+typedef struct StdVideoDecodeH264MvcElementFlags {
+ uint32_t non_idr:1;
+ uint32_t anchor_pic:1;
+ uint32_t inter_view:1;
+} StdVideoDecodeH264MvcElementFlags;
+
+typedef struct StdVideoDecodeH264MvcElement {
+ StdVideoDecodeH264MvcElementFlags flags;
+ uint16_t viewOrderIndex;
+ uint16_t viewId;
+ uint16_t temporalId; // move out?
+ uint16_t priorityId; // move out?
+ uint16_t numOfAnchorRefsInL0;
+ uint16_t viewIdOfAnchorRefsInL0[15];
+ uint16_t numOfAnchorRefsInL1;
+ uint16_t viewIdOfAnchorRefsInL1[15];
+ uint16_t numOfNonAnchorRefsInL0;
+ uint16_t viewIdOfNonAnchorRefsInL0[15];
+ uint16_t numOfNonAnchorRefsInL1;
+ uint16_t viewIdOfNonAnchorRefsInL1[15];
+} StdVideoDecodeH264MvcElement;
+
+typedef struct StdVideoDecodeH264Mvc {
+ uint32_t viewId0;
+ uint32_t mvcElementCount;
+ StdVideoDecodeH264MvcElement* pMvcElements;
+} StdVideoDecodeH264Mvc;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H264STD_DECODE_H_
diff --git a/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std_encode.h b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std_encode.h
new file mode 100644
index 0000000..7184562
--- /dev/null
+++ b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h264std_encode.h
@@ -0,0 +1,94 @@
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_
+#define VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "vk_video/vulkan_video_codec_h264std.h"
+
+// *************************************************
+// Video H.264 Encode related parameters:
+// *************************************************
+
+typedef struct StdVideoEncodeH264SliceHeaderFlags {
+ uint32_t idr_flag:1;
+ uint32_t is_reference_flag:1;
+ uint32_t num_ref_idx_active_override_flag:1;
+ uint32_t no_output_of_prior_pics_flag:1;
+ uint32_t long_term_reference_flag:1;
+ uint32_t adaptive_ref_pic_marking_mode_flag:1;
+ uint32_t no_prior_references_available_flag:1;
+} StdVideoEncodeH264SliceHeaderFlags;
+
+typedef struct StdVideoEncodeH264PictureInfoFlags {
+ uint32_t idr_flag:1;
+ uint32_t is_reference_flag:1;
+ uint32_t long_term_reference_flag:1;
+} StdVideoEncodeH264PictureInfoFlags;
+
+typedef struct StdVideoEncodeH264RefMgmtFlags {
+ uint32_t ref_pic_list_modification_l0_flag:1;
+ uint32_t ref_pic_list_modification_l1_flag:1;
+} StdVideoEncodeH264RefMgmtFlags;
+
+typedef struct StdVideoEncodeH264RefListModEntry {
+ StdVideoH264ModificationOfPicNumsIdc modification_of_pic_nums_idc;
+ uint16_t abs_diff_pic_num_minus1;
+ uint16_t long_term_pic_num;
+} StdVideoEncodeH264RefListModEntry;
+
+typedef struct StdVideoEncodeH264RefPicMarkingEntry {
+ StdVideoH264MemMgmtControlOp operation;
+ uint16_t difference_of_pic_nums_minus1;
+ uint16_t long_term_pic_num;
+ uint16_t long_term_frame_idx;
+ uint16_t max_long_term_frame_idx_plus1;
+} StdVideoEncodeH264RefPicMarkingEntry;
+
+typedef struct StdVideoEncodeH264RefMemMgmtCtrlOperations {
+ StdVideoEncodeH264RefMgmtFlags flags;
+ uint8_t refList0ModOpCount;
+ StdVideoEncodeH264RefListModEntry* pRefList0ModOperations;
+ uint8_t refList1ModOpCount;
+ StdVideoEncodeH264RefListModEntry* pRefList1ModOperations;
+ uint8_t refPicMarkingOpCount;
+ StdVideoEncodeH264RefPicMarkingEntry* pRefPicMarkingOperations;
+} StdVideoEncodeH264RefMemMgmtCtrlOperations;
+
+typedef struct StdVideoEncodeH264PictureInfo {
+ StdVideoEncodeH264PictureInfoFlags flags;
+ StdVideoH264PictureType pictureType;
+ uint32_t frameNum;
+ uint32_t pictureOrderCount;
+ uint16_t long_term_pic_num;
+ uint16_t long_term_frame_idx;
+} StdVideoEncodeH264PictureInfo;
+
+typedef struct StdVideoEncodeH264SliceHeader {
+ StdVideoEncodeH264SliceHeaderFlags flags;
+ StdVideoH264SliceType slice_type;
+ uint8_t seq_parameter_set_id;
+ uint8_t pic_parameter_set_id;
+ uint16_t idr_pic_id;
+ uint8_t num_ref_idx_l0_active_minus1;
+ uint8_t num_ref_idx_l1_active_minus1;
+ StdVideoH264CabacInitIdc cabac_init_idc;
+ StdVideoH264DisableDeblockingFilterIdc disable_deblocking_filter_idc;
+ int8_t slice_alpha_c0_offset_div2;
+ int8_t slice_beta_offset_div2;
+ StdVideoEncodeH264RefMemMgmtCtrlOperations* pMemMgmtCtrlOperations;
+} StdVideoEncodeH264SliceHeader;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_
diff --git a/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h265std.h b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h265std.h
new file mode 100644
index 0000000..185b550
--- /dev/null
+++ b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h265std.h
@@ -0,0 +1,341 @@
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H265STD_H_
+#define VULKAN_VIDEO_CODEC_H265STD_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "vk_video/vulkan_video_codecs_common.h"
+
+// Vulkan 0.5 version number WIP
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_API_VERSION_0_5 VK_MAKE_VIDEO_STD_VERSION(0, 5, 0) // Patch version should always be set to 0
+
+// Format must be in the form XX.XX where the first two digits are the major and the second two, the minor.
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_API_VERSION_0_5
+#define VK_STD_VULKAN_VIDEO_CODEC_H265_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265"
+
+typedef enum StdVideoH265ChromaFormatIdc {
+ std_video_h265_chroma_format_idc_monochrome = 0,
+ std_video_h265_chroma_format_idc_420 = 1,
+ std_video_h265_chroma_format_idc_422 = 2,
+ std_video_h265_chroma_format_idc_444 = 3,
+} StdVideoH265ChromaFormatIdc;
+
+typedef enum StdVideoH265ProfileIdc {
+ std_video_h265_profile_idc_main = 1,
+ std_video_h265_profile_idc_main_10 = 2,
+ std_video_h265_profile_idc_main_still_picture = 3,
+ std_video_h265_profile_idc_format_range_extensions = 4,
+ std_video_h265_profile_idc_scc_extensions = 9,
+ std_video_h265_profile_idc_invalid = 0x7FFFFFFF
+} StdVideoH265ProfileIdc;
+
+typedef enum StdVideoH265Level {
+ std_video_h265_level_1_0 = 0,
+ std_video_h265_level_2_0 = 1,
+ std_video_h265_level_2_1 = 2,
+ std_video_h265_level_3_0 = 3,
+ std_video_h265_level_3_1 = 4,
+ std_video_h265_level_4_0 = 5,
+ std_video_h265_level_4_1 = 6,
+ std_video_h265_level_5_0 = 7,
+ std_video_h265_level_5_1 = 8,
+ std_video_h265_level_5_2 = 9,
+ std_video_h265_level_6_0 = 10,
+ std_video_h265_level_6_1 = 11,
+ std_video_h265_level_6_2 = 12,
+ std_video_h265_level_invalid = 0x7FFFFFFF
+} StdVideoH265Level;
+
+
+typedef struct StdVideoH265DecPicBufMgr
+{
+ uint32_t max_latency_increase_plus1[7];
+ uint8_t max_dec_pic_buffering_minus1[7];
+ uint8_t max_num_reorder_pics[7];
+} StdVideoH265DecPicBufMgr;
+
+typedef struct StdVideoH265SubLayerHrdParameters {
+ uint32_t bit_rate_value_minus1[32];
+ uint32_t cpb_size_value_minus1[32];
+ uint32_t cpb_size_du_value_minus1[32];
+ uint32_t bit_rate_du_value_minus1[32];
+ uint32_t cbr_flag; // each bit represents a range of CpbCounts (bit 0 - cpb_cnt_minus1) per sub-layer
+} StdVideoH265SubLayerHrdParameters;
+
+typedef struct StdVideoH265HrdFlags {
+ uint32_t nal_hrd_parameters_present_flag : 1;
+ uint32_t vcl_hrd_parameters_present_flag : 1;
+ uint32_t sub_pic_hrd_params_present_flag : 1;
+ uint32_t sub_pic_cpb_params_in_pic_timing_sei_flag : 1;
+ uint8_t fixed_pic_rate_general_flag; // each bit represents a sublayer, bit 0 - vps_max_sub_layers_minus1
+ uint8_t fixed_pic_rate_within_cvs_flag; // each bit represents a sublayer, bit 0 - vps_max_sub_layers_minus1
+ uint8_t low_delay_hrd_flag; // each bit represents a sublayer, bit 0 - vps_max_sub_layers_minus1
+} StdVideoH265HrdFlags;
+
+typedef struct StdVideoH265HrdParameters {
+ uint8_t tick_divisor_minus2;
+ uint8_t du_cpb_removal_delay_increment_length_minus1;
+ uint8_t dpb_output_delay_du_length_minus1;
+ uint8_t bit_rate_scale;
+ uint8_t cpb_size_scale;
+ uint8_t cpb_size_du_scale;
+ uint8_t initial_cpb_removal_delay_length_minus1;
+ uint8_t au_cpb_removal_delay_length_minus1;
+ uint8_t dpb_output_delay_length_minus1;
+ uint8_t cpb_cnt_minus1[7];
+ uint16_t elemental_duration_in_tc_minus1[7];
+ StdVideoH265SubLayerHrdParameters* SubLayerHrdParametersNal[7];
+ StdVideoH265SubLayerHrdParameters* SubLayerHrdParametersVcl[7];
+ StdVideoH265HrdFlags flags;
+} StdVideoH265HrdParameters;
+
+typedef struct StdVideoH265VpsFlags {
+ uint32_t vps_temporal_id_nesting_flag : 1;
+ uint32_t vps_sub_layer_ordering_info_present_flag : 1;
+ uint32_t vps_timing_info_present_flag : 1;
+ uint32_t vps_poc_proportional_to_timing_flag : 1;
+} StdVideoH265VpsFlags;
+
+typedef struct StdVideoH265VideoParameterSet
+{
+ uint8_t vps_video_parameter_set_id;
+ uint8_t vps_max_sub_layers_minus1;
+ uint32_t vps_num_units_in_tick;
+ uint32_t vps_time_scale;
+ uint32_t vps_num_ticks_poc_diff_one_minus1;
+ StdVideoH265DecPicBufMgr* pDecPicBufMgr;
+ StdVideoH265HrdParameters* hrd_parameters;
+ StdVideoH265VpsFlags flags;
+} StdVideoH265VideoParameterSet;
+
+typedef struct StdVideoH265ScalingLists
+{
+ uint8_t ScalingList4x4[6][16]; // ScalingList[ 0 ][ MatrixID ][ i ] (sizeID = 0)
+ uint8_t ScalingList8x8[6][64]; // ScalingList[ 1 ][ MatrixID ][ i ] (sizeID = 1)
+ uint8_t ScalingList16x16[6][64]; // ScalingList[ 2 ][ MatrixID ][ i ] (sizeID = 2)
+ uint8_t ScalingList32x32[2][64]; // ScalingList[ 3 ][ MatrixID ][ i ] (sizeID = 3)
+ uint8_t ScalingListDCCoef16x16[6]; // scaling_list_dc_coef_minus8[ sizeID - 2 ][ matrixID ] + 8, sizeID = 2
+ uint8_t ScalingListDCCoef32x32[2]; // scaling_list_dc_coef_minus8[ sizeID - 2 ][ matrixID ] + 8. sizeID = 3
+} StdVideoH265ScalingLists;
+
+typedef struct StdVideoH265SpsVuiFlags {
+ uint32_t aspect_ratio_info_present_flag : 1;
+ uint32_t overscan_info_present_flag : 1;
+ uint32_t overscan_appropriate_flag : 1;
+ uint32_t video_signal_type_present_flag : 1;
+ uint32_t video_full_range_flag : 1;
+ uint32_t colour_description_present_flag : 1;
+ uint32_t chroma_loc_info_present_flag : 1;
+ uint32_t neutral_chroma_indication_flag : 1;
+ uint32_t field_seq_flag : 1;
+ uint32_t frame_field_info_present_flag : 1;
+ uint32_t default_display_window_flag : 1;
+ uint32_t vui_timing_info_present_flag : 1;
+ uint32_t vui_poc_proportional_to_timing_flag : 1;
+ uint32_t vui_hrd_parameters_present_flag : 1;
+ uint32_t bitstream_restriction_flag : 1;
+ uint32_t tiles_fixed_structure_flag : 1;
+ uint32_t motion_vectors_over_pic_boundaries_flag : 1;
+ uint32_t restricted_ref_pic_lists_flag : 1;
+} StdVideoH265SpsVuiFlags;
+
+typedef struct StdVideoH265SequenceParameterSetVui {
+ uint8_t aspect_ratio_idc;
+ uint16_t sar_width;
+ uint16_t sar_height;
+ uint8_t video_format;
+ uint8_t colour_primaries;
+ uint8_t transfer_characteristics;
+ uint8_t matrix_coeffs;
+ uint8_t chroma_sample_loc_type_top_field;
+ uint8_t chroma_sample_loc_type_bottom_field;
+ uint16_t def_disp_win_left_offset;
+ uint16_t def_disp_win_right_offset;
+ uint16_t def_disp_win_top_offset;
+ uint16_t def_disp_win_bottom_offset;
+ uint32_t vui_num_units_in_tick;
+ uint32_t vui_time_scale;
+ uint32_t vui_num_ticks_poc_diff_one_minus1;
+ StdVideoH265HrdParameters* hrd_parameters;
+ uint16_t min_spatial_segmentation_idc;
+ uint8_t max_bytes_per_pic_denom;
+ uint8_t max_bits_per_min_cu_denom;
+ uint8_t log2_max_mv_length_horizontal;
+ uint8_t log2_max_mv_length_vertical;
+ StdVideoH265SpsVuiFlags flags;
+} StdVideoH265SequenceParameterSetVui;
+
+typedef struct StdVideoH265PredictorPaletteEntries
+{
+ uint16_t PredictorPaletteEntries[3][128];
+} StdVideoH265PredictorPaletteEntries;
+
+
+typedef struct StdVideoH265SpsFlags {
+ uint32_t sps_temporal_id_nesting_flag : 1;
+ uint32_t separate_colour_plane_flag : 1;
+ uint32_t scaling_list_enabled_flag : 1;
+ uint32_t sps_scaling_list_data_present_flag : 1;
+ uint32_t amp_enabled_flag : 1;
+ uint32_t sample_adaptive_offset_enabled_flag : 1;
+ uint32_t pcm_enabled_flag : 1;
+ uint32_t pcm_loop_filter_disabled_flag : 1;
+ uint32_t long_term_ref_pics_present_flag : 1;
+ uint32_t sps_temporal_mvp_enabled_flag : 1;
+ uint32_t strong_intra_smoothing_enabled_flag : 1;
+ uint32_t vui_parameters_present_flag : 1;
+ uint32_t sps_extension_present_flag : 1;
+ uint32_t sps_range_extension_flag : 1;
+
+ // extension SPS flags, valid when std_video_h265_profile_idc_format_range_extensions is set
+ uint32_t transform_skip_rotation_enabled_flag : 1;
+ uint32_t transform_skip_context_enabled_flag : 1;
+ uint32_t implicit_rdpcm_enabled_flag : 1;
+ uint32_t explicit_rdpcm_enabled_flag : 1;
+ uint32_t extended_precision_processing_flag : 1;
+ uint32_t intra_smoothing_disabled_flag : 1;
+ uint32_t high_precision_offsets_enabled_flag : 1;
+ uint32_t persistent_rice_adaptation_enabled_flag : 1;
+ uint32_t cabac_bypass_alignment_enabled_flag : 1;
+
+ // extension SPS flags, valid when std_video_h265_profile_idc_scc_extensions is set
+ uint32_t sps_curr_pic_ref_enabled_flag : 1;
+ uint32_t palette_mode_enabled_flag : 1;
+ uint32_t sps_palette_predictor_initializer_present_flag : 1;
+ uint32_t intra_boundary_filtering_disabled_flag : 1;
+} StdVideoH265SpsFlags;
+
+typedef struct StdVideoH265SequenceParameterSet
+{
+ StdVideoH265ProfileIdc profile_idc;
+ StdVideoH265Level level_idc;
+ uint32_t pic_width_in_luma_samples;
+ uint32_t pic_height_in_luma_samples;
+ uint8_t sps_video_parameter_set_id;
+ uint8_t sps_max_sub_layers_minus1;
+ uint8_t sps_seq_parameter_set_id;
+ uint8_t chroma_format_idc;
+ uint8_t bit_depth_luma_minus8;
+ uint8_t bit_depth_chroma_minus8;
+ uint8_t log2_max_pic_order_cnt_lsb_minus4;
+ uint8_t sps_max_dec_pic_buffering_minus1;
+ uint8_t log2_min_luma_coding_block_size_minus3;
+ uint8_t log2_diff_max_min_luma_coding_block_size;
+ uint8_t log2_min_luma_transform_block_size_minus2;
+ uint8_t log2_diff_max_min_luma_transform_block_size;
+ uint8_t max_transform_hierarchy_depth_inter;
+ uint8_t max_transform_hierarchy_depth_intra;
+ uint8_t num_short_term_ref_pic_sets;
+ uint8_t num_long_term_ref_pics_sps;
+ uint8_t pcm_sample_bit_depth_luma_minus1;
+ uint8_t pcm_sample_bit_depth_chroma_minus1;
+ uint8_t log2_min_pcm_luma_coding_block_size_minus3;
+ uint8_t log2_diff_max_min_pcm_luma_coding_block_size;
+ uint32_t conf_win_left_offset;
+ uint32_t conf_win_right_offset;
+ uint32_t conf_win_top_offset;
+ uint32_t conf_win_bottom_offset;
+ StdVideoH265DecPicBufMgr* pDecPicBufMgr;
+ StdVideoH265SpsFlags flags;
+ StdVideoH265ScalingLists* pScalingLists; // Must be a valid pointer if sps_scaling_list_data_present_flag is set
+ StdVideoH265SequenceParameterSetVui* pSequenceParameterSetVui; // Must be a valid pointer if StdVideoH265SpsFlags:vui_parameters_present_flag is set palette_max_size;
+
+ // extension SPS flags, valid when std_video_h265_profile_idc_scc_extensions is set
+ uint8_t palette_max_size;
+ uint8_t delta_palette_max_predictor_size;
+ uint8_t motion_vector_resolution_control_idc;
+ uint8_t sps_num_palette_predictor_initializer_minus1;
+ StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries; // Must be a valid pointer if sps_palette_predictor_initializer_present_flag is set
+} StdVideoH265SequenceParameterSet;
+
+
+typedef struct StdVideoH265PpsFlags {
+ uint32_t dependent_slice_segments_enabled_flag : 1;
+ uint32_t output_flag_present_flag : 1;
+ uint32_t sign_data_hiding_enabled_flag : 1;
+ uint32_t cabac_init_present_flag : 1;
+ uint32_t constrained_intra_pred_flag : 1;
+ uint32_t transform_skip_enabled_flag : 1;
+ uint32_t cu_qp_delta_enabled_flag : 1;
+ uint32_t pps_slice_chroma_qp_offsets_present_flag : 1;
+ uint32_t weighted_pred_flag : 1;
+ uint32_t weighted_bipred_flag : 1;
+ uint32_t transquant_bypass_enabled_flag : 1;
+ uint32_t tiles_enabled_flag : 1;
+ uint32_t entropy_coding_sync_enabled_flag : 1;
+ uint32_t uniform_spacing_flag : 1;
+ uint32_t loop_filter_across_tiles_enabled_flag : 1;
+ uint32_t pps_loop_filter_across_slices_enabled_flag : 1;
+ uint32_t deblocking_filter_control_present_flag : 1;
+ uint32_t deblocking_filter_override_enabled_flag : 1;
+ uint32_t pps_deblocking_filter_disabled_flag : 1;
+ uint32_t pps_scaling_list_data_present_flag : 1;
+ uint32_t lists_modification_present_flag : 1;
+ uint32_t slice_segment_header_extension_present_flag : 1;
+ uint32_t pps_extension_present_flag : 1;
+
+ // extension PPS flags, valid when std_video_h265_profile_idc_format_range_extensions is set
+ uint32_t cross_component_prediction_enabled_flag : 1;
+ uint32_t chroma_qp_offset_list_enabled_flag : 1;
+
+ // extension PPS flags, valid when std_video_h265_profile_idc_scc_extensions is set
+ uint32_t pps_curr_pic_ref_enabled_flag : 1;
+ uint32_t residual_adaptive_colour_transform_enabled_flag : 1;
+ uint32_t pps_slice_act_qp_offsets_present_flag : 1;
+ uint32_t pps_palette_predictor_initializer_present_flag : 1;
+ uint32_t monochrome_palette_flag : 1;
+ uint32_t pps_range_extension_flag : 1;
+} StdVideoH265PpsFlags;
+
+typedef struct StdVideoH265PictureParameterSet
+{
+ uint8_t pps_pic_parameter_set_id;
+ uint8_t pps_seq_parameter_set_id;
+ uint8_t num_extra_slice_header_bits;
+ uint8_t num_ref_idx_l0_default_active_minus1;
+ uint8_t num_ref_idx_l1_default_active_minus1;
+ int8_t init_qp_minus26;
+ uint8_t diff_cu_qp_delta_depth;
+ int8_t pps_cb_qp_offset;
+ int8_t pps_cr_qp_offset;
+ uint8_t num_tile_columns_minus1;
+ uint8_t num_tile_rows_minus1;
+ uint16_t column_width_minus1[19];
+ uint16_t row_height_minus1[21];
+ int8_t pps_beta_offset_div2;
+ int8_t pps_tc_offset_div2;
+ uint8_t log2_parallel_merge_level_minus2;
+ StdVideoH265PpsFlags flags;
+ StdVideoH265ScalingLists* pScalingLists; // Must be a valid pointer if pps_scaling_list_data_present_flag is set
+
+ // extension PPS, valid when std_video_h265_profile_idc_format_range_extensions is set
+ uint8_t log2_max_transform_skip_block_size_minus2;
+ uint8_t diff_cu_chroma_qp_offset_depth;
+ uint8_t chroma_qp_offset_list_len_minus1;
+ int8_t cb_qp_offset_list[6];
+ int8_t cr_qp_offset_list[6];
+ uint8_t log2_sao_offset_scale_luma;
+ uint8_t log2_sao_offset_scale_chroma;
+
+ // extension PPS, valid when std_video_h265_profile_idc_scc_extensions is set
+ int8_t pps_act_y_qp_offset_plus5;
+ int8_t pps_act_cb_qp_offset_plus5;
+ int8_t pps_act_cr_qp_offset_plus5;
+ uint8_t pps_num_palette_predictor_initializer;
+ uint8_t luma_bit_depth_entry_minus8;
+ uint8_t chroma_bit_depth_entry_minus8;
+ StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries; // Must be a valid pointer if pps_palette_predictor_initializer_present_flag is set
+} StdVideoH265PictureParameterSet;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H265STD_H_
diff --git a/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h265std_decode.h b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h265std_decode.h
new file mode 100644
index 0000000..4be8b5f
--- /dev/null
+++ b/external/vulkancts/scripts/src/vk_video/vulkan_video_codec_h265std_decode.h
@@ -0,0 +1,59 @@
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_H265STD_DECODE_H_
+#define VULKAN_VIDEO_CODEC_H265STD_DECODE_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "vk_video/vulkan_video_codec_h265std.h"
+
+// *************************************************
+// Video h265 Decode related parameters:
+// *************************************************
+
+typedef struct StdVideoDecodeH265PictureInfoFlags {
+ uint32_t IrapPicFlag : 1;
+ uint32_t IdrPicFlag : 1;
+ uint32_t IsReference : 1;
+ uint32_t short_term_ref_pic_set_sps_flag : 1;
+} StdVideoDecodeH265PictureInfoFlags;
+
+typedef struct StdVideoDecodeH265PictureInfo {
+ uint8_t vps_video_parameter_set_id;
+ uint8_t sps_seq_parameter_set_id;
+ uint8_t pps_pic_parameter_set_id;
+ uint8_t num_short_term_ref_pic_sets;
+ int32_t PicOrderCntVal;
+ uint16_t NumBitsForSTRefPicSetInSlice; // number of bits used in st_ref_pic_set()
+ //when short_term_ref_pic_set_sps_flag is 0; otherwise set to 0.
+ uint8_t NumDeltaPocsOfRefRpsIdx; // NumDeltaPocs[ RefRpsIdx ] when short_term_ref_pic_set_sps_flag = 1, otherwise 0
+ uint8_t RefPicSetStCurrBefore[8]; // slotIndex as used in VkVideoReferenceSlotKHR structures representing
+ //pReferenceSlots in VkVideoDecodeInfoKHR, 0xff for invalid slotIndex
+ uint8_t RefPicSetStCurrAfter[8]; // slotIndex as used in VkVideoReferenceSlotKHR structures representing
+ //pReferenceSlots in VkVideoDecodeInfoKHR, 0xff for invalid slotIndex
+ uint8_t RefPicSetLtCurr[8]; // slotIndex as used in VkVideoReferenceSlotKHR structures representing
+ //pReferenceSlots in VkVideoDecodeInfoKHR, 0xff for invalid slotIndex
+ StdVideoDecodeH265PictureInfoFlags flags;
+} StdVideoDecodeH265PictureInfo;
+
+typedef struct StdVideoDecodeH265ReferenceInfoFlags {
+ uint32_t is_long_term : 1;
+ uint32_t is_non_existing : 1;
+} StdVideoDecodeH265ReferenceInfoFlags;
+
+typedef struct StdVideoDecodeH265ReferenceInfo {
+ int32_t PicOrderCntVal;
+ StdVideoDecodeH265ReferenceInfoFlags flags;
+} StdVideoDecodeH265ReferenceInfo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_H265STD_DECODE_H_
diff --git a/external/vulkancts/scripts/src/vk_video/vulkan_video_codecs_common.h b/external/vulkancts/scripts/src/vk_video/vulkan_video_codecs_common.h
new file mode 100644
index 0000000..8cc227a
--- /dev/null
+++ b/external/vulkancts/scripts/src/vk_video/vulkan_video_codecs_common.h
@@ -0,0 +1,21 @@
+/*
+** Copyright (c) 2019-2021 The Khronos Group Inc.
+**
+** SPDX-License-Identifier: Apache-2.0
+*/
+
+#ifndef VULKAN_VIDEO_CODEC_COMMON_H_
+#define VULKAN_VIDEO_CODEC_COMMON_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define VK_MAKE_VIDEO_STD_VERSION(major, minor, patch) \
+ ((((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch)))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // VULKAN_VIDEO_CODEC_COMMON_H_
diff --git a/external/vulkancts/scripts/src/vulkan_android.h b/external/vulkancts/scripts/src/vulkan_android.h
index 50ef85f..2160e3e 100644
--- a/external/vulkancts/scripts/src/vulkan_android.h
+++ b/external/vulkancts/scripts/src/vulkan_android.h
@@ -2,7 +2,7 @@
#define VULKAN_ANDROID_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_beta.h b/external/vulkancts/scripts/src/vulkan_beta.h
index 23513b3..9aebb1a 100644
--- a/external/vulkancts/scripts/src/vulkan_beta.h
+++ b/external/vulkancts/scripts/src/vulkan_beta.h
@@ -2,7 +2,7 @@
#define VULKAN_BETA_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
@@ -19,6 +19,325 @@
+#define VK_KHR_video_queue 1
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionKHR)
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionParametersKHR)
+#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION 1
+#define VK_KHR_VIDEO_QUEUE_EXTENSION_NAME "VK_KHR_video_queue"
+
+typedef enum VkQueryResultStatusKHR {
+ VK_QUERY_RESULT_STATUS_ERROR_KHR = -1,
+ VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0,
+ VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1,
+ VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkQueryResultStatusKHR;
+
+typedef enum VkVideoCodecOperationFlagBitsKHR {
+ VK_VIDEO_CODEC_OPERATION_INVALID_BIT_KHR = 0,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT = 0x00010000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT = 0x00000001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT = 0x00000002,
+#endif
+ VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCodecOperationFlagBitsKHR;
+typedef VkFlags VkVideoCodecOperationFlagsKHR;
+
+typedef enum VkVideoChromaSubsamplingFlagBitsKHR {
+ VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_BIT_KHR = 0,
+ VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0x00000001,
+ VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0x00000002,
+ VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0x00000004,
+ VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0x00000008,
+ VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoChromaSubsamplingFlagBitsKHR;
+typedef VkFlags VkVideoChromaSubsamplingFlagsKHR;
+
+typedef enum VkVideoComponentBitDepthFlagBitsKHR {
+ VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR = 0,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0x00000001,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0x00000004,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0x00000010,
+ VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoComponentBitDepthFlagBitsKHR;
+typedef VkFlags VkVideoComponentBitDepthFlagsKHR;
+
+typedef enum VkVideoCapabilitiesFlagBitsKHR {
+ VK_VIDEO_CAPABILITIES_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
+ VK_VIDEO_CAPABILITIES_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002,
+ VK_VIDEO_CAPABILITIES_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCapabilitiesFlagBitsKHR;
+typedef VkFlags VkVideoCapabilitiesFlagsKHR;
+
+typedef enum VkVideoSessionCreateFlagBitsKHR {
+ VK_VIDEO_SESSION_CREATE_DEFAULT_KHR = 0,
+ VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001,
+ VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoSessionCreateFlagBitsKHR;
+typedef VkFlags VkVideoSessionCreateFlagsKHR;
+typedef VkFlags VkVideoBeginCodingFlagsKHR;
+typedef VkFlags VkVideoEndCodingFlagsKHR;
+
+typedef enum VkVideoCodingControlFlagBitsKHR {
+ VK_VIDEO_CODING_CONTROL_DEFAULT_KHR = 0,
+ VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0x00000001,
+ VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCodingControlFlagBitsKHR;
+typedef VkFlags VkVideoCodingControlFlagsKHR;
+
+typedef enum VkVideoCodingQualityPresetFlagBitsKHR {
+ VK_VIDEO_CODING_QUALITY_PRESET_DEFAULT_BIT_KHR = 0,
+ VK_VIDEO_CODING_QUALITY_PRESET_NORMAL_BIT_KHR = 0x00000001,
+ VK_VIDEO_CODING_QUALITY_PRESET_POWER_BIT_KHR = 0x00000002,
+ VK_VIDEO_CODING_QUALITY_PRESET_QUALITY_BIT_KHR = 0x00000004,
+ VK_VIDEO_CODING_QUALITY_PRESET_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoCodingQualityPresetFlagBitsKHR;
+typedef VkFlags VkVideoCodingQualityPresetFlagsKHR;
+typedef struct VkVideoQueueFamilyProperties2KHR {
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCodecOperationFlagsKHR videoCodecOperations;
+} VkVideoQueueFamilyProperties2KHR;
+
+typedef struct VkVideoProfileKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCodecOperationFlagBitsKHR videoCodecOperation;
+ VkVideoChromaSubsamplingFlagsKHR chromaSubsampling;
+ VkVideoComponentBitDepthFlagsKHR lumaBitDepth;
+ VkVideoComponentBitDepthFlagsKHR chromaBitDepth;
+} VkVideoProfileKHR;
+
+typedef struct VkVideoProfilesKHR {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t profileCount;
+ const VkVideoProfileKHR* pProfiles;
+} VkVideoProfilesKHR;
+
+typedef struct VkVideoCapabilitiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkVideoCapabilitiesFlagsKHR capabilityFlags;
+ VkDeviceSize minBitstreamBufferOffsetAlignment;
+ VkDeviceSize minBitstreamBufferSizeAlignment;
+ VkExtent2D videoPictureExtentGranularity;
+ VkExtent2D minExtent;
+ VkExtent2D maxExtent;
+ uint32_t maxReferencePicturesSlotsCount;
+ uint32_t maxReferencePicturesActiveCount;
+} VkVideoCapabilitiesKHR;
+
+typedef struct VkPhysicalDeviceVideoFormatInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkImageUsageFlags imageUsage;
+ const VkVideoProfilesKHR* pVideoProfiles;
+} VkPhysicalDeviceVideoFormatInfoKHR;
+
+typedef struct VkVideoFormatPropertiesKHR {
+ VkStructureType sType;
+ void* pNext;
+ VkFormat format;
+} VkVideoFormatPropertiesKHR;
+
+typedef struct VkVideoPictureResourceKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkOffset2D codedOffset;
+ VkExtent2D codedExtent;
+ uint32_t baseArrayLayer;
+ VkImageView imageViewBinding;
+} VkVideoPictureResourceKHR;
+
+typedef struct VkVideoReferenceSlotKHR {
+ VkStructureType sType;
+ const void* pNext;
+ int8_t slotIndex;
+ const VkVideoPictureResourceKHR* pPictureResource;
+} VkVideoReferenceSlotKHR;
+
+typedef struct VkVideoGetMemoryPropertiesKHR {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t memoryBindIndex;
+ VkMemoryRequirements2* pMemoryRequirements;
+} VkVideoGetMemoryPropertiesKHR;
+
+typedef struct VkVideoBindMemoryKHR {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t memoryBindIndex;
+ VkDeviceMemory memory;
+ VkDeviceSize memoryOffset;
+ VkDeviceSize memorySize;
+} VkVideoBindMemoryKHR;
+
+typedef struct VkVideoSessionCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t queueFamilyIndex;
+ VkVideoSessionCreateFlagsKHR flags;
+ const VkVideoProfileKHR* pVideoProfile;
+ VkFormat pictureFormat;
+ VkExtent2D maxCodedExtent;
+ VkFormat referencePicturesFormat;
+ uint32_t maxReferencePicturesSlotsCount;
+ uint32_t maxReferencePicturesActiveCount;
+} VkVideoSessionCreateInfoKHR;
+
+typedef struct VkVideoSessionParametersCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoSessionParametersKHR videoSessionParametersTemplate;
+ VkVideoSessionKHR videoSession;
+} VkVideoSessionParametersCreateInfoKHR;
+
+typedef struct VkVideoSessionParametersUpdateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t updateSequenceCount;
+} VkVideoSessionParametersUpdateInfoKHR;
+
+typedef struct VkVideoBeginCodingInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoBeginCodingFlagsKHR flags;
+ VkVideoCodingQualityPresetFlagsKHR codecQualityPreset;
+ VkVideoSessionKHR videoSession;
+ VkVideoSessionParametersKHR videoSessionParameters;
+ uint32_t referenceSlotCount;
+ const VkVideoReferenceSlotKHR* pReferenceSlots;
+} VkVideoBeginCodingInfoKHR;
+
+typedef struct VkVideoEndCodingInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEndCodingFlagsKHR flags;
+} VkVideoEndCodingInfoKHR;
+
+typedef struct VkVideoCodingControlInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoCodingControlFlagsKHR flags;
+} VkVideoCodingControlInfoKHR;
+
+typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)(VkPhysicalDevice physicalDevice, const VkVideoProfileKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities);
+typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, uint32_t* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionKHR)(VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession);
+typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionKHR)(VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator);
+typedef VkResult (VKAPI_PTR *PFN_vkGetVideoSessionMemoryRequirementsKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t* pVideoSessionMemoryRequirementsCount, VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements);
+typedef VkResult (VKAPI_PTR *PFN_vkBindVideoSessionMemoryKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t videoSessionBindMemoryCount, const VkVideoBindMemoryKHR* pVideoSessionBindMemories);
+typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionParametersKHR)(VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters);
+typedef VkResult (VKAPI_PTR *PFN_vkUpdateVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);
+typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator);
+typedef void (VKAPI_PTR *PFN_vkCmdBeginVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdEndVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo);
+typedef void (VKAPI_PTR *PFN_vkCmdControlVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoCapabilitiesKHR(
+ VkPhysicalDevice physicalDevice,
+ const VkVideoProfileKHR* pVideoProfile,
+ VkVideoCapabilitiesKHR* pCapabilities);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoFormatPropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo,
+ uint32_t* pVideoFormatPropertyCount,
+ VkVideoFormatPropertiesKHR* pVideoFormatProperties);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionKHR(
+ VkDevice device,
+ const VkVideoSessionCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkVideoSessionKHR* pVideoSession);
+
+VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionKHR(
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ const VkAllocationCallbacks* pAllocator);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetVideoSessionMemoryRequirementsKHR(
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ uint32_t* pVideoSessionMemoryRequirementsCount,
+ VkVideoGetMemoryPropertiesKHR* pVideoSessionMemoryRequirements);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkBindVideoSessionMemoryKHR(
+ VkDevice device,
+ VkVideoSessionKHR videoSession,
+ uint32_t videoSessionBindMemoryCount,
+ const VkVideoBindMemoryKHR* pVideoSessionBindMemories);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionParametersKHR(
+ VkDevice device,
+ const VkVideoSessionParametersCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkVideoSessionParametersKHR* pVideoSessionParameters);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkUpdateVideoSessionParametersKHR(
+ VkDevice device,
+ VkVideoSessionParametersKHR videoSessionParameters,
+ const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionParametersKHR(
+ VkDevice device,
+ VkVideoSessionParametersKHR videoSessionParameters,
+ const VkAllocationCallbacks* pAllocator);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdBeginVideoCodingKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoBeginCodingInfoKHR* pBeginInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdEndVideoCodingKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoEndCodingInfoKHR* pEndCodingInfo);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdControlVideoCodingKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoCodingControlInfoKHR* pCodingControlInfo);
+#endif
+
+
+#define VK_KHR_video_decode_queue 1
+#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 1
+#define VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME "VK_KHR_video_decode_queue"
+
+typedef enum VkVideoDecodeFlagBitsKHR {
+ VK_VIDEO_DECODE_DEFAULT_KHR = 0,
+ VK_VIDEO_DECODE_RESERVED_0_BIT_KHR = 0x00000001,
+ VK_VIDEO_DECODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoDecodeFlagBitsKHR;
+typedef VkFlags VkVideoDecodeFlagsKHR;
+typedef struct VkVideoDecodeInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeFlagsKHR flags;
+ VkOffset2D codedOffset;
+ VkExtent2D codedExtent;
+ VkBuffer srcBuffer;
+ VkDeviceSize srcBufferOffset;
+ VkDeviceSize srcBufferRange;
+ VkVideoPictureResourceKHR dstPictureResource;
+ const VkVideoReferenceSlotKHR* pSetupReferenceSlot;
+ uint32_t referenceSlotCount;
+ const VkVideoReferenceSlotKHR* pReferenceSlots;
+} VkVideoDecodeInfoKHR;
+
+typedef void (VKAPI_PTR *PFN_vkCmdDecodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pFrameInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdDecodeVideoKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoDecodeInfoKHR* pFrameInfo);
+#endif
+
+
#define VK_KHR_portability_subset 1
#define VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION 1
#define VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME "VK_KHR_portability_subset"
@@ -49,6 +368,335 @@
} VkPhysicalDevicePortabilitySubsetPropertiesKHR;
+
+#define VK_KHR_video_encode_queue 1
+#define VK_KHR_VIDEO_ENCODE_QUEUE_SPEC_VERSION 2
+#define VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME "VK_KHR_video_encode_queue"
+
+typedef enum VkVideoEncodeFlagBitsKHR {
+ VK_VIDEO_ENCODE_DEFAULT_KHR = 0,
+ VK_VIDEO_ENCODE_RESERVED_0_BIT_KHR = 0x00000001,
+ VK_VIDEO_ENCODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoEncodeFlagBitsKHR;
+typedef VkFlags VkVideoEncodeFlagsKHR;
+
+typedef enum VkVideoEncodeRateControlFlagBitsKHR {
+ VK_VIDEO_ENCODE_RATE_CONTROL_DEFAULT_KHR = 0,
+ VK_VIDEO_ENCODE_RATE_CONTROL_RESET_BIT_KHR = 0x00000001,
+ VK_VIDEO_ENCODE_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoEncodeRateControlFlagBitsKHR;
+typedef VkFlags VkVideoEncodeRateControlFlagsKHR;
+
+typedef enum VkVideoEncodeRateControlModeFlagBitsKHR {
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR = 0,
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR = 1,
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR = 2,
+ VK_VIDEO_ENCODE_RATE_CONTROL_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF
+} VkVideoEncodeRateControlModeFlagBitsKHR;
+typedef VkFlags VkVideoEncodeRateControlModeFlagsKHR;
+typedef struct VkVideoEncodeInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeFlagsKHR flags;
+ uint32_t qualityLevel;
+ VkExtent2D codedExtent;
+ VkBuffer dstBitstreamBuffer;
+ VkDeviceSize dstBitstreamBufferOffset;
+ VkDeviceSize dstBitstreamBufferMaxRange;
+ VkVideoPictureResourceKHR srcPictureResource;
+ const VkVideoReferenceSlotKHR* pSetupReferenceSlot;
+ uint32_t referenceSlotCount;
+ const VkVideoReferenceSlotKHR* pReferenceSlots;
+} VkVideoEncodeInfoKHR;
+
+typedef struct VkVideoEncodeRateControlInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeRateControlFlagsKHR flags;
+ VkVideoEncodeRateControlModeFlagBitsKHR rateControlMode;
+ uint32_t averageBitrate;
+ uint16_t peakToAverageBitrateRatio;
+ uint16_t frameRateNumerator;
+ uint16_t frameRateDenominator;
+ uint32_t virtualBufferSizeInMs;
+} VkVideoEncodeRateControlInfoKHR;
+
+typedef void (VKAPI_PTR *PFN_vkCmdEncodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdEncodeVideoKHR(
+ VkCommandBuffer commandBuffer,
+ const VkVideoEncodeInfoKHR* pEncodeInfo);
+#endif
+
+
+#define VK_EXT_video_encode_h264 1
+#include "vk_video/vulkan_video_codec_h264std.h"
+#include "vk_video/vulkan_video_codec_h264std_encode.h"
+#define VK_EXT_VIDEO_ENCODE_H264_SPEC_VERSION 1
+#define VK_EXT_VIDEO_ENCODE_H264_EXTENSION_NAME "VK_EXT_video_encode_h264"
+
+typedef enum VkVideoEncodeH264CapabilitiesFlagBitsEXT {
+ VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT = 0x00000002,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT = 0x00000004,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT = 0x00000008,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT = 0x00000010,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT = 0x00000020,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT = 0x00000040,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT = 0x00000080,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT = 0x00000100,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT = 0x00000200,
+ VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT = 0x00000400,
+ VK_VIDEO_ENCODE_H264_CAPABILITIES_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkVideoEncodeH264CapabilitiesFlagBitsEXT;
+typedef VkFlags VkVideoEncodeH264CapabilitiesFlagsEXT;
+
+typedef enum VkVideoEncodeH264InputModeFlagBitsEXT {
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT = 0x00000002,
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT = 0x00000004,
+ VK_VIDEO_ENCODE_H264_INPUT_MODE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkVideoEncodeH264InputModeFlagBitsEXT;
+typedef VkFlags VkVideoEncodeH264InputModeFlagsEXT;
+
+typedef enum VkVideoEncodeH264OutputModeFlagBitsEXT {
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT = 0x00000002,
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT = 0x00000004,
+ VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkVideoEncodeH264OutputModeFlagBitsEXT;
+typedef VkFlags VkVideoEncodeH264OutputModeFlagsEXT;
+
+typedef enum VkVideoEncodeH264CreateFlagBitsEXT {
+ VK_VIDEO_ENCODE_H264_CREATE_DEFAULT_EXT = 0,
+ VK_VIDEO_ENCODE_H264_CREATE_RESERVED_0_BIT_EXT = 0x00000001,
+ VK_VIDEO_ENCODE_H264_CREATE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkVideoEncodeH264CreateFlagBitsEXT;
+typedef VkFlags VkVideoEncodeH264CreateFlagsEXT;
+typedef struct VkVideoEncodeH264CapabilitiesEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeH264CapabilitiesFlagsEXT flags;
+ VkVideoEncodeH264InputModeFlagsEXT inputModeFlags;
+ VkVideoEncodeH264OutputModeFlagsEXT outputModeFlags;
+ VkExtent2D minPictureSizeInMbs;
+ VkExtent2D maxPictureSizeInMbs;
+ VkExtent2D inputImageDataAlignment;
+ uint8_t maxNumL0ReferenceForP;
+ uint8_t maxNumL0ReferenceForB;
+ uint8_t maxNumL1Reference;
+ uint8_t qualityLevelCount;
+ VkExtensionProperties stdExtensionVersion;
+} VkVideoEncodeH264CapabilitiesEXT;
+
+typedef struct VkVideoEncodeH264SessionCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoEncodeH264CreateFlagsEXT flags;
+ VkExtent2D maxPictureSizeInMbs;
+ const VkExtensionProperties* pStdExtensionVersion;
+} VkVideoEncodeH264SessionCreateInfoEXT;
+
+typedef struct VkVideoEncodeH264SessionParametersAddInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t spsStdCount;
+ const StdVideoH264SequenceParameterSet* pSpsStd;
+ uint32_t ppsStdCount;
+ const StdVideoH264PictureParameterSet* pPpsStd;
+} VkVideoEncodeH264SessionParametersAddInfoEXT;
+
+typedef struct VkVideoEncodeH264SessionParametersCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t maxSpsStdCount;
+ uint32_t maxPpsStdCount;
+ const VkVideoEncodeH264SessionParametersAddInfoEXT* pParametersAddInfo;
+} VkVideoEncodeH264SessionParametersCreateInfoEXT;
+
+typedef struct VkVideoEncodeH264DpbSlotInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ int8_t slotIndex;
+ const StdVideoEncodeH264PictureInfo* pStdPictureInfo;
+} VkVideoEncodeH264DpbSlotInfoEXT;
+
+typedef struct VkVideoEncodeH264NaluSliceEXT {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoEncodeH264SliceHeader* pSliceHeaderStd;
+ uint32_t mbCount;
+ uint8_t refFinalList0EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefFinalList0Entries;
+ uint8_t refFinalList1EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefFinalList1Entries;
+ uint32_t precedingNaluBytes;
+ uint8_t minQp;
+ uint8_t maxQp;
+} VkVideoEncodeH264NaluSliceEXT;
+
+typedef struct VkVideoEncodeH264VclFrameInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint8_t refDefaultFinalList0EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefDefaultFinalList0Entries;
+ uint8_t refDefaultFinalList1EntryCount;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pRefDefaultFinalList1Entries;
+ uint32_t naluSliceEntryCount;
+ const VkVideoEncodeH264NaluSliceEXT* pNaluSliceEntries;
+ const VkVideoEncodeH264DpbSlotInfoEXT* pCurrentPictureInfo;
+} VkVideoEncodeH264VclFrameInfoEXT;
+
+typedef struct VkVideoEncodeH264EmitPictureParametersEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint8_t spsId;
+ VkBool32 emitSpsEnable;
+ uint32_t ppsIdEntryCount;
+ const uint8_t* ppsIdEntries;
+} VkVideoEncodeH264EmitPictureParametersEXT;
+
+typedef struct VkVideoEncodeH264ProfileEXT {
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH264ProfileIdc stdProfileIdc;
+} VkVideoEncodeH264ProfileEXT;
+
+
+
+#define VK_EXT_video_decode_h264 1
+#include "vk_video/vulkan_video_codec_h264std_decode.h"
+#define VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION 1
+#define VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME "VK_EXT_video_decode_h264"
+
+typedef enum VkVideoDecodeH264FieldLayoutFlagBitsEXT {
+ VK_VIDEO_DECODE_H264_PROGRESSIVE_PICTURES_ONLY_EXT = 0,
+ VK_VIDEO_DECODE_H264_FIELD_LAYOUT_LINE_INTERLACED_PLANE_BIT_EXT = 0x00000001,
+ VK_VIDEO_DECODE_H264_FIELD_LAYOUT_SEPARATE_INTERLACED_PLANE_BIT_EXT = 0x00000002,
+ VK_VIDEO_DECODE_H264_FIELD_LAYOUT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF
+} VkVideoDecodeH264FieldLayoutFlagBitsEXT;
+typedef VkFlags VkVideoDecodeH264FieldLayoutFlagsEXT;
+typedef VkFlags VkVideoDecodeH264CreateFlagsEXT;
+typedef struct VkVideoDecodeH264ProfileEXT {
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH264ProfileIdc stdProfileIdc;
+ VkVideoDecodeH264FieldLayoutFlagsEXT fieldLayout;
+} VkVideoDecodeH264ProfileEXT;
+
+typedef struct VkVideoDecodeH264CapabilitiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t maxLevel;
+ VkOffset2D fieldOffsetGranularity;
+ VkExtensionProperties stdExtensionVersion;
+} VkVideoDecodeH264CapabilitiesEXT;
+
+typedef struct VkVideoDecodeH264SessionCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeH264CreateFlagsEXT flags;
+ const VkExtensionProperties* pStdExtensionVersion;
+} VkVideoDecodeH264SessionCreateInfoEXT;
+
+typedef struct VkVideoDecodeH264SessionParametersAddInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t spsStdCount;
+ const StdVideoH264SequenceParameterSet* pSpsStd;
+ uint32_t ppsStdCount;
+ const StdVideoH264PictureParameterSet* pPpsStd;
+} VkVideoDecodeH264SessionParametersAddInfoEXT;
+
+typedef struct VkVideoDecodeH264SessionParametersCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t maxSpsStdCount;
+ uint32_t maxPpsStdCount;
+ const VkVideoDecodeH264SessionParametersAddInfoEXT* pParametersAddInfo;
+} VkVideoDecodeH264SessionParametersCreateInfoEXT;
+
+typedef struct VkVideoDecodeH264PictureInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264PictureInfo* pStdPictureInfo;
+ uint32_t slicesCount;
+ const uint32_t* pSlicesDataOffsets;
+} VkVideoDecodeH264PictureInfoEXT;
+
+typedef struct VkVideoDecodeH264MvcEXT {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264Mvc* pStdMvc;
+} VkVideoDecodeH264MvcEXT;
+
+typedef struct VkVideoDecodeH264DpbSlotInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH264ReferenceInfo* pStdReferenceInfo;
+} VkVideoDecodeH264DpbSlotInfoEXT;
+
+
+
+#define VK_EXT_video_decode_h265 1
+#include "vk_video/vulkan_video_codec_h265std.h"
+#include "vk_video/vulkan_video_codec_h265std_decode.h"
+#define VK_EXT_VIDEO_DECODE_H265_SPEC_VERSION 1
+#define VK_EXT_VIDEO_DECODE_H265_EXTENSION_NAME "VK_EXT_video_decode_h265"
+typedef VkFlags VkVideoDecodeH265CreateFlagsEXT;
+typedef struct VkVideoDecodeH265ProfileEXT {
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoH265ProfileIdc stdProfileIdc;
+} VkVideoDecodeH265ProfileEXT;
+
+typedef struct VkVideoDecodeH265CapabilitiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t maxLevel;
+ VkExtensionProperties stdExtensionVersion;
+} VkVideoDecodeH265CapabilitiesEXT;
+
+typedef struct VkVideoDecodeH265SessionCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkVideoDecodeH265CreateFlagsEXT flags;
+ const VkExtensionProperties* pStdExtensionVersion;
+} VkVideoDecodeH265SessionCreateInfoEXT;
+
+typedef struct VkVideoDecodeH265SessionParametersAddInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t spsStdCount;
+ const StdVideoH265SequenceParameterSet* pSpsStd;
+ uint32_t ppsStdCount;
+ const StdVideoH265PictureParameterSet* pPpsStd;
+} VkVideoDecodeH265SessionParametersAddInfoEXT;
+
+typedef struct VkVideoDecodeH265SessionParametersCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t maxSpsStdCount;
+ uint32_t maxPpsStdCount;
+ const VkVideoDecodeH265SessionParametersAddInfoEXT* pParametersAddInfo;
+} VkVideoDecodeH265SessionParametersCreateInfoEXT;
+
+typedef struct VkVideoDecodeH265PictureInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ StdVideoDecodeH265PictureInfo* pStdPictureInfo;
+ uint32_t slicesCount;
+ const uint32_t* pSlicesDataOffsets;
+} VkVideoDecodeH265PictureInfoEXT;
+
+typedef struct VkVideoDecodeH265DpbSlotInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ const StdVideoDecodeH265ReferenceInfo* pStdReferenceInfo;
+} VkVideoDecodeH265DpbSlotInfoEXT;
+
+
#ifdef __cplusplus
}
#endif
diff --git a/external/vulkancts/scripts/src/vulkan_core.h b/external/vulkancts/scripts/src/vulkan_core.h
index 5efc972..06e389a 100644
--- a/external/vulkancts/scripts/src/vulkan_core.h
+++ b/external/vulkancts/scripts/src/vulkan_core.h
@@ -25,35 +25,71 @@
#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;
-#if !defined(VK_DEFINE_NON_DISPATCHABLE_HANDLE)
-#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
- #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
-#else
- #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
-#endif
+#ifndef VK_USE_64_BIT_PTR_DEFINES
+ #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
+ #define VK_USE_64_BIT_PTR_DEFINES 1
+ #else
+ #define VK_USE_64_BIT_PTR_DEFINES 0
+ #endif
#endif
+
+#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE
+ #if (VK_USE_64_BIT_PTR_DEFINES==1)
+ #if __cplusplus >= 201103L || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))
+ #define VK_NULL_HANDLE nullptr
+ #else
+ #define VK_NULL_HANDLE ((void*)0)
+ #endif
+ #else
+ #define VK_NULL_HANDLE 0ULL
+ #endif
+#endif
+#ifndef VK_NULL_HANDLE
+ #define VK_NULL_HANDLE 0
+#endif
+
+
+#ifndef VK_DEFINE_NON_DISPATCHABLE_HANDLE
+ #if (VK_USE_64_BIT_PTR_DEFINES==1)
+ #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
+ #else
+ #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
+ #endif
+#endif
+
+// DEPRECATED: This define is deprecated. VK_MAKE_API_VERSION should be used instead.
#define VK_MAKE_VERSION(major, minor, patch) \
((((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch)))
// DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead.
//#define VK_API_VERSION VK_MAKE_VERSION(1, 0, 0) // Patch version should always be set to 0
+#define VK_MAKE_API_VERSION(variant, major, minor, patch) \
+ ((((uint32_t)(variant)) << 29) | (((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch)))
+
// Vulkan 1.0 version number
-#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)// Patch version should always be set to 0
+#define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0
// Version of this file
-#define VK_HEADER_VERSION 170
+#define VK_HEADER_VERSION 176
// Complete version of this file
-#define VK_HEADER_VERSION_COMPLETE VK_MAKE_VERSION(1, 2, VK_HEADER_VERSION)
+#define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 2, VK_HEADER_VERSION)
+// DEPRECATED: This define is deprecated. VK_API_VERSION_MAJOR should be used instead.
#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22)
-#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)
-#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)
-#define VK_NULL_HANDLE 0
+// DEPRECATED: This define is deprecated. VK_API_VERSION_MINOR should be used instead.
+#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3FFU)
+// DEPRECATED: This define is deprecated. VK_API_VERSION_PATCH should be used instead.
+#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU)
+
+#define VK_API_VERSION_VARIANT(version) ((uint32_t)(version) >> 29)
+#define VK_API_VERSION_MAJOR(version) (((uint32_t)(version) >> 22) & 0x7FU)
+#define VK_API_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3FFU)
+#define VK_API_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU)
typedef uint32_t VkBool32;
typedef uint64_t VkDeviceAddress;
typedef uint64_t VkDeviceSize;
@@ -85,20 +121,20 @@
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool)
#define VK_ATTACHMENT_UNUSED (~0U)
-#define VK_FALSE 0
-#define VK_LOD_CLAMP_NONE 1000.0f
+#define VK_FALSE 0U
+#define VK_LOD_CLAMP_NONE 1000.0F
#define VK_QUEUE_FAMILY_IGNORED (~0U)
#define VK_REMAINING_ARRAY_LAYERS (~0U)
#define VK_REMAINING_MIP_LEVELS (~0U)
#define VK_SUBPASS_EXTERNAL (~0U)
-#define VK_TRUE 1
+#define VK_TRUE 1U
#define VK_WHOLE_SIZE (~0ULL)
-#define VK_MAX_MEMORY_TYPES 32
-#define VK_MAX_MEMORY_HEAPS 16
-#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256
-#define VK_UUID_SIZE 16
-#define VK_MAX_EXTENSION_NAME_SIZE 256
-#define VK_MAX_DESCRIPTION_SIZE 256
+#define VK_MAX_MEMORY_TYPES 32U
+#define VK_MAX_MEMORY_HEAPS 16U
+#define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256U
+#define VK_UUID_SIZE 16U
+#define VK_MAX_EXTENSION_NAME_SIZE 256U
+#define VK_MAX_DESCRIPTION_SIZE 256U
typedef enum VkResult {
VK_SUCCESS = 0,
@@ -334,6 +370,63 @@
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000,
VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001,
VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR = 1000023000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR = 1000023002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR = 1000023003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR = 1000023004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR = 1000023008,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR = 1000023009,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR = 1000023011,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR = 1000023012,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR = 1000023013,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR = 1000299000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR = 1000299001,
+#endif
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001,
VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002,
@@ -342,6 +435,57 @@
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002,
VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000,
VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT = 1000038000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT = 1000038001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000038002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000038003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT = 1000038004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT = 1000038005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT = 1000038006,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT = 1000038007,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT = 1000038008,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT = 1000040001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT = 1000040003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT = 1000040004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040006,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040007,
+#endif
VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,
VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000,
@@ -468,8 +612,12 @@
VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158005,
VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000,
VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR = 1000163000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR = 1000163001,
+#endif
VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV = 1000164000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV = 1000164001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV = 1000164002,
@@ -497,6 +645,27 @@
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT = 1000187001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187003,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT = 1000187004,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187005,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187006,
+#endif
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
@@ -581,6 +750,8 @@
VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV = 1000277005,
VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000,
+ VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = 1000281001,
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000,
@@ -614,6 +785,7 @@
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001,
VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV = 1000326002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001,
VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000,
@@ -634,6 +806,18 @@
VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = 1000351000,
VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = 1000351002,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000,
+ VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001,
+ VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002,
+ VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000,
+ VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001,
+ VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002,
+ VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365000,
+ VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365001,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000,
+ VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000,
+ VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,
VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
@@ -768,6 +952,24 @@
VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002,
VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002,
+#endif
VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = 1000164003,
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
@@ -817,6 +1019,12 @@
VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000,
VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001,
VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001,
+#endif
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000,
VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,
@@ -1101,6 +1309,10 @@
VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = 1000066011,
VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = 1000066012,
VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = 1000066013,
+ VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT = 1000330000,
+ VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT = 1000330001,
+ VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT = 1000330002,
+ VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT = 1000330003,
VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = 1000340000,
VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = 1000340001,
VK_FORMAT_G8B8G8R8_422_UNORM_KHR = VK_FORMAT_G8B8G8R8_422_UNORM,
@@ -1167,6 +1379,12 @@
VK_QUERY_TYPE_OCCLUSION = 0,
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
VK_QUERY_TYPE_TIMESTAMP = 2,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR = 1000299000,
+#endif
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000,
@@ -1325,6 +1543,13 @@
VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT = 1000267009,
VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT = 1000267010,
VK_DYNAMIC_STATE_STENCIL_OP_EXT = 1000267011,
+ VK_DYNAMIC_STATE_VERTEX_INPUT_EXT = 1000352000,
+ VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT = 1000377000,
+ VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT = 1000377001,
+ VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT = 1000377002,
+ VK_DYNAMIC_STATE_LOGIC_OP_EXT = 1000377003,
+ VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT = 1000377004,
+ VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT = 1000381000,
VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF
} VkDynamicState;
@@ -1574,6 +1799,18 @@
VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000,
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR = 0x08000000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000,
+#endif
VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000,
VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000,
VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000,
@@ -1639,6 +1876,24 @@
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000,
+#endif
VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = 0x00000100,
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV,
@@ -1674,6 +1929,12 @@
VK_QUEUE_TRANSFER_BIT = 0x00000004,
VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008,
VK_QUEUE_PROTECTED_BIT = 0x00000010,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040,
+#endif
VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkQueueFlagBits;
typedef VkFlags VkQueueFlags;
@@ -1770,6 +2031,9 @@
VK_QUERY_RESULT_WAIT_BIT = 0x00000002,
VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004,
VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0x00000010,
+#endif
VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkQueryResultFlagBits;
typedef VkFlags VkQueryResultFlags;
@@ -1797,6 +2061,18 @@
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000,
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000,
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+ VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000,
+#endif
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
@@ -4079,13 +4355,13 @@
#define VK_VERSION_1_1 1
// Vulkan 1.1 version number
-#define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)// Patch version should always be set to 0
+#define VK_API_VERSION_1_1 VK_MAKE_API_VERSION(0, 1, 1, 0)// Patch version should always be set to 0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorUpdateTemplate)
-#define VK_MAX_DEVICE_GROUP_SIZE 32
-#define VK_LUID_SIZE 8
-#define VK_QUEUE_FAMILY_EXTERNAL (~0U-1)
+#define VK_MAX_DEVICE_GROUP_SIZE 32U
+#define VK_LUID_SIZE 8U
+#define VK_QUEUE_FAMILY_EXTERNAL (~1U)
typedef enum VkPointClippingBehavior {
VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES = 0,
@@ -4192,6 +4468,7 @@
VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID = 0x00000400,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT = 0x00000080,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100,
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA = 0x00000800,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
@@ -4256,6 +4533,7 @@
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT = 0x00000004,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT = 0x00000008,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT = 0x00000010,
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA = 0x00000080,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,
@@ -4941,10 +5219,10 @@
#define VK_VERSION_1_2 1
// Vulkan 1.2 version number
-#define VK_API_VERSION_1_2 VK_MAKE_VERSION(1, 2, 0)// Patch version should always be set to 0
+#define VK_API_VERSION_1_2 VK_MAKE_API_VERSION(0, 1, 2, 0)// Patch version should always be set to 0
-#define VK_MAX_DRIVER_NAME_SIZE 256
-#define VK_MAX_DRIVER_INFO_SIZE 256
+#define VK_MAX_DRIVER_NAME_SIZE 256U
+#define VK_MAX_DRIVER_INFO_SIZE 256U
typedef enum VkDriverId {
VK_DRIVER_ID_AMD_PROPRIETARY = 1,
@@ -4961,6 +5239,7 @@
VK_DRIVER_ID_BROADCOM_PROPRIETARY = 12,
VK_DRIVER_ID_MESA_LLVMPIPE = 13,
VK_DRIVER_ID_MOLTENVK = 14,
+ VK_DRIVER_ID_COREAVI_PROPRIETARY = 15,
VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY,
VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE,
VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV,
@@ -6477,7 +6756,7 @@
#define VK_KHR_incremental_present 1
-#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 1
+#define VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION 2
#define VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME "VK_KHR_incremental_present"
typedef struct VkRectLayerKHR {
VkOffset2D offset;
@@ -7546,84 +7825,106 @@
#define VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME "VK_KHR_synchronization2"
typedef VkFlags64 VkPipelineStageFlags2KHR;
-// Flag bits for VkPipelineStageFlags2KHR
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_NONE_KHR = 0;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000;
-static const VkPipelineStageFlags2KHR VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000;
+// Flag bits for VkPipelineStageFlagBits2KHR
+typedef VkFlags64 VkPipelineStageFlagBits2KHR;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_NONE_KHR = 0ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL;
+#endif
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000ULL;
+static const VkPipelineStageFlagBits2KHR VK_PIPELINE_STAGE_FLAG_BITS_2KHR_MAX_ENUM_KHR = 0x7FFFFFFFFFFFFFFFULL;
typedef VkFlags64 VkAccessFlags2KHR;
-// Flag bits for VkAccessFlags2KHR
-static const VkAccessFlags2KHR VK_ACCESS_2_NONE_KHR = 0;
-static const VkAccessFlags2KHR VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001;
-static const VkAccessFlags2KHR VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002;
-static const VkAccessFlags2KHR VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004;
-static const VkAccessFlags2KHR VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008;
-static const VkAccessFlags2KHR VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100;
-static const VkAccessFlags2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200;
-static const VkAccessFlags2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000;
-static const VkAccessFlags2KHR VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000;
-static const VkAccessFlags2KHR VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000;
-static const VkAccessFlags2KHR VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000;
-static const VkAccessFlags2KHR VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000;
-static const VkAccessFlags2KHR VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000;
-static const VkAccessFlags2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000;
-static const VkAccessFlags2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000;
-static const VkAccessFlags2KHR VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000;
-static const VkAccessFlags2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000;
+// Flag bits for VkAccessFlagBits2KHR
+typedef VkFlags64 VkAccessFlagBits2KHR;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_NONE_KHR = 0ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL;
+#endif
+#ifdef VK_ENABLE_BETA_EXTENSIONS
+static const VkAccessFlagBits2KHR VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0x4000000000ULL;
+#endif
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000ULL;
+static const VkAccessFlagBits2KHR VK_ACCESS_FLAG_BITS_2KHR_MAX_ENUM_KHR = 0x7FFFFFFFFFFFFFFFULL;
typedef enum VkSubmitFlagBitsKHR {
@@ -7956,9 +8257,10 @@
const VkResolveImageInfo2KHR* pResolveImageInfo);
#endif
+
#define VK_EXT_debug_report 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)
-#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 9
+#define VK_EXT_DEBUG_REPORT_SPEC_VERSION 10
#define VK_EXT_DEBUG_REPORT_EXTENSION_NAME "VK_EXT_debug_report"
typedef enum VkDebugReportObjectTypeEXT {
@@ -8969,7 +9271,7 @@
#define VK_EXT_queue_family_foreign 1
#define VK_EXT_QUEUE_FAMILY_FOREIGN_SPEC_VERSION 1
#define VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME "VK_EXT_queue_family_foreign"
-#define VK_QUEUE_FAMILY_FOREIGN_EXT (~0U-2)
+#define VK_QUEUE_FAMILY_FOREIGN_EXT (~2U)
#define VK_EXT_debug_utils 1
@@ -10082,7 +10384,7 @@
#define VK_EXT_calibrated_timestamps 1
-#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 1
+#define VK_EXT_CALIBRATED_TIMESTAMPS_SPEC_VERSION 2
#define VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME "VK_EXT_calibrated_timestamps"
typedef enum VkTimeDomainEXT {
@@ -11347,6 +11649,25 @@
#endif
+#define VK_NV_inherited_viewport_scissor 1
+#define VK_NV_INHERITED_VIEWPORT_SCISSOR_SPEC_VERSION 1
+#define VK_NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME "VK_NV_inherited_viewport_scissor"
+typedef struct VkPhysicalDeviceInheritedViewportScissorFeaturesNV {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 inheritedViewportScissor2D;
+} VkPhysicalDeviceInheritedViewportScissorFeaturesNV;
+
+typedef struct VkCommandBufferInheritanceViewportScissorInfoNV {
+ VkStructureType sType;
+ const void* pNext;
+ VkBool32 viewportScissor2D;
+ uint32_t viewportDepthCount;
+ const VkViewport* pViewportDepths;
+} VkCommandBufferInheritanceViewportScissorInfoNV;
+
+
+
#define VK_EXT_texel_buffer_alignment 1
#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION 1
#define VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME "VK_EXT_texel_buffer_alignment"
@@ -11368,7 +11689,7 @@
#define VK_QCOM_render_pass_transform 1
-#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 1
+#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 2
#define VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME "VK_QCOM_render_pass_transform"
typedef struct VkRenderPassTransformBeginInfoQCOM {
VkStructureType sType;
@@ -11638,6 +11959,17 @@
#endif
+#define VK_EXT_ycbcr_2plane_444_formats 1
+#define VK_EXT_YCBCR_2PLANE_444_FORMATS_SPEC_VERSION 1
+#define VK_EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME "VK_EXT_ycbcr_2plane_444_formats"
+typedef struct VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 ycbcr2plane444Formats;
+} VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT;
+
+
+
#define VK_EXT_fragment_density_map2 1
#define VK_EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION 1
#define VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME "VK_EXT_fragment_density_map2"
@@ -11659,7 +11991,7 @@
#define VK_QCOM_rotated_copy_commands 1
-#define VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION 0
+#define VK_QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION 1
#define VK_QCOM_ROTATED_COPY_COMMANDS_EXTENSION_NAME "VK_QCOM_rotated_copy_commands"
typedef struct VkCopyCommandTransformInfoQCOM {
VkStructureType sType;
@@ -11733,6 +12065,111 @@
+#define VK_EXT_vertex_input_dynamic_state 1
+#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_SPEC_VERSION 2
+#define VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME "VK_EXT_vertex_input_dynamic_state"
+typedef struct VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 vertexInputDynamicState;
+} VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT;
+
+typedef struct VkVertexInputBindingDescription2EXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t binding;
+ uint32_t stride;
+ VkVertexInputRate inputRate;
+ uint32_t divisor;
+} VkVertexInputBindingDescription2EXT;
+
+typedef struct VkVertexInputAttributeDescription2EXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t location;
+ uint32_t binding;
+ VkFormat format;
+ uint32_t offset;
+} VkVertexInputAttributeDescription2EXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetVertexInputEXT)(VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetVertexInputEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t vertexBindingDescriptionCount,
+ const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,
+ uint32_t vertexAttributeDescriptionCount,
+ const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions);
+#endif
+
+
+#define VK_EXT_extended_dynamic_state2 1
+#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION 1
+#define VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME "VK_EXT_extended_dynamic_state2"
+typedef struct VkPhysicalDeviceExtendedDynamicState2FeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 extendedDynamicState2;
+ VkBool32 extendedDynamicState2LogicOp;
+ VkBool32 extendedDynamicState2PatchControlPoints;
+} VkPhysicalDeviceExtendedDynamicState2FeaturesEXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetPatchControlPointsEXT)(VkCommandBuffer commandBuffer, uint32_t patchControlPoints);
+typedef void (VKAPI_PTR *PFN_vkCmdSetRasterizerDiscardEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable);
+typedef void (VKAPI_PTR *PFN_vkCmdSetDepthBiasEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable);
+typedef void (VKAPI_PTR *PFN_vkCmdSetLogicOpEXT)(VkCommandBuffer commandBuffer, VkLogicOp logicOp);
+typedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveRestartEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetPatchControlPointsEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t patchControlPoints);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizerDiscardEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 rasterizerDiscardEnable);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBiasEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBiasEnable);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetLogicOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkLogicOp logicOp);
+
+VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 primitiveRestartEnable);
+#endif
+
+
+#define VK_EXT_color_write_enable 1
+#define VK_EXT_COLOR_WRITE_ENABLE_SPEC_VERSION 1
+#define VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME "VK_EXT_color_write_enable"
+typedef struct VkPhysicalDeviceColorWriteEnableFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 colorWriteEnable;
+} VkPhysicalDeviceColorWriteEnableFeaturesEXT;
+
+typedef struct VkPipelineColorWriteCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t attachmentCount;
+ const VkBool32* pColorWriteEnables;
+} VkPipelineColorWriteCreateInfoEXT;
+
+typedef void (VKAPI_PTR *PFN_vkCmdSetColorWriteEnableEXT)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkBool32* pColorWriteEnables);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR void VKAPI_CALL vkCmdSetColorWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t attachmentCount,
+ const VkBool32* pColorWriteEnables);
+#endif
+
+
#define VK_KHR_acceleration_structure 1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR)
#define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 11
diff --git a/external/vulkancts/scripts/src/vulkan_fuchsia.h b/external/vulkancts/scripts/src/vulkan_fuchsia.h
index 03e27cb..d558715 100644
--- a/external/vulkancts/scripts/src/vulkan_fuchsia.h
+++ b/external/vulkancts/scripts/src/vulkan_fuchsia.h
@@ -2,7 +2,7 @@
#define VULKAN_FUCHSIA_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
@@ -40,6 +40,80 @@
VkSurfaceKHR* pSurface);
#endif
+
+#define VK_FUCHSIA_external_memory 1
+#define VK_FUCHSIA_EXTERNAL_MEMORY_SPEC_VERSION 1
+#define VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME "VK_FUCHSIA_external_memory"
+typedef struct VkImportMemoryZirconHandleInfoFUCHSIA {
+ VkStructureType sType;
+ const void* pNext;
+ VkExternalMemoryHandleTypeFlagBits handleType;
+ zx_handle_t handle;
+} VkImportMemoryZirconHandleInfoFUCHSIA;
+
+typedef struct VkMemoryZirconHandlePropertiesFUCHSIA {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t memoryTypeBits;
+} VkMemoryZirconHandlePropertiesFUCHSIA;
+
+typedef struct VkMemoryGetZirconHandleInfoFUCHSIA {
+ VkStructureType sType;
+ const void* pNext;
+ VkDeviceMemory memory;
+ VkExternalMemoryHandleTypeFlagBits handleType;
+} VkMemoryGetZirconHandleInfoFUCHSIA;
+
+typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryZirconHandleFUCHSIA)(VkDevice device, const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, zx_handle_t* pZirconHandle);
+typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryZirconHandlePropertiesFUCHSIA)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, zx_handle_t zirconHandle, VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryZirconHandleFUCHSIA(
+ VkDevice device,
+ const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
+ zx_handle_t* pZirconHandle);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryZirconHandlePropertiesFUCHSIA(
+ VkDevice device,
+ VkExternalMemoryHandleTypeFlagBits handleType,
+ zx_handle_t zirconHandle,
+ VkMemoryZirconHandlePropertiesFUCHSIA* pMemoryZirconHandleProperties);
+#endif
+
+
+#define VK_FUCHSIA_external_semaphore 1
+#define VK_FUCHSIA_EXTERNAL_SEMAPHORE_SPEC_VERSION 1
+#define VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME "VK_FUCHSIA_external_semaphore"
+typedef struct VkImportSemaphoreZirconHandleInfoFUCHSIA {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphore semaphore;
+ VkSemaphoreImportFlags flags;
+ VkExternalSemaphoreHandleTypeFlagBits handleType;
+ zx_handle_t zirconHandle;
+} VkImportSemaphoreZirconHandleInfoFUCHSIA;
+
+typedef struct VkSemaphoreGetZirconHandleInfoFUCHSIA {
+ VkStructureType sType;
+ const void* pNext;
+ VkSemaphore semaphore;
+ VkExternalSemaphoreHandleTypeFlagBits handleType;
+} VkSemaphoreGetZirconHandleInfoFUCHSIA;
+
+typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreZirconHandleFUCHSIA)(VkDevice device, const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo);
+typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreZirconHandleFUCHSIA)(VkDevice device, const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo, zx_handle_t* pZirconHandle);
+
+#ifndef VK_NO_PROTOTYPES
+VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreZirconHandleFUCHSIA(
+ VkDevice device,
+ const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo);
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreZirconHandleFUCHSIA(
+ VkDevice device,
+ const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
+ zx_handle_t* pZirconHandle);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/external/vulkancts/scripts/src/vulkan_ggp.h b/external/vulkancts/scripts/src/vulkan_ggp.h
index 273c880..9a6a582 100644
--- a/external/vulkancts/scripts/src/vulkan_ggp.h
+++ b/external/vulkancts/scripts/src/vulkan_ggp.h
@@ -2,7 +2,7 @@
#define VULKAN_GGP_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_ios.h b/external/vulkancts/scripts/src/vulkan_ios.h
index 446a269..6e7e6af 100644
--- a/external/vulkancts/scripts/src/vulkan_ios.h
+++ b/external/vulkancts/scripts/src/vulkan_ios.h
@@ -2,7 +2,7 @@
#define VULKAN_IOS_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_macos.h b/external/vulkancts/scripts/src/vulkan_macos.h
index 35fcabe..c49b123 100644
--- a/external/vulkancts/scripts/src/vulkan_macos.h
+++ b/external/vulkancts/scripts/src/vulkan_macos.h
@@ -2,7 +2,7 @@
#define VULKAN_MACOS_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_metal.h b/external/vulkancts/scripts/src/vulkan_metal.h
index 99f097d..5cf4a70 100644
--- a/external/vulkancts/scripts/src/vulkan_metal.h
+++ b/external/vulkancts/scripts/src/vulkan_metal.h
@@ -2,7 +2,7 @@
#define VULKAN_METAL_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_vi.h b/external/vulkancts/scripts/src/vulkan_vi.h
index 2e62d7d..9e0dcca 100644
--- a/external/vulkancts/scripts/src/vulkan_vi.h
+++ b/external/vulkancts/scripts/src/vulkan_vi.h
@@ -2,7 +2,7 @@
#define VULKAN_VI_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_wayland.h b/external/vulkancts/scripts/src/vulkan_wayland.h
index f7b307e..2a329be 100644
--- a/external/vulkancts/scripts/src/vulkan_wayland.h
+++ b/external/vulkancts/scripts/src/vulkan_wayland.h
@@ -2,7 +2,7 @@
#define VULKAN_WAYLAND_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_win32.h b/external/vulkancts/scripts/src/vulkan_win32.h
index 4b561ea..1b680f0 100644
--- a/external/vulkancts/scripts/src/vulkan_win32.h
+++ b/external/vulkancts/scripts/src/vulkan_win32.h
@@ -2,7 +2,7 @@
#define VULKAN_WIN32_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_xcb.h b/external/vulkancts/scripts/src/vulkan_xcb.h
index c5441b2..5ba2ad8 100644
--- a/external/vulkancts/scripts/src/vulkan_xcb.h
+++ b/external/vulkancts/scripts/src/vulkan_xcb.h
@@ -2,7 +2,7 @@
#define VULKAN_XCB_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_xlib.h b/external/vulkancts/scripts/src/vulkan_xlib.h
index c54628a..75c75dc 100644
--- a/external/vulkancts/scripts/src/vulkan_xlib.h
+++ b/external/vulkancts/scripts/src/vulkan_xlib.h
@@ -2,7 +2,7 @@
#define VULKAN_XLIB_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h b/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h
index 436432f..fa27493 100644
--- a/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h
+++ b/external/vulkancts/scripts/src/vulkan_xlib_xrandr.h
@@ -2,7 +2,7 @@
#define VULKAN_XLIB_XRANDR_H_ 1
/*
-** Copyright (c) 2015-2020 The Khronos Group Inc.
+** Copyright 2015-2021 The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0
*/
diff --git a/framework/common/tcuCommandLine.cpp b/framework/common/tcuCommandLine.cpp
index 4e0cbc6..83ec331 100644
--- a/framework/common/tcuCommandLine.cpp
+++ b/framework/common/tcuCommandLine.cpp
@@ -101,6 +101,7 @@
DE_DECLARE_COMMAND_LINE_OPT(CaseFraction, std::vector<int>);
DE_DECLARE_COMMAND_LINE_OPT(CaseFractionMandatoryTests, std::string);
DE_DECLARE_COMMAND_LINE_OPT(WaiverFile, std::string);
+DE_DECLARE_COMMAND_LINE_OPT(RunnerType, tcu::TestRunnerType);
static void parseIntList (const char* src, std::vector<int>* dst)
{
@@ -153,6 +154,12 @@
{ "180", SCREENROTATION_180 },
{ "270", SCREENROTATION_270 }
};
+ static const NamedValue<tcu::TestRunnerType> s_runnerTypes[] =
+ {
+ { "any", tcu::RUNNERTYPE_ANY },
+ { "none", tcu::RUNNERTYPE_NONE },
+ { "amber", tcu::RUNNERTYPE_AMBER },
+ };
parser
<< Option<CasePath> ("n", "deqp-case", "Test case(s) to run, supports wildcards (e.g. dEQP-GLES2.info.*)")
@@ -200,7 +207,8 @@
<< Option<RenderDoc> (DE_NULL, "deqp-renderdoc", "Enable RenderDoc frame markers", s_enableNames, "disable")
<< Option<CaseFraction> (DE_NULL, "deqp-fraction", "Run a fraction of the test cases (e.g. N,M means run group%M==N)", parseIntList, "")
<< Option<CaseFractionMandatoryTests> (DE_NULL, "deqp-fraction-mandatory-caselist-file", "Case list file that must be run for each fraction", "")
- << Option<WaiverFile> (DE_NULL, "deqp-waiver-file", "Read waived tests from given file", "");
+ << Option<WaiverFile> (DE_NULL, "deqp-waiver-file", "Read waived tests from given file", "")
+ << Option<RunnerType> (DE_NULL, "deqp-runner-type", "Filter test cases based on runner", s_runnerTypes, "any");
}
void registerLegacyOptions (de::cmdline::Parser& parser)
@@ -851,6 +859,7 @@
const std::vector<int>& CommandLine::getCaseFraction (void) const { return m_cmdLine.getOption<opt::CaseFraction>(); }
const char* CommandLine::getCaseFractionMandatoryTests (void) const { return m_cmdLine.getOption<opt::CaseFractionMandatoryTests>().c_str(); }
const char* CommandLine::getArchiveDir (void) const { return m_cmdLine.getOption<opt::ArchiveDir>().c_str(); }
+tcu::TestRunnerType CommandLine::getRunnerType (void) const { return m_cmdLine.getOption<opt::RunnerType>(); }
const char* CommandLine::getGLContextType (void) const
{
@@ -960,12 +969,14 @@
}
CaseListFilter::CaseListFilter (void)
- : m_caseTree(DE_NULL)
+ : m_caseTree (DE_NULL)
+ , m_runnerType (tcu::RUNNERTYPE_ANY)
{
}
CaseListFilter::CaseListFilter (const de::cmdline::CommandLine& cmdLine, const tcu::Archive& archive)
- : m_caseTree(DE_NULL)
+ : m_caseTree (DE_NULL)
+ , m_runnerType (cmdLine.getOption<opt::RunnerType>())
{
if (cmdLine.hasOption<opt::CaseList>())
{
diff --git a/framework/common/tcuCommandLine.hpp b/framework/common/tcuCommandLine.hpp
index 22ea2e0..2a7c48e 100644
--- a/framework/common/tcuCommandLine.hpp
+++ b/framework/common/tcuCommandLine.hpp
@@ -25,6 +25,7 @@
#include "tcuDefs.hpp"
#include "deCommandLine.hpp"
+#include "tcuTestCase.hpp"
#include "deUniquePtr.hpp"
#include <string>
@@ -114,6 +115,9 @@
//! Check if test group passes the case fraction filter.
bool checkCaseFraction (int i, const std::string& testCaseName) const;
+ //! Check if test case runner is of supplied type
+ bool checkRunnerType (tcu::TestRunnerType type) const { return ((m_runnerType & type) == m_runnerType); }
+
private:
CaseListFilter (const CaseListFilter&); // not allowed!
CaseListFilter& operator= (const CaseListFilter&); // not allowed!
@@ -122,6 +126,7 @@
de::MovePtr<const CasePaths> m_casePaths;
std::vector<int> m_caseFraction;
de::MovePtr<const CasePaths> m_caseFractionMandatoryTests;
+ const tcu::TestRunnerType m_runnerType;
};
/*--------------------------------------------------------------------*//*!
@@ -258,6 +263,9 @@
//! Get archive directory path
const char* getArchiveDir (void) const;
+ //! Get runner type (--deqp-runner-type)
+ tcu::TestRunnerType getRunnerType (void) const;
+
/*--------------------------------------------------------------------*//*!
* \brief Creates case list filter
* \param archive Resources
diff --git a/framework/common/tcuRasterizationVerifier.cpp b/framework/common/tcuRasterizationVerifier.cpp
index 230aa58..7e15eac 100644
--- a/framework/common/tcuRasterizationVerifier.cpp
+++ b/framework/common/tcuRasterizationVerifier.cpp
@@ -2490,6 +2490,149 @@
}
}
+CoverageType calculateUnderestimateLineCoverage (const tcu::Vec4& p0, const tcu::Vec4& p1, const float lineWidth, const tcu::IVec2& pixel, const tcu::IVec2& viewportSize)
+{
+ DE_ASSERT(viewportSize.x() == viewportSize.y() && viewportSize.x() > 0);
+ DE_ASSERT(p0.w() == 1.0f && p1.w() == 1.0f);
+
+ const Vec2 p = Vec2(p0.x(), p0.y());
+ const Vec2 q = Vec2(p1.x(), p1.y());
+ const Vec2 pq = Vec2(p1.x() - p0.x(), p1.y() - p0.y());
+ const Vec2 pqn = normalize(pq);
+ const Vec2 lw = 0.5f * lineWidth * pqn;
+ const Vec2 n = Vec2(lw.y(), -lw.x());
+ const Vec2 vp = Vec2(float(viewportSize.x()), float(viewportSize.y()));
+ const Vec2 a = 0.5f * (p + Vec2(1.0f, 1.0f)) * vp + n;
+ const Vec2 b = 0.5f * (p + Vec2(1.0f, 1.0f)) * vp - n;
+ const Vec2 c = 0.5f * (q + Vec2(1.0f, 1.0f)) * vp - n;
+ const Vec2 ba = b - a;
+ const Vec2 bc = b - c;
+ const float det = ba.x() * bc.y() - ba.y() * bc.x();
+ int within = 0;
+
+ if (det != 0.0f)
+ {
+ for (int cornerNdx = 0; cornerNdx < 4; ++cornerNdx)
+ {
+ const int pixelCornerOffsetX = ((cornerNdx & 1) ? 1 : 0);
+ const int pixelCornerOffsetY = ((cornerNdx & 2) ? 1 : 0);
+ const Vec2 f = Vec2(float(pixel.x() + pixelCornerOffsetX), float(pixel.y() + pixelCornerOffsetY));
+ const Vec2 bf = b - f;
+ const float alpha = (bf.x() * bc.y() - bc.x() * bf.y()) / det;
+ const float beta = (ba.x() * bf.y() - bf.x() * ba.y()) / det;
+ bool cornerWithin = de::inRange(alpha, 0.0f, 1.0f) && de::inRange(beta, 0.0f, 1.0f);
+
+ if (cornerWithin)
+ within++;
+ }
+ }
+
+ if (within == 0)
+ return COVERAGE_NONE;
+ else if (within == 4)
+ return COVERAGE_FULL;
+ else
+ return COVERAGE_PARTIAL;
+}
+
+CoverageType calculateUnderestimateTriangleCoverage (const tcu::Vec4& p0, const tcu::Vec4& p1, const tcu::Vec4& p2, const tcu::IVec2& pixel, int subpixelBits, const tcu::IVec2& viewportSize)
+{
+ typedef tcu::Vector<deInt64, 2> I64Vec2;
+
+ const deUint64 numSubPixels = ((deUint64)1) << subpixelBits;
+ const bool order = isTriangleClockwise(p0, p1, p2); //!< clockwise / counter-clockwise
+ const tcu::Vec4& orderedP0 = p0; //!< vertices of a clockwise triangle
+ const tcu::Vec4& orderedP1 = (order) ? (p1) : (p2);
+ const tcu::Vec4& orderedP2 = (order) ? (p2) : (p1);
+ const tcu::Vec2 triangleNormalizedDeviceSpace[3] =
+ {
+ tcu::Vec2(orderedP0.x() / orderedP0.w(), orderedP0.y() / orderedP0.w()),
+ tcu::Vec2(orderedP1.x() / orderedP1.w(), orderedP1.y() / orderedP1.w()),
+ tcu::Vec2(orderedP2.x() / orderedP2.w(), orderedP2.y() / orderedP2.w()),
+ };
+ const tcu::Vec2 triangleScreenSpace[3] =
+ {
+ (triangleNormalizedDeviceSpace[0] + tcu::Vec2(1.0f, 1.0f)) * 0.5f * tcu::Vec2((float)viewportSize.x(), (float)viewportSize.y()),
+ (triangleNormalizedDeviceSpace[1] + tcu::Vec2(1.0f, 1.0f)) * 0.5f * tcu::Vec2((float)viewportSize.x(), (float)viewportSize.y()),
+ (triangleNormalizedDeviceSpace[2] + tcu::Vec2(1.0f, 1.0f)) * 0.5f * tcu::Vec2((float)viewportSize.x(), (float)viewportSize.y()),
+ };
+
+ // Broad bounding box - pixel check
+ {
+ const float minX = de::min(de::min(triangleScreenSpace[0].x(), triangleScreenSpace[1].x()), triangleScreenSpace[2].x());
+ const float minY = de::min(de::min(triangleScreenSpace[0].y(), triangleScreenSpace[1].y()), triangleScreenSpace[2].y());
+ const float maxX = de::max(de::max(triangleScreenSpace[0].x(), triangleScreenSpace[1].x()), triangleScreenSpace[2].x());
+ const float maxY = de::max(de::max(triangleScreenSpace[0].y(), triangleScreenSpace[1].y()), triangleScreenSpace[2].y());
+
+ if ((float)pixel.x() > maxX + 1 ||
+ (float)pixel.y() > maxY + 1 ||
+ (float)pixel.x() < minX - 1 ||
+ (float)pixel.y() < minY - 1)
+ return COVERAGE_NONE;
+ }
+
+ // Accurate intersection for edge pixels
+ {
+ // In multisampling, the sample points can be anywhere in the pixel, and in single sampling only in the center.
+ const I64Vec2 pixelCorners[4] =
+ {
+ I64Vec2((pixel.x()+0) * numSubPixels, (pixel.y()+0) * numSubPixels),
+ I64Vec2((pixel.x()+1) * numSubPixels, (pixel.y()+0) * numSubPixels),
+ I64Vec2((pixel.x()+1) * numSubPixels, (pixel.y()+1) * numSubPixels),
+ I64Vec2((pixel.x()+0) * numSubPixels, (pixel.y()+1) * numSubPixels),
+ };
+ // both rounding directions
+ const I64Vec2 triangleSubPixelSpaceFloor[3] =
+ {
+ I64Vec2(deFloorFloatToInt32(triangleScreenSpace[0].x() * (float)numSubPixels), deFloorFloatToInt32(triangleScreenSpace[0].y() * (float)numSubPixels)),
+ I64Vec2(deFloorFloatToInt32(triangleScreenSpace[1].x() * (float)numSubPixels), deFloorFloatToInt32(triangleScreenSpace[1].y() * (float)numSubPixels)),
+ I64Vec2(deFloorFloatToInt32(triangleScreenSpace[2].x() * (float)numSubPixels), deFloorFloatToInt32(triangleScreenSpace[2].y() * (float)numSubPixels)),
+ };
+ const I64Vec2 triangleSubPixelSpaceCeil[3] =
+ {
+ I64Vec2(deCeilFloatToInt32(triangleScreenSpace[0].x() * (float)numSubPixels), deCeilFloatToInt32(triangleScreenSpace[0].y() * (float)numSubPixels)),
+ I64Vec2(deCeilFloatToInt32(triangleScreenSpace[1].x() * (float)numSubPixels), deCeilFloatToInt32(triangleScreenSpace[1].y() * (float)numSubPixels)),
+ I64Vec2(deCeilFloatToInt32(triangleScreenSpace[2].x() * (float)numSubPixels), deCeilFloatToInt32(triangleScreenSpace[2].y() * (float)numSubPixels)),
+ };
+
+ // Test if any edge (with any rounding) intersects the pixel (boundary). If it does => Partial. If not => fully inside or outside
+
+ for (int edgeNdx = 0; edgeNdx < 3; ++edgeNdx)
+ for (int startRounding = 0; startRounding < 4; ++startRounding)
+ for (int endRounding = 0; endRounding < 4; ++endRounding)
+ {
+ const int nextEdgeNdx = (edgeNdx+1) % 3;
+ const I64Vec2 startPos ((startRounding&0x01) ? (triangleSubPixelSpaceFloor[edgeNdx].x()) : (triangleSubPixelSpaceCeil[edgeNdx].x()), (startRounding&0x02) ? (triangleSubPixelSpaceFloor[edgeNdx].y()) : (triangleSubPixelSpaceCeil[edgeNdx].y()));
+ const I64Vec2 endPos ((endRounding&0x01) ? (triangleSubPixelSpaceFloor[nextEdgeNdx].x()) : (triangleSubPixelSpaceCeil[nextEdgeNdx].x()), (endRounding&0x02) ? (triangleSubPixelSpaceFloor[nextEdgeNdx].y()) : (triangleSubPixelSpaceCeil[nextEdgeNdx].y()));
+
+ for (int pixelEdgeNdx = 0; pixelEdgeNdx < 4; ++pixelEdgeNdx)
+ {
+ const int pixelEdgeEnd = (pixelEdgeNdx + 1) % 4;
+
+ if (lineLineIntersect(startPos, endPos, pixelCorners[pixelEdgeNdx], pixelCorners[pixelEdgeEnd]))
+ return COVERAGE_PARTIAL;
+ }
+ }
+
+ // fully inside or outside
+ for (int edgeNdx = 0; edgeNdx < 3; ++edgeNdx)
+ {
+ const int nextEdgeNdx = (edgeNdx+1) % 3;
+ const I64Vec2& startPos = triangleSubPixelSpaceFloor[edgeNdx];
+ const I64Vec2& endPos = triangleSubPixelSpaceFloor[nextEdgeNdx];
+ const I64Vec2 edge = endPos - startPos;
+ const I64Vec2 v = pixelCorners[0] - endPos;
+ const deInt64 crossProduct = (edge.x() * v.y() - edge.y() * v.x());
+
+ // a corner of the pixel is outside => "fully inside" option is impossible
+ if (crossProduct < 0)
+ return COVERAGE_NONE;
+ }
+
+ return COVERAGE_FULL;
+ }
+}
+
static void logTriangleGroupRasterizationStash (const tcu::Surface& surface, tcu::TestLog& log, VerifyTriangleGroupRasterizationLogStash& logStash)
{
// Output results
diff --git a/framework/common/tcuRasterizationVerifier.hpp b/framework/common/tcuRasterizationVerifier.hpp
index 9f7ab1f..e79b26b 100644
--- a/framework/common/tcuRasterizationVerifier.hpp
+++ b/framework/common/tcuRasterizationVerifier.hpp
@@ -144,6 +144,18 @@
CoverageType calculateTriangleCoverage (const tcu::Vec4& p0, const tcu::Vec4& p1, const tcu::Vec4& p2, const tcu::IVec2& pixel, const tcu::IVec2& viewportSize, int subpixelBits, bool multisample);
/*--------------------------------------------------------------------*//*!
+ * \brief Calculates line coverage at given pixel
+ * Calculates the coverage of a reactangle given by line coordinates and width.
+ *//*--------------------------------------------------------------------*/
+CoverageType calculateUnderestimateLineCoverage (const tcu::Vec4& p0, const tcu::Vec4& p1, const float lineWidth, const tcu::IVec2& pixel, const tcu::IVec2& viewportSize);
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Calculates triangle coverage at given pixel
+ * Calculates the coverage of a triangle given by by three vertices.
+ *//*--------------------------------------------------------------------*/
+CoverageType calculateUnderestimateTriangleCoverage (const tcu::Vec4& p0, const tcu::Vec4& p1, const tcu::Vec4& p2, const tcu::IVec2& pixel, int subpixelBits, const tcu::IVec2& viewportSize);
+
+/*--------------------------------------------------------------------*//*!
* \brief Verify triangle rasterization result
* Verifies pixels in the surface are rasterized within the bounds given
* by RasterizationArguments. Triangles should not be z-clipped.
diff --git a/framework/common/tcuStringTemplate.hpp b/framework/common/tcuStringTemplate.hpp
index 31d6a30..8896f47 100644
--- a/framework/common/tcuStringTemplate.hpp
+++ b/framework/common/tcuStringTemplate.hpp
@@ -5,6 +5,8 @@
* ----------------------------------------
*
* Copyright 2014 The Android Open Source Project
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Advanced Micro Devices, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,6 +25,8 @@
* \brief String template class.
*//*--------------------------------------------------------------------*/
+#include <deStringUtil.hpp>
+
#include <map>
#include <string>
@@ -40,6 +44,9 @@
std::string specialize (const std::map<std::string, std::string>& params) const;
+ template <typename... args_t>
+ std::string format (args_t&&... args) const;
+
private:
StringTemplate (const StringTemplate&); // not allowed!
StringTemplate& operator= (const StringTemplate&); // not allowed!
@@ -47,6 +54,43 @@
std::string m_template;
} DE_WARN_UNUSED_TYPE;
+/*--------------------------------------------------------------------*//*!
+ * Utility to unpack consecutive arguments into a parameter map
+ *//*--------------------------------------------------------------------*/
+namespace detail
+{
+static constexpr const char* TOKENS[] = {
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
+ "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21",
+ "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32",
+ "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43",
+ "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54",
+ "55", "56", "57", "58", "59", "60", "61", "62", "63"};
+
+template <size_t ARG_NUM, typename unpacked_t>
+inline void unpackArgs(unpacked_t&) {}
+
+template <size_t ARG_NUM, typename unpacked_t, typename arg_t, typename... args_t>
+inline void unpackArgs(unpacked_t& unpacked, arg_t&& cur, args_t&&... args)
+{
+ static_assert(ARG_NUM < DE_LENGTH_OF_ARRAY(TOKENS),
+ "ARG_NUM must be less than DE_LENGTH_OF_ARRAY(TOKENS)");
+ unpacked[TOKENS[ARG_NUM]] = de::toString(cur);
+ unpackArgs<ARG_NUM + 1>(unpacked, ::std::forward<args_t>(args)...);
+}
+} // detail
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Implementation of specialize() using a variable argument list
+ *//*--------------------------------------------------------------------*/
+template <typename... args_t>
+std::string StringTemplate::format(args_t&&... args) const
+{
+ std::map<std::string, std::string> unpacked = {};
+ detail::unpackArgs<0>(unpacked, ::std::forward<args_t>(args)...);
+ return specialize(unpacked);
+}
+
} // tcu
#endif // _TCUSTRINGTEMPLATE_HPP
diff --git a/framework/common/tcuTestCase.hpp b/framework/common/tcuTestCase.hpp
index 00996c5..16ba9bc 100644
--- a/framework/common/tcuTestCase.hpp
+++ b/framework/common/tcuTestCase.hpp
@@ -51,6 +51,13 @@
NODECLASS_LAST
};
+enum TestRunnerType
+{
+ RUNNERTYPE_ANY = 0u,
+ RUNNERTYPE_NONE = (1u << 0),
+ RUNNERTYPE_AMBER = (1u << 1)
+};
+
inline TestNodeClass getTestNodeTypeClass (TestNodeType type)
{
switch (type)
@@ -118,6 +125,7 @@
virtual void init (void);
virtual void deinit (void);
virtual IterateResult iterate (void) = 0;
+ virtual TestRunnerType getRunnerType (void) const { return RUNNERTYPE_NONE; }
protected:
TestContext& m_testCtx;
diff --git a/framework/common/tcuTestHierarchyIterator.cpp b/framework/common/tcuTestHierarchyIterator.cpp
index 5c4ba63..ea0620f 100644
--- a/framework/common/tcuTestHierarchyIterator.cpp
+++ b/framework/common/tcuTestHierarchyIterator.cpp
@@ -175,8 +175,9 @@
{
const std::string nodePath = buildNodePath(m_sessionStack);
- // Return to parent if name doesn't match filter.
- if (!(isLeaf ? m_caseListFilter.checkTestCaseName(nodePath.c_str()) : m_caseListFilter.checkTestGroupName(nodePath.c_str())))
+ // Return to parent if name or runner type doesn't match filter.
+ if (!(isLeaf ? (m_caseListFilter.checkRunnerType(node->getRunnerType()) && m_caseListFilter.checkTestCaseName(nodePath.c_str()))
+ : m_caseListFilter.checkTestGroupName(nodePath.c_str())))
{
m_sessionStack.pop_back();
break;
diff --git a/framework/common/tcuTestHierarchyUtil.cpp b/framework/common/tcuTestHierarchyUtil.cpp
index eaa391c..f52d6aa 100644
--- a/framework/common/tcuTestHierarchyUtil.cpp
+++ b/framework/common/tcuTestHierarchyUtil.cpp
@@ -207,7 +207,7 @@
{
iter.next();
}
- catch (const tcu::NotSupportedError& e)
+ catch (const tcu::NotSupportedError&)
{
return;
}
diff --git a/framework/common/tcuTexLookupVerifier.cpp b/framework/common/tcuTexLookupVerifier.cpp
index a5be969..1dfd3d8 100644
--- a/framework/common/tcuTexLookupVerifier.cpp
+++ b/framework/common/tcuTexLookupVerifier.cpp
@@ -2203,6 +2203,11 @@
return computeFloatingPointError(value, bits);
}
+Vec4 computeColorBitsThreshold(const IVec4& bits, const IVec4& numAccurateBits)
+{
+ return computeColorBitsError(bits, numAccurateBits);
+}
+
Vec2 computeLodBoundsFromDerivates (const float dudx, const float dvdx, const float dwdx, const float dudy, const float dvdy, const float dwdy, const LodPrecision& prec)
{
const float mux = deFloatAbs(dudx);
diff --git a/framework/common/tcuTexLookupVerifier.hpp b/framework/common/tcuTexLookupVerifier.hpp
index d69efca..60dc472 100644
--- a/framework/common/tcuTexLookupVerifier.hpp
+++ b/framework/common/tcuTexLookupVerifier.hpp
@@ -102,6 +102,7 @@
Vec4 computeFixedPointThreshold (const IVec4& bits);
Vec4 computeFloatingPointThreshold (const IVec4& bits, const Vec4& value);
+Vec4 computeColorBitsThreshold (const IVec4& bits, const IVec4& numAccurateBits);
Vec2 computeLodBoundsFromDerivates (const float dudx, const float dudy, const LodPrecision& prec);
Vec2 computeLodBoundsFromDerivates (const float dudx, const float dvdx, const float dudy, const float dvdy, const LodPrecision& prec);
diff --git a/framework/common/tcuTexVerifierUtil.cpp b/framework/common/tcuTexVerifierUtil.cpp
index 004345d..43d3916 100644
--- a/framework/common/tcuTexVerifierUtil.cpp
+++ b/framework/common/tcuTexVerifierUtil.cpp
@@ -46,6 +46,15 @@
return computeFloatingPointError(1.0f, numAccurateBits);
}
+float computeColorBitsError(const int bits, const int numAccurateBits)
+{
+ // Color bits error is not a generic function, it just for compute the error value that cannot be accurately shown in integer data format.
+ //
+ // "bits" is color bit width, "numAccurateBits" is the number of accurate bits in color bits, "1 << (bits - numAccurateBits)" is the threshold in integer.
+ // "1.0f / 256.0f" is epsilon value, to make sure the threshold use to calculate in float can be a little bigger than the real value.
+ return (float(1 << (bits - numAccurateBits)) + 1.0f / 256.0f) / float((1 << bits) - 1);
+}
+
Vec2 computeNonNormalizedCoordBounds (const bool normalizedCoords, const int dim, const float coord, const int coordBits, const int uvBits)
{
const float coordErr = computeFloatingPointError(coord, coordBits);
diff --git a/framework/common/tcuTexVerifierUtil.hpp b/framework/common/tcuTexVerifierUtil.hpp
index cb9051d..f52d3f4 100644
--- a/framework/common/tcuTexVerifierUtil.hpp
+++ b/framework/common/tcuTexVerifierUtil.hpp
@@ -35,6 +35,7 @@
float computeFloatingPointError (const float value, const int numAccurateBits);
float computeFixedPointError (const int numAccurateBits);
+float computeColorBitsError (const int bits, const int numAccurateBits);
template<int Size>
inline Vector<float, Size> computeFloatingPointError (const Vector<float, Size>& value, const Vector<deInt32, Size>& numAccurateBits)
@@ -54,6 +55,15 @@
return res;
}
+template<int Size>
+inline Vector<float, Size> computeColorBitsError(const Vector<deInt32, Size>& bits, const Vector<deInt32, Size>& numAccurateBits)
+{
+ Vector<float, Size> res;
+ for (int ndx = 0; ndx < Size; ndx++)
+ res[ndx] = computeColorBitsError(bits[ndx], numAccurateBits[ndx]);
+ return res;
+}
+
// Sampler introspection
inline bool isNearestMipmapFilter(const Sampler::FilterMode mode)
diff --git a/framework/common/tcuTextureUtil.cpp b/framework/common/tcuTextureUtil.cpp
index 08b262d..f568388 100644
--- a/framework/common/tcuTextureUtil.cpp
+++ b/framework/common/tcuTextureUtil.cpp
@@ -569,10 +569,12 @@
case TextureFormat::SIGNED_INT8: return IVec4(8);
case TextureFormat::SIGNED_INT16: return IVec4(16);
case TextureFormat::SIGNED_INT32: return IVec4(32);
+ case TextureFormat::SIGNED_INT64: return IVec4(64);
case TextureFormat::UNSIGNED_INT8: return IVec4(8);
case TextureFormat::UNSIGNED_INT16: return IVec4(16);
case TextureFormat::UNSIGNED_INT24: return IVec4(24);
case TextureFormat::UNSIGNED_INT32: return IVec4(32);
+ case TextureFormat::UNSIGNED_INT64: return IVec4(64);
case TextureFormat::SIGNED_INT_1010102_REV: return IVec4(10,10,10,2);
case TextureFormat::UNSIGNED_INT_1010102_REV: return IVec4(10,10,10,2);
case TextureFormat::UNSIGNED_INT_16_8_8: return IVec4(16,8,0,0);
@@ -831,7 +833,8 @@
enum GradientStyle
{
GRADIENT_STYLE_OLD = 0,
- GRADIENT_STYLE_NEW = 1
+ GRADIENT_STYLE_NEW = 1,
+ GRADIENT_STYLE_PYRAMID = 2
};
static void fillWithComponentGradients1D (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal, GradientStyle)
@@ -850,21 +853,59 @@
}
}
-static void fillWithComponentGradients2D (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal, GradientStyle)
+static void fillWithComponentGradients2D (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal, GradientStyle style)
{
- for (int y = 0; y < access.getHeight(); y++)
+ if (style == GRADIENT_STYLE_PYRAMID)
{
- for (int x = 0; x < access.getWidth(); x++)
+ int xedge = deFloorFloatToInt32(float(access.getWidth()) * 0.6f);
+ int yedge = deFloorFloatToInt32(float(access.getHeight()) * 0.6f);
+
+ for (int y = 0; y < access.getHeight(); y++)
{
- float s = ((float)x + 0.5f) / (float)access.getWidth();
- float t = ((float)y + 0.5f) / (float)access.getHeight();
+ for (int x = 0; x < access.getWidth(); x++)
+ {
+ float s = ((float)x + 0.5f) / (float)access.getWidth();
+ float t = ((float)y + 0.5f) / (float)access.getHeight();
+ float coefR = 0.0f;
+ float coefG = 0.0f;
+ float coefB = 0.0f;
+ float coefA = 0.0f;
- float r = linearInterpolate(( s + t) *0.5f, minVal.x(), maxVal.x());
- float g = linearInterpolate(( s + (1.0f-t))*0.5f, minVal.y(), maxVal.y());
- float b = linearInterpolate(((1.0f-s) + t) *0.5f, minVal.z(), maxVal.z());
- float a = linearInterpolate(((1.0f-s) + (1.0f-t))*0.5f, minVal.w(), maxVal.w());
+ coefR = (x < xedge) ? s * 0.4f : (1 - s) * 0.6f;
+ coefG = (x < xedge) ? s * 0.4f : (1 - s) * 0.6f;
+ coefB = (x < xedge) ? (1.0f - s) * 0.4f : s * 0.6f - 0.2f;
+ coefA = (x < xedge) ? (1.0f - s) * 0.4f : s * 0.6f - 0.2f;
- access.setPixel(tcu::Vec4(r, g, b, a), x, y);
+ coefR += (y < yedge) ? t * 0.4f : (1 - t) * 0.6f;
+ coefG += (y < yedge) ? (1.0f - t) * 0.4f : t * 0.6f - 0.2f;
+ coefB += (y < yedge) ? t * 0.4f : (1 - t) * 0.6f;
+ coefA += (y < yedge) ? (1.0f - t) * 0.4f : t * 0.6f - 0.2f;
+
+ float r = linearInterpolate(coefR, minVal.x(), maxVal.x());
+ float g = linearInterpolate(coefG, minVal.y(), maxVal.y());
+ float b = linearInterpolate(coefB, minVal.z(), maxVal.z());
+ float a = linearInterpolate(coefA, minVal.w(), maxVal.w());
+
+ access.setPixel(tcu::Vec4(r, g, b, a), x, y);
+ }
+ }
+ }
+ else
+ {
+ for (int y = 0; y < access.getHeight(); y++)
+ {
+ for (int x = 0; x < access.getWidth(); x++)
+ {
+ float s = ((float)x + 0.5f) / (float)access.getWidth();
+ float t = ((float)y + 0.5f) / (float)access.getHeight();
+
+ float r = linearInterpolate((s + t) *0.5f, minVal.x(), maxVal.x());
+ float g = linearInterpolate((s + (1.0f - t))*0.5f, minVal.y(), maxVal.y());
+ float b = linearInterpolate(((1.0f - s) + t) *0.5f, minVal.z(), maxVal.z());
+ float a = linearInterpolate(((1.0f - s) + (1.0f - t))*0.5f, minVal.w(), maxVal.w());
+
+ access.setPixel(tcu::Vec4(r, g, b, a), x, y);
+ }
}
}
}
@@ -942,6 +983,11 @@
fillWithComponentGradientsStyled(access, minVal, maxVal, GRADIENT_STYLE_NEW);
}
+void fillWithComponentGradients3(const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal)
+{
+ fillWithComponentGradientsStyled(access, minVal, maxVal, GRADIENT_STYLE_PYRAMID);
+}
+
static void fillWithGrid1D (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB)
{
for (int x = 0; x < access.getWidth(); x++)
diff --git a/framework/common/tcuTextureUtil.hpp b/framework/common/tcuTextureUtil.hpp
index 5512033..be9ed3f 100644
--- a/framework/common/tcuTextureUtil.hpp
+++ b/framework/common/tcuTextureUtil.hpp
@@ -117,6 +117,7 @@
void clearStencil (const PixelBufferAccess& access, int stencil);
void fillWithComponentGradients (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal);
void fillWithComponentGradients2 (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal);
+void fillWithComponentGradients3 (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal);
void fillWithGrid (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB);
void fillWithRepeatableGradient (const PixelBufferAccess& access, const Vec4& colorA, const Vec4& colorB);
void fillWithMetaballs (const PixelBufferAccess& access, int numMetaballs, deUint32 seed);
diff --git a/framework/common/tcuWaiverUtil.cpp b/framework/common/tcuWaiverUtil.cpp
index facaffe..09a1f19 100644
--- a/framework/common/tcuWaiverUtil.cpp
+++ b/framework/common/tcuWaiverUtil.cpp
@@ -438,7 +438,11 @@
bool GLWaiverTreeBuilder::matchVendor(const std::string& vendor) const
{
- return m_currentVendor == vendor;
+ return tcu::matchWildcards(vendor.cbegin(),
+ vendor.cend(),
+ m_currentVendor.cbegin(),
+ m_currentVendor.cend(),
+ false);
}
bool GLWaiverTreeBuilder::matchDevice(const std::string& device) const
diff --git a/framework/delibs/cmake/Defs.cmake b/framework/delibs/cmake/Defs.cmake
index e65015b..e710856 100644
--- a/framework/delibs/cmake/Defs.cmake
+++ b/framework/delibs/cmake/Defs.cmake
@@ -24,7 +24,7 @@
# project(deproject)
# include(delibs/cmake/Defs.cmake NO_POLICY_SCOPE)
-cmake_policy(VERSION 2.6)
+cmake_policy(VERSION 3.10.2)
# \todo [pyry] More intelligent detection, perhaps use some script?
diff --git a/framework/delibs/debase/deDefs.h b/framework/delibs/debase/deDefs.h
index 314d2ad..6289670 100644
--- a/framework/delibs/debase/deDefs.h
+++ b/framework/delibs/debase/deDefs.h
@@ -340,6 +340,9 @@
/** Offset of a struct member. */
#define DE_OFFSET_OF(STRUCT, MEMBER) ((deUint32)(deUintptr)(deUint8*)&(((STRUCT*)0)->MEMBER))
+/** Used in enum to easify declarations for struct serialization. Declares 'NAME'_OFFSET, 'NAME'_SIZE, and offsets counter for next enum value by SIZE. */
+#define DE_SERIALIZED_FIELD(NAME, SIZE) NAME ## _OFFSET, NAME ## _SIZE = (SIZE), _DE_TMP_ ## NAME = NAME ## _OFFSET + (SIZE) - 1
+
/* Pointer size. */
#if defined(DE_PTR_SIZE)
/* nada */
diff --git a/framework/delibs/decpp/deSTLUtil.hpp b/framework/delibs/decpp/deSTLUtil.hpp
index 18df99c..348378d 100644
--- a/framework/delibs/decpp/deSTLUtil.hpp
+++ b/framework/delibs/decpp/deSTLUtil.hpp
@@ -29,6 +29,7 @@
#include <stdexcept>
#include <utility>
#include <iterator>
+#include <vector>
namespace de
{
@@ -114,6 +115,41 @@
return ret.second;
}
+// Returns the total size in bytes for contiguous-storage containers.
+template <typename T>
+size_t dataSize (const T& container)
+{
+ return (container.size() * sizeof(typename T::value_type));
+}
+
+// Returns const pointer to data stored in vector or NULL if vector is empty
+template <typename T>
+const T* dataSafe (const std::vector<T>& container)
+{
+ return container.empty() ? static_cast<const T*>(DE_NULL) : container.data();
+}
+
+// Returns pointer to data stored in vector or NULL if vector is empty
+template <typename T>
+T* dataSafe (std::vector<T>& container)
+{
+ return container.empty() ? static_cast<T*>(DE_NULL) : container.data();
+}
+
+// Returns the data pointer or a null pointer if the vector is empty.
+template <typename T>
+T* dataOrNull (std::vector<T>& container)
+{
+ return (container.empty() ? nullptr : container.data());
+}
+
+// Returns the data pointer or a null pointer if the vector is empty.
+template <typename T>
+const T* dataOrNull (const std::vector<T>& container)
+{
+ return (container.empty() ? nullptr : container.data());
+}
+
} // de
#endif // _DESTLUTIL_HPP
diff --git a/framework/opengl/gluRenderContext.hpp b/framework/opengl/gluRenderContext.hpp
index 2fd4fb4..4c5665b 100644
--- a/framework/opengl/gluRenderContext.hpp
+++ b/framework/opengl/gluRenderContext.hpp
@@ -148,6 +148,8 @@
explicit ContextType (ApiType apiType, ContextFlags flags = ContextFlags(0));
ApiType getAPI (void) const { return ApiType::fromBits(m_bits & ((1u<<TOTAL_API_BITS)-1u)); }
+ void setAPI (const ApiType& apiType) { m_bits = apiType.getPacked(); }
+
ContextFlags getFlags (void) const { return ContextFlags((m_bits>>FLAGS_SHIFT) & ((1u<<FLAGS_BITS)-1u)); }
using ApiType::getMajorVersion;
diff --git a/framework/opengl/gluStateReset.cpp b/framework/opengl/gluStateReset.cpp
index fe159b3..f7e41f2 100644
--- a/framework/opengl/gluStateReset.cpp
+++ b/framework/opengl/gluStateReset.cpp
@@ -1163,6 +1163,27 @@
GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer copy state reset failed");
}
+ // Images.
+ if (contextSupports(type, ApiType::core(4,4)))
+ {
+ int numImageUnits = 0;
+ gl.getIntegerv(GL_MAX_IMAGE_UNITS, &numImageUnits);
+
+ for (int ndx = 0; ndx < numImageUnits; ndx++)
+ gl.bindImageTexture(ndx, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R32UI);
+
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Image state reset failed");
+ }
+
+ // Sample shading state.
+ if (contextSupports(type, ApiType::core(4,0)))
+ {
+ gl.minSampleShading(0.0f);
+ gl.disable(GL_SAMPLE_SHADING);
+
+ GLU_EXPECT_NO_ERROR(gl.getError(), "Sample shading state reset failed");
+ }
+
// Debug state
if (ctxInfo.isExtensionSupported("GL_KHR_debug"))
{
diff --git a/framework/opengl/gluTextureUtil.cpp b/framework/opengl/gluTextureUtil.cpp
index bbf88e1..16d50d9 100644
--- a/framework/opengl/gluTextureUtil.cpp
+++ b/framework/opengl/gluTextureUtil.cpp
@@ -452,6 +452,8 @@
case GL_RGB_INTEGER: return TextureFormat(TextureFormat::RGB, mapGLChannelType(dataType, false));
case GL_RG_INTEGER: return TextureFormat(TextureFormat::RG, mapGLChannelType(dataType, false));
case GL_RED_INTEGER: return TextureFormat(TextureFormat::R, mapGLChannelType(dataType, false));
+ case GL_SRGB: return TextureFormat(TextureFormat::sRGB, mapGLChannelType(dataType, false));
+ case GL_SRGB_ALPHA: return TextureFormat(TextureFormat::sRGBA, mapGLChannelType(dataType, false));
case GL_DEPTH_COMPONENT: return TextureFormat(TextureFormat::D, mapGLChannelType(dataType, true));
case GL_DEPTH_STENCIL: return TextureFormat(TextureFormat::DS, mapGLChannelType(dataType, true));
diff --git a/framework/opengl/simplereference/sglrReferenceContext.cpp b/framework/opengl/simplereference/sglrReferenceContext.cpp
index d781b81..d17a275 100644
--- a/framework/opengl/simplereference/sglrReferenceContext.cpp
+++ b/framework/opengl/simplereference/sglrReferenceContext.cpp
@@ -30,6 +30,7 @@
#include "tcuVectorUtil.hpp"
#include "gluDefs.hpp"
#include "gluTextureUtil.hpp"
+#include "gluContextInfo.hpp"
#include "glwFunctions.hpp"
#include "glwEnums.hpp"
#include "deMemory.h"
@@ -248,6 +249,17 @@
{
const glw::Functions& gl = renderCtx.getFunctions();
+ // When the OpenGL ES's major version bigger than 3, and the expect context version is 3,
+ // we need query the real GL context version and update the real version to reference context.
+ if (glu::IsES3Compatible(gl) && isES2Context(contextType))
+ {
+ int majorVersion = contextType.getMajorVersion();
+ int minorVersion = contextType.getMinorVersion();
+ gl.getIntegerv(GL_MAJOR_VERSION, &majorVersion);
+ gl.getIntegerv(GL_MINOR_VERSION, &minorVersion);
+ contextType.setAPI(glu::ApiType::es(majorVersion, minorVersion));
+ }
+
gl.getIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureImageUnits);
gl.getIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexture2DSize);
gl.getIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxTextureCubeSize);
@@ -325,7 +337,7 @@
, m_textureUnits (m_limits.maxTextureImageUnits)
, m_emptyTex1D ()
, m_emptyTex2D (isES2Context(limits.contextType))
- , m_emptyTexCube ()
+ , m_emptyTexCube (!isES2Context(limits.contextType))
, m_emptyTex2DArray ()
, m_emptyTex3D ()
, m_emptyTexCubeArray ()
@@ -441,6 +453,9 @@
m_emptyTexCubeArray.getLevel(0).setPixel(Vec4(0.0f, 0.0f, 0.0f, 1.0f), 0, 0, faceNdx);
m_emptyTexCubeArray.updateView(tcu::Sampler::MODE_LAST);
+ for (int unitNdx = 0; unitNdx < m_limits.maxTextureImageUnits; unitNdx++)
+ m_textureUnits[unitNdx].defaultCubeTex.getSampler().seamlessCubeMap = !isES2Context(limits.contextType);
+
if (glu::isContextTypeGLCore(getType()))
m_sRGBUpdateEnabled = false;
}
@@ -644,14 +659,15 @@
else
{
// New texture object.
+ bool seamlessCubeMap = !isES2Context(m_limits.contextType);
switch (target)
{
- case GL_TEXTURE_1D: texObj = new Texture1D (texture); break;
- case GL_TEXTURE_2D: texObj = new Texture2D (texture); break;
- case GL_TEXTURE_CUBE_MAP: texObj = new TextureCube (texture); break;
- case GL_TEXTURE_2D_ARRAY: texObj = new Texture2DArray (texture); break;
- case GL_TEXTURE_3D: texObj = new Texture3D (texture); break;
- case GL_TEXTURE_CUBE_MAP_ARRAY: texObj = new TextureCubeArray (texture); break;
+ case GL_TEXTURE_1D: texObj = new Texture1D (texture); break;
+ case GL_TEXTURE_2D: texObj = new Texture2D (texture); break;
+ case GL_TEXTURE_CUBE_MAP: texObj = new TextureCube (texture, seamlessCubeMap); break;
+ case GL_TEXTURE_2D_ARRAY: texObj = new Texture2DArray (texture); break;
+ case GL_TEXTURE_3D: texObj = new Texture3D (texture); break;
+ case GL_TEXTURE_CUBE_MAP_ARRAY: texObj = new TextureCubeArray (texture); break;
default:
DE_ASSERT(false);
}
@@ -4707,7 +4723,7 @@
m_effectiveAccess[levelNdx] = tcu::getEffectiveDepthStencilAccess(m_access[levelNdx], mode);
}
-Texture::Texture (deUint32 name, Type type)
+Texture::Texture (deUint32 name, Type type, deBool seamless)
: NamedObject (name)
, m_type (type)
, m_immutable (false)
@@ -4721,7 +4737,7 @@
tcu::Sampler::COMPAREMODE_NONE,
0, // cmp channel ndx
tcu::Vec4(0.0f), // border color
- true // seamless cube map \todo [2014-02-19 pyry] Default value ok?
+ seamless // seamless cube map, Default value is True.
)
, m_baseLevel (0)
, m_maxLevel (1000)
@@ -4929,8 +4945,8 @@
}
}
-TextureCube::TextureCube (deUint32 name)
- : Texture(name, TYPE_CUBE_MAP)
+TextureCube::TextureCube (deUint32 name, deBool seamless)
+ : Texture(name, TYPE_CUBE_MAP, seamless)
{
}
diff --git a/framework/opengl/simplereference/sglrReferenceContext.hpp b/framework/opengl/simplereference/sglrReferenceContext.hpp
index b9aca1a..5ddeb60 100644
--- a/framework/opengl/simplereference/sglrReferenceContext.hpp
+++ b/framework/opengl/simplereference/sglrReferenceContext.hpp
@@ -85,7 +85,7 @@
TYPE_LAST
};
- Texture (deUint32 name, Type type);
+ Texture (deUint32 name, Type type, deBool seamless = true);
virtual ~Texture (void) {}
Type getType (void) const { return m_type; }
@@ -193,7 +193,7 @@
class TextureCube : public Texture
{
public:
- TextureCube (deUint32 name = 0);
+ TextureCube (deUint32 name = 0, deBool seamless = true);
virtual ~TextureCube (void);
void clearLevels (void);
diff --git a/framework/platform/CMakeLists.txt b/framework/platform/CMakeLists.txt
index f7858f5..260950a 100644
--- a/framework/platform/CMakeLists.txt
+++ b/framework/platform/CMakeLists.txt
@@ -19,7 +19,7 @@
win32/tcuWin32VulkanPlatform.cpp
)
- elseif ((DE_OS_IS_UNIX OR DE_OS_IS_OSX) AND (DEQP_USE_X11 OR DEQP_USE_WAYLAND))
+ elseif ((DE_OS_IS_UNIX OR DE_OS_IS_OSX) AND (DEQP_USE_X11 OR DEQP_USE_WAYLAND OR DEQP_USE_HEADLESS))
set(TCUTIL_PLATFORM_SRCS
lnx/tcuLnx.cpp
@@ -83,6 +83,10 @@
include_directories(wayland)
endif()
+ if (DEQP_USE_HEADLESS)
+ add_definitions(-DDEQP_SUPPORT_HEADLESS=1)
+ endif()
+
elseif (DE_OS_IS_UNIX AND DEQP_USE_SURFACELESS)
set(TCUTIL_PLATFORM_SRCS
surfaceless/tcuSurfacelessPlatform.hpp
@@ -101,8 +105,6 @@
${TCUTIL_PLATFORM_SRCS}
android/tcuAndroidAssets.cpp
android/tcuAndroidAssets.hpp
- android/tcuAndroidInternals.cpp
- android/tcuAndroidInternals.hpp
android/tcuAndroidNativeActivity.cpp
android/tcuAndroidNativeActivity.hpp
android/tcuAndroidPlatform.cpp
diff --git a/framework/platform/android/tcuAndroidInternals.cpp b/framework/platform/android/tcuAndroidInternals.cpp
deleted file mode 100644
index 8590393..0000000
--- a/framework/platform/android/tcuAndroidInternals.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-/*-------------------------------------------------------------------------
- * drawElements Quality Program Tester Core
- * ----------------------------------------
- *
- * Copyright 2014 The Android Open Source Project
- *
- * 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 Access to Android internals that are not a part of the NDK.
- *//*--------------------------------------------------------------------*/
-
-#include "tcuAndroidInternals.hpp"
-#include "deMemory.h"
-#include "deStringUtil.hpp"
-
-namespace tcu
-{
-namespace Android
-{
-namespace internal
-{
-
-using std::string;
-using de::DynamicLibrary;
-
-template<typename Func>
-void setFuncPtr (Func*& funcPtr, DynamicLibrary& lib, const string& symname)
-{
- funcPtr = reinterpret_cast<Func*>(lib.getFunction(symname.c_str()));
- if (!funcPtr)
- TCU_THROW(NotSupportedError, ("Unable to look up symbol from shared object: " + symname).c_str());
-}
-
-LibUI::LibUI (void)
- : m_library ("libui.so")
-{
- GraphicBufferFunctions& gb = m_functions.graphicBuffer;
-
- setFuncPtr(gb.constructor, m_library, "_ZN7android13GraphicBufferC1Ejjij");
- setFuncPtr(gb.destructor, m_library, "_ZN7android13GraphicBufferD1Ev");
- setFuncPtr(gb.getNativeBuffer, m_library, "_ZNK7android13GraphicBuffer15getNativeBufferEv");
- setFuncPtr(gb.lock, m_library, "_ZN7android13GraphicBuffer4lockEjPPv");
- setFuncPtr(gb.unlock, m_library, "_ZN7android13GraphicBuffer6unlockEv");
- setFuncPtr(gb.initCheck, m_library, "_ZNK7android13GraphicBuffer9initCheckEv");
-}
-
-#define GRAPHICBUFFER_SIZE 1024 // Hopefully enough
-
-typedef void (*GenericFptr)();
-
-//! call constructor with 4 arguments
-template <typename RT, typename T1, typename T2, typename T3, typename T4>
-RT* callConstructor4 (GenericFptr fptr, void* memory, size_t memorySize, T1 param1, T2 param2, T3 param3, T4 param4)
-{
- DE_UNREF(memorySize);
-
-#if (DE_CPU == DE_CPU_ARM)
- // C1 constructors return pointer
- typedef RT* (*ABIFptr)(void*, T1, T2, T3, T4);
- (void)((ABIFptr)fptr)(memory, param1, param2, param3, param4);
- return reinterpret_cast<RT*>(memory);
-#elif (DE_CPU == DE_CPU_ARM_64)
- // C1 constructors return void
- typedef void (*ABIFptr)(void*, T1, T2, T3, T4);
- ((ABIFptr)fptr)(memory, param1, param2, param3, param4);
- return reinterpret_cast<RT*>(memory);
-#elif (DE_CPU == DE_CPU_X86)
- // ctor returns void
- typedef void (*ABIFptr)(void*, T1, T2, T3, T4);
- ((ABIFptr)fptr)(memory, param1, param2, param3, param4);
- return reinterpret_cast<RT*>(memory);
-#elif (DE_CPU == DE_CPU_X86_64)
- // ctor returns void
- typedef void (*ABIFptr)(void*, T1, T2, T3, T4);
- ((ABIFptr)fptr)(memory, param1, param2, param3, param4);
- return reinterpret_cast<RT*>(memory);
-#else
- DE_UNREF(fptr);
- DE_UNREF(memory);
- DE_UNREF(param1);
- DE_UNREF(param2);
- DE_UNREF(param3);
- DE_UNREF(param4);
- TCU_THROW(NotSupportedError, "ABI not supported");
- return DE_NULL;
-#endif
-}
-
-template <typename T>
-void callDestructor (GenericFptr fptr, T* obj)
-{
-#if (DE_CPU == DE_CPU_ARM)
- // D1 destructor returns ptr
- typedef void* (*ABIFptr)(T* obj);
- (void)((ABIFptr)fptr)(obj);
-#elif (DE_CPU == DE_CPU_ARM_64)
- // D1 destructor returns void
- typedef void (*ABIFptr)(T* obj);
- ((ABIFptr)fptr)(obj);
-#elif (DE_CPU == DE_CPU_X86)
- // dtor returns void
- typedef void (*ABIFptr)(T* obj);
- ((ABIFptr)fptr)(obj);
-#elif (DE_CPU == DE_CPU_X86_64)
- // dtor returns void
- typedef void (*ABIFptr)(T* obj);
- ((ABIFptr)fptr)(obj);
-#else
- DE_UNREF(fptr);
- DE_UNREF(obj);
- TCU_THROW(NotSupportedError, "ABI not supported");
-#endif
-}
-
-template<typename T1, typename T2>
-T1* pointerToOffset (T2* ptr, size_t bytes)
-{
- return reinterpret_cast<T1*>((deUint8*)ptr + bytes);
-}
-
-static android::android_native_base_t* getAndroidNativeBase (android::GraphicBuffer* gb)
-{
- // \note: assuming Itanium ABI
- return pointerToOffset<android::android_native_base_t>(gb, 2 * DE_PTR_SIZE);
-}
-
-//! android_native_base_t::magic for ANativeWindowBuffer
-static deInt32 getExpectedNativeBufferVersion (void)
-{
-#if (DE_PTR_SIZE == 4)
- return 96;
-#elif (DE_PTR_SIZE == 8)
- return 168;
-#else
-# error Invalid DE_PTR_SIZE
-#endif
-}
-
-//! access android_native_base_t::magic
-static deUint32 getNativeBaseMagic (android::android_native_base_t* base)
-{
- return *pointerToOffset<deUint32>(base, 0);
-}
-
-//! access android_native_base_t::version
-static deUint32 getNativeBaseVersion (android::android_native_base_t* base)
-{
- return *pointerToOffset<deInt32>(base, 4);
-}
-
-//! access android_native_base_t::incRef
-static NativeBaseFunctions::incRefFunc getNativeBaseIncRefFunc (android::android_native_base_t* base)
-{
- return *pointerToOffset<NativeBaseFunctions::incRefFunc>(base, 8 + DE_PTR_SIZE*4);
-}
-
-//! access android_native_base_t::decRef
-static NativeBaseFunctions::decRefFunc getNativeBaseDecRefFunc (android::android_native_base_t* base)
-{
- return *pointerToOffset<NativeBaseFunctions::decRefFunc>(base, 8 + DE_PTR_SIZE*5);
-}
-
-static android::GraphicBuffer* createGraphicBuffer (const GraphicBufferFunctions& functions, NativeBaseFunctions& baseFunctions, deUint32 w, deUint32 h, PixelFormat format, deUint32 usage)
-{
- // \note: Hopefully uses the same allocator as libui
- void* const memory = deMalloc(GRAPHICBUFFER_SIZE);
- if (memory == DE_NULL)
- TCU_THROW(ResourceError, "Could not alloc for GraphicBuffer");
- else
- {
- try
- {
- android::GraphicBuffer* const gb = callConstructor4<android::GraphicBuffer, deUint32, deUint32, PixelFormat, deUint32>(functions.constructor,
- memory,
- GRAPHICBUFFER_SIZE,
- w,
- h,
- format,
- usage);
- android::android_native_base_t* const base = getAndroidNativeBase(gb);
- status_t ctorStatus = functions.initCheck(gb);
-
- if (ctorStatus)
- {
- // ctor failed
- callDestructor<android::GraphicBuffer>(functions.destructor, gb);
- TCU_THROW(NotSupportedError, ("GraphicBuffer ctor failed, initCheck returned " + de::toString(ctorStatus)).c_str());
- }
-
- // check object layout
- {
- const deUint32 magic = getNativeBaseMagic(base);
- const deUint32 bufferMagic = 0x5f626672u; // "_bfr"
-
- if (magic != bufferMagic)
- TCU_THROW(NotSupportedError, "GraphicBuffer layout unexpected");
- }
-
- // check object version
- {
- const deInt32 version = getNativeBaseVersion(base);
- const deInt32 expectedVersion = getExpectedNativeBufferVersion();
-
- if (version != expectedVersion)
- TCU_THROW(NotSupportedError, "GraphicBuffer version unexpected");
- }
-
- // locate refcounting functions
-
- if (!baseFunctions.incRef || !baseFunctions.decRef)
- {
- baseFunctions.incRef = getNativeBaseIncRefFunc(base);
- baseFunctions.decRef = getNativeBaseDecRefFunc(base);
- }
-
- // take the initial reference and return
- baseFunctions.incRef(base);
- return gb;
- }
- catch (...)
- {
- deFree(memory);
- throw;
- }
- }
-}
-
-GraphicBuffer::GraphicBuffer (const LibUI& lib, deUint32 width, deUint32 height, PixelFormat format, deUint32 usage)
- : m_functions (lib.getFunctions().graphicBuffer)
- , m_impl (DE_NULL)
-{
- m_baseFunctions.incRef = DE_NULL;
- m_baseFunctions.decRef = DE_NULL;
-
- // \note createGraphicBuffer updates m_baseFunctions
- m_impl = createGraphicBuffer(m_functions, m_baseFunctions, width, height, format, usage);
-}
-
-GraphicBuffer::~GraphicBuffer (void)
-{
- if (m_impl && m_baseFunctions.decRef)
- {
- m_baseFunctions.decRef(getAndroidNativeBase(m_impl));
- m_impl = DE_NULL;
- }
-}
-
-status_t GraphicBuffer::lock (deUint32 usage, void** vaddr)
-{
- return m_functions.lock(m_impl, usage, vaddr);
-}
-
-status_t GraphicBuffer::unlock (void)
-{
- return m_functions.unlock(m_impl);
-}
-
-ANativeWindowBuffer* GraphicBuffer::getNativeBuffer (void) const
-{
- return m_functions.getNativeBuffer(m_impl);
-}
-
-} // internal
-} // Android
-} // tcu
diff --git a/framework/platform/android/tcuAndroidInternals.hpp b/framework/platform/android/tcuAndroidInternals.hpp
deleted file mode 100644
index b52dd51..0000000
--- a/framework/platform/android/tcuAndroidInternals.hpp
+++ /dev/null
@@ -1,188 +0,0 @@
-#ifndef _TCUANDROIDINTERNALS_HPP
-#define _TCUANDROIDINTERNALS_HPP
-/*-------------------------------------------------------------------------
- * drawElements Quality Program Tester Core
- * ----------------------------------------
- *
- * Copyright 2014 The Android Open Source Project
- *
- * 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 Access to Android internals that are not a part of the NDK.
- *//*--------------------------------------------------------------------*/
-
-#include "tcuDefs.hpp"
-
-#include "deDynamicLibrary.hpp"
-
-#include <vector>
-#include <errno.h>
-
-struct ANativeWindowBuffer;
-
-namespace android
-{
-class GraphicBuffer;
-class android_native_base_t;
-}
-
-namespace tcu
-{
-
-namespace Android
-{
-
-// These classes and enums reflect internal android definitions
-namespace internal
-{
-
-// utils/Errors.h
-enum
-{
- OK = 0,
- UNKNOWN_ERROR = (-2147483647-1),
- NO_MEMORY = -ENOMEM,
- INVALID_OPERATION = -ENOSYS,
- BAD_VALUE = -EINVAL,
- BAD_TYPE = (UNKNOWN_ERROR + 1),
- NAME_NOT_FOUND = -ENOENT,
- PERMISSION_DENIED = -EPERM,
- NO_INIT = -ENODEV,
- ALREADY_EXISTS = -EEXIST,
- DEAD_OBJECT = -EPIPE,
- FAILED_TRANSACTION = (UNKNOWN_ERROR + 2),
- BAD_INDEX = -E2BIG,
- NOT_ENOUGH_DATA = (UNKNOWN_ERROR + 3),
- WOULD_BLOCK = (UNKNOWN_ERROR + 4),
- TIMED_OUT = (UNKNOWN_ERROR + 5),
- UNKNOWN_TRANSACTION = (UNKNOWN_ERROR + 6),
- FDS_NOT_ALLOWED = (UNKNOWN_ERROR + 7),
-};
-
-typedef deInt32 status_t;
-
-// ui/PixelFormat.h, system/graphics.h
-enum
-{
- PIXEL_FORMAT_UNKNOWN = 0,
- PIXEL_FORMAT_NONE = 0,
- PIXEL_FORMAT_CUSTOM = -4,
- PIXEL_FORMAT_TRANSLUCENT = -3,
- PIXEL_FORMAT_TRANSPARENT = -2,
- PIXEL_FORMAT_OPAQUE = -1,
- PIXEL_FORMAT_RGBA_8888 = 1,
- PIXEL_FORMAT_RGBX_8888 = 2,
- PIXEL_FORMAT_RGB_888 = 3,
- PIXEL_FORMAT_RGB_565 = 4,
- PIXEL_FORMAT_BGRA_8888 = 5,
- PIXEL_FORMAT_RGBA_5551 = 6,
- PIXEL_FORMAT_RGBA_4444 = 7,
-};
-
-typedef deInt32 PixelFormat;
-
-// ui/GraphicBuffer.h
-struct GraphicBufferFunctions
-{
- typedef void (*genericFunc) ();
- typedef status_t (*initCheckFunc) (android::GraphicBuffer* buffer);
- typedef status_t (*lockFunc) (android::GraphicBuffer* buffer, deUint32 usage, void** vaddr);
- typedef status_t (*unlockFunc) (android::GraphicBuffer* buffer);
- typedef ANativeWindowBuffer* (*getNativeBufferFunc) (const android::GraphicBuffer* buffer);
-
- genericFunc constructor;
- genericFunc destructor;
- lockFunc lock;
- unlockFunc unlock;
- getNativeBufferFunc getNativeBuffer;
- initCheckFunc initCheck;
-};
-
-// system/window.h
-struct NativeBaseFunctions
-{
- typedef void (*incRefFunc) (android::android_native_base_t* base);
- typedef void (*decRefFunc) (android::android_native_base_t* base);
-
- incRefFunc incRef;
- decRefFunc decRef;
-};
-
-struct LibUIFunctions
-{
- GraphicBufferFunctions graphicBuffer;
-};
-
-class LibUI
-{
-public:
- struct Functions
- {
- GraphicBufferFunctions graphicBuffer;
- };
-
- LibUI (void);
- const Functions& getFunctions (void) const { return m_functions; }
-
-private:
- Functions m_functions;
- de::DynamicLibrary m_library;
-};
-
-class GraphicBuffer
-{
-public:
- // ui/GraphicBuffer.h, hardware/gralloc.h
- enum {
- USAGE_SW_READ_NEVER = 0x00000000,
- USAGE_SW_READ_RARELY = 0x00000002,
- USAGE_SW_READ_OFTEN = 0x00000003,
- USAGE_SW_READ_MASK = 0x0000000f,
-
- USAGE_SW_WRITE_NEVER = 0x00000000,
- USAGE_SW_WRITE_RARELY = 0x00000020,
- USAGE_SW_WRITE_OFTEN = 0x00000030,
- USAGE_SW_WRITE_MASK = 0x000000f0,
-
- USAGE_SOFTWARE_MASK = USAGE_SW_READ_MASK | USAGE_SW_WRITE_MASK,
-
- USAGE_PROTECTED = 0x00004000,
-
- USAGE_HW_TEXTURE = 0x00000100,
- USAGE_HW_RENDER = 0x00000200,
- USAGE_HW_2D = 0x00000400,
- USAGE_HW_COMPOSER = 0x00000800,
- USAGE_HW_VIDEO_ENCODER = 0x00010000,
- USAGE_HW_MASK = 0x00071F00,
- };
-
- GraphicBuffer (const LibUI& lib, deUint32 width, deUint32 height, PixelFormat format, deUint32 usage);
- ~GraphicBuffer ();
-
- status_t lock (deUint32 usage, void** vaddr);
- status_t unlock (void);
- ANativeWindowBuffer* getNativeBuffer (void) const;
-
-private:
- const GraphicBufferFunctions& m_functions;
- NativeBaseFunctions m_baseFunctions;
- android::GraphicBuffer* m_impl;
-};
-
-} // internal
-} // Android
-} // tcu
-
-#endif // _TCUANDROIDINTERNALS_HPP
diff --git a/framework/platform/lnx/tcuLnxVulkanPlatform.cpp b/framework/platform/lnx/tcuLnxVulkanPlatform.cpp
index 2c44fdb..a4dffc2 100644
--- a/framework/platform/lnx/tcuLnxVulkanPlatform.cpp
+++ b/framework/platform/lnx/tcuLnxVulkanPlatform.cpp
@@ -193,6 +193,31 @@
};
#endif // DEQP_SUPPORT_WAYLAND
+#if defined (DEQP_SUPPORT_HEADLESS)
+
+struct VulkanWindowHeadless : public vk::wsi::Window
+{
+public:
+ void resize (const UVec2&)
+ {
+ }
+};
+
+class VulkanDisplayHeadless : public vk::wsi::Display
+{
+public:
+ VulkanDisplayHeadless ()
+ {
+ }
+
+ vk::wsi::Window* createWindow (const Maybe<UVec2>&) const
+ {
+ return new VulkanWindowHeadless();
+ }
+};
+
+#endif // DEQP_SUPPORT_HEADLESS
+
class VulkanLibrary : public vk::Library
{
public:
@@ -246,6 +271,11 @@
return new VulkanDisplayWayland(MovePtr<wayland::Display>(new wayland::Display(m_eventState, WAYLAND_DISPLAY)));
break;
#endif // DEQP_SUPPORT_WAYLAND
+#if defined (DEQP_SUPPORT_HEADLESS)
+ case vk::wsi::TYPE_HEADLESS:
+ return new VulkanDisplayHeadless();
+ break;
+#endif // DEQP_SUPPORT_HEADLESS
default:
TCU_THROW(NotSupportedError, "WSI type not supported");
@@ -268,6 +298,10 @@
case vk::wsi::TYPE_WAYLAND:
return wayland::Display::hasDisplay(WAYLAND_DISPLAY);
#endif // DEQP_SUPPORT_WAYLAND
+#if defined (DEQP_SUPPORT_HEADLESS)
+ case vk::wsi::TYPE_HEADLESS:
+ return true;
+#endif // DEQP_SUPPORT_HEADLESS
default:
return false;
diff --git a/modules/egl/teglAndroidUtil.cpp b/modules/egl/teglAndroidUtil.cpp
index c5969fc..2e1ac47 100644
--- a/modules/egl/teglAndroidUtil.cpp
+++ b/modules/egl/teglAndroidUtil.cpp
@@ -30,16 +30,13 @@
#include "eglwLibrary.hpp"
#include "eglwEnums.hpp"
-#if (DE_OS == DE_OS_ANDROID)
-# include "tcuAndroidInternals.hpp"
-#endif
-
namespace deqp
{
namespace egl
{
namespace Image
{
+
using std::string;
using de::MovePtr;
using tcu::PixelBufferAccess;
@@ -58,88 +55,220 @@
#else // DE_OS == DE_OS_ANDROID
-using tcu::Android::internal::LibUI;
-using tcu::Android::internal::GraphicBuffer;
-using tcu::Android::internal::PixelFormat;
-using tcu::Android::internal::status_t;
+namespace
+{
-PixelFormat getPixelFormat (GLenum format)
+#if defined(__ANDROID_API_O__) && (DE_ANDROID_API >= __ANDROID_API_O__)
+# include <sys/system_properties.h>
+# include <android/hardware_buffer.h>
+# include "deDynamicLibrary.hpp"
+# define BUILT_WITH_ANDROID_HARDWARE_BUFFER 1
+#endif
+
+#if defined(__ANDROID_API_P__) && (DE_ANDROID_API >= __ANDROID_API_P__)
+# define BUILT_WITH_ANDROID_P_HARDWARE_BUFFER 1
+#endif
+
+deInt32 androidGetSdkVersion (void)
+{
+ static deInt32 sdkVersion = -1;
+ if (sdkVersion < 0)
+ {
+ char value[128] = {0};
+ __system_property_get("ro.build.version.sdk", value);
+ sdkVersion = static_cast<deInt32>(strtol(value, DE_NULL, 10));
+ printf("SDK Version is %d\n", sdkVersion);
+ }
+ return sdkVersion;
+}
+
+typedef int (*pfnAHardwareBuffer_allocate)(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer);
+typedef void (*pfnAHardwareBuffer_describe)(const AHardwareBuffer* buffer, AHardwareBuffer_Desc* outDesc);
+typedef void (*pfnAHardwareBuffer_acquire)(AHardwareBuffer* buffer);
+typedef void (*pfnAHardwareBuffer_release)(AHardwareBuffer* buffer);
+typedef int (*pfnAHardwareBuffer_isSupported)(const AHardwareBuffer_Desc* desc);
+
+struct AhbFunctions
+{
+ pfnAHardwareBuffer_allocate allocate;
+ pfnAHardwareBuffer_describe describe;
+ pfnAHardwareBuffer_acquire acquire;
+ pfnAHardwareBuffer_release release;
+ pfnAHardwareBuffer_isSupported isSupported;
+};
+
+AhbFunctions ahbFunctions;
+
+bool ahbFunctionsLoaded (AhbFunctions* pAhbFunctions)
+{
+ static bool ahbApiLoaded = false;
+ if (ahbApiLoaded ||
+ ((pAhbFunctions->allocate != DE_NULL) &&
+ (pAhbFunctions->describe != DE_NULL) &&
+ (pAhbFunctions->acquire != DE_NULL) &&
+ (pAhbFunctions->release != DE_NULL) &&
+ (pAhbFunctions->isSupported != DE_NULL)))
+ {
+ ahbApiLoaded = true;
+ return true;
+ }
+ return false;
+}
+
+bool loadAhbDynamicApis (deInt32 sdkVersion)
+{
+ if (sdkVersion >= __ANDROID_API_O__)
+ {
+ if (!ahbFunctionsLoaded(&ahbFunctions))
+ {
+ static de::DynamicLibrary libnativewindow("libnativewindow.so");
+ ahbFunctions.allocate = reinterpret_cast<pfnAHardwareBuffer_allocate>(libnativewindow.getFunction("AHardwareBuffer_allocate"));
+ ahbFunctions.describe = reinterpret_cast<pfnAHardwareBuffer_describe>(libnativewindow.getFunction("AHardwareBuffer_describe"));
+ ahbFunctions.acquire = reinterpret_cast<pfnAHardwareBuffer_acquire>(libnativewindow.getFunction("AHardwareBuffer_acquire"));
+ ahbFunctions.release = reinterpret_cast<pfnAHardwareBuffer_release>(libnativewindow.getFunction("AHardwareBuffer_release"));
+ ahbFunctions.isSupported = reinterpret_cast<pfnAHardwareBuffer_isSupported>(libnativewindow.getFunction("AHardwareBuffer_isSupported"));
+
+ return ahbFunctionsLoaded(&ahbFunctions);
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+AHardwareBuffer_Format getPixelFormat (GLenum format)
{
switch (format)
{
- case GL_RGB565: return tcu::Android::internal::PIXEL_FORMAT_RGB_565;
- case GL_RGB8: return tcu::Android::internal::PIXEL_FORMAT_RGB_888;
- case GL_RGBA4: return tcu::Android::internal::PIXEL_FORMAT_RGBA_4444;
- case GL_RGB5_A1: return tcu::Android::internal::PIXEL_FORMAT_RGBA_5551;
- case GL_RGBA8: return tcu::Android::internal::PIXEL_FORMAT_RGBA_8888;
- default: TCU_THROW(NotSupportedError, "Texture format unsupported by Android");
+ case GL_RGB565: return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
+ case GL_RGB8: return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
+ case GL_RGBA8: return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
+ case GL_DEPTH_COMPONENT16: return AHARDWAREBUFFER_FORMAT_D16_UNORM;
+ case GL_DEPTH_COMPONENT24: return AHARDWAREBUFFER_FORMAT_D24_UNORM;
+ case GL_DEPTH24_STENCIL8: return AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT;
+ case GL_DEPTH_COMPONENT32F: return AHARDWAREBUFFER_FORMAT_D32_FLOAT;
+ case GL_DEPTH32F_STENCIL8: return AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT;
+ case GL_RGB10_A2: return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
+ case GL_RGBA16F: return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
+ case GL_STENCIL_INDEX8: return AHARDWAREBUFFER_FORMAT_S8_UINT;
+
+ default: TCU_THROW(NotSupportedError, "Texture format unsupported by Android");
}
}
class AndroidNativeClientBuffer : public ClientBuffer
{
public:
- AndroidNativeClientBuffer (const LibUI& lib, GLenum format);
- EGLClientBuffer get (void) const { return reinterpret_cast<EGLClientBuffer>(m_windowBuffer); }
- GraphicBuffer& getGraphicBuffer (void) { return m_graphicBuffer; }
+ AndroidNativeClientBuffer (const Library& egl, GLenum format);
+ ~AndroidNativeClientBuffer (void);
+ EGLClientBuffer get (void) const;
+ void lock (void** data);
+ void unlock (void);
private:
- GraphicBuffer m_graphicBuffer;
- ANativeWindowBuffer* m_windowBuffer;
+ const Library& m_egl;
+ AHardwareBuffer* m_hardwareBuffer;
};
-AndroidNativeClientBuffer::AndroidNativeClientBuffer (const LibUI& lib, GLenum format)
- : m_graphicBuffer (lib, 64, 64, getPixelFormat(format),
- GraphicBuffer::USAGE_SW_READ_OFTEN |
- GraphicBuffer::USAGE_SW_WRITE_RARELY |
- GraphicBuffer::USAGE_HW_TEXTURE |
- GraphicBuffer::USAGE_HW_RENDER)
- , m_windowBuffer (m_graphicBuffer.getNativeBuffer())
+AndroidNativeClientBuffer::AndroidNativeClientBuffer (const Library& egl, GLenum format)
+ : m_egl(egl)
{
+ //deInt32 sdkVersion = checkAnbApiBuild();
+ deInt32 sdkVersion = androidGetSdkVersion();
+#if defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
+ // When testing AHB on Android-P and newer the CTS must be compiled against API28 or newer.
+ DE_TEST_ASSERT(sdkVersion >= 28); /*__ANDROID_API_P__ */
+#else
+ // When testing AHB on Android-O and newer the CTS must be compiled against API26 or newer.
+ DE_TEST_ASSERT(sdkVersion >= 26); /* __ANDROID_API_O__ */
+#endif // !defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
+
+ if (sdkVersion >= __ANDROID_API_O__)
+ {
+#if defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
+ if (!loadAhbDynamicApis(sdkVersion))
+ {
+ // Couldn't load Android AHB system APIs.
+ DE_TEST_ASSERT(false);
+ }
+#else
+ // Invalid Android AHB APIs configuration. Please check the instructions on how to build NDK for Android.
+ DE_TEST_ASSERT(false);
+#endif // defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
+ }
+
+ AHardwareBuffer_Desc hbufferdesc = {
+ 64u,
+ 64u,
+ 1u, // number of images
+ getPixelFormat(format),
+ AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY |
+ AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
+ AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER,
+ 0u, // Stride in pixels, ignored for AHardwareBuffer_allocate()
+ 0u, // Initialize to zero, reserved for future use
+ 0u // Initialize to zero, reserved for future use
+ };
+
+ if (!ahbFunctions.isSupported(&hbufferdesc))
+ TCU_THROW(NotSupportedError, "Texture format unsupported");
+
+ ahbFunctions.allocate(&hbufferdesc, &m_hardwareBuffer);
+}
+
+AndroidNativeClientBuffer::~AndroidNativeClientBuffer (void)
+{
+ ahbFunctions.release(m_hardwareBuffer);
+}
+
+EGLClientBuffer AndroidNativeClientBuffer::get (void) const
+{
+ typedef EGLW_APICALL EGLClientBuffer (EGLW_APIENTRY* eglGetNativeClientBufferANDROIDFunc) (const struct AHardwareBuffer *buffer);
+ return ((eglGetNativeClientBufferANDROIDFunc)m_egl.getProcAddress("eglGetNativeClientBufferANDROID"))(m_hardwareBuffer);
+}
+
+void AndroidNativeClientBuffer::lock(void** data)
+{
+ const int status = AHardwareBuffer_lock(m_hardwareBuffer, AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY, -1, DE_NULL, data);
+
+ if (status != 0)
+ TCU_FAIL(("AHardwareBuffer_lock failed with error: " + de::toString(status)).c_str());
+}
+
+void AndroidNativeClientBuffer::unlock(void)
+{
+ const int status = AHardwareBuffer_unlock(m_hardwareBuffer, DE_NULL);
+
+ if (status != 0)
+ TCU_FAIL(("AHardwareBuffer_unlock failed with error: " + de::toString(status)).c_str());
}
class AndroidNativeImageSource : public ImageSource
{
public:
- AndroidNativeImageSource (GLenum format) : m_format(format), m_libui(DE_NULL) {}
+ AndroidNativeImageSource (GLenum format) : m_format(format) {}
~AndroidNativeImageSource (void);
- MovePtr<ClientBuffer> createBuffer (const glw::Functions&, Texture2D*) const;
- string getRequiredExtension (void) const { return "EGL_ANDROID_image_native_buffer"; }
+ MovePtr<ClientBuffer> createBuffer (const Library& egl, const glw::Functions&, Texture2D*) const;
+ string getRequiredExtension (void) const { return "EGL_ANDROID_get_native_client_buffer"; }
EGLImageKHR createImage (const Library& egl, EGLDisplay dpy, EGLContext ctx, EGLClientBuffer clientBuffer) const;
GLenum getEffectiveFormat (void) const { return m_format; }
protected:
GLenum m_format;
-
- const LibUI& getLibUI (void) const;
-
-private:
- mutable LibUI* m_libui;
};
AndroidNativeImageSource::~AndroidNativeImageSource (void)
{
- delete m_libui;
}
-const LibUI& AndroidNativeImageSource::getLibUI (void) const
+MovePtr<ClientBuffer> AndroidNativeImageSource::createBuffer (const Library& egl, const glw::Functions&, Texture2D* ref) const
{
- if (!m_libui)
- m_libui = new LibUI();
+ MovePtr<AndroidNativeClientBuffer> buffer (new AndroidNativeClientBuffer(egl, m_format));
- return *m_libui;
-}
-
-void checkStatus (status_t status)
-{
- if (status != tcu::Android::internal::OK)
- TCU_FAIL(("Android error: status code " + de::toString(status)).c_str());
-}
-
-MovePtr<ClientBuffer> AndroidNativeImageSource::createBuffer (const glw::Functions&, Texture2D* ref) const
-{
- MovePtr<AndroidNativeClientBuffer> buffer (new AndroidNativeClientBuffer(getLibUI(), m_format));
- GraphicBuffer& graphicBuffer = buffer->getGraphicBuffer();
if (ref != DE_NULL)
{
const TextureFormat texFormat = glu::mapGLInternalFormat(m_format);
@@ -150,25 +279,27 @@
tcu::fillWithComponentGradients(ref->getLevel(0),
tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f),
tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
- checkStatus(graphicBuffer.lock(GraphicBuffer::USAGE_SW_WRITE_RARELY, &bufferData));
+ buffer->lock(&bufferData);
{
PixelBufferAccess nativeBuffer(texFormat, 64, 64, 1, bufferData);
tcu::copy(nativeBuffer, ref->getLevel(0));
}
- checkStatus(graphicBuffer.unlock());
+ buffer->unlock();
}
return MovePtr<ClientBuffer>(buffer);
}
EGLImageKHR AndroidNativeImageSource::createImage (const Library& egl, EGLDisplay dpy, EGLContext, EGLClientBuffer clientBuffer) const
{
- static const EGLint attribs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
+ static const EGLint attribs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
const EGLImageKHR image = egl.createImageKHR(dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attribs);
EGLU_CHECK_MSG(egl, "eglCreateImageKHR()");
return image;
}
+} // anonymous
+
MovePtr<ImageSource> createAndroidNativeImageSource (GLenum format)
{
try
diff --git a/modules/egl/teglImageFormatTests.cpp b/modules/egl/teglImageFormatTests.cpp
index 1dee13c..2ccba58 100644
--- a/modules/egl/teglImageFormatTests.cpp
+++ b/modules/egl/teglImageFormatTests.cpp
@@ -315,7 +315,7 @@
bool GLES2ImageApi::Create::invokeGLES2 (GLES2ImageApi& api, MovePtr<UniqueImage>& image, tcu::Texture2D& ref) const
{
- de::UniquePtr<ClientBuffer> buffer (m_imgSource->createBuffer(api.m_gl, &ref));
+ de::UniquePtr<ClientBuffer> buffer (m_imgSource->createBuffer(api.m_egl, api.m_gl, &ref));
GLU_CHECK_GLW_CALL(api.m_gl, finish());
@@ -706,22 +706,31 @@
tcu::Surface screen (reference.getWidth(), reference.getHeight());
tcu::Surface refSurface (reference.getWidth(), reference.getHeight());
- // Branch only taken in TryAll case
- if (reference.getFormat().order == tcu::TextureFormat::DS || reference.getFormat().order == tcu::TextureFormat::D)
- throw IllegalRendererException(); // Skip, GLES2 does not support ReadPixels for depth attachments
- if (reference.getFormat().order == tcu::TextureFormat::S)
- throw IllegalRendererException(); // Skip, GLES2 does not support ReadPixels for stencil attachments
+ switch (glu::getInternalFormat(reference.getFormat()))
+ {
+ case GL_RGBA4:
+ case GL_RGB5_A1:
+ case GL_RGB565:
+ break;
+ default:
+ // Skip, not in the list of allowed render buffer formats for GLES2.
+ throw tcu::NotSupportedError("Image format not allowed for glReadPixels.");
+ break;
+ }
log << tcu::TestLog::Message << "Reading with ReadPixels from renderbuffer" << tcu::TestLog::EndMessage;
GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, *framebuffer));
GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, *renderbuffer));
imageTargetRenderbuffer(api.m_egl, gl, **img);
+
+ GLU_EXPECT_NO_ERROR(gl.getError(), "imageTargetRenderbuffer");
framebufferRenderbuffer(gl, GL_COLOR_ATTACHMENT0, *renderbuffer);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "framebufferRenderbuffer");
GLU_CHECK_GLW_CALL(gl, viewport(0, 0, reference.getWidth(), reference.getHeight()));
- gl.readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, screen.getAccess().getDataPtr());
+ GLU_CHECK_GLW_CALL(gl, readPixels(0, 0, screen.getWidth(), screen.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, screen.getAccess().getDataPtr()));
GLU_CHECK_GLW_CALL(gl, bindFramebuffer(GL_FRAMEBUFFER, 0));
GLU_CHECK_GLW_CALL(gl, bindRenderbuffer(GL_RENDERBUFFER, 0));
@@ -1060,7 +1069,7 @@
void add (const string& label, MovePtr<Action> action);
int size (void) const { return m_numActions; }
private:
- LabeledAction m_actions[32];
+ LabeledAction m_actions[64];
int m_numActions;
};
@@ -1134,11 +1143,19 @@
void ImageTests::addCreateAndroidNativeActions (void)
{
- addCreateAndroidNative("android_native_rgb565", GL_RGB565);
- addCreateAndroidNative("android_native_rgb8", GL_RGB8);
addCreateAndroidNative("android_native_rgba4", GL_RGBA4);
addCreateAndroidNative("android_native_rgb5_a1", GL_RGB5_A1);
+ addCreateAndroidNative("android_native_rgb565", GL_RGB565);
+ addCreateAndroidNative("android_native_rgb8", GL_RGB8);
addCreateAndroidNative("android_native_rgba8", GL_RGBA8);
+ addCreateAndroidNative("android_native_d16", GL_DEPTH_COMPONENT16);
+ addCreateAndroidNative("android_native_d24", GL_DEPTH_COMPONENT24);
+ addCreateAndroidNative("android_native_d24s8", GL_DEPTH24_STENCIL8);
+ addCreateAndroidNative("android_native_d32f", GL_DEPTH_COMPONENT32F);
+ addCreateAndroidNative("android_native_d32fs8", GL_DEPTH32F_STENCIL8);
+ addCreateAndroidNative("android_native_rgb10a2", GL_RGB10_A2);
+ addCreateAndroidNative("android_native_rgba16f", GL_RGBA16F);
+ addCreateAndroidNative("android_native_s8", GL_STENCIL_INDEX8);
}
class RenderTests : public ImageTests
@@ -1177,9 +1194,16 @@
case GL_RGBA4:
case GL_RGBA8:
case GL_RGB5_A1:
+ case GL_RGB10_A2:
+ case GL_RGBA16F:
return false;
case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT24:
+ case GL_DEPTH_COMPONENT32:
+ case GL_DEPTH_COMPONENT32F:
+ case GL_DEPTH24_STENCIL8:
+ case GL_DEPTH32F_STENCIL8:
return true;
case GL_STENCIL_INDEX8:
@@ -1202,12 +1226,19 @@
case GL_RGBA4:
case GL_RGBA8:
case GL_RGB5_A1:
+ case GL_RGB10_A2:
+ case GL_RGBA16F:
return false;
case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT24:
+ case GL_DEPTH_COMPONENT32:
+ case GL_DEPTH_COMPONENT32F:
return false;
case GL_STENCIL_INDEX8:
+ case GL_DEPTH24_STENCIL8:
+ case GL_DEPTH32F_STENCIL8:
return true;
default:
@@ -1439,9 +1470,9 @@
void MultiContextRenderTests::addClearActions (void)
{
- m_clearActions.add("renderbuffer_clear_color", MovePtr<Action>(new GLES2ImageApi::ModifyRenderbufferClearColor(tcu::Vec4(0.8f, 0.2f, 0.9f, 1.0f))));
- m_clearActions.add("renderbuffer_clear_depth", MovePtr<Action>(new GLES2ImageApi::ModifyRenderbufferClearDepth(0.75f)));
- m_clearActions.add("renderbuffer_clear_stencil", MovePtr<Action>(new GLES2ImageApi::ModifyRenderbufferClearStencil(97)));
+ m_clearActions.add("clear_color", MovePtr<Action>(new GLES2ImageApi::ModifyRenderbufferClearColor(tcu::Vec4(0.8f, 0.2f, 0.9f, 1.0f))));
+ m_clearActions.add("clear_depth", MovePtr<Action>(new GLES2ImageApi::ModifyRenderbufferClearDepth(0.75f)));
+ m_clearActions.add("clear_stencil", MovePtr<Action>(new GLES2ImageApi::ModifyRenderbufferClearStencil(97)));
}
void MultiContextRenderTests::init (void)
@@ -1469,6 +1500,15 @@
continue;
spec.name = std::string("gles2_") + createAction.label + "_" + renderAction.label;
+
+ const GLenum createFormat = dynamic_cast<const GLES2ImageApi::Create*>(createAction.action.get())->getEffectiveFormat();
+ if (isDepthFormat(createFormat) && isStencilFormat(createFormat))
+ {
+ // Combined depth and stencil format. Add the clear action label to avoid test
+ // name clashes.
+ spec.name += std::string("_") + clearAction.label;
+ }
+
spec.desc = spec.name;
spec.contexts.push_back(TestSpec::API_GLES2);
diff --git a/modules/egl/teglImageTests.cpp b/modules/egl/teglImageTests.cpp
index 6e146a4..57bb6c7 100644
--- a/modules/egl/teglImageTests.cpp
+++ b/modules/egl/teglImageTests.cpp
@@ -352,7 +352,13 @@
case GL_LUMINANCE_ALPHA: return "luminance_alpha";
case GL_RGB: return "rgb";
case GL_RGBA: return "rgba";
+ case GL_RGBA16F: return "rgba16f";
case GL_DEPTH_COMPONENT16: return "depth_component_16";
+ case GL_DEPTH_COMPONENT24: return "depth_component_24";
+ case GL_DEPTH_COMPONENT32F: return "depth_component_32f";
+ case GL_DEPTH24_STENCIL8: return "depth24_stencil8";
+ case GL_DEPTH32F_STENCIL8: return "depth32f_stencil8";
+ case GL_RGB10_A2: return "rgb10_a2";
case GL_RGBA4: return "rgba4";
case GL_RGB5_A1: return "rgb5_a1";
case GL_RGB565: return "rgb565";
@@ -422,7 +428,7 @@
log << TestLog::Message << "Using EGL config " << eglu::getConfigID(egl, dpy, context.getConfig()) << TestLog::EndMessage;
- UniquePtr<ClientBuffer> clientBuffer (m_source->createBuffer(context.gl()));
+ UniquePtr<ClientBuffer> clientBuffer (m_source->createBuffer(egl, context.gl()));
const EGLImageKHR image = m_source->createImage(egl, dpy, eglContext, clientBuffer->get());
if (image == EGL_NO_IMAGE_KHR)
@@ -590,9 +596,17 @@
{
GL_RGB565,
GL_RGB8,
+ GL_RGBA8,
GL_RGBA4,
GL_RGB5_A1,
- GL_RGBA8,
+ GL_DEPTH_COMPONENT16,
+ GL_DEPTH_COMPONENT24,
+ GL_DEPTH24_STENCIL8,
+ GL_DEPTH_COMPONENT32F,
+ GL_DEPTH32F_STENCIL8,
+ GL_RGB10_A2,
+ GL_RGBA16F,
+ GL_STENCIL_INDEX8
};
for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(androidFormats); ++formatNdx)
diff --git a/modules/egl/teglImageUtil.cpp b/modules/egl/teglImageUtil.cpp
index 234c227..b423cb4 100644
--- a/modules/egl/teglImageUtil.cpp
+++ b/modules/egl/teglImageUtil.cpp
@@ -179,7 +179,7 @@
{
public:
TextureImageSource (GLenum internalFormat, GLenum format, GLenum type, bool useTexLevel0) : m_internalFormat(internalFormat), m_format(format), m_type(type), m_useTexLevel0(useTexLevel0) {}
- MovePtr<ClientBuffer> createBuffer (const glw::Functions& gl, Texture2D* reference) const;
+ MovePtr<ClientBuffer> createBuffer (const eglw::Library& egl, const glw::Functions& gl, Texture2D* reference) const;
GLenum getEffectiveFormat (void) const;
GLenum getInternalFormat (void) const { return m_internalFormat; }
@@ -229,8 +229,10 @@
return ret;
}
-MovePtr<ClientBuffer> TextureImageSource::createBuffer (const glw::Functions& gl, Texture2D* ref) const
+MovePtr<ClientBuffer> TextureImageSource::createBuffer (const eglw::Library& egl, const glw::Functions& gl, Texture2D* ref) const
{
+ DE_UNREF(egl);
+
MovePtr<TextureClientBuffer> clientBuffer (new TextureClientBuffer(gl));
const GLuint texture = clientBuffer->getName();
const GLenum target = getGLTarget();
@@ -332,7 +334,7 @@
RenderbufferImageSource (GLenum format) : m_format(format) {}
string getRequiredExtension (void) const { return "EGL_KHR_gl_renderbuffer_image"; }
- MovePtr<ClientBuffer> createBuffer (const glw::Functions& gl, Texture2D* reference) const;
+ MovePtr<ClientBuffer> createBuffer (const eglw::Library& egl, const glw::Functions& gl, Texture2D* reference) const;
GLenum getEffectiveFormat (void) const { return m_format; }
protected:
@@ -465,8 +467,10 @@
GL_RENDERBUFFER, 0));
}
-MovePtr<ClientBuffer> RenderbufferImageSource::createBuffer (const glw::Functions& gl, Texture2D* ref) const
+MovePtr<ClientBuffer> RenderbufferImageSource::createBuffer (const eglw::Library& egl, const glw::Functions& gl, Texture2D* ref) const
{
+ DE_UNREF(egl);
+
MovePtr<RenderbufferClientBuffer> buffer (new RenderbufferClientBuffer(gl));
const GLuint rbo = buffer->getName();
@@ -516,7 +520,7 @@
public:
UnsupportedImageSource (const string& message, GLenum format) : m_message(message), m_format(format) {}
string getRequiredExtension (void) const { fail(); return ""; }
- MovePtr<ClientBuffer> createBuffer (const glw::Functions&, tcu::Texture2D*) const { fail(); return de::MovePtr<ClientBuffer>(); }
+ MovePtr<ClientBuffer> createBuffer (const eglw::Library& egl, const glw::Functions&, tcu::Texture2D*) const { DE_UNREF(egl); fail(); return de::MovePtr<ClientBuffer>(); }
EGLImageKHR createImage (const Library& egl, EGLDisplay dpy, EGLContext ctx, EGLClientBuffer clientBuffer) const;
GLenum getEffectiveFormat (void) const { return m_format; }
diff --git a/modules/egl/teglImageUtil.hpp b/modules/egl/teglImageUtil.hpp
index beca1be..2d63df7 100644
--- a/modules/egl/teglImageUtil.hpp
+++ b/modules/egl/teglImageUtil.hpp
@@ -72,7 +72,7 @@
public:
virtual ~ImageSource (void) {}
virtual std::string getRequiredExtension(void) const = 0;
- virtual de::MovePtr<ClientBuffer> createBuffer (const glw::Functions& gl, tcu::Texture2D* reference = DE_NULL) const = 0;
+ virtual de::MovePtr<ClientBuffer> createBuffer (const eglw::Library& egl, const glw::Functions& gl, tcu::Texture2D* reference = DE_NULL) const = 0;
virtual eglw::EGLImageKHR createImage (const eglw::Library& egl, eglw::EGLDisplay dpy, eglw::EGLContext ctx, eglw::EGLClientBuffer clientBuffer) const = 0;
virtual glw::GLenum getEffectiveFormat (void) const = 0;
};
diff --git a/modules/gles2/functional/es2fFboRenderTest.cpp b/modules/gles2/functional/es2fFboRenderTest.cpp
index 0007801..64cbba3 100644
--- a/modules/gles2/functional/es2fFboRenderTest.cpp
+++ b/modules/gles2/functional/es2fFboRenderTest.cpp
@@ -625,7 +625,7 @@
}
// Compare images
- const float threshold = 0.03f;
+ const float threshold = 0.05f;
bool imagesOk = tcu::fuzzyCompare(log, "ComparisonResult", "Image comparison result", refFrame, gles2Frame, threshold, tcu::COMPARE_LOG_RESULT);
if (!imagesOk && !failReason)
diff --git a/modules/gles2/functional/es2fTextureWrapTests.cpp b/modules/gles2/functional/es2fTextureWrapTests.cpp
index f776a86..0a3bfa2 100644
--- a/modules/gles2/functional/es2fTextureWrapTests.cpp
+++ b/modules/gles2/functional/es2fTextureWrapTests.cpp
@@ -143,7 +143,16 @@
// Fill level 0.
m_texture->getRefTexture().allocLevel(0);
- tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), tcu::Vec4(-0.5f, -0.5f, -0.5f, 2.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f));
+ if (m_wrapS == GL_REPEAT ||
+ m_wrapT == GL_REPEAT)
+ {
+ // If run in repeat mode, use conical style texture to avoid edge sample result have a huge difference when coordinate offset in allow range.
+ tcu::fillWithComponentGradients3(m_texture->getRefTexture().getLevel(0), tcu::Vec4(-0.5f, -0.5f, -0.5f, 1.5f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f));
+ }
+ else
+ {
+ tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), tcu::Vec4(-0.5f, -0.5f, -0.5f, 1.5f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f));
+ }
m_texture->upload();
}
@@ -169,8 +178,18 @@
int leftWidth = viewport.width / 2;
int rightWidth = viewport.width - leftWidth;
vector<float> texCoord;
- tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold()
- + (isCompressedTex ? tcu::RGBA(7,7,7,7) : tcu::RGBA(3,3,3,3));
+
+ tcu::RGBA threshold;
+ if (m_texture->getRefTexture().getFormat().type == tcu::TextureFormat::UNORM_SHORT_4444 ||
+ m_texture->getRefTexture().getFormat().type == tcu::TextureFormat::UNSIGNED_SHORT_4444)
+ {
+ threshold = tcu::PixelFormat(4, 4, 4, 4).getColorThreshold() + tcu::RGBA(1, 1, 1, 1);
+ }
+ else
+ {
+ threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() +
+ (isCompressedTex ? tcu::RGBA(7, 7, 7, 7) : tcu::RGBA(3, 3, 3, 3));
+ }
// Bind to unit 0.
gl.activeTexture(GL_TEXTURE0);
diff --git a/modules/gles3/functional/es3fNegativeTextureApiTests.cpp b/modules/gles3/functional/es3fNegativeTextureApiTests.cpp
index cf8a437..2c73be8 100644
--- a/modules/gles3/functional/es3fNegativeTextureApiTests.cpp
+++ b/modules/gles3/functional/es3fNegativeTextureApiTests.cpp
@@ -2672,7 +2672,8 @@
// textures ... result in an INVALID_OPERATION error.
// Also, if LDR is supported, formats cannot be invalid enums
- if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") ||
+ if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_sliced_3d") ||
+ m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") ||
m_context.getContextInfo().isExtensionSupported("GL_OES_texture_compression_astc"))
{
m_log.writeMessage("Full ASTC supported. No negative API requirements.");
@@ -3128,7 +3129,8 @@
// no effect.
// In conclusion: Expect same errors as with TexImage?D
- if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") ||
+ if (m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_sliced_3d") ||
+ m_context.getContextInfo().isExtensionSupported("GL_KHR_texture_compression_astc_hdr") ||
m_context.getContextInfo().isExtensionSupported("GL_OES_texture_compression_astc"))
{
m_log.writeMessage("Full ASTC supported. No negative API requirements.");
diff --git a/modules/gles3/functional/es3fTextureWrapTests.cpp b/modules/gles3/functional/es3fTextureWrapTests.cpp
index a36e4ce..33e0334 100644
--- a/modules/gles3/functional/es3fTextureWrapTests.cpp
+++ b/modules/gles3/functional/es3fTextureWrapTests.cpp
@@ -267,7 +267,16 @@
// Fill level 0.
m_texture->getRefTexture().allocLevel(0);
- tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), tcu::Vec4(-0.5f, -0.5f, -0.5f, 2.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f));
+ if (m_wrapS == GL_REPEAT ||
+ m_wrapT == GL_REPEAT)
+ {
+ // If run in repeat mode, use conical style texture to avoid edge sample result have a huge difference when coordinate offset in allow range.
+ tcu::fillWithComponentGradients3(m_texture->getRefTexture().getLevel(0), tcu::Vec4(-0.5f, -0.5f, -0.5f, 1.5f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f));
+ }
+ else
+ {
+ tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), tcu::Vec4(-0.5f, -0.5f, -0.5f, 1.5f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f));
+ }
m_texture->upload();
}
@@ -339,7 +348,7 @@
lodPrecision.derivateBits = 18;
lodPrecision.lodBits = 5;
- lookupPrecision.colorThreshold = tcu::computeFixedPointThreshold(colorBits) / refParams.colorScale;
+ lookupPrecision.colorThreshold = tcu::computeColorBitsThreshold(getBitsVec(pixelFormat), colorBits) / refParams.colorScale;
lookupPrecision.coordBits = tcu::IVec3(20,20,0);
lookupPrecision.uvwBits = tcu::IVec3(5,5,0);
lookupPrecision.colorMask = getCompareMask(pixelFormat);
diff --git a/modules/gles3/functional/es3fUniformBlockTests.cpp b/modules/gles3/functional/es3fUniformBlockTests.cpp
index 2671945..520e8f4 100644
--- a/modules/gles3/functional/es3fUniformBlockTests.cpp
+++ b/modules/gles3/functional/es3fUniformBlockTests.cpp
@@ -189,6 +189,50 @@
int m_numInstances;
};
+class BlockSingleNestedStructMixedMatrixPackingCase : public UniformBlockCase
+{
+public:
+ BlockSingleNestedStructMixedMatrixPackingCase (Context& context, const char* name, const char* description, deUint32 blockLayoutFlags, deUint32 matrixLayoutFlags, deUint32 matrixArrayLayoutFlags, BufferMode bufferMode, int numInstances)
+ : UniformBlockCase (context.getTestContext(), context.getRenderContext(), name, description, glu::GLSL_VERSION_300_ES, bufferMode)
+ , m_blockLayoutFlags (blockLayoutFlags)
+ , m_matrixLayoutFlags (matrixLayoutFlags)
+ , m_matrixArrayLayoutFlags (matrixArrayLayoutFlags)
+ , m_numInstances (numInstances)
+ {
+ }
+
+ void init (void)
+ {
+ StructType& typeS = m_interface.allocStruct("S");
+ typeS.addMember("a", VarType(glu::TYPE_INT_VEC3, PRECISION_HIGH));
+ typeS.addMember("b", VarType(VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM), 4));
+ typeS.addMember("c", VarType(glu::TYPE_FLOAT_VEC4, PRECISION_HIGH), UNUSED_BOTH);
+
+ StructType& typeT = m_interface.allocStruct("T");
+ typeT.addMember("a", VarType(glu::TYPE_FLOAT_MAT3, PRECISION_MEDIUM));
+ typeT.addMember("b", VarType(&typeS));
+
+ UniformBlock& block = m_interface.allocBlock("Block");
+ block.addUniform(Uniform("s", VarType(&typeS, m_matrixArrayLayoutFlags), 0));
+ block.addUniform(Uniform("v", VarType(glu::TYPE_FLOAT_VEC2, PRECISION_LOW), UNUSED_BOTH));
+ block.addUniform(Uniform("t", VarType(&typeT, m_matrixLayoutFlags), 0));
+ block.addUniform(Uniform("u", VarType(glu::TYPE_UINT, PRECISION_HIGH), 0));
+ block.setFlags(m_blockLayoutFlags);
+
+ if (m_numInstances > 0)
+ {
+ block.setInstanceName("block");
+ block.setArraySize(m_numInstances);
+ }
+ }
+
+private:
+ deUint32 m_blockLayoutFlags;
+ deUint32 m_matrixLayoutFlags;
+ deUint32 m_matrixArrayLayoutFlags;
+ int m_numInstances;
+};
+
class BlockSingleNestedStructArrayCase : public UniformBlockCase
{
public:
@@ -570,6 +614,45 @@
}
}
+ // ubo.single_nested_struct_mixed_matrix_packing
+ {
+ tcu::TestCaseGroup* singleNestedStructMixedMatrixPackingGroup = new tcu::TestCaseGroup(m_testCtx, "single_nested_struct_mixed_matrix_packing", "Nested struct in one uniform block with a mixed matrix packing");
+ addChild(singleNestedStructMixedMatrixPackingGroup);
+
+ for (const auto& bufferMode : bufferModes)
+ {
+ tcu::TestCaseGroup* modeGroup = new tcu::TestCaseGroup(m_testCtx, bufferMode.name, "");
+ singleNestedStructMixedMatrixPackingGroup->addChild(modeGroup);
+
+ for (const auto& layoutFlag : layoutFlags)
+ for (const auto& blockMatrixFlag : matrixFlags)
+ for (const auto& singleMatrixFlag : matrixFlags)
+ for (const auto& arrayMatrixFlag : matrixFlags)
+ for (int isArray = 0; isArray < 2; isArray++)
+ {
+ std::string baseName = layoutFlag.name;
+ deUint32 baseFlags = layoutFlag.flags;
+ deUint32 blockFlags = baseFlags | blockMatrixFlag.flags;
+
+ baseName += std::string("_block_") + blockMatrixFlag.name;
+ baseName += std::string("_matrix_") + singleMatrixFlag.name;
+ baseName += std::string("_matrixarray_") + arrayMatrixFlag.name;
+
+ if (bufferMode.mode == UniformBlockCase::BUFFERMODE_SINGLE && isArray == 0)
+ continue; // Doesn't make sense to add this variant.
+
+ if (isArray)
+ baseName += "_instance_array";
+
+ modeGroup->addChild(new BlockSingleNestedStructMixedMatrixPackingCase(m_context, (baseName + "_vertex").c_str(), "", blockFlags | DECLARE_VERTEX, singleMatrixFlag.flags, arrayMatrixFlag.flags, bufferMode.mode, isArray ? 3 : 0));
+ modeGroup->addChild(new BlockSingleNestedStructMixedMatrixPackingCase(m_context, (baseName + "_fragment").c_str(), "", blockFlags | DECLARE_FRAGMENT, singleMatrixFlag.flags, arrayMatrixFlag.flags, bufferMode.mode, isArray ? 3 : 0));
+
+ if (!(baseFlags & LAYOUT_PACKED))
+ modeGroup->addChild(new BlockSingleNestedStructMixedMatrixPackingCase(m_context, (baseName + "_both").c_str(), "", blockFlags | DECLARE_VERTEX | DECLARE_FRAGMENT, singleMatrixFlag.flags, arrayMatrixFlag.flags, bufferMode.mode, isArray ? 3 : 0));
+ }
+ }
+ }
+
// ubo.single_nested_struct_array
{
tcu::TestCaseGroup* singleNestedStructArrayGroup = new tcu::TestCaseGroup(m_testCtx, "single_nested_struct_array", "Nested struct array in one uniform block");
diff --git a/modules/gles31/CMakeLists.txt b/modules/gles31/CMakeLists.txt
index 0d4cfc9..42b2859 100644
--- a/modules/gles31/CMakeLists.txt
+++ b/modules/gles31/CMakeLists.txt
@@ -22,6 +22,8 @@
tes31TestCase.hpp
tes31TestPackage.cpp
tes31TestPackage.hpp
+ tgl45TestPackage.cpp
+ tgl45TestPackage.hpp
)
set(DEQP_GLES31_LIBS
diff --git a/modules/gles31/functional/es31fAdvancedBlendTests.cpp b/modules/gles31/functional/es31fAdvancedBlendTests.cpp
index 1ce7dcb..a9540b6 100644
--- a/modules/gles31/functional/es31fAdvancedBlendTests.cpp
+++ b/modules/gles31/functional/es31fAdvancedBlendTests.cpp
@@ -312,6 +312,9 @@
gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
}
+
+ if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()) && useSRGB)
+ gl.enable(GL_FRAMEBUFFER_SRGB);
}
else
DE_ASSERT(m_rtType == RENDERTARGETTYPE_DEFAULT);
@@ -364,6 +367,9 @@
gl.deleteRenderbuffers(1, &m_resolveFbo);
m_resolveFbo = 0;
}
+
+ if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()) && RENDERTARGETTYPE_SRGB_FBO == m_rtType)
+ gl.disable(GL_FRAMEBUFFER_SRGB);
}
}
@@ -411,6 +417,7 @@
const deUint32 program = m_program->getProgram();
const int posLoc = gl.getAttribLocation(program, "a_position");
const int colorLoc = gl.getAttribLocation(program, "a_color");
+ deUint32 vao = 0;
const glu::Buffer indexBuffer (renderCtx);
const glu::Buffer positionBuffer (renderCtx);
const glu::Buffer colorBuffer (renderCtx);
@@ -434,6 +441,12 @@
indices[quadNdx*6 + ndx] = (deUint16)(quadNdx*4 + singleQuadIndices[ndx]);
}
+ if (!glu::isContextTypeES(renderCtx.getType()))
+ {
+ gl.genVertexArrays(1, &vao);
+ gl.bindVertexArray(vao);
+ }
+
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer);
gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(indices.size()*sizeof(indices[0])), &indices[0], GL_STATIC_DRAW);
@@ -482,6 +495,9 @@
}
}
+ if (vao)
+ gl.deleteVertexArrays(1, &vao);
+
gl.flush();
GLU_EXPECT_NO_ERROR(gl.getError(), "Render failed");
}
@@ -715,13 +731,15 @@
BlendEquationIndexedStateCase::IterateResult BlendEquationIndexedStateCase::iterate (void)
{
- if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ const auto& renderContext = m_context.getRenderContext();
+ if (!glu::contextSupports(renderContext.getType(), glu::ApiType::es(3, 2)) &&
+ !glu::contextSupports(renderContext.getType(), glu::ApiType::core(4, 5)))
{
TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced"), "GL_KHR_blend_equation_advanced is not supported");
TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"), "GL_EXT_draw_buffers_indexed is not supported");
}
- glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
+ glu::CallLogWrapper gl (renderContext.getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
gl.enableLogging(true);
@@ -770,6 +788,7 @@
GL_HSL_SATURATION,
GL_HSL_COLOR,
GL_HSL_LUMINOSITY,
+
};
tcu::TestCaseGroup* const stateQueryGroup = new tcu::TestCaseGroup(m_testCtx, "state_query", "State query tests");
diff --git a/modules/gles31/functional/es31fBasicComputeShaderTests.cpp b/modules/gles31/functional/es31fBasicComputeShaderTests.cpp
index efec5ab..aa3e54e 100644
--- a/modules/gles31/functional/es31fBasicComputeShaderTests.cpp
+++ b/modules/gles31/functional/es31fBasicComputeShaderTests.cpp
@@ -1240,19 +1240,23 @@
void init (void)
{
- if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic"))
- throw tcu::NotSupportedError("Test requires OES_shader_image_atomic extension");
+ auto contextType = m_context.getRenderContext().getType();
+ if (!glu::contextSupports(contextType, glu::ApiType::es(3, 2)) &&
+ !glu::contextSupports(contextType, glu::ApiType::core(4, 5)) &&
+ !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic"))
+ TCU_THROW(NotSupportedError, "Test requires OES_shader_image_atomic extension");
}
IterateResult iterate (void)
{
- const GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType());
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ glu::ContextType contextType = m_context.getRenderContext().getType();
+ const GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(contextType);
+ const bool supportsES32orGL45 = glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(contextType, glu::ApiType::core(4, 5));
std::ostringstream src;
src << getGLSLVersionDeclaration(glslVersion) << "\n"
- << (supportsES32 ? "\n" : "#extension GL_OES_shader_image_atomic : require\n")
+ << (supportsES32orGL45 ? "\n" : "#extension GL_OES_shader_image_atomic : require\n")
<< "layout (local_size_x = " << m_localSize << ") in;\n"
<< "layout(r32ui, binding = 1) uniform highp uimage2D u_dstImg;\n"
<< "buffer Input {\n"
diff --git a/modules/gles31/functional/es31fBooleanStateQueryTests.cpp b/modules/gles31/functional/es31fBooleanStateQueryTests.cpp
index 6395016..57bd0b4 100644
--- a/modules/gles31/functional/es31fBooleanStateQueryTests.cpp
+++ b/modules/gles31/functional/es31fBooleanStateQueryTests.cpp
@@ -70,7 +70,8 @@
IterateResult iterate (void)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "This test requires a higher context version.");
+ if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)))
+ TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "This test requires a higher context version.");
tcu::ResultCollector result(m_testCtx.getLog(), " // ERROR: ");
enableLogging(true);
diff --git a/modules/gles31/functional/es31fCopyImageTests.cpp b/modules/gles31/functional/es31fCopyImageTests.cpp
index c117fd2..502dd45 100644
--- a/modules/gles31/functional/es31fCopyImageTests.cpp
+++ b/modules/gles31/functional/es31fCopyImageTests.cpp
@@ -1898,11 +1898,12 @@
if (isAstcFormat(glu::mapGLCompressedTexFormat(format)))
{
DE_ASSERT(target != GL_RENDERBUFFER);
- if (!info.isExtensionSupported("GL_KHR_texture_compression_astc_hdr") &&
+ if (!info.isExtensionSupported("GL_KHR_texture_compression_astc_sliced_3d") &&
+ !info.isExtensionSupported("GL_KHR_texture_compression_astc_hdr") &&
!info.isExtensionSupported("GL_OES_texture_compression_astc"))
{
if (target == GL_TEXTURE_3D)
- TCU_THROW(NotSupportedError, "TEXTURE_3D target requires HDR astc support.");
+ TCU_THROW(NotSupportedError, "TEXTURE_3D target not supported.");
if (!isES32 && !info.isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
TCU_THROW(NotSupportedError, "Compressed astc texture not supported.");
}
diff --git a/modules/gles31/functional/es31fDefaultVertexArrayObjectTests.cpp b/modules/gles31/functional/es31fDefaultVertexArrayObjectTests.cpp
index 2bf9b1d..55cb0cd 100644
--- a/modules/gles31/functional/es31fDefaultVertexArrayObjectTests.cpp
+++ b/modules/gles31/functional/es31fDefaultVertexArrayObjectTests.cpp
@@ -41,6 +41,7 @@
{
public:
VertexAttributeDivisorCase (Context& context, const char* name, const char* description);
+ void init (void);
IterateResult iterate (void);
};
@@ -49,6 +50,14 @@
{
}
+void VertexAttributeDivisorCase::init (void)
+{
+ if (!glu::isContextTypeES(m_context.getRenderContext().getType()))
+ {
+ throw tcu::NotSupportedError("The Use VertexAttribDivisor with default VAO test is not supported in the GL context");
+ }
+}
+
VertexAttributeDivisorCase::IterateResult VertexAttributeDivisorCase::iterate (void)
{
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
diff --git a/modules/gles31/functional/es31fDrawBuffersIndexedTests.cpp b/modules/gles31/functional/es31fDrawBuffersIndexedTests.cpp
index d190461..0a1d4cc 100644
--- a/modules/gles31/functional/es31fDrawBuffersIndexedTests.cpp
+++ b/modules/gles31/functional/es31fDrawBuffersIndexedTests.cpp
@@ -182,6 +182,13 @@
Maybe<BVec4> colorMask;
};
+static bool checkES32orGL45Support(Context& ctx)
+{
+ auto ctxType = ctx.getRenderContext().getType();
+ return contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ contextSupports(ctxType, glu::ApiType::core(4, 5));
+}
+
void setCommonBlendState (const glw::Functions& gl, const BlendState& blend)
{
if (blend.enableBlend)
@@ -1194,9 +1201,9 @@
void DrawBuffersIndexedTest::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = checkES32orGL45Support(m_context);
- if (!supportsES32)
+ if (!supportsES32orGL45)
{
if (requiresAdvancedBlendEq(m_preCommonBlendState, m_postCommonBlendState, m_drawBuffers) && !m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced"))
TCU_THROW(NotSupportedError, "Extension GL_KHR_blend_equation_advanced not supported");
@@ -1303,7 +1310,7 @@
TextureFormat getRandomFormat (de::Random& rng, Context& context)
{
- const bool supportsES32 = glu::contextSupports(context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = checkES32orGL45Support(context);
const deUint32 glFormats[] =
{
@@ -1341,7 +1348,7 @@
GL_R11F_G11F_B10F
};
- if (supportsES32)
+ if (supportsES32orGL45)
return glu::mapGLInternalFormat(de::getArrayElement(glFormats, rng.getUint32() % DE_LENGTH_OF_ARRAY(glFormats)));
else
{
@@ -1413,9 +1420,9 @@
void MaxDrawBuffersIndexedTest::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = checkES32orGL45Support(m_context);
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
+ if (!supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
TCU_THROW(NotSupportedError, "Extension GL_EXT_draw_buffers_indexed not supported");
}
@@ -1457,9 +1464,9 @@
void ImplMaxDrawBuffersIndexedTest::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = checkES32orGL45Support(m_context);
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
+ if (!supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
TCU_THROW(NotSupportedError, "Extension GL_EXT_draw_buffers_indexed not supported");
}
diff --git a/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp b/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp
index 7b68587..97e648c 100644
--- a/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp
+++ b/modules/gles31/functional/es31fDrawElementsBaseVertexTests.cpp
@@ -125,9 +125,9 @@
DE_ASSERT(false);
}
-static void genBasicSpec (gls::DrawTestSpec& spec, gls::DrawTestSpec::DrawMethod method)
+static void genBasicSpec (gls::DrawTestSpec& spec, glu::ContextType& contextType, gls::DrawTestSpec::DrawMethod method)
{
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3,1) : contextType.getAPI();
spec.primitive = gls::DrawTestSpec::PRIMITIVE_TRIANGLES;
spec.primitiveCount = 5;
spec.drawMethod = method;
@@ -183,6 +183,7 @@
private:
const glw::Functions& m_gl;
glu::ShaderProgram* m_program;
+ GLuint m_vao;
GLuint m_coordinatesBuffer;
GLuint m_elementsBuffer;
int m_iterNdx;
@@ -204,6 +205,7 @@
: TestCase (context, "vertex_id", "gl_VertexID Test")
, m_gl (m_context.getRenderContext().getFunctions())
, m_program (DE_NULL)
+ , m_vao (0)
, m_coordinatesBuffer (0)
, m_elementsBuffer (0)
, m_iterNdx (0)
@@ -218,12 +220,13 @@
void VertexIDCase::init (void)
{
+ auto ctxType = m_context.getRenderContext().getType();
if (m_method == deqp::gls::DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_BASEVERTEX ||
m_method == gls::DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX ||
m_method == gls::DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX)
{
- const bool supportsES32 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_elements_base_vertex"), "GL_EXT_draw_elements_base_vertex is not supported.");
+ const bool supportsES32orGL45 = contextSupports(ctxType, glu::ApiType::es(3, 2)) || contextSupports(ctxType, glu::ApiType::core(4, 5));
+ TCU_CHECK_AND_THROW(NotSupportedError, supportsES32orGL45 || m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_elements_base_vertex"), "GL_EXT_draw_elements_base_vertex is not supported.");
}
m_testCtx.getLog() << TestLog::Message
@@ -263,6 +266,9 @@
GLU_CHECK_GLW_CALL(m_gl, genBuffers(1, &m_coordinatesBuffer));
GLU_CHECK_GLW_CALL(m_gl, genBuffers(1, &m_elementsBuffer));
+
+ if (!glu::isContextTypeES(ctxType))
+ GLU_CHECK_GLW_CALL(m_gl, genVertexArrays(1, &m_vao));
}
void VertexIDCase::deinit (void)
@@ -281,6 +287,12 @@
GLU_CHECK_GLW_CALL(m_gl, deleteBuffers(1, &m_coordinatesBuffer));
m_coordinatesBuffer = 0;
}
+
+ if (m_vao)
+ {
+ GLU_CHECK_GLW_CALL(m_gl, deleteVertexArrays(1, &m_vao));
+ m_vao = 0;
+ }
}
void VertexIDCase::draw (GLenum mode, GLsizei count, GLenum type, GLvoid* indices, GLint baseVertex)
@@ -406,6 +418,9 @@
GLU_CHECK_GLW_CALL(m_gl, bindBuffer(GL_ARRAY_BUFFER, m_coordinatesBuffer));
GLU_CHECK_GLW_CALL(m_gl, bufferData(GL_ARRAY_BUFFER, (GLsizeiptr)sizeof(coords), coords, GL_STATIC_DRAW));
+
+ if (m_vao)
+ GLU_CHECK_GLW_CALL(m_gl, bindVertexArray(m_vao));
GLU_CHECK_GLW_CALL(m_gl, enableVertexAttribArray(coordLocation));
GLU_CHECK_GLW_CALL(m_gl, vertexAttribPointer(coordLocation, 2, GL_FLOAT, GL_FALSE, 0, DE_NULL));
@@ -496,7 +511,8 @@
};
gls::DrawTestSpec spec;
- genBasicSpec(spec, m_method);
+ glu::ContextType contextType = m_context.getRenderContext().getType();
+ genBasicSpec(spec, contextType, m_method);
spec.indexStorage = gls::DrawTestSpec::STORAGE_BUFFER;
@@ -563,7 +579,8 @@
};
gls::DrawTestSpec spec;
- genBasicSpec(spec, m_method);
+ glu::ContextType contextType = m_context.getRenderContext().getType();
+ genBasicSpec(spec, contextType, m_method);
spec.indexStorage = gls::DrawTestSpec::STORAGE_BUFFER;
@@ -628,8 +645,9 @@
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "single_attribute", "Single attribute array.");
gls::DrawTestSpec spec;
+ glu::ContextType contextType = m_context.getRenderContext().getType();
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3,1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
@@ -664,8 +682,9 @@
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "multiple_attributes", "Multiple attribute arrays.");
gls::DrawTestSpec spec;
+ glu::ContextType contextType = m_context.getRenderContext().getType();
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3,1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
@@ -711,8 +730,9 @@
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "instanced_attributes", "Instanced attribute array.");
gls::DrawTestSpec spec;
+ glu::ContextType contextType = m_context.getRenderContext().getType();
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3,1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
@@ -772,8 +792,9 @@
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "default_attribute", "Attribute specified with glVertexAttrib*.");
gls::DrawTestSpec spec;
+ glu::ContextType contextType = m_context.getRenderContext().getType();
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3,1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
diff --git a/modules/gles31/functional/es31fDrawTests.cpp b/modules/gles31/functional/es31fDrawTests.cpp
index 4ca39c7..a3bd67f 100644
--- a/modules/gles31/functional/es31fDrawTests.cpp
+++ b/modules/gles31/functional/es31fDrawTests.cpp
@@ -178,9 +178,9 @@
DE_ASSERT(false);
}
-static void genBasicSpec (gls::DrawTestSpec& spec, gls::DrawTestSpec::DrawMethod method)
+static void genBasicSpec (gls::DrawTestSpec& spec, glu::ContextType contextType, gls::DrawTestSpec::DrawMethod method)
{
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3, 1) : contextType.getAPI();
spec.primitive = gls::DrawTestSpec::PRIMITIVE_TRIANGLES;
spec.primitiveCount = 5;
spec.drawMethod = method;
@@ -260,9 +260,10 @@
// Single attribute
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "single_attribute", "Single attribute array.");
+ glu::ContextType contextType = m_context.getRenderContext().getType();
gls::DrawTestSpec spec;
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3, 1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
@@ -296,9 +297,10 @@
// Multiple attribute
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "multiple_attributes", "Multiple attribute arrays.");
+ glu::ContextType contextType = m_context.getRenderContext().getType();
gls::DrawTestSpec spec;
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3, 1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
@@ -343,9 +345,10 @@
// Multiple attribute, second one divided
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "instanced_attributes", "Instanced attribute array.");
+ glu::ContextType contextType = m_context.getRenderContext().getType();
gls::DrawTestSpec spec;
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3, 1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
@@ -404,9 +407,10 @@
// Multiple attribute, second one default
{
gls::DrawTest* test = new gls::DrawTest(m_testCtx, m_context.getRenderContext(), "default_attribute", "Attribute specified with glVertexAttrib*.");
+ glu::ContextType contextType = m_context.getRenderContext().getType();
gls::DrawTestSpec spec;
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3, 1) : contextType.getAPI();
spec.primitive = m_primitive;
spec.primitiveCount = 5;
spec.drawMethod = m_method;
@@ -505,7 +509,7 @@
};
gls::DrawTestSpec spec;
- genBasicSpec(spec, m_method);
+ genBasicSpec(spec, m_context.getRenderContext().getType(), m_method);
spec.indexStorage = gls::DrawTestSpec::STORAGE_BUFFER;
@@ -572,7 +576,7 @@
};
gls::DrawTestSpec spec;
- genBasicSpec(spec, m_method);
+ genBasicSpec(spec, m_context.getRenderContext().getType(), m_method);
spec.indexStorage = gls::DrawTestSpec::STORAGE_BUFFER;
@@ -627,7 +631,7 @@
};
gls::DrawTestSpec spec;
- genBasicSpec(spec, m_method);
+ genBasicSpec(spec, m_context.getRenderContext().getType(), m_method);
for (int firstNdx = 0; firstNdx < DE_LENGTH_OF_ARRAY(firsts); ++firstNdx)
{
@@ -2139,6 +2143,8 @@
std::set<deUint32> insertedHashes;
size_t insertedCount = 0;
+ glu::ContextType contextType = m_context.getRenderContext().getType();
+ glu::ApiType apiType = glu::isContextTypeES(contextType) ? glu::ApiType::es(3,1) : contextType.getAPI();
for (int ndx = 0; ndx < numAttempts; ++ndx)
{
@@ -2148,7 +2154,7 @@
int drawCommandSize;
gls::DrawTestSpec spec;
- spec.apiType = glu::ApiType::es(3,1);
+ spec.apiType = apiType;
spec.primitive = random.chooseWeighted<gls::DrawTestSpec::Primitive> (DE_ARRAY_BEGIN(primitives), DE_ARRAY_END(primitives), primitiveWeights.weights);
spec.primitiveCount = random.chooseWeighted<int, const int*, const float*> (DE_ARRAY_BEGIN(primitiveCounts), DE_ARRAY_END(primitiveCounts), primitiveCountWeights);
spec.drawMethod = random.chooseWeighted<gls::DrawTestSpec::DrawMethod> (DE_ARRAY_BEGIN(drawMethods), DE_ARRAY_END(drawMethods), drawMethodWeights.weights);
@@ -2449,6 +2455,14 @@
void BadStateCase::init (void)
{
+ if (!glu::isContextTypeES(m_context.getRenderContext().getType()))
+ {
+ if (m_caseType == CASE_CLIENT_BUFFER_VERTEXATTR)
+ throw tcu::NotSupportedError("The negative test for vertex attrib array in the client memory is not supported in the GL context");
+ if (m_caseType == CASE_DEFAULT_VAO)
+ throw tcu::NotSupportedError("The negative test for use with default vao is not supported in the GL context");
+ }
+
}
void BadStateCase::deinit (void)
diff --git a/modules/gles31/functional/es31fFboColorbufferTests.cpp b/modules/gles31/functional/es31fFboColorbufferTests.cpp
index 2aa857d..5da82a9 100644
--- a/modules/gles31/functional/es31fFboColorbufferTests.cpp
+++ b/modules/gles31/functional/es31fFboColorbufferTests.cpp
@@ -209,7 +209,10 @@
protected:
void preCheck (void)
{
- if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
+ auto ctxType = m_context.getRenderContext().getType();
+ if (!glu::contextSupports(ctxType, glu::ApiType::core(4, 5)) &&
+ !glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) &&
+ !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
TCU_THROW(NotSupportedError, "Test requires extension GL_EXT_texture_cube_map_array or a context version equal or higher than 3.2");
checkFormatSupport(m_format);
diff --git a/modules/gles31/functional/es31fFboSRGBWriteControlTests.cpp b/modules/gles31/functional/es31fFboSRGBWriteControlTests.cpp
index 2a84ca6..d94fb83 100644
--- a/modules/gles31/functional/es31fFboSRGBWriteControlTests.cpp
+++ b/modules/gles31/functional/es31fFboSRGBWriteControlTests.cpp
@@ -1353,15 +1353,18 @@
void FboSRGBTestCase::init (void)
{
- // extensions requirements for test
- if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
- TCU_THROW(NotSupportedError, "Test requires a context version equal or higher than 3.2");
+ if (glu::isContextTypeES(m_context.getRenderContext().getType()))
+ {
+ // extensions requirements for test
+ if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ TCU_THROW(NotSupportedError, "Test requires a context version equal or higher than 3.2");
- if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_sRGB_write_control"))
- TCU_THROW(NotSupportedError, "Test requires extension GL_EXT_sRGB_write_control");
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_sRGB_write_control"))
+ TCU_THROW(NotSupportedError, "Test requires extension GL_EXT_sRGB_write_control");
- if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_sRGB_decode"))
- TCU_THROW(NotSupportedError, "Test requires GL_EXT_texture_sRGB_decode extension");
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_sRGB_decode"))
+ TCU_THROW(NotSupportedError, "Test requires GL_EXT_texture_sRGB_decode extension");
+ }
}
void FboSRGBTestCase::deinit (void)
@@ -1770,6 +1773,9 @@
void FboSRGBUnsupportedEnumCase::init (void)
{
+ if(!glu::isContextTypeES(m_context.getRenderContext().getType()))
+ TCU_THROW(NotSupportedError, "The test is not supported in a non-GLES context");
+
// extension requirements for test
if (m_context.getContextInfo().isExtensionSupported("GL_EXT_sRGB_write_control"))
TCU_THROW(NotSupportedError, "Test requires extension GL_EXT_sRGB_write_control to be unsupported");
diff --git a/modules/gles31/functional/es31fFboTestCase.cpp b/modules/gles31/functional/es31fFboTestCase.cpp
index eef9b96..000bea5 100644
--- a/modules/gles31/functional/es31fFboTestCase.cpp
+++ b/modules/gles31/functional/es31fFboTestCase.cpp
@@ -155,6 +155,7 @@
static bool isRequiredFormat (deUint32 format, glu::RenderContext& renderContext)
{
const bool supportsES32 = glu::contextSupports(renderContext.getType(), glu::ApiType::es(3, 2));
+ const bool supportsGL45 = glu::contextSupports(renderContext.getType(), glu::ApiType::core(4, 5));
switch (format)
{
// Color-renderable formats
@@ -211,7 +212,9 @@
case GL_RGBA16F:
case GL_RG16F:
case GL_R16F:
- return supportsES32;
+ return supportsES32 || supportsGL45;
+ case GL_RGB16F:
+ return supportsGL45;
default:
return false;
diff --git a/modules/gles31/functional/es31fFboTestUtil.cpp b/modules/gles31/functional/es31fFboTestUtil.cpp
index c6173ce..14cff7f 100644
--- a/modules/gles31/functional/es31fFboTestUtil.cpp
+++ b/modules/gles31/functional/es31fFboTestUtil.cpp
@@ -309,7 +309,7 @@
, m_layer (0)
, m_outputType (outputType)
{
- TCU_CHECK_INTERNAL(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion == glu::GLSL_VERSION_320_ES);
+ TCU_CHECK_INTERNAL(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion == glu::GLSL_VERSION_320_ES || glslVersion == glu::GLSL_VERSION_450);
}
void TextureCubeArrayShader::setLayer (int layer)
diff --git a/modules/gles31/functional/es31fFunctionalTests.cpp b/modules/gles31/functional/es31fFunctionalTests.cpp
index d2d6aa4..50f894d 100644
--- a/modules/gles31/functional/es31fFunctionalTests.cpp
+++ b/modules/gles31/functional/es31fFunctionalTests.cpp
@@ -397,16 +397,16 @@
}
};
-FunctionalTests::FunctionalTests (Context& context)
+GLES31FunctionalTests::GLES31FunctionalTests (Context& context)
: TestCaseGroup(context, "functional", "Functionality Tests")
{
}
-FunctionalTests::~FunctionalTests (void)
+GLES31FunctionalTests::~GLES31FunctionalTests (void)
{
}
-void FunctionalTests::init (void)
+void GLES31FunctionalTests::init (void)
{
addChild(new ShaderTests (m_context));
addChild(new ComputeTests (m_context));
@@ -426,12 +426,12 @@
addChild(new VertexAttributeBindingTests (m_context));
addChild(new ProgramUniformTests (m_context));
addChild(new AdvancedBlendTests (m_context));
- addChild(createSeparateShaderTests (m_context));
+ addChild(createGLESSeparateShaderTests (m_context));
addChild(new UniformLocationTests (m_context));
addChild(new TessellationGeometryInteractionTests (m_context));
addChild(new DebugTests (m_context));
addChild(new FboTests (m_context));
- addChild(new ProgramInterfaceQueryTests (m_context));
+ addChild(new ProgramInterfaceQueryTests (m_context, false));
addChild(new LayoutBindingTests (m_context));
addChild(new PrimitiveBoundingBoxTests (m_context));
addChild(new AndroidExtensionPackES31ATests (m_context));
@@ -442,6 +442,49 @@
addChild(new DrawElementsBaseVertexTests (m_context));
}
+GL45FunctionalTests::GL45FunctionalTests (Context& context)
+ : TestCaseGroup(context, "functional", "Functionality Tests")
+{
+}
+
+GL45FunctionalTests::~GL45FunctionalTests (void)
+{
+}
+
+void GL45FunctionalTests::init (void)
+{
+ addChild(new ShaderTests (m_context));
+ addChild(new ComputeTests (m_context));
+ addChild(new DrawTests (m_context));
+ addChild(new TessellationTests (m_context));
+ addChild(new SSBOTests (m_context));
+ addChild(new UniformBlockTests (m_context));
+ addChild(new ShaderImageLoadStoreTests (m_context));
+ addChild(new AtomicCounterTests (m_context));
+ addChild(new StencilTexturingTests (m_context));
+ addChild(new TextureTests (m_context));
+ addChild(new StateQueryTests (m_context));
+ addChild(new MultisampleTests (m_context));
+ addChild(new SynchronizationTests (m_context));
+ addChild(new GeometryShaderTests (m_context));
+ addChild(new SampleShadingTests (m_context));
+ addChild(new VertexAttributeBindingTests (m_context));
+ addChild(new ProgramUniformTests (m_context));
+ addChild(new AdvancedBlendTests (m_context));
+ addChild(createCommonSeparateShaderTests (m_context));
+ addChild(new UniformLocationTests (m_context));
+ addChild(new TessellationGeometryInteractionTests (m_context));
+ addChild(new DebugTests (m_context));
+ addChild(new FboTests (m_context));
+ addChild(new ProgramInterfaceQueryTests (m_context, true));
+ addChild(new LayoutBindingTests (m_context));
+ addChild(new PrimitiveBoundingBoxTests (m_context));
+ addChild(createCopyImageTests (m_context));
+ addChild(createDrawBuffersIndexedTests (m_context));
+ addChild(new SRGBTextureDecodeTests (m_context));
+ addChild(new DrawElementsBaseVertexTests (m_context));
+}
+
} // Functional
} // gles31
} // deqp
diff --git a/modules/gles31/functional/es31fFunctionalTests.hpp b/modules/gles31/functional/es31fFunctionalTests.hpp
index aa6562b..49860e4 100644
--- a/modules/gles31/functional/es31fFunctionalTests.hpp
+++ b/modules/gles31/functional/es31fFunctionalTests.hpp
@@ -33,17 +33,30 @@
namespace Functional
{
-class FunctionalTests : public TestCaseGroup
+class GLES31FunctionalTests : public TestCaseGroup
{
public:
- FunctionalTests (Context& context);
- ~FunctionalTests (void);
+ GLES31FunctionalTests (Context& context);
+ ~GLES31FunctionalTests (void);
- void init (void);
+ void init (void);
private:
- FunctionalTests (const FunctionalTests& other);
- FunctionalTests& operator= (const FunctionalTests& other);
+ GLES31FunctionalTests (const GLES31FunctionalTests& other);
+ GLES31FunctionalTests& operator= (const GLES31FunctionalTests& other);
+};
+
+class GL45FunctionalTests : public TestCaseGroup
+{
+public:
+ GL45FunctionalTests (Context& context);
+ ~GL45FunctionalTests (void);
+
+ void init (void);
+
+private:
+ GL45FunctionalTests (const GL45FunctionalTests& other);
+ GL45FunctionalTests& operator= (const GL45FunctionalTests& other);
};
} // Functional
diff --git a/modules/gles31/functional/es31fIndexedStateQueryTests.cpp b/modules/gles31/functional/es31fIndexedStateQueryTests.cpp
index e3c8b41..595b6f8 100644
--- a/modules/gles31/functional/es31fIndexedStateQueryTests.cpp
+++ b/modules/gles31/functional/es31fIndexedStateQueryTests.cpp
@@ -65,6 +65,9 @@
void isExtensionSupported (Context& context, std::string extensionName)
{
+ if (contextSupports(context.getRenderContext().getType(), glu::ApiType::core(4, 5)))
+ return;
+
if (extensionName == "GL_EXT_draw_buffers_indexed" || extensionName == "GL_KHR_blend_equation_advanced")
{
if (!contextSupports(context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !context.getContextInfo().isExtensionSupported(extensionName.c_str()))
diff --git a/modules/gles31/functional/es31fIntegerStateQueryTests.cpp b/modules/gles31/functional/es31fIntegerStateQueryTests.cpp
index 461ef4d..662142f 100644
--- a/modules/gles31/functional/es31fIntegerStateQueryTests.cpp
+++ b/modules/gles31/functional/es31fIntegerStateQueryTests.cpp
@@ -119,7 +119,9 @@
void TexBindingCase::init (void)
{
- if (contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ auto ctxType = m_context.getRenderContext().getType();
+ if (contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ contextSupports(ctxType, glu::ApiType::core(4, 5)))
return;
if (m_texTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
@@ -204,7 +206,8 @@
MinimumValueCase::IterateResult MinimumValueCase::iterate (void)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context version.");
+ if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)))
+ TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context version.");
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -258,7 +261,8 @@
AlignmentCase::IterateResult AlignmentCase::iterate (void)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context.");
+ if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)))
+ TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context.");
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -508,7 +512,8 @@
CombinedUniformComponentsCase::IterateResult CombinedUniformComponentsCase::iterate (void)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context.");
+ if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)))
+ TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context.");
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
diff --git a/modules/gles31/functional/es31fInternalFormatQueryTests.cpp b/modules/gles31/functional/es31fInternalFormatQueryTests.cpp
index af2dfce..7c2597a 100644
--- a/modules/gles31/functional/es31fInternalFormatQueryTests.cpp
+++ b/modules/gles31/functional/es31fInternalFormatQueryTests.cpp
@@ -71,15 +71,17 @@
void FormatSamplesCase::init (void)
{
- const bool isTextureTarget = (m_target == GL_TEXTURE_2D_MULTISAMPLE) ||
+ const bool isTextureTarget = (m_target == GL_TEXTURE_2D_MULTISAMPLE) ||
(m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
- const bool supportsES32 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
- if (!supportsES32 && m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (!isES32orGL45 && m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
TCU_THROW(NotSupportedError, "Test requires OES_texture_storage_multisample_2d_array extension or a context version equal or higher than 3.2");
// stencil8 textures are not supported without GL_OES_texture_stencil8 extension
- if (!supportsES32 && isTextureTarget && m_internalFormat == GL_STENCIL_INDEX8 && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_stencil8"))
+ if (!isES32orGL45 && isTextureTarget && m_internalFormat == GL_STENCIL_INDEX8 && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_stencil8"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_texture_stencil8 extension or a context version equal or higher than 3.2");
}
@@ -90,9 +92,11 @@
bool error = false;
glw::GLint maxSamples = 0;
glw::GLint numSampleCounts = 0;
- const bool supportsES32 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
- if (!supportsES32)
+ if (!isES32orGL45)
{
if (m_internalFormat == GL_RGBA16F || m_internalFormat == GL_R32F || m_internalFormat == GL_RG32F || m_internalFormat == GL_RGBA32F || m_internalFormat == GL_R16F || m_internalFormat == GL_RG16F || m_internalFormat == GL_R11F_G11F_B10F)
{
diff --git a/modules/gles31/functional/es31fLayoutBindingTests.cpp b/modules/gles31/functional/es31fLayoutBindingTests.cpp
index bcb8fd9..e892c1a 100644
--- a/modules/gles31/functional/es31fLayoutBindingTests.cpp
+++ b/modules/gles31/functional/es31fLayoutBindingTests.cpp
@@ -337,6 +337,7 @@
const glw::GLenum m_maxFragmentUnitsEnum;
const glw::GLenum m_maxCombinedUnitsEnum;
+ glw::GLuint m_vao;
glw::GLuint m_vertexBuffer;
glw::GLuint m_indexBuffer;
glw::GLint m_shaderProgramLoc;
@@ -369,6 +370,7 @@
, m_maxVertexUnitsEnum (maxVertexUnitsEnum)
, m_maxFragmentUnitsEnum (maxFragmentUnitsEnum)
, m_maxCombinedUnitsEnum (maxCombinedUnitsEnum)
+ , m_vao (0)
, m_vertexBuffer (0)
, m_indexBuffer (0)
, m_shaderProgramLoc (0)
@@ -502,6 +504,13 @@
TCU_CHECK((m_shaderProgramPosLoc >= 0) && (m_shaderProgramArrayNdxLoc >= 0));
+ // Generate and bind vao
+ if (!glu::isContextTypeES(m_context.getRenderContext().getType()))
+ {
+ gl.genVertexArrays(1, &m_vao);
+ gl.bindVertexArray(m_vao);
+ }
+
// Generate and bind index buffer
gl.genBuffers(1, &m_indexBuffer);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
@@ -529,6 +538,9 @@
if (m_shaderProgramPosLoc)
m_context.getRenderContext().getFunctions().disableVertexAttribArray(m_shaderProgramPosLoc);
+ if (m_vao)
+ m_context.getRenderContext().getFunctions().deleteVertexArrays(1, &m_vao);
+
if (m_vertexBuffer)
{
m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_vertexBuffer);
@@ -771,7 +783,8 @@
glw::GLint maxUnits = 0; // Maximum available uniforms for this test
m_tessSupport = m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader")
- || contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ || contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2))
+ || contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
if (!m_tessSupport && (m_shaderType == SHADERTYPE_TESS_EVALUATION || m_shaderType == SHADERTYPE_TESS_CONTROL))
TCU_THROW(NotSupportedError, "Tesselation shaders not supported");
diff --git a/modules/gles31/functional/es31fMultisampleShaderRenderCase.cpp b/modules/gles31/functional/es31fMultisampleShaderRenderCase.cpp
index e8a31cd..97a0d04 100644
--- a/modules/gles31/functional/es31fMultisampleShaderRenderCase.cpp
+++ b/modules/gles31/functional/es31fMultisampleShaderRenderCase.cpp
@@ -26,6 +26,7 @@
#include "tcuSurface.hpp"
#include "tcuTestLog.hpp"
#include "tcuStringTemplate.hpp"
+#include "gluContextInfo.hpp"
#include "gluShaderProgram.hpp"
#include "gluRenderContext.hpp"
#include "gluPixelTransfer.hpp"
@@ -116,9 +117,7 @@
case TARGET_TEXTURE:
{
- deInt32 maxTextureSamples = 0;
- gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8, GL_SAMPLES, 1, &maxTextureSamples);
-
+ deInt32 maxTextureSamples = getMaxConformantSampleCount(GL_TEXTURE_2D_MULTISAMPLE, GL_RGBA8);
if (m_numRequestedSamples > maxTextureSamples)
throw tcu::NotSupportedError("Sample count not supported");
break;
@@ -126,9 +125,7 @@
case TARGET_RENDERBUFFER:
{
- deInt32 maxRboSamples = 0;
- gl.getInternalformativ(GL_RENDERBUFFER, GL_RGBA8, GL_SAMPLES, 1, &maxRboSamples);
-
+ deInt32 maxRboSamples = getMaxConformantSampleCount(GL_RENDERBUFFER, GL_RGBA8);
if (m_numRequestedSamples > maxRboSamples)
throw tcu::NotSupportedError("Sample count not supported");
break;
@@ -783,6 +780,46 @@
gl.bufferData(GL_ARRAY_BUFFER, (int)sizeof(fullscreenQuad), fullscreenQuad, GL_STATIC_DRAW);
}
+glw::GLint MultisampleRenderCase::getMaxConformantSampleCount(glw::GLenum target, glw::GLenum internalFormat)
+{
+ deInt32 maxTextureSamples = 0;
+ const glw::Functions& gl = m_context.getRenderContext().getFunctions();
+
+ if (m_context.getContextInfo().isExtensionSupported("GL_NV_internalformat_sample_query"))
+ {
+ glw::GLint gl_sample_counts = 0;
+ gl.getInternalformativ(target, internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &gl_sample_counts);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformativ() failed for GL_NUM_SAMPLE_COUNTS pname");
+
+ /* Check and return the first conformant sample count */
+ glw::GLint* gl_supported_samples = new glw::GLint[gl_sample_counts];
+ if (gl_supported_samples)
+ {
+ gl.getInternalformativ(target, internalFormat, GL_SAMPLES, gl_sample_counts, gl_supported_samples);
+
+ for (glw::GLint i = 0; i < gl_sample_counts; i++)
+ {
+ glw::GLint isConformant = 0;
+ gl.getInternalformatSampleivNV(target, internalFormat, gl_supported_samples[i], GL_CONFORMANT_NV, 1,
+ &isConformant);
+ GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformatSampleivNV() call(s) failed");
+
+ if (isConformant && gl_supported_samples[i] > maxTextureSamples)
+ {
+ maxTextureSamples = gl_supported_samples[i];
+ }
+ }
+ delete[] gl_supported_samples;
+ }
+ }
+ else
+ {
+ gl.getInternalformativ(target, internalFormat, GL_SAMPLES, 1, &maxTextureSamples);
+ }
+
+ return maxTextureSamples;
+}
+
} // MultisampleShaderRenderUtil
} // Functional
} // gles31
diff --git a/modules/gles31/functional/es31fMultisampleShaderRenderCase.hpp b/modules/gles31/functional/es31fMultisampleShaderRenderCase.hpp
index fab77f6..84ae5ef 100644
--- a/modules/gles31/functional/es31fMultisampleShaderRenderCase.hpp
+++ b/modules/gles31/functional/es31fMultisampleShaderRenderCase.hpp
@@ -97,6 +97,8 @@
virtual bool verifySampleBuffers (const std::vector<tcu::Surface>& resultBuffers);
virtual void setupRenderData (void);
+ glw::GLint getMaxConformantSampleCount (glw::GLenum target, glw::GLenum internalFormat);
+
protected:
struct Attrib
{
diff --git a/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp b/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp
index 511bb5c..c8deaaa 100644
--- a/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp
+++ b/modules/gles31/functional/es31fNegativeAdvancedBlendEquationTests.cpp
@@ -175,6 +175,14 @@
ctx.isExtensionSupported("GL_KHR_blend_equation_advanced") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
"This test requires support for the extension GL_KHR_blend_equation_advanced or context version 3.2 or higher.");
+ glw::GLuint vao = 0;
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
+ if (!isES)
+ {
+ ctx.glGenVertexArrays(1, &vao);
+ ctx.glBindVertexArray(vao);
+ }
+
ctx.beginSection("GL_INVALID_OPERATION is generated if blending is enabled, and the blend qualifier is different from blend_support_all_equations and does not match the blend equation.");
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_equations); ++ndx)
{
@@ -203,6 +211,9 @@
}
}
ctx.endSection();
+
+ if (!isES)
+ ctx.glDeleteVertexArrays(1, &vao);
}
void attachment_advanced_equation (NegativeTestContext& ctx)
@@ -211,9 +222,17 @@
ctx.isExtensionSupported("GL_KHR_blend_equation_advanced") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
"This test requires support for the extension GL_KHR_blend_equation_advanced or context version 3.2 or higher.");
+ glw::GLuint vao = 0;
glw::GLuint fbo = 0x1234;
glw::GLuint texture = 0x1234;
const glw::GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
+ const bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
+
+ if (!isES)
+ {
+ ctx.glGenVertexArrays(1, &vao);
+ ctx.glBindVertexArray(vao);
+ }
ctx.glGenTextures(1, &texture);
ctx.glBindTexture(GL_TEXTURE_2D, texture);
@@ -260,6 +279,9 @@
}
ctx.endSection();
+ if (!isES)
+ ctx.glDeleteVertexArrays(1, &vao);
+
ctx.glDeleteFramebuffers(1, &fbo);
ctx.glDeleteTextures(1, &texture);
}
diff --git a/modules/gles31/functional/es31fNegativeBufferApiTests.cpp b/modules/gles31/functional/es31fNegativeBufferApiTests.cpp
index 23394ba..bb8a2b2 100644
--- a/modules/gles31/functional/es31fNegativeBufferApiTests.cpp
+++ b/modules/gles31/functional/es31fNegativeBufferApiTests.cpp
@@ -169,7 +169,7 @@
std::vector<GLubyte> ubyteData (4);
GLuint fbo = 0x1234;
- ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of format and type is unsupported.");
+ ctx.beginSection("Unsupported combinations of format and type will generate an GL_INVALID_OPERATION error.");
ctx.glReadPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ubyteData[0]);
ctx.expectError(GL_INVALID_OPERATION);
ctx.endSection();
@@ -201,14 +201,15 @@
GLuint fbo = 0x1234;
if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2))
+ && !contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5))
&& !ctx.isExtensionSupported("GL_KHR_robustness")
&& !ctx.isExtensionSupported("GL_EXT_robustness"))
{
TCU_THROW(NotSupportedError, "GLES 3.2 or robustness extension not supported");
}
- ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of format and type is unsupported.");
- ctx.glReadnPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, (int) ubyteData.size(), &ubyteData[0]);
+ ctx.beginSection("Unsupported combinations of format and type will generate an GL_INVALID_OPERATION error.");
+ ctx.glReadnPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, (int)ubyteData.size(), &ubyteData[0]);
ctx.expectError(GL_INVALID_OPERATION);
ctx.endSection();
@@ -246,21 +247,25 @@
GLint readFormat = 0x1234;
GLint readType = 0x1234;
+
ctx.beginSection("Unsupported combinations of format and type will generate an GL_INVALID_OPERATION error.");
- ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
- ctx.expectError(GL_INVALID_OPERATION);
ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
ctx.expectError(GL_INVALID_OPERATION);
- ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
- ctx.expectError(GL_INVALID_OPERATION);
ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
ctx.expectError(GL_INVALID_OPERATION);
- ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
- ctx.expectError(GL_INVALID_OPERATION);
ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
ctx.expectError(GL_INVALID_OPERATION);
ctx.endSection();
+ ctx.beginSection("Unsupported combinations of format and type will generate an GL_INVALID_OPERATION error.");
+ ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
+ ctx.expectError(GL_INVALID_OPERATION);
+ ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
+ ctx.expectError(GL_INVALID_OPERATION);
+ ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
+ ctx.expectError(GL_INVALID_OPERATION);
+ ctx.endSection();
+
ctx.beginSection("GL_RGBA/GL_UNSIGNED_BYTE is always accepted and the other acceptable pair can be discovered by querying GL_IMPLEMENTATION_COLOR_READ_FORMAT and GL_IMPLEMENTATION_COLOR_READ_TYPE.");
ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
ctx.expectError(GL_NO_ERROR);
@@ -277,6 +282,7 @@
std::vector<float> floatData(4);
deUint32 fbo = 0x1234;
deUint32 texture = 0x1234;
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
ctx.glGenTextures (1, &texture);
ctx.glBindTexture (GL_TEXTURE_2D, texture);
@@ -293,7 +299,7 @@
ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
ctx.expectError (GL_NO_ERROR);
ctx.glReadPixels (0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]);
- ctx.expectError (GL_INVALID_OPERATION);
+ ctx.expectError (isES ? GL_INVALID_OPERATION : GL_NO_ERROR);
ctx.glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
ctx.glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
@@ -759,6 +765,7 @@
std::vector<deUint32> values (maxDrawBuffers+1);
std::vector<deUint32> attachments (4);
std::vector<GLfloat> data (32*32);
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
values[0] = GL_NONE;
values[1] = GL_BACK;
values[2] = GL_COLOR_ATTACHMENT0;
@@ -785,7 +792,7 @@
ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to a draw framebuffer and DrawBuffers is supplied with BACK or COLOR_ATTACHMENTm where m is greater than or equal to the value of MAX_COLOR_ATTACHMENTS.");
ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo);
ctx.glDrawBuffers (1, &values[1]);
- ctx.expectError (GL_INVALID_OPERATION);
+ ctx.expectError (isES ? GL_INVALID_OPERATION : GL_INVALID_ENUM);
ctx.glDrawBuffers (4, &attachments[0]);
ctx.expectError (GL_INVALID_OPERATION);
ctx.endSection();
@@ -805,7 +812,7 @@
ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to a framebuffer object and the ith buffer listed in bufs is anything other than GL_NONE or GL_COLOR_ATTACHMENTSi.");
ctx.glBindFramebuffer (GL_FRAMEBUFFER, fbo);
ctx.glDrawBuffers (1, &values[1]);
- ctx.expectError (GL_INVALID_OPERATION);
+ ctx.expectError (isES ? GL_INVALID_OPERATION : GL_INVALID_ENUM);
ctx.glDrawBuffers (4, &attachments[0]);
ctx.expectError (GL_INVALID_OPERATION);
@@ -950,6 +957,7 @@
deUint32 fbo = 0x1234;
deUint32 texture = 0x1234;
int maxColorAttachments = 0x1234;
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
ctx.glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
ctx.glGenTextures (1, &texture);
@@ -971,7 +979,7 @@
ctx.glReadBuffer (GL_COLOR_ATTACHMENT0 - 1);
ctx.expectError (GL_INVALID_ENUM);
ctx.glReadBuffer (GL_FRONT);
- ctx.expectError (GL_INVALID_ENUM);
+ ctx.expectError (isES ? GL_INVALID_ENUM : GL_INVALID_OPERATION);
// \ note Spec isn't actually clear here, but it is safe to assume that
// GL_DEPTH_ATTACHMENT can't be interpreted as GL_COLOR_ATTACHMENTm
@@ -1289,6 +1297,7 @@
{
deUint32 rbo = 0x1234;
GLint maxSize = 0x1234;
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
ctx.glGenRenderbuffers (1, &rbo);
ctx.glBindRenderbuffer (GL_RENDERBUFFER, rbo);
@@ -1307,13 +1316,13 @@
if (!ctx.isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error
{
ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGB16F, 1, 1);
- ctx.expectError (GL_INVALID_ENUM);
+ ctx.expectError (isES ? GL_INVALID_ENUM : GL_NO_ERROR);
}
if (!ctx.isExtensionSupported("GL_EXT_render_snorm")) // GL_EXT_render_snorm disables error
{
ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA8_SNORM, 1, 1);
- ctx.expectError (GL_INVALID_ENUM);
+ ctx.expectError (isES ? GL_INVALID_ENUM : GL_NO_ERROR);
}
ctx.endSection();
@@ -1471,11 +1480,12 @@
ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
ctx.endSection();
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
ctx.beginSection("GL_INVALID_OPERATION is generated if the source and destination buffers are identical.");
ctx.glBindFramebuffer (GL_DRAW_FRAMEBUFFER, fbo[0]);
ctx.expectError (GL_NO_ERROR);
ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
- ctx.expectError (GL_INVALID_OPERATION);
+ ctx.expectError (isES ? GL_INVALID_OPERATION : GL_NO_ERROR);
// restore
ctx.glBindFramebuffer (GL_DRAW_FRAMEBUFFER, fbo[1]);
ctx.endSection();
@@ -1509,25 +1519,27 @@
if (!ctx.isExtensionSupported("GL_NV_framebuffer_multisample"))
{
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
+
ctx.beginSection("GL_INVALID_OPERATION is generated if the value of GL_SAMPLE_BUFFERS for the draw buffer is greater than zero.");
ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32);
ctx.glFramebufferRenderbuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
- ctx.expectError (GL_INVALID_OPERATION);
+ ctx.expectError (isES ? GL_INVALID_OPERATION : GL_NO_ERROR);
ctx.endSection();
ctx.beginSection("GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater than zero and the formats of draw and read buffers are not identical.");
ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA4, 32, 32);
ctx.glFramebufferRenderbuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
ctx.glBlitFramebuffer (0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
- ctx.expectError (GL_INVALID_OPERATION);
+ ctx.expectError (isES ? GL_INVALID_OPERATION : GL_NO_ERROR);
ctx.endSection();
ctx.beginSection("GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater than zero and the source and destination rectangles are not defined with the same (X0, Y0) and (X1, Y1) bounds.");
ctx.glRenderbufferStorage (GL_RENDERBUFFER, GL_RGBA8, 32, 32);
ctx.glFramebufferRenderbuffer (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
ctx.glBlitFramebuffer (0, 0, 16, 16, 2, 2, 18, 18, GL_COLOR_BUFFER_BIT, GL_NEAREST);
- ctx.expectError (GL_INVALID_OPERATION);
+ ctx.expectError (isES ? GL_INVALID_OPERATION : GL_NO_ERROR);
ctx.endSection();
}
@@ -1784,6 +1796,7 @@
int maxSamplesSupportedRGBA4 = -1;
int maxSamplesSupportedRGBA8UI = -1;
GLint maxSize = 0x1234;
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_RGBA4, GL_SAMPLES, 1, &maxSamplesSupportedRGBA4);
ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_RGBA8UI, GL_SAMPLES, 1, &maxSamplesSupportedRGBA8UI);
@@ -1810,13 +1823,13 @@
if (!ctx.isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error
{
ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, GL_RGB16F, 1, 1);
- ctx.expectError (GL_INVALID_ENUM);
+ ctx.expectError (isES ? GL_INVALID_ENUM : GL_NO_ERROR);
}
if (!ctx.isExtensionSupported("GL_EXT_render_snorm")) // GL_EXT_render_snorm disables error
{
ctx.glRenderbufferStorageMultisample (GL_RENDERBUFFER, 2, GL_RGBA8_SNORM, 1, 1);
- ctx.expectError (GL_INVALID_ENUM);
+ ctx.expectError (isES ? GL_INVALID_ENUM : GL_NO_ERROR);
}
ctx.endSection();
diff --git a/modules/gles31/functional/es31fNegativeComputeTests.cpp b/modules/gles31/functional/es31fNegativeComputeTests.cpp
index 813a56a..b99bdcd 100644
--- a/modules/gles31/functional/es31fNegativeComputeTests.cpp
+++ b/modules/gles31/functional/es31fNegativeComputeTests.cpp
@@ -761,6 +761,7 @@
ctx.endSection();
}
+ if (glu::isContextTypeES(ctx.getRenderContext().getType())) // for GL4.5 program will compile and link
{
std::ostringstream compShaderSource;
compShaderSource << shaderVersion << "\n"
@@ -800,10 +801,11 @@
void invalid_write_built_in_constants (NegativeTestContext& ctx)
{
- if ((!ctx.isExtensionSupported("GL_EXT_tessellation_shader") && !ctx.isExtensionSupported("GL_OES_tessellation_shader")) ||
- (!ctx.isExtensionSupported("GL_EXT_geometry_shader") && !ctx.isExtensionSupported("GL_OES_geometry_shader")))
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
{
- TCU_THROW(NotSupportedError, "tessellation and geometry shader extensions not supported");
+ if((!ctx.isExtensionSupported("GL_EXT_tessellation_shader") && !ctx.isExtensionSupported("GL_OES_tessellation_shader")) ||
+ (!ctx.isExtensionSupported("GL_EXT_geometry_shader") && !ctx.isExtensionSupported("GL_OES_geometry_shader")))
+ TCU_THROW(NotSupportedError, "tessellation and geometry shader extensions not supported");
}
const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
diff --git a/modules/gles31/functional/es31fNegativeFragmentApiTests.cpp b/modules/gles31/functional/es31fNegativeFragmentApiTests.cpp
index a663255..75a0a3d 100644
--- a/modules/gles31/functional/es31fNegativeFragmentApiTests.cpp
+++ b/modules/gles31/functional/es31fNegativeFragmentApiTests.cpp
@@ -157,11 +157,18 @@
ctx.endSection();
}
+static bool checkSupport(NegativeTestContext& ctx)
+{
+ return contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5)) ||
+ ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed");
+}
+
void blend_equationi (NegativeTestContext& ctx)
{
glw::GLint maxDrawBuffers = -1;
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
+ if (!checkSupport(ctx))
throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
@@ -181,7 +188,7 @@
{
glw::GLint maxDrawBuffers = -1;
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
+ if (!checkSupport(ctx))
throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
@@ -229,7 +236,7 @@
{
glw::GLint maxDrawBuffers = -1;
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
+ if (!checkSupport(ctx))
throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
@@ -251,7 +258,7 @@
{
glw::GLint maxDrawBuffers = -1;
- if (!glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !ctx.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
+ if (!checkSupport(ctx))
throw tcu::NotSupportedError("GL_EXT_draw_buffers_indexed is not supported", DE_NULL, __FILE__, __LINE__);
ctx.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
diff --git a/modules/gles31/functional/es31fNegativePreciseTests.cpp b/modules/gles31/functional/es31fNegativePreciseTests.cpp
index c323386..38e656a 100644
--- a/modules/gles31/functional/es31fNegativePreciseTests.cpp
+++ b/modules/gles31/functional/es31fNegativePreciseTests.cpp
@@ -156,10 +156,16 @@
ctx.fail("Shader was not expected to compile.");
}
+static bool checkSupport(NegativeTestContext& ctx)
+{
+ return ctx.isExtensionSupported("GL_EXT_gpu_shader5") ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5));
+}
+
void precise_as_variable_name (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError,
- ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx),
"This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher.");
ctx.beginSection("Test that precise cannot be used as a variable name.");
@@ -173,8 +179,7 @@
void precise_as_function_name (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError,
- ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx),
"This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher.");
ctx.beginSection("Test that precise cannot be used as a function name.");
@@ -188,8 +193,7 @@
void precise_as_function_argument (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError,
- ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx),
"This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher.");
ctx.beginSection("Test that precise cannot be used as a argument name.");
diff --git a/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp b/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp
index 54b77da..f028e07 100644
--- a/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp
+++ b/modules/gles31/functional/es31fNegativeSampleVariablesTests.cpp
@@ -92,9 +92,10 @@
void checkSupported (NegativeTestContext& ctx)
{
- const bool isES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool isES32orGL45 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5));
- if (!isES32 && !ctx.isExtensionSupported("GL_OES_sample_variables"))
+ if (!isES32orGL45 && !ctx.isExtensionSupported("GL_OES_sample_variables"))
TCU_THROW(NotSupportedError, "GL_OES_sample_variables is not supported.");
}
@@ -137,10 +138,11 @@
{
checkSupported(ctx);
- if ((!ctx.isExtensionSupported("GL_EXT_tessellation_shader") && !ctx.isExtensionSupported("GL_OES_tessellation_shader")) ||
- (!ctx.isExtensionSupported("GL_EXT_geometry_shader") && !ctx.isExtensionSupported("GL_OES_geometry_shader")))
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
{
- TCU_THROW(NotSupportedError, "tessellation and geometry shader extensions not supported");
+ if ((!ctx.isExtensionSupported("GL_EXT_tessellation_shader") && !ctx.isExtensionSupported("GL_OES_tessellation_shader")) ||
+ (!ctx.isExtensionSupported("GL_EXT_geometry_shader") && !ctx.isExtensionSupported("GL_OES_geometry_shader")))
+ TCU_THROW(NotSupportedError, "tessellation and geometry shader extensions not supported");
}
std::ostringstream shader;
@@ -225,6 +227,10 @@
void index_outside_sample_mask_range (NegativeTestContext& ctx)
{
+ // Skip this test for GL4.5 - shader will compile
+ if (!glu::isContextTypeES(ctx.getRenderContext().getType()))
+ return;
+
checkSupported(ctx);
std::ostringstream shader;
@@ -307,6 +313,10 @@
void redeclare_built_in_types (NegativeTestContext& ctx)
{
+ // skip this test for core GL
+ if (glu::isContextTypeGLCore(ctx.getRenderContext().getType()))
+ return;
+
checkSupported(ctx);
std::ostringstream shader;
diff --git a/modules/gles31/functional/es31fNegativeShaderApiTests.cpp b/modules/gles31/functional/es31fNegativeShaderApiTests.cpp
index e82734a..88ee474 100644
--- a/modules/gles31/functional/es31fNegativeShaderApiTests.cpp
+++ b/modules/gles31/functional/es31fNegativeShaderApiTests.cpp
@@ -86,6 +86,11 @@
" gl_Position = vec4(var);\n"
"}\n\0";
+static bool supportsES32orGL45(NegativeTestContext& ctx)
+{
+ return contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5));
+}
// Shader control commands
void create_shader (NegativeTestContext& ctx)
@@ -269,10 +274,13 @@
ctx.expectError(GL_INVALID_OPERATION);
ctx.endSection();
- ctx.beginSection("GL_INVALID_OPERATION is generated if a shader of the same type as shader is already attached to program.");
- ctx.glAttachShader(program, shader2);
- ctx.expectError(GL_INVALID_OPERATION);
- ctx.endSection();
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ {
+ ctx.beginSection("GL_INVALID_OPERATION is generated if a shader of the same type as shader is already attached to program.");
+ ctx.glAttachShader(program, shader2);
+ ctx.expectError(GL_INVALID_OPERATION);
+ ctx.endSection();
+ }
ctx.glDeleteProgram(program);
ctx.glDeleteShader(shader1);
@@ -497,9 +505,17 @@
ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
ctx.expectError (GL_NO_ERROR);
- ctx.glGetProgramBinary (programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
- ctx.expectError (GL_INVALID_OPERATION);
- ctx.endSection();
+ if (!linkStatus)
+ {
+ ctx.glGetProgramBinary (programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
+ ctx.expectError (GL_INVALID_OPERATION);
+ ctx.endSection();
+ }
+ else
+ {
+ if (isContextTypeES(ctx.getRenderContext().getType()))
+ ctx.fail("Program should not have linked");
+ }
}
void program_binary (NegativeTestContext& ctx)
@@ -653,7 +669,7 @@
void get_sampler_parameterIiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
throw tcu::NotSupportedError("glGetSamplerParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
GLuint sampler = 0x1234;
@@ -676,7 +692,7 @@
void get_sampler_parameterIuiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
throw tcu::NotSupportedError("glGetSamplerParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
GLuint sampler = 0x1234;
@@ -713,7 +729,7 @@
ctx.expectError(GL_INVALID_ENUM);
ctx.endSection();
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (supportsES32orGL45(ctx))
{
ctx.beginSection("GL_INVALID_ENUM is generated if glSamplerParameteri is called for a non-scalar parameter.");
ctx.glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, 0);
@@ -761,7 +777,7 @@
ctx.expectError(GL_INVALID_ENUM);
ctx.endSection();
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (supportsES32orGL45(ctx))
{
ctx.beginSection("GL_INVALID_ENUM is generated if glSamplerParameterf is called for a non-scalar parameter.");
ctx.glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, 0);
@@ -795,7 +811,7 @@
void sampler_parameterIiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
throw tcu::NotSupportedError("glSamplerParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
GLuint sampler;
@@ -816,7 +832,7 @@
void sampler_parameterIuiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
throw tcu::NotSupportedError("glSamplerParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
GLuint sampler;
@@ -2579,7 +2595,7 @@
void srgb_decode_samplerparameterIiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
TCU_THROW(NotSupportedError, "glSamplerParameterIiv is not supported.");
if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
@@ -2602,7 +2618,7 @@
void srgb_decode_samplerparameterIuiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
TCU_THROW(NotSupportedError, "glSamplerParameterIuiv is not supported.");
if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
diff --git a/modules/gles31/functional/es31fNegativeShaderDirectiveTests.cpp b/modules/gles31/functional/es31fNegativeShaderDirectiveTests.cpp
index 8d87a21..0440835 100644
--- a/modules/gles31/functional/es31fNegativeShaderDirectiveTests.cpp
+++ b/modules/gles31/functional/es31fNegativeShaderDirectiveTests.cpp
@@ -203,7 +203,9 @@
void sample_variables (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2)), "Test requires a context version 3.2 or higher.");
+ TCU_CHECK_AND_THROW(NotSupportedError,
+ contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2)) || contextSupports(ctx.getRenderContext().getType() , glu::ApiType::core(4, 5)),
+ "Test requires a context version 3.2 or higher.");
static const char* const s_tests[] =
{
diff --git a/modules/gles31/functional/es31fNegativeShaderFramebufferFetchTests.cpp b/modules/gles31/functional/es31fNegativeShaderFramebufferFetchTests.cpp
index b74c5a6..241972d 100644
--- a/modules/gles31/functional/es31fNegativeShaderFramebufferFetchTests.cpp
+++ b/modules/gles31/functional/es31fNegativeShaderFramebufferFetchTests.cpp
@@ -117,6 +117,10 @@
void last_frag_data_not_defined (NegativeTestContext& ctx)
{
+ // this tests does not apply to GL4.5
+ if (!glu::isContextTypeES(ctx.getRenderContext().getType()))
+ return;
+
checkFramebufferFetchSupport(ctx);
const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
@@ -143,6 +147,8 @@
void last_frag_data_readonly (NegativeTestContext& ctx)
{
+ return; /// TEMP - not sure what to do, this test crashes on es3.1 and gl4.5 context
+
checkFramebufferFetchSupport(ctx);
map<string, string> args;
@@ -194,6 +200,10 @@
void invalid_redeclaration_inout (NegativeTestContext& ctx)
{
+ // this case does not apply to GL4.5
+ if (!glu::isContextTypeES(ctx.getRenderContext().getType()))
+ return;
+
checkFramebufferFetchSupport(ctx);
const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
@@ -222,6 +232,10 @@
void invalid_vertex_inout (NegativeTestContext& ctx)
{
+ // this case does not apply to GL4.5
+ if (!glu::isContextTypeES(ctx.getRenderContext().getType()))
+ return;
+
checkFramebufferFetchSupport(ctx);
const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
diff --git a/modules/gles31/functional/es31fNegativeShaderFunctionTests.cpp b/modules/gles31/functional/es31fNegativeShaderFunctionTests.cpp
index b37064a..891288a 100644
--- a/modules/gles31/functional/es31fNegativeShaderFunctionTests.cpp
+++ b/modules/gles31/functional/es31fNegativeShaderFunctionTests.cpp
@@ -1669,6 +1669,13 @@
return source.str();
}
+static bool checkSupport(NegativeTestContext& ctx)
+{
+ auto ctxType = ctx.getRenderContext().getType();
+ return contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ contextSupports(ctxType, glu::ApiType::core(4, 5));
+}
+
void texture_size_invalid_sampler (NegativeTestContext& ctx)
{
ctx.beginSection("textureSize: Invalid sampler type - some overloads take two arguments while others take only one.");
@@ -1679,7 +1686,7 @@
ctx.beginSection("Verify shader: " + std::string(getShaderTypeName(s_shaders[shaderNdx])));
for (int dataTypeNdx = 0; dataTypeNdx < DE_LENGTH_OF_ARRAY(s_samplerTypes); ++dataTypeNdx)
{
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(s_samplerTypes[dataTypeNdx])))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(s_samplerTypes[dataTypeNdx])))
{
ctx.beginSection("Verify sampler data type: " + std::string(getDataTypeName(s_samplerTypes[dataTypeNdx])));
const std::string shaderSource(genShaderSourceTextureSize_sampler(ctx, s_shaders[shaderNdx], s_samplerTypes[dataTypeNdx], glu::TYPE_INT));
@@ -1719,7 +1726,7 @@
ctx.beginSection("Verify shader: " + std::string(getShaderTypeName(s_shaders[shaderNdx])));
for (int dataTypeNdx = 0; dataTypeNdx < DE_LENGTH_OF_ARRAY(s_samplerTypes); ++dataTypeNdx)
{
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(s_samplerTypes[dataTypeNdx])))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(s_samplerTypes[dataTypeNdx])))
{
ctx.beginSection("Verify sampler/lod data type" + std::string(getDataTypeName(s_samplerTypes[dataTypeNdx])));
for (int dataTypeNdx2 = 0; dataTypeNdx2 < DE_LENGTH_OF_ARRAY(s_nonScalarIntTypes); ++dataTypeNdx2)
@@ -2194,7 +2201,7 @@
}
// SAMPLER_CUBE_ARRAY
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
{
if (s_floatTypes[dataTypeNdx] != glu::TYPE_FLOAT_VEC4)
{
@@ -2274,7 +2281,7 @@
}
// SAMPLER_CUBE_ARRAY_SHADOW
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY_SHADOW)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY_SHADOW)))
{
if (s_floatTypes[dataTypeNdx] != glu::TYPE_FLOAT_VEC4)
{
@@ -2499,7 +2506,7 @@
}
// SAMPLER_CUBE_ARRAY
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
{
if (s_floatTypes[dataTypeNdx] != glu::TYPE_FLOAT)
{
@@ -2543,7 +2550,7 @@
}
// SAMPLER_CUBE_ARRAY_SHADOW
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY_SHADOW)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY_SHADOW)))
{
if (s_floatTypes[dataTypeNdx] != glu::TYPE_FLOAT)
{
@@ -2591,7 +2598,7 @@
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_intTypes));
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_uintTypes));
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
{
ctx.beginSection("textureLod: Invalid P type.");
for (int shaderNdx = 0; shaderNdx < DE_LENGTH_OF_ARRAY(s_shaders); ++shaderNdx)
@@ -2653,7 +2660,7 @@
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_intTypes));
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_uintTypes));
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
{
ctx.beginSection("textureLod: Invalid lod type.");
for (int shaderNdx = 0; shaderNdx < DE_LENGTH_OF_ARRAY(s_shaders); ++shaderNdx)
@@ -2759,7 +2766,7 @@
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_intTypes));
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_uintTypes));
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
{
ctx.beginSection("texelFetch: Invalid P type.");
for (int shaderNdx = 0; shaderNdx < DE_LENGTH_OF_ARRAY(s_shaders); ++shaderNdx)
@@ -2908,7 +2915,7 @@
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_intTypes));
DE_ASSERT(DE_LENGTH_OF_ARRAY(s_floatTypes) == DE_LENGTH_OF_ARRAY(s_uintTypes));
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
+ if (checkSupport(ctx) || ctx.isExtensionSupported(getDataTypeExtension(glu::TYPE_SAMPLER_CUBE_ARRAY)))
{
ctx.beginSection("texelFetch: Invalid sample type.");
for (int shaderNdx = 0; shaderNdx < DE_LENGTH_OF_ARRAY(s_shaders); ++shaderNdx)
@@ -3102,7 +3109,8 @@
void texture_grad (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, ctx.isExtensionSupported("GL_EXT_texture_cube_map_array") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "Test requires support for GL_EXT_texture_cube_map_array or version 3.2.");
+ TCU_CHECK_AND_THROW(NotSupportedError, ctx.isExtensionSupported("GL_EXT_texture_cube_map_array") || checkSupport(ctx),
+ "Test requires support for GL_EXT_texture_cube_map_array or version 3.2.");
ctx.beginSection("textureGrad.");
for (int shaderNdx = 0; shaderNdx < DE_LENGTH_OF_ARRAY(s_shaders); ++shaderNdx)
@@ -3449,7 +3457,7 @@
{
TCU_CHECK_AND_THROW(
NotSupportedError,
- contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported("GL_EXT_texture_cube_map_array"),
+ checkSupport(ctx) || ctx.isExtensionSupported("GL_EXT_texture_cube_map_array"),
"Test requires extension GL_EXT_texture_cube_map_array or context version 3.2 or higher.");
ctx.beginSection("textureGrad - samplerCubeArray");
@@ -3508,7 +3516,7 @@
{
TCU_CHECK_AND_THROW(
NotSupportedError,
- contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported("GL_EXT_texture_cube_map_array"),
+ checkSupport(ctx) || ctx.isExtensionSupported("GL_EXT_texture_cube_map_array"),
"Test requires extension GL_EXT_texture_cube_map_array or context version 3.2 or higher.");
ctx.beginSection("textureGrad - samplerCubeArrayShadow");
@@ -4038,12 +4046,14 @@
{
DE_ASSERT(function >= SHADER_FUNCTION_INTERPOLATED_AT_CENTROID && function <= SHADER_FUNCTION_INTERPOLATED_AT_OFFSET);
- const bool supportsES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
- std::ostringstream source;
+ auto ctxType = ctx.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
- source << (supportsES32 ? glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES)) << "\n"
+ std::ostringstream source;
+ source << (isES32orGL45 ? glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES)) << "\n"
<< getShaderInitialization(ctx, shaderType)
- << (supportsES32 ? "" : getShaderExtensionDeclaration("GL_OES_shader_multisample_interpolation"))
+ << (isES32orGL45 ? "" : getShaderExtensionDeclaration("GL_OES_shader_multisample_interpolation"))
<< declareShaderInput(interpolantDataType, "interpolant")
<< "void main()\n"
<< "{\n";
@@ -4083,7 +4093,7 @@
void interpolate_at_centroid (NegativeTestContext& ctx)
{
TCU_CHECK_AND_THROW(NotSupportedError,
- contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported("GL_OES_shader_multisample_interpolation"),
+ checkSupport(ctx) || ctx.isExtensionSupported("GL_OES_shader_multisample_interpolation"),
"This test requires a context version 3.2 or higher.");
ctx.beginSection("interpolateAtCentroid");
@@ -4125,7 +4135,7 @@
void interpolate_at_sample (NegativeTestContext& ctx)
{
TCU_CHECK_AND_THROW(NotSupportedError,
- contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported("GL_OES_shader_multisample_interpolation"),
+ checkSupport(ctx) || ctx.isExtensionSupported("GL_OES_shader_multisample_interpolation"),
"This test requires a context version 3.2 or higher.");
ctx.beginSection("interpolateAtSample");
@@ -4185,7 +4195,7 @@
void interpolate_at_offset (NegativeTestContext& ctx)
{
TCU_CHECK_AND_THROW(NotSupportedError,
- contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported("GL_OES_shader_multisample_interpolation"),
+ checkSupport(ctx) || ctx.isExtensionSupported("GL_OES_shader_multisample_interpolation"),
"This test requires a context version 3.2 or higher.");
ctx.beginSection("interpolateAtOffset");
@@ -4287,7 +4297,7 @@
void texture_gather_offsets (NegativeTestContext& ctx)
{
TCU_CHECK_AND_THROW(NotSupportedError,
- contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported("GL_EXT_gpu_shader5"),
+ checkSupport(ctx) || ctx.isExtensionSupported("GL_EXT_gpu_shader5"),
"This test requires a context version 3.2 or higher.");
const struct TextureGatherOffsetsTestSpec testSpecs[] =
@@ -4363,7 +4373,7 @@
void fma (NegativeTestContext& ctx)
{
TCU_CHECK_AND_THROW(NotSupportedError,
- contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.isExtensionSupported("GL_EXT_gpu_shader5"),
+ checkSupport(ctx) || ctx.isExtensionSupported("GL_EXT_gpu_shader5"),
"This test requires a context version 3.2 or higher.");
ctx.beginSection("fma");
diff --git a/modules/gles31/functional/es31fNegativeStateApiTests.cpp b/modules/gles31/functional/es31fNegativeStateApiTests.cpp
index 43f41d8..284bf45 100644
--- a/modules/gles31/functional/es31fNegativeStateApiTests.cpp
+++ b/modules/gles31/functional/es31fNegativeStateApiTests.cpp
@@ -68,6 +68,35 @@
" fragColor = vec4(vec4(fUnif_ivec4) + vec4(fUnif_uvec4));\n"
"}\n\0";
+// Helper class that enables tests to be executed on GL4.5 context
+// and removes code redundancy in each test that requires it.
+class VAOHelper
+{
+public:
+ VAOHelper(NegativeTestContext& ctx)
+ : m_vao(0)
+ , m_ctx(ctx)
+ {
+ // tests need vao only for GL4.5 context
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ return;
+
+ m_ctx.glGenVertexArrays(1, &m_vao);
+ m_ctx.glBindVertexArray(m_vao);
+ }
+
+ ~VAOHelper()
+ {
+ if (m_vao)
+ m_ctx.glDeleteVertexArrays(1, &m_vao);
+ }
+
+private:
+ GLuint m_vao;
+ NegativeTestContext& m_ctx;
+};
+
+
static std::string getVtxFragVersionSources (const std::string source, NegativeTestContext& ctx)
{
const bool supportsES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
@@ -88,10 +117,16 @@
ctx.endSection();
}
+static bool checkSupport(NegativeTestContext& ctx)
+{
+ return contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5));
+}
+
// Enabling & disabling states
void enablei (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
ctx.glEnablei(-1, -1);
@@ -114,7 +149,7 @@
void disablei (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
ctx.beginSection("GL_INVALID_ENUM is generated if cap is not one of the allowed values.");
ctx.glDisablei(-1,-1);
@@ -476,7 +511,7 @@
void get_tex_parameteriiv (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
GLint params[1] = { 0 };
@@ -492,7 +527,7 @@
void get_tex_parameteriuiv (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
GLuint params[1] = { 0 };
@@ -549,7 +584,7 @@
void get_nuniformfv (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
GLint unif = ctx.glGetUniformLocation(program.getProgram(), "vUnif_vec4");
@@ -639,7 +674,7 @@
void get_nuniformiv (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
GLint unif = ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
@@ -729,7 +764,7 @@
void get_nuniformuiv (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(getVtxFragVersionSources(uniformTestVertSource, ctx), getVtxFragVersionSources(uniformTestFragSource, ctx)));
GLint unif = ctx.glGetUniformLocation(program.getProgram(), "fUnif_ivec4");
@@ -997,8 +1032,9 @@
void get_vertex_attribfv (NegativeTestContext& ctx)
{
- GLfloat params = 0.0f;
- GLint maxVertexAttribs;
+ GLfloat params = 0.0f;
+ GLint maxVertexAttribs;
+ VAOHelper vao(ctx);
ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
ctx.glGetVertexAttribfv(0, -1, ¶ms);
@@ -1014,8 +1050,9 @@
void get_vertex_attribiv (NegativeTestContext& ctx)
{
- GLint params = -1;
- GLint maxVertexAttribs;
+ GLint params = -1;
+ GLint maxVertexAttribs;
+ VAOHelper vao(ctx);
ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
ctx.glGetVertexAttribiv(0, -1, ¶ms);
@@ -1031,8 +1068,9 @@
void get_vertex_attribi_iv (NegativeTestContext& ctx)
{
- GLint params = -1;
- GLint maxVertexAttribs;
+ GLint params = -1;
+ GLint maxVertexAttribs;
+ VAOHelper vao(ctx);
ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
ctx.glGetVertexAttribIiv(0, -1, ¶ms);
@@ -1048,8 +1086,10 @@
void get_vertex_attribi_uiv (NegativeTestContext& ctx)
{
- GLuint params = (GLuint)-1;
- GLint maxVertexAttribs;
+ GLuint params = (GLuint)-1;
+ GLint maxVertexAttribs;
+ VAOHelper vao(ctx);
+
ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
ctx.glGetVertexAttribIuiv(0, -1, ¶ms);
@@ -1202,6 +1242,7 @@
ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, ¶ms[0]); // TYPE is GL_RENDERBUFFER
ctx.expectError(GL_INVALID_ENUM);
ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
ctx.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, ¶ms[0]); // TYPE is GL_FRAMEBUFFER_DEFAULT
ctx.expectError(GL_INVALID_ENUM);
ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
@@ -1260,7 +1301,8 @@
void get_internalformativ (NegativeTestContext& ctx)
{
- GLint params[16];
+ const bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
+ GLint params[16];
deMemset(¶ms[0], 0xcd, sizeof(params));
@@ -1276,15 +1318,18 @@
ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not color-, depth-, or stencil-renderable.");
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_render_snorm"))
+ if (isES)
{
- ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_RG8_SNORM, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]);
- ctx.expectError (GL_INVALID_ENUM);
- }
+ if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_render_snorm"))
+ {
+ ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_RG8_SNORM, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]);
+ ctx.expectError (GL_INVALID_ENUM);
+ }
- ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_COMPRESSED_RGB8_ETC2, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]);
- ctx.expectError (GL_INVALID_ENUM);
- ctx.endSection();
+ ctx.glGetInternalformativ (GL_RENDERBUFFER, GL_COMPRESSED_RGB8_ETC2, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]);
+ ctx.expectError (GL_INVALID_ENUM);
+ ctx.endSection();
+ }
ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
ctx.glGetInternalformativ (-1, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]);
@@ -1292,7 +1337,7 @@
ctx.glGetInternalformativ (GL_FRAMEBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]);
ctx.expectError (GL_INVALID_ENUM);
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_sparse_texture"))
+ if (isES && !ctx.getContextInfo().isExtensionSupported("GL_EXT_sparse_texture"))
{
ctx.glGetInternalformativ (GL_TEXTURE_2D, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, 16, ¶ms[0]);
ctx.expectError (GL_INVALID_ENUM);
@@ -1399,7 +1444,7 @@
void is_enabledi (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a higher context version.");
ctx.beginSection("GL_INVALID_ENUM is generated if cap is not an accepted value.");
ctx.glIsEnabledi(-1, 1);
diff --git a/modules/gles31/functional/es31fNegativeTessellationTests.cpp b/modules/gles31/functional/es31fNegativeTessellationTests.cpp
index 39c9b32..fcb085e 100644
--- a/modules/gles31/functional/es31fNegativeTessellationTests.cpp
+++ b/modules/gles31/functional/es31fNegativeTessellationTests.cpp
@@ -45,7 +45,7 @@
using namespace glw;
static const char* vertexShaderSource = "${GLSL_VERSION_STRING}\n"
- "\n"
+ "${GLSL_PER_VERTEX_OUT}\n"
"void main (void)\n"
"{\n"
" gl_Position = vec4(0.0);\n"
@@ -62,6 +62,8 @@
static const char* tessControlShaderSource = "${GLSL_VERSION_STRING}\n"
"${GLSL_TESS_EXTENSION_STRING}\n"
+ "${GLSL_PER_VERTEX_IN_ARR}\n"
+ "${GLSL_PER_VERTEX_OUT_ARR}\n"
"layout (vertices=3) out;\n"
"\n"
"void main()\n"
@@ -71,6 +73,8 @@
static const char* tessEvalShaderSource = "${GLSL_VERSION_STRING}\n"
"${GLSL_TESS_EXTENSION_STRING}\n"
+ "${GLSL_PER_VERTEX_IN_ARR}\n"
+ "${GLSL_PER_VERTEX_OUT}\n"
"layout(triangles) in;\n"
"\n"
"void main()\n"
@@ -86,7 +90,8 @@
static void checkTessellationSupport (NegativeTestContext& ctx)
{
- checkExtensionSupport(ctx, "GL_EXT_tessellation_shader");
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ checkExtensionSupport(ctx, "GL_EXT_tessellation_shader");
}
// Helper for constructing tessellation pipeline sources.
@@ -105,14 +110,30 @@
return sources;
}
+map<string, string> constructSpecializationMap(NegativeTestContext& ctx)
+{
+ glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(ctx.getRenderContext().getType());
+ bool isES31 = (glslVersion == glu::GLSL_VERSION_310_ES);
+ string ext = isES31 ? "#extension GL_EXT_tessellation_shader : require" : "";
+ return
+ {
+ { "GLSL_VERSION_STRING", getGLSLVersionDeclaration(glslVersion) },
+ { "GLSL_TESS_EXTENSION_STRING", ext },
+ { "GLSL_PER_VERTEX_OUT", "" }, // needed for GL4.5
+ { "GLSL_PER_VERTEX_IN_ARR", "" },
+ { "GLSL_PER_VERTEX_OUT_ARR", "" }
+ };
+}
+
// Incomplete active tess shaders
void single_tessellation_stage (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
- const bool requireTES = !ctx.getContextInfo().isExtensionSupported("GL_NV_gpu_shader5");
- map<string, string> args;
- args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_TESS_EXTENSION_STRING"] = isES32 ? "" : "#extension GL_EXT_tessellation_shader : require";
+ // this case does not apply to GL4.5
+ if (!glu::isContextTypeES(ctx.getRenderContext().getType()))
+ return;
+
+ const bool requireTES = !ctx.getContextInfo().isExtensionSupported("GL_NV_gpu_shader5");
+ map<string, string> args = constructSpecializationMap(ctx);
checkTessellationSupport(ctx);
@@ -206,11 +227,7 @@
{
checkTessellationSupport(ctx);
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
- map<string, string> args;
- args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_TESS_EXTENSION_STRING"] = isES32 ? "" : "#extension GL_EXT_tessellation_shader : require";
-
+ map<string, string> args = constructSpecializationMap(ctx);
glu::ShaderProgram program(ctx.getRenderContext(),
makeTessPipelineSources(tcu::StringTemplate(vertexShaderSource).specialize(args),
tcu::StringTemplate(fragmentShaderSource).specialize(args),
@@ -234,12 +251,8 @@
{
checkTessellationSupport(ctx);
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
- const glw::GLenum tessErr = ctx.getContextInfo().isExtensionSupported("GL_NV_gpu_shader5") ? GL_NO_ERROR : GL_INVALID_OPERATION;
- map<string, string> args;
- args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_TESS_EXTENSION_STRING"] = isES32 ? "" : "#extension GL_EXT_tessellation_shader : require";
-
+ const glw::GLenum tessErr = ctx.getContextInfo().isExtensionSupported("GL_NV_gpu_shader5") ? GL_NO_ERROR : GL_INVALID_OPERATION;
+ map<string, string> args = constructSpecializationMap(ctx);
glu::ShaderProgram program(ctx.getRenderContext(),
makeTessPipelineSources(tcu::StringTemplate(vertexShaderSource).specialize(args),
tcu::StringTemplate(fragmentShaderSource).specialize(args),
@@ -248,6 +261,13 @@
tcu::TestLog& log = ctx.getLog();
log << program;
+ GLuint vao = 0;
+ if (!glu::isContextTypeES(ctx.getRenderContext().getType()))
+ {
+ ctx.glGenVertexArrays(1, &vao);
+ ctx.glBindVertexArray(vao);
+ }
+
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -257,26 +277,35 @@
ctx.endSection();
ctx.glUseProgram(0);
+
+ if (vao)
+ ctx.glDeleteVertexArrays(1, &vao);
}
void invalid_program_state (NegativeTestContext& ctx)
{
checkTessellationSupport(ctx);
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
- map<string, string> args;
- args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_TESS_EXTENSION_STRING"] = isES32 ? "" : "#extension GL_EXT_tessellation_shader : require";
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ map<string, string> args = constructSpecializationMap(ctx);
+
+ // for gl4.5 we need to add per vertex sections
+ if (!glu::isContextTypeES(rc.getType()))
+ {
+ args["GLSL_PER_VERTEX_OUT"] = "out gl_PerVertex { vec4 gl_Position; };\n";
+ args["GLSL_PER_VERTEX_IN_ARR"] = "in gl_PerVertex { vec4 gl_Position; } gl_in[];\n";
+ args["GLSL_PER_VERTEX_OUT_ARR"] = "out gl_PerVertex { vec4 gl_Position; } gl_out[];\n";
+ }
glu::FragmentSource frgSource(tcu::StringTemplate(fragmentShaderSource).specialize(args));
glu::TessellationControlSource tessCtrlSource(tcu::StringTemplate(tessControlShaderSource).specialize(args));
glu::TessellationEvaluationSource tessEvalSource(tcu::StringTemplate(tessEvalShaderSource).specialize(args));
- glu::ProgramPipeline pipeline(ctx.getRenderContext());
+ glu::ProgramPipeline pipeline(rc);
- glu::ShaderProgram fragProgram (ctx.getRenderContext(), glu::ProgramSources() << glu::ProgramSeparable(true) << frgSource);
- glu::ShaderProgram tessCtrlProgram (ctx.getRenderContext(), glu::ProgramSources() << glu::ProgramSeparable(true) << tessCtrlSource);
- glu::ShaderProgram tessEvalProgram (ctx.getRenderContext(), glu::ProgramSources() << glu::ProgramSeparable(true) << tessEvalSource);
+ glu::ShaderProgram fragProgram (rc, glu::ProgramSources() << glu::ProgramSeparable(true) << frgSource);
+ glu::ShaderProgram tessCtrlProgram (rc, glu::ProgramSources() << glu::ProgramSeparable(true) << tessCtrlSource);
+ glu::ShaderProgram tessEvalProgram (rc, glu::ProgramSources() << glu::ProgramSeparable(true) << tessEvalSource);
tcu::TestLog& log = ctx.getLog();
log << fragProgram << tessCtrlProgram << tessEvalProgram;
@@ -313,11 +342,7 @@
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
"}\n";
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
- map<string, string> args;
- args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_TESS_EXTENSION_STRING"] = isES32 ? "" : "#extension GL_EXT_tessellation_shader : require";
-
+ map<string, string> args = constructSpecializationMap(ctx);
int maxPatchVertices= 0;
ctx.beginSection("Output vertex count exceeds GL_MAX_PATCH_VERTICES.");
diff --git a/modules/gles31/functional/es31fNegativeTextureApiTests.cpp b/modules/gles31/functional/es31fNegativeTextureApiTests.cpp
index c2f9d47..58c513f 100644
--- a/modules/gles31/functional/es31fNegativeTextureApiTests.cpp
+++ b/modules/gles31/functional/es31fNegativeTextureApiTests.cpp
@@ -75,6 +75,12 @@
}
}
+static bool supportsES32orGL45(NegativeTestContext& ctx)
+{
+ return contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5));
+}
+
#define FOR_CUBE_FACES(FACE_GL_VAR, BODY) \
do \
{ \
@@ -150,7 +156,7 @@
ctx.glBindTexture(GL_TEXTURE_3D, texture[3]);
ctx.expectError(GL_INVALID_OPERATION);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, texture[0]);
ctx.expectError(GL_INVALID_OPERATION);
@@ -401,55 +407,58 @@
void compressedteximage2d_invalid_border (NegativeTestContext& ctx)
{
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
+ GLenum error = isES ? GL_INVALID_VALUE : GL_INVALID_OPERATION;
+
ctx.beginSection("GL_INVALID_VALUE is generated if border is not 0.");
ctx.beginSection("GL_TEXTURE_2D target");
ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_X target");
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Y target");
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
ctx.beginSection("GL_TEXTURE_CUBE_MAP_POSITIVE_Z target");
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_X target");
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Y target");
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
ctx.beginSection("GL_TEXTURE_CUBE_MAP_NEGATIVE_Z target");
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
ctx.endSection();
@@ -480,7 +489,7 @@
ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (supportsES32orGL45(ctx))
{
ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_4x4, 1, 1, 0, divRoundUp(1, 4) * divRoundUp(1, 4) * 16 - 1, 0);
ctx.expectError(GL_INVALID_VALUE);
@@ -964,6 +973,9 @@
void copytexsubimage2d_texture_internalformat (NegativeTestContext& ctx)
{
+ if (!glu::isContextTypeES(ctx.getRenderContext().getType()))
+ return;
+
GLuint texture = 0x1234;
ctx.glGenTextures (1, &texture);
ctx.glBindTexture (GL_TEXTURE_2D, texture);
@@ -1178,29 +1190,32 @@
ctx.expectError(GL_INVALID_OPERATION);
ctx.endSection();
- ctx.beginSection("GL_INVALID_OPERATION is generated if the zero level array is stored in a compressed internal format.");
- ctx.glBindTexture(GL_TEXTURE_2D, texture[1]);
- ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
- ctx.glGenerateMipmap(GL_TEXTURE_2D);
- ctx.expectError(GL_INVALID_OPERATION);
- ctx.endSection();
-
- ctx.beginSection("GL_INVALID_OPERATION is generated if the level base array was not specified with an unsized internal format or a sized internal format that is both color-renderable and texture-filterable.");
- ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 0, 0, 0, GL_RGB, GL_BYTE, 0);
- ctx.glGenerateMipmap(GL_TEXTURE_2D);
- ctx.expectError(GL_INVALID_OPERATION);
- ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, 0);
- ctx.glGenerateMipmap(GL_TEXTURE_2D);
- ctx.expectError(GL_INVALID_OPERATION);
-
- if (!(ctx.getContextInfo().isExtensionSupported("GL_EXT_color_buffer_float") && ctx.getContextInfo().isExtensionSupported("GL_OES_texture_float_linear")))
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
{
- ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, GL_RGBA, GL_FLOAT, 0);
+ ctx.beginSection("GL_INVALID_OPERATION is generated if the zero level array is stored in a compressed internal format.");
+ ctx.glBindTexture(GL_TEXTURE_2D, texture[1]);
+ ctx.glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 0, 0);
ctx.glGenerateMipmap(GL_TEXTURE_2D);
ctx.expectError(GL_INVALID_OPERATION);
- }
+ ctx.endSection();
- ctx.endSection();
+ ctx.beginSection("GL_INVALID_OPERATION is generated if the level base array was not specified with an unsized internal format or a sized internal format that is both color-renderable and texture-filterable.");
+ ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8_SNORM, 0, 0, 0, GL_RGB, GL_BYTE, 0);
+ ctx.glGenerateMipmap(GL_TEXTURE_2D);
+ ctx.expectError(GL_INVALID_OPERATION);
+ ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, 0);
+ ctx.glGenerateMipmap(GL_TEXTURE_2D);
+ ctx.expectError(GL_INVALID_OPERATION);
+
+ if (!(ctx.getContextInfo().isExtensionSupported("GL_EXT_color_buffer_float") && ctx.getContextInfo().isExtensionSupported("GL_OES_texture_float_linear")))
+ {
+ ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 0, 0, 0, GL_RGBA, GL_FLOAT, 0);
+ ctx.glGenerateMipmap(GL_TEXTURE_2D);
+ ctx.expectError(GL_INVALID_OPERATION);
+ }
+
+ ctx.endSection();
+ }
ctx.glDeleteTextures(2, texture);
}
@@ -1267,16 +1282,19 @@
ctx.endSection();
ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid.");
- ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB10_A2, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0);
ctx.expectError(GL_INVALID_OPERATION);
- ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
- ctx.expectError(GL_INVALID_OPERATION);
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ {
+ ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+ ctx.expectError(GL_INVALID_OPERATION);
+ ctx.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
+ ctx.expectError(GL_INVALID_OPERATION);
+ }
ctx.endSection();
}
@@ -1584,8 +1602,11 @@
ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0);
ctx.expectError(GL_INVALID_OPERATION);
- ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, 0);
- ctx.expectError(GL_INVALID_OPERATION);
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ {
+ ctx.glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, 0);
+ ctx.expectError(GL_INVALID_OPERATION);
+ }
ctx.endSection();
ctx.glDeleteTextures (1, &texture);
@@ -1800,7 +1821,7 @@
ctx.expectError(GL_INVALID_VALUE);
ctx.endSection();
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (supportsES32orGL45(ctx))
{
ctx.beginSection("GL_INVALID_ENUM is generated if pname is a non-scalar parameter.");
ctx.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, 0);
@@ -1830,7 +1851,7 @@
ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, textureMode);
ctx.expectError(GL_INVALID_ENUM);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, textureMode);
ctx.expectError(GL_INVALID_ENUM);
@@ -1859,7 +1880,7 @@
ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, 1);
ctx.expectError(GL_INVALID_OPERATION);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
ctx.glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
ctx.expectError(GL_INVALID_OPERATION);
@@ -1921,7 +1942,7 @@
ctx.expectError(GL_INVALID_VALUE);
ctx.endSection();
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (supportsES32orGL45(ctx))
{
ctx.beginSection("GL_INVALID_ENUM is generated if pname is a non-scalar parameter.");
ctx.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, 0.0f);
@@ -1951,7 +1972,7 @@
ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, textureMode);
ctx.expectError(GL_INVALID_ENUM);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, textureMode);
ctx.expectError(GL_INVALID_ENUM);
@@ -1980,7 +2001,7 @@
ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, 1.0f);
ctx.expectError(GL_INVALID_OPERATION);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
ctx.glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, 1.0f);
ctx.expectError(GL_INVALID_OPERATION);
@@ -2066,7 +2087,7 @@
ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, ¶ms[0]);
ctx.expectError(GL_INVALID_ENUM);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, ¶ms[0]);
ctx.expectError(GL_INVALID_ENUM);
@@ -2096,7 +2117,7 @@
ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, ¶ms[0]);
ctx.expectError(GL_INVALID_OPERATION);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
params[0] = 1;
ctx.glTexParameteriv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, ¶ms[0]);
@@ -2183,7 +2204,7 @@
ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_COMPARE_FUNC, ¶ms[0]);
ctx.expectError(GL_INVALID_ENUM);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BORDER_COLOR, ¶ms[0]);
ctx.expectError(GL_INVALID_ENUM);
@@ -2213,7 +2234,7 @@
ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_BASE_LEVEL, ¶ms[0]);
ctx.expectError(GL_INVALID_OPERATION);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
{
params[0] = 1.0f;
ctx.glTexParameterfv(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BASE_LEVEL, ¶ms[0]);
@@ -2228,7 +2249,7 @@
void texparameterIiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
throw tcu::NotSupportedError("glTexParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
GLint textureMode[] = { GL_DEPTH_COMPONENT, GL_STENCIL_INDEX };
@@ -2338,7 +2359,7 @@
void texparameterIuiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
throw tcu::NotSupportedError("glTexParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
GLuint textureMode[] = { GL_DEPTH_COMPONENT, GL_STENCIL_INDEX };
@@ -2682,19 +2703,23 @@
ctx.endSection();
ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of internalFormat, format and type is invalid.");
- ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, 0);
ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB5_A1, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, 0);
ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB10_A2, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_INT_2_10_10_10_REV, 0);
ctx.expectError(GL_INVALID_OPERATION);
- ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32UI, 1, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
- ctx.expectError(GL_INVALID_OPERATION);
+
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ {
+ ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+ ctx.expectError(GL_INVALID_OPERATION);
+ ctx.glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32UI, 1, 1, 1, 0, GL_RGBA_INTEGER, GL_INT, 0);
+ ctx.expectError(GL_INVALID_OPERATION);
+ }
ctx.endSection();
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TEXTURE_CUBE_MAP_ARRAY and width and height are not equal.");
ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 2, 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -2716,7 +2741,7 @@
ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, -1, GL_RGB, 1, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, -1, GL_RGBA, 1, 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
@@ -2762,7 +2787,7 @@
ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, -1, -1, -1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, -1, 1, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
@@ -2817,7 +2842,7 @@
ctx.glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 1, 1, 1, 2, GL_RGB, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA, 1, 1, 6, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
@@ -2903,8 +2928,11 @@
ctx.expectError(GL_INVALID_OPERATION);
ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 0);
ctx.expectError(GL_INVALID_OPERATION);
- ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_FLOAT, 0);
- ctx.expectError(GL_INVALID_OPERATION);
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ {
+ ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 4, 4, 4, GL_RGB, GL_FLOAT, 0);
+ ctx.expectError(GL_INVALID_OPERATION);
+ }
ctx.endSection();
ctx.glDeleteTextures (1, &texture);
@@ -2926,7 +2954,7 @@
ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture (GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
ctx.glTexImage3D (GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -2995,7 +3023,7 @@
ctx.glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, -1, -1, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture (GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
ctx.glTexImage3D (GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -3054,7 +3082,7 @@
ctx.glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, -1, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, -1, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
ctx.expectError(GL_INVALID_VALUE);
@@ -3146,7 +3174,7 @@
ctx.glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, -1, 0, 0, 0, 0, 0, 4, 4);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -3184,7 +3212,7 @@
ctx.expectError(GL_INVALID_VALUE);
ctx.endSection();
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[2]);
ctx.glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, 4, 4, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -3350,20 +3378,25 @@
ctx.expectError(GL_INVALID_VALUE);
ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, maxTextureSize, 0, 0, 0, 0);
ctx.expectError(GL_INVALID_VALUE);
- ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, maxTextureLayers, 0, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, maxTextureSize, maxTextureSize, maxTextureLayers, 0, 0, 0);
ctx.expectError(GL_INVALID_VALUE);
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ {
+ ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, maxTextureLayers, 0, 0, 0);
+ ctx.expectError(GL_INVALID_VALUE);
+ }
ctx.endSection();
}
void compressedteximage3d_invalid_border (NegativeTestContext& ctx)
{
+ bool isES = glu::isContextTypeES(ctx.getRenderContext().getType());
+ GLenum error = isES ? GL_INVALID_VALUE : GL_INVALID_OPERATION;
ctx.beginSection("GL_INVALID_VALUE is generated if border is not 0.");
ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, -1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA8_ETC2_EAC, 0, 0, 0, 1, 0, 0);
- ctx.expectError(GL_INVALID_VALUE);
+ ctx.expectError(error);
ctx.endSection();
}
@@ -3383,7 +3416,7 @@
void compressedteximage3d_invalid_width_height (NegativeTestContext& ctx)
{
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
const int width = 4;
const int height = 6;
@@ -3656,7 +3689,7 @@
ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 0, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (supportsES32orGL45(ctx))
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
ctx.expectError(GL_NO_ERROR);
@@ -3676,14 +3709,14 @@
{
deUint32 textures[] = {0x1234, 0x1234};
deInt32 immutable = 0x1234;
- const bool supportsES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool isES32orGL45 = supportsES32orGL45(ctx);
ctx.beginSection("GL_INVALID_OPERATION is generated if the default texture object is curently bound to target.");
ctx.glBindTexture(GL_TEXTURE_2D, 0);
ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
ctx.expectError(GL_INVALID_OPERATION);
- if (supportsES32)
+ if (isES32orGL45)
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8, 16, 16);
@@ -3704,7 +3737,7 @@
ctx.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16);
ctx.expectError(GL_INVALID_OPERATION);
- if (supportsES32)
+ if (isES32orGL45)
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
ctx.glGetTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
@@ -3725,12 +3758,12 @@
{
deUint32 textures[] = {0x1234, 0x1234};
deUint32 log2MaxSize = deLog2Floor32(deMax32(16, 16)) + 1 + 1;
- const bool supportsES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool isES32orGL45 = supportsES32orGL45(ctx);
ctx.glGenTextures(2, textures);
ctx.glBindTexture(GL_TEXTURE_2D, textures[0]);
- if (supportsES32)
+ if (isES32orGL45)
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
ctx.expectError(GL_NO_ERROR);
@@ -3741,7 +3774,7 @@
ctx.glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (supportsES32)
+ if (isES32orGL45)
{
ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, 0, GL_RGBA8, 16, 16);
ctx.expectError(GL_INVALID_VALUE);
@@ -3754,7 +3787,7 @@
ctx.glTexStorage2D(GL_TEXTURE_2D, log2MaxSize, GL_RGBA8, 16, 16);
ctx.expectError(GL_INVALID_OPERATION);
- if (supportsES32)
+ if (isES32orGL45)
{
ctx.glTexStorage2D(GL_TEXTURE_CUBE_MAP, log2MaxSize, GL_RGBA8, 16, 16);
ctx.expectError(GL_INVALID_OPERATION);
@@ -3800,7 +3833,7 @@
ctx.glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 0, 0, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
ctx.expectError(GL_NO_ERROR);
@@ -3828,7 +3861,7 @@
ctx.glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
ctx.expectError (GL_INVALID_OPERATION);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture (GL_TEXTURE_CUBE_MAP_ARRAY, 0);
ctx.glTexStorage3D (GL_TEXTURE_CUBE_MAP_ARRAY, 1, GL_RGBA8, 4, 4, 6);
@@ -3849,7 +3882,7 @@
ctx.glTexStorage3D (GL_TEXTURE_3D, 1, GL_RGBA8, 4, 4, 4);
ctx.expectError (GL_INVALID_OPERATION);
- if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (supportsES32orGL45(ctx) || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture (GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
ctx.glGetTexParameteriv(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_IMMUTABLE_FORMAT, &immutable);
@@ -3870,7 +3903,7 @@
{
deUint32 textures[] = {0x1234, 0x1234};
deUint32 log2MaxSize = deLog2Floor32(8) + 1 + 1;
- const bool supportsES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool isES32orGL45 = supportsES32orGL45(ctx);
ctx.glGenTextures(2, textures);
ctx.glBindTexture(GL_TEXTURE_3D, textures[0]);
@@ -3880,7 +3913,7 @@
ctx.glTexStorage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 0, 0, 0);
ctx.expectError(GL_INVALID_VALUE);
- if (supportsES32 || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (isES32orGL45 || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
ctx.glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA8, 4, 4, 6);
@@ -3900,7 +3933,7 @@
ctx.glTexStorage3D (GL_TEXTURE_3D, log2MaxSize, GL_RGBA8, 8, 8, 8);
ctx.expectError (GL_INVALID_OPERATION);
- if (supportsES32 || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
+ if (isES32orGL45 || ctx.getContextInfo().isExtensionSupported("GL_OES_texture_cube_map_array"))
{
ctx.glTexStorage3D (GL_TEXTURE_CUBE_MAP_ARRAY, log2MaxSize, GL_RGBA8, 2, 2, 6);
ctx.expectError (GL_INVALID_OPERATION);
@@ -3992,7 +4025,7 @@
void srgb_decode_texparameterIiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
TCU_THROW(NotSupportedError,"glTexParameterIiv is not supported.");
if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
@@ -4016,7 +4049,7 @@
void srgb_decode_texparameterIuiv (NegativeTestContext& ctx)
{
- if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(ctx))
TCU_THROW(NotSupportedError,"glTexParameterIuiv is not supported.");
if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
diff --git a/modules/gles31/functional/es31fNegativeVertexArrayApiTests.cpp b/modules/gles31/functional/es31fNegativeVertexArrayApiTests.cpp
index 977e268..1c49ff5 100644
--- a/modules/gles31/functional/es31fNegativeVertexArrayApiTests.cpp
+++ b/modules/gles31/functional/es31fNegativeVertexArrayApiTests.cpp
@@ -66,6 +66,36 @@
"{\n"
"}\n";
+// Helper class that enables tests to be executed on GL4.5 context
+// and removes code redundancy in each test that requires it.
+class VAOHelper
+{
+public:
+ VAOHelper(NegativeTestContext& ctx, bool isES)
+ : m_vao(0)
+ , m_ctx(ctx)
+ {
+ // tests need vao only for GL4.5 context
+ if (isES)
+ return;
+
+ m_ctx.glGenVertexArrays(1, &m_vao);
+ m_ctx.glBindVertexArray(m_vao);
+ m_ctx.glVertexAttribPointer(0, 1, GL_BYTE, GL_TRUE, 0, NULL);
+ m_ctx.glEnableVertexAttribArray(0);
+ }
+
+ ~VAOHelper()
+ {
+ if (m_vao)
+ m_ctx.glDeleteVertexArrays(1, &m_vao);
+ }
+
+private:
+ GLuint m_vao;
+ NegativeTestContext& m_ctx;
+};
+
void vertex_attribf (NegativeTestContext& ctx)
{
ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
@@ -127,6 +157,13 @@
void vertex_attrib_pointer (NegativeTestContext& ctx)
{
+ GLuint vao = 0;
+ ctx.glGenVertexArrays(1, &vao);
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ ctx.glBindVertexArray(0);
+ else
+ ctx.glBindVertexArray(vao);
+
ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
ctx.glVertexAttribPointer(0, 1, 0, GL_TRUE, 0, 0);
ctx.expectError(GL_INVALID_ENUM);
@@ -160,9 +197,7 @@
ctx.endSection();
ctx.beginSection("GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
- GLuint vao = 0;
GLbyte offset = 1;
- ctx.glGenVertexArrays(1, &vao);
ctx.glBindVertexArray(vao);
ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
ctx.expectError(GL_NO_ERROR);
@@ -178,6 +213,13 @@
void vertex_attrib_i_pointer (NegativeTestContext& ctx)
{
+ GLuint vao = 0;
+ ctx.glGenVertexArrays(1, &vao);
+ if (glu::isContextTypeES(ctx.getRenderContext().getType()))
+ ctx.glBindVertexArray(0);
+ else
+ ctx.glBindVertexArray(vao);
+
ctx.beginSection("GL_INVALID_ENUM is generated if type is not an accepted value.");
ctx.glVertexAttribIPointer(0, 1, 0, 0, 0);
ctx.expectError(GL_INVALID_ENUM);
@@ -204,9 +246,7 @@
ctx.endSection();
ctx.beginSection("GL_INVALID_OPERATION is generated a non-zero vertex array object is bound, zero is bound to the GL_ARRAY_BUFFER buffer object binding point and the pointer argument is not NULL.");
- GLuint vao = 0;
GLbyte offset = 1;
- ctx.glGenVertexArrays(1, &vao);
ctx.glBindVertexArray(vao);
ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
ctx.expectError(GL_NO_ERROR);
@@ -388,11 +428,13 @@
void draw_arrays (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, glu::isContextTypeES(rc.getType()));
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -422,7 +464,9 @@
void draw_arrays_invalid_program (NegativeTestContext& ctx)
{
- GLuint fbo = 0;
+ GLuint fbo = 0;
+ VAOHelper vao(ctx, glu::isContextTypeES(ctx.getRenderContext().getType()));
+
ctx.glUseProgram(0);
ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
@@ -448,11 +492,13 @@
void draw_arrays_incomplete_primitive (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, glu::isContextTypeES(rc.getType()));
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -482,14 +528,17 @@
void draw_elements (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES = glu::isContextTypeES(rc.getType());
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
GLuint buf = 0;
GLuint tfID = 0;
GLbyte indices[1] = {0};
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, isES);
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -521,7 +570,7 @@
ctx.glDeleteFramebuffers(1, &fbo);
ctx.endSection();
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
+ if (isES && !ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
{
ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
const char* tfVarying = "gl_Position";
@@ -559,8 +608,9 @@
void draw_elements_invalid_program (NegativeTestContext& ctx)
{
ctx.glUseProgram(0);
- GLuint fbo = 0;
- GLbyte indices[1] = {0};
+ GLuint fbo = 0;
+ GLbyte indices[1] = {0};
+ VAOHelper vao(ctx, glu::isContextTypeES(ctx.getRenderContext().getType()));
ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
ctx.glDrawElements(-1, 1, GL_UNSIGNED_BYTE, indices);
@@ -592,14 +642,17 @@
void draw_elements_incomplete_primitive (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ bool isES = glu::isContextTypeES(rc.getType());
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
GLuint buf = 0;
GLuint tfID = 0;
GLbyte indices[1] = {0};
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, isES);
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -631,7 +684,7 @@
ctx.glDeleteFramebuffers(1, &fbo);
ctx.endSection();
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
+ if (isES && !ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
{
ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
const char* tfVarying= "gl_Position";
@@ -666,12 +719,19 @@
ctx.glUseProgram(0);
}
+static bool checkSupport(NegativeTestContext& ctx)
+{
+ return contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5));
+}
+
void draw_elements_base_vertex (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a 3.2 context or higher context version.");
GLuint fbo = 0;
GLuint indices[1] = {0};
+ VAOHelper vao(ctx, glu::isContextTypeES(ctx.getRenderContext().getType()));
ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
ctx.glDrawElementsBaseVertex(-1, 1, GL_UNSIGNED_INT, indices, 1);
@@ -703,7 +763,7 @@
void draw_elements_base_vertex_primitive_mode_mismatch (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a 3.2 context or higher context version.");
GLuint indices[1] = {0};
map<string, string> args;
@@ -722,11 +782,13 @@
void draw_arrays_instanced (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao (ctx, glu::isContextTypeES(rc.getType()));
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -761,7 +823,10 @@
void draw_arrays_instanced_invalid_program (NegativeTestContext& ctx)
{
ctx.glUseProgram(0);
- GLuint fbo = 0;
+
+ GLuint fbo = 0;
+ VAOHelper vao (ctx, glu::isContextTypeES(ctx.getRenderContext().getType()));
+
ctx.glVertexAttribDivisor(0, 1);
ctx.expectError(GL_NO_ERROR);
@@ -790,11 +855,13 @@
void draw_arrays_instanced_incomplete_primitive (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, glu::isContextTypeES(rc.getType()));
ctx.glVertexAttribDivisor(0, 1);
ctx.expectError(GL_NO_ERROR);
@@ -826,14 +893,17 @@
void draw_elements_instanced (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES = glu::isContextTypeES(rc.getType());
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
GLuint buf = 0;
GLuint tfID = 0;
GLbyte indices[1] = {0};
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, isES);
ctx.glUseProgram(program.getProgram());
ctx.glVertexAttribDivisor(0, 1);
@@ -868,7 +938,7 @@
ctx.glDeleteFramebuffers(1, &fbo);
ctx.endSection();
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
+ if (isES && !ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
{
ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
const char* tfVarying = "gl_Position";
@@ -906,8 +976,11 @@
void draw_elements_instanced_invalid_program (NegativeTestContext& ctx)
{
ctx.glUseProgram(0);
+
GLuint fbo = 0;
GLbyte indices[1] = {0};
+ VAOHelper vao(ctx, glu::isContextTypeES(ctx.getRenderContext().getType()));
+
ctx.glVertexAttribDivisor(0, 1);
ctx.expectError(GL_NO_ERROR);
@@ -943,14 +1016,17 @@
void draw_elements_instanced_incomplete_primitive (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES = glu::isContextTypeES(rc.getType());
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
GLuint buf = 0;
GLuint tfID = 0;
GLbyte indices[1] = {0};
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, isES);
ctx.glUseProgram(program.getProgram());
ctx.glVertexAttribDivisor(0, 1);
@@ -985,7 +1061,7 @@
ctx.glDeleteFramebuffers(1, &fbo);
ctx.endSection();
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
+ if (isES && !ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
{
ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
const char* tfVarying= "gl_Position";
@@ -1022,14 +1098,16 @@
void draw_elements_instanced_base_vertex (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a 3.2 context or higher context version.");
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
GLbyte indices[1] = {0};
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, glu::isContextTypeES(rc.getType()));
ctx.glUseProgram(program.getProgram());
ctx.glVertexAttribDivisor(0, 1);
@@ -1069,7 +1147,7 @@
void draw_elements_instanced_base_vertex_primitive_mode_mismatch (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a 3.2 context or higher context version.");
GLuint indices[1] = {0};
map<string, string> args;
@@ -1087,14 +1165,17 @@
void draw_range_elements (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES = glu::isContextTypeES(rc.getType());
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
GLuint buf = 0;
GLuint tfID = 0;
GLbyte indices[1] = {0};
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, isES);
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -1131,7 +1212,7 @@
ctx.glDeleteFramebuffers(1, &fbo);
ctx.endSection();
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
+ if (isES && !ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
{
ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
const char* tfVarying= "gl_Position";
@@ -1169,8 +1250,10 @@
void draw_range_elements_invalid_program (NegativeTestContext& ctx)
{
ctx.glUseProgram(0);
+
GLuint fbo = 0;
GLbyte indices[1] = {0};
+ VAOHelper vao(ctx, glu::isContextTypeES(ctx.getRenderContext().getType()));
ctx.beginSection("GL_INVALID_ENUM is generated if mode is not an accepted value.");
ctx.glDrawRangeElements(-1, 0, 1, 1, GL_UNSIGNED_BYTE, indices);
@@ -1207,7 +1290,9 @@
void draw_range_elements_incomplete_primitive (NegativeTestContext& ctx)
{
- const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ const bool isES = glu::isContextTypeES(rc.getType());
+ const bool isES32 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2));
GLuint fbo = 0;
GLuint buf = 0;
GLuint tfID = 0;
@@ -1215,6 +1300,7 @@
map<string, string> args;
args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, isES);
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -1251,7 +1337,7 @@
ctx.glDeleteFramebuffers(1, &fbo);
ctx.endSection();
- if (!ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
+ if (isES && !ctx.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader")) // GL_EXT_geometry_shader removes error
{
ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is active and not paused.");
const char* tfVarying = "gl_Position";
@@ -1288,13 +1374,15 @@
void draw_range_elements_base_vertex (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a 3.2 context or higher context version.");
GLuint fbo = 0;
GLbyte indices[1] = {0};
map<string, string> args;
args["GLSL_VERSION_STRING"] = getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES);
- glu::ShaderProgram program (ctx.getRenderContext(), glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ const glu::RenderContext& rc = ctx.getRenderContext();
+ glu::ShaderProgram program (rc, glu::makeVtxFragSources(tcu::StringTemplate(vertexShaderSource).specialize(args), tcu::StringTemplate(fragmentShaderSource).specialize(args)));
+ VAOHelper vao(ctx, glu::isContextTypeES(rc.getType()));
ctx.glUseProgram(program.getProgram());
ctx.expectError(GL_NO_ERROR);
@@ -1336,7 +1424,7 @@
void draw_range_elements_base_vertex_primitive_mode_mismatch (NegativeTestContext& ctx)
{
- TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires a 3.2 context or higher context version.");
+ TCU_CHECK_AND_THROW(NotSupportedError, checkSupport(ctx), "This test requires a 3.2 context or higher context version.");
GLuint indices[1] = {0};
map<string, string> args;
diff --git a/modules/gles31/functional/es31fOpaqueTypeIndexingTests.cpp b/modules/gles31/functional/es31fOpaqueTypeIndexingTests.cpp
index de867e5..074117b 100644
--- a/modules/gles31/functional/es31fOpaqueTypeIndexingTests.cpp
+++ b/modules/gles31/functional/es31fOpaqueTypeIndexingTests.cpp
@@ -363,7 +363,10 @@
void SamplerIndexingCase::init (void)
{
- if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ const bool supportsES32 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ hasExtension(m_context.getRenderContext().getFunctions(), glu::ApiType::core(4, 5), "GL_ARB_ES3_2_compatibility");
+
+ if (!supportsES32)
{
if (m_shaderType == SHADERTYPE_GEOMETRY)
TCU_CHECK_AND_THROW(NotSupportedError,
@@ -400,7 +403,8 @@
const char* resultPrefix = "result";
const DataType coordType = getSamplerCoordType(m_samplerType);
const DataType outType = getSamplerOutputType(m_samplerType);
- const bool supportsES32 = contextSupports(renderContext.getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32 = contextSupports(renderContext.getType(), glu::ApiType::es(3, 2)) ||
+ hasExtension(renderContext.getFunctions(), glu::ApiType::core(4, 5), "GL_ARB_ES3_2_compatibility");
std::ostringstream global;
std::ostringstream code;
@@ -736,7 +740,10 @@
void BlockArrayIndexingCase::init (void)
{
- if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ const bool supportsES32 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ hasExtension(m_context.getRenderContext().getFunctions(), glu::ApiType::core(4, 5), "GL_ARB_ES3_2_compatibility");
+
+ if (!supportsES32)
{
if (m_shaderType == SHADERTYPE_GEOMETRY)
TCU_CHECK_AND_THROW(NotSupportedError,
@@ -786,7 +793,8 @@
const char* resultPrefix = "result";
const char* interfaceName = m_blockType == BLOCKTYPE_UNIFORM ? "uniform" : "buffer";
const char* layout = m_blockType == BLOCKTYPE_UNIFORM ? "std140" : "std430";
- const bool supportsES32 = contextSupports(renderContext.getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32 = contextSupports(renderContext.getType(), glu::ApiType::es(3, 2)) ||
+ hasExtension(renderContext.getFunctions(), glu::ApiType::core(4, 5), "GL_ARB_ES3_2_compatibility");
std::ostringstream global;
std::ostringstream code;
@@ -982,7 +990,10 @@
void AtomicCounterIndexingCase::init (void)
{
- if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ const bool supportsES32 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ hasExtension(m_context.getRenderContext().getFunctions(), glu::ApiType::core(4, 5), "GL_ARB_ES3_2_compatibility");
+
+ if (!supportsES32)
{
if (m_shaderType == SHADERTYPE_GEOMETRY)
TCU_CHECK_AND_THROW(NotSupportedError,
@@ -1016,7 +1027,8 @@
{
const char* indicesPrefix = "index";
const char* resultPrefix = "result";
- const bool supportsES32 = contextSupports(renderContext.getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32 = contextSupports(renderContext.getType(), glu::ApiType::es(3, 2)) ||
+ hasExtension(renderContext.getFunctions(), glu::ApiType::core(4, 5), "GL_ARB_ES3_2_compatibility");
std::ostringstream global;
std::ostringstream code;
diff --git a/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp b/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp
index c31d754..c18029e 100644
--- a/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp
+++ b/modules/gles31/functional/es31fProgramInterfaceDefinitionUtil.cpp
@@ -218,6 +218,9 @@
static std::string getShaderExtensionDeclarations (const ProgramInterfaceDefinition::Shader* shader)
{
+ if (shader->getVersion() > glu::GLSL_VERSION_440)
+ return "";
+
std::vector<std::string> extensions;
std::ostringstream buf;
@@ -239,11 +242,16 @@
return buf.str();
}
-static std::string getShaderTypeDeclarations (const ProgramInterfaceDefinition::Program* program, glu::ShaderType type)
+static std::string getShaderTypeDeclarations (const ProgramInterfaceDefinition::Program* program, const ProgramInterfaceDefinition::Shader* shader)
{
+ glu::ShaderType type = shader->getType();
+ auto isCoreGL = (shader->getVersion() > glu::GLSL_VERSION_440);
+
switch (type)
{
case glu::SHADERTYPE_VERTEX:
+ if (isCoreGL)
+ return "out gl_PerVertex { vec4 gl_Position; };\n";
return "";
case glu::SHADERTYPE_FRAGMENT:
@@ -254,6 +262,11 @@
std::ostringstream buf;
buf << "layout(points) in;\n"
"layout(points, max_vertices=" << program->getGeometryNumOutputVertices() << ") out;\n";
+ if (isCoreGL)
+ {
+ buf << "in gl_PerVertex { vec4 gl_Position; } gl_in[];\n"
+ "out gl_PerVertex { vec4 gl_Position; };\n";
+ }
return buf.str();
}
@@ -261,11 +274,25 @@
{
std::ostringstream buf;
buf << "layout(vertices=" << program->getTessellationNumOutputPatchVertices() << ") out;\n";
+ if (isCoreGL)
+ {
+ buf << "in gl_PerVertex { vec4 gl_Position; } gl_in[];\n"
+ "out gl_PerVertex { vec4 gl_Position; } gl_out[];\n";
+ }
return buf.str();
}
case glu::SHADERTYPE_TESSELLATION_EVALUATION:
- return "layout(triangles, point_mode) in;\n";
+ {
+ std::ostringstream buf;
+ if (isCoreGL)
+ {
+ buf << "in gl_PerVertex { vec4 gl_Position; } gl_in[];\n"
+ "out gl_PerVertex { vec4 gl_Position; };\n";
+ }
+ buf << "layout(triangles, point_mode) in;\n";
+ return buf.str();
+ }
case glu::SHADERTYPE_COMPUTE:
return "layout(local_size_x=1) in;\n";
@@ -1506,7 +1533,7 @@
sourceBuf << glu::getGLSLVersionDeclaration(shader->getVersion()) << "\n"
<< getShaderExtensionDeclarations(shader)
- << getShaderTypeDeclarations(program, shader->getType())
+ << getShaderTypeDeclarations(program, shader)
<< "\n";
// Struct definitions
diff --git a/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp b/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp
index 4b3d732..2362420 100644
--- a/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp
+++ b/modules/gles31/functional/es31fProgramInterfaceQueryTestCase.cpp
@@ -203,7 +203,8 @@
bool PropValidator::isSupported (void) const
{
- if(glu::contextSupports(m_renderContext.getType(), glu::ApiType::es(3, 2)))
+ if(glu::contextSupports(m_renderContext.getType(), glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(m_renderContext.getType(), glu::ApiType::core(4, 5)))
return true;
return m_extension == DE_NULL || m_contextInfo.isExtensionSupported(m_extension);
}
@@ -2086,12 +2087,17 @@
const ProgramInterfaceDefinition::Program* programDefinition = getProgramDefinition();
DE_ASSERT(programDefinition->isValid());
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto type = m_context.getRenderContext().getType();
+ if (glu::contextSupports(type, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(type, glu::ApiType::core(4, 5)))
+ {
+ return programDefinition;
+ }
if (programDefinition->hasStage(glu::SHADERTYPE_TESSELLATION_CONTROL) ||
programDefinition->hasStage(glu::SHADERTYPE_TESSELLATION_EVALUATION))
{
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
throw tcu::NotSupportedError("Test requires GL_EXT_tessellation_shader extension");
}
@@ -2099,19 +2105,19 @@
// before query. However, we don't want IS_PER_PATCH-specific tests to become noop and pass.
if (m_queryTarget.propFlags == PROGRAMRESOURCEPROP_IS_PER_PATCH)
{
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
throw tcu::NotSupportedError("Test requires GL_EXT_tessellation_shader extension");
}
if (programDefinition->hasStage(glu::SHADERTYPE_GEOMETRY))
{
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
throw tcu::NotSupportedError("Test requires GL_EXT_geometry_shader extension");
}
if (programContainsIOBlocks(programDefinition))
{
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_shader_io_blocks"))
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_shader_io_blocks"))
throw tcu::NotSupportedError("Test requires GL_EXT_shader_io_blocks extension");
}
diff --git a/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp b/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
index 67fd5a8..d2bb749 100644
--- a/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
+++ b/modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp
@@ -209,6 +209,13 @@
return glu::SHADERTYPE_LAST;
}
+static bool checkSupport(Context& ctx)
+{
+ auto ctxType = ctx.getRenderContext().getType();
+ return contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ contextSupports(ctxType, glu::ApiType::core(4, 5));
+}
+
static std::string specializeShader(Context& context, const char* code)
{
const glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(context.getRenderContext().getType());
@@ -922,20 +929,20 @@
void ResourceListTestCase::init (void)
{
m_programDefinition = generateProgramDefinitionFromResource(m_targetResource.get()).release();
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = checkSupport(m_context);
if ((m_programDefinition->hasStage(glu::SHADERTYPE_TESSELLATION_CONTROL) || m_programDefinition->hasStage(glu::SHADERTYPE_TESSELLATION_EVALUATION)) &&
- !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
+ !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
{
throw tcu::NotSupportedError("Test requires GL_EXT_tessellation_shader extension");
}
if (m_programDefinition->hasStage(glu::SHADERTYPE_GEOMETRY) &&
- !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
+ !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
{
throw tcu::NotSupportedError("Test requires GL_EXT_geometry_shader extension");
}
if (programContainsIOBlocks(m_programDefinition) &&
- !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_shader_io_blocks"))
+ !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_shader_io_blocks"))
{
throw tcu::NotSupportedError("Test requires GL_EXT_shader_io_blocks extension");
}
@@ -2715,11 +2722,11 @@
const deUint32 tessellationMask = (1 << glu::SHADERTYPE_TESSELLATION_CONTROL) | (1 << glu::SHADERTYPE_TESSELLATION_EVALUATION);
glu::VariableDeclaration atomicVar (glu::VarType(glu::TYPE_UINT_ATOMIC_COUNTER, glu::PRECISION_LAST), "targetCounter", glu::STORAGE_UNIFORM);
const glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType());
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = checkSupport(m_context);
- if ((m_presentStagesMask & tessellationMask) != 0 && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
+ if ((m_presentStagesMask & tessellationMask) != 0 && !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
throw tcu::NotSupportedError("Test requires GL_EXT_tessellation_shader extension");
- if ((m_presentStagesMask & geometryMask) != 0 && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
+ if ((m_presentStagesMask & geometryMask) != 0 && !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
throw tcu::NotSupportedError("Test requires GL_EXT_geometry_shader extension");
atomicVar.layout.binding = 1;
@@ -2751,7 +2758,9 @@
AtomicCounterReferencedByCase::IterateResult AtomicCounterReferencedByCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const glu::RenderContext& rc = m_context.getRenderContext();
+ const bool isES32orGL45 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(rc.getType(), glu::ApiType::core(4, 5));
const struct
{
@@ -2763,16 +2772,16 @@
{ GL_REFERENCED_BY_VERTEX_SHADER, glu::SHADERTYPE_VERTEX, DE_NULL },
{ GL_REFERENCED_BY_FRAGMENT_SHADER, glu::SHADERTYPE_FRAGMENT, DE_NULL },
{ GL_REFERENCED_BY_COMPUTE_SHADER, glu::SHADERTYPE_COMPUTE, DE_NULL },
- { GL_REFERENCED_BY_TESS_CONTROL_SHADER, glu::SHADERTYPE_TESSELLATION_CONTROL, (supportsES32 ? DE_NULL : "GL_EXT_tessellation_shader") },
- { GL_REFERENCED_BY_TESS_EVALUATION_SHADER, glu::SHADERTYPE_TESSELLATION_EVALUATION, (supportsES32 ? DE_NULL : "GL_EXT_tessellation_shader") },
- { GL_REFERENCED_BY_GEOMETRY_SHADER, glu::SHADERTYPE_GEOMETRY, (supportsES32 ? DE_NULL : "GL_EXT_geometry_shader") },
+ { GL_REFERENCED_BY_TESS_CONTROL_SHADER, glu::SHADERTYPE_TESSELLATION_CONTROL, (isES32orGL45 ? DE_NULL : "GL_EXT_tessellation_shader") },
+ { GL_REFERENCED_BY_TESS_EVALUATION_SHADER, glu::SHADERTYPE_TESSELLATION_EVALUATION, (isES32orGL45 ? DE_NULL : "GL_EXT_tessellation_shader") },
+ { GL_REFERENCED_BY_GEOMETRY_SHADER, glu::SHADERTYPE_GEOMETRY, (isES32orGL45 ? DE_NULL : "GL_EXT_geometry_shader") },
};
- const glw::Functions& gl = m_context.getRenderContext().getFunctions();
- const glu::ShaderProgram program (m_context.getRenderContext(), generateProgramInterfaceProgramSources(m_program));
+ const glw::Functions& gl = rc.getFunctions();
+ const glu::ShaderProgram program (rc, generateProgramInterfaceProgramSources(m_program));
m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
- checkAndLogProgram(program, m_program, m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
+ checkAndLogProgram(program, m_program, rc.getFunctions(), m_testCtx.getLog());
// check props
for (int propNdx = 0; propNdx < DE_LENGTH_OF_ARRAY(targetProps); ++propNdx)
@@ -2864,11 +2873,11 @@
const bool hasGeometryShader = (m_caseType == CASE_VERTEX_GEO_FRAGMENT) ||
(m_caseType == CASE_VERTEX_TESS_GEO_FRAGMENT) ||
(m_caseType == CASE_SEPARABLE_GEOMETRY);
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = checkSupport(m_context);
- if (hasTessellationShader && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
+ if (hasTessellationShader && !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
throw tcu::NotSupportedError("Test requires GL_EXT_tessellation_shader extension");
- if (hasGeometryShader && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
+ if (hasGeometryShader && !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
throw tcu::NotSupportedError("Test requires GL_EXT_geometry_shader extension");
glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType());
@@ -5036,7 +5045,7 @@
}
}
-static void generateProgramInputOutputShaderCaseBlocks (Context& context, tcu::TestCaseGroup* targetGroup, glu::GLSLVersion glslVersion, bool withCompute, bool inputCase, void (*blockContentGenerator)(Context&, const ResourceDefinition::Node::SharedPtr&, tcu::TestCaseGroup*, deUint32))
+static void generateProgramInputOutputShaderCaseBlocks (Context& context, tcu::TestCaseGroup* targetGroup, glu::GLSLVersion glslVersion, bool withCompute, bool inputCase, bool isGL45, void (*blockContentGenerator)(Context&, const ResourceDefinition::Node::SharedPtr&, tcu::TestCaseGroup*, deUint32, bool))
{
static const struct
{
@@ -5064,7 +5073,7 @@
targetGroup->addChild(blockGroup);
- blockContentGenerator(context, defaultBlock, blockGroup, (1 << glu::SHADERTYPE_VERTEX) | (1 << glu::SHADERTYPE_FRAGMENT));
+ blockContentGenerator(context, defaultBlock, blockGroup, (1 << glu::SHADERTYPE_VERTEX) | (1 << glu::SHADERTYPE_FRAGMENT), isGL45);
}
// .separable_*
@@ -5076,7 +5085,7 @@
const ResourceDefinition::Node::SharedPtr defaultBlock (new ResourceDefinition::DefaultBlock(shader));
targetGroup->addChild(blockGroup);
- blockContentGenerator(context, defaultBlock, blockGroup, (1 << singleStageCases[ndx].stage));
+ blockContentGenerator(context, defaultBlock, blockGroup, (1 << singleStageCases[ndx].stage), isGL45);
}
// .compute
@@ -5089,7 +5098,7 @@
targetGroup->addChild(blockGroup);
- blockContentGenerator(context, defaultBlock, blockGroup, (1 << glu::SHADERTYPE_COMPUTE));
+ blockContentGenerator(context, defaultBlock, blockGroup, (1 << glu::SHADERTYPE_COMPUTE), isGL45);
}
// .interface_blocks
@@ -5148,7 +5157,7 @@
ioBlockGroup->addChild(blockGroup);
- blockContentGenerator(context, block, blockGroup, (1 << shaderType));
+ blockContentGenerator(context, block, blockGroup, (1 << shaderType), isGL45);
}
// .named_block_explicit_location
@@ -5159,17 +5168,18 @@
ioBlockGroup->addChild(blockGroup);
- blockContentGenerator(context, block, blockGroup, (1 << shaderType));
+ blockContentGenerator(context, block, blockGroup, (1 << shaderType), isGL45);
}
// .unnamed_block
+ if (!isGL45)
{
const ResourceDefinition::Node::SharedPtr block (new ResourceDefinition::InterfaceBlock(storage, false));
tcu::TestCaseGroup* const blockGroup = new TestCaseGroup(context, "unnamed_block", "Unnamed block");
ioBlockGroup->addChild(blockGroup);
- blockContentGenerator(context, block, blockGroup, (1 << shaderType));
+ blockContentGenerator(context, block, blockGroup, (1 << shaderType), isGL45);
}
// .block_array
@@ -5180,7 +5190,7 @@
ioBlockGroup->addChild(blockGroup);
- blockContentGenerator(context, block, blockGroup, (1 << shaderType));
+ blockContentGenerator(context, block, blockGroup, (1 << shaderType), isGL45);
}
}
}
@@ -5394,13 +5404,15 @@
targetGroup->addChild(resourceListCase);
}
-static void generateProgramInputResourceListBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramInputResourceListBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
+ DE_UNREF(isGL45);
generateProgramInputBlockContents(context, parentStructure, targetGroup, presentShadersMask, true, addProgramInputOutputResourceListCase);
}
-static void generateProgramOutputResourceListBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramOutputResourceListBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
+ DE_UNREF(isGL45);
generateProgramOutputBlockContents(context, parentStructure, targetGroup, presentShadersMask, true, addProgramInputOutputResourceListCase);
}
@@ -5412,19 +5424,22 @@
}
template <ProgramResourcePropFlags TargetProp>
-static void generateProgramInputBasicBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramInputBasicBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
+ DE_UNREF(isGL45);
generateProgramInputBlockContents(context, parentStructure, targetGroup, presentShadersMask, false, addProgramInputOutputResourceTestCase<TargetProp>);
}
template <ProgramResourcePropFlags TargetProp>
-static void generateProgramOutputBasicBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramOutputBasicBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
+ DE_UNREF(isGL45);
generateProgramOutputBlockContents(context, parentStructure, targetGroup, presentShadersMask, false, addProgramInputOutputResourceTestCase<TargetProp>);
}
-static void generateProgramInputLocationBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramInputLocationBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
+ DE_UNREF(isGL45);
const bool inDefaultBlock = parentStructure->getType() == ResourceDefinition::Node::TYPE_DEFAULT_BLOCK;
const ResourceDefinition::Node::SharedPtr input = (inDefaultBlock)
? (ResourceDefinition::Node::SharedPtr(new ResourceDefinition::StorageQualifier(parentStructure, glu::STORAGE_IN)))
@@ -5573,7 +5588,7 @@
DE_ASSERT(false);
}
-static void generateProgramOutputLocationBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramOutputLocationBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
const bool inDefaultBlock = parentStructure->getType() == ResourceDefinition::Node::TYPE_DEFAULT_BLOCK;
const ResourceDefinition::Node::SharedPtr output = (inDefaultBlock)
@@ -5581,6 +5596,8 @@
: (parentStructure);
const glu::ShaderType lastStage = getShaderMaskLastStage(presentShadersMask);
+ const bool inBlockArray = 0 == deStringEqual("block_array", targetGroup->getName());
+
if (lastStage == glu::SHADERTYPE_VERTEX ||
lastStage == glu::SHADERTYPE_GEOMETRY ||
lastStage == glu::SHADERTYPE_TESSELLATION_EVALUATION ||
@@ -5592,6 +5609,7 @@
targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_PROGRAM_OUTPUT, PROGRAMRESOURCEPROP_LOCATION), "var"));
}
// .var_explicit_location
+ if (!(isGL45 && inBlockArray))
{
const ResourceDefinition::Node::SharedPtr layout (new ResourceDefinition::LayoutQualifier(output, glu::Layout(2)));
const ResourceDefinition::Node::SharedPtr variable (new ResourceDefinition::Variable(layout, glu::TYPE_FLOAT_VEC4));
@@ -5604,6 +5622,7 @@
targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_PROGRAM_OUTPUT, PROGRAMRESOURCEPROP_LOCATION), "var_struct"));
}
// .var_struct_explicit_location
+ if (!(isGL45 && inBlockArray))
{
const ResourceDefinition::Node::SharedPtr layout (new ResourceDefinition::LayoutQualifier(output, glu::Layout(2)));
const ResourceDefinition::Node::SharedPtr structMbr (new ResourceDefinition::StructMember(layout));
@@ -5617,6 +5636,7 @@
targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_PROGRAM_OUTPUT, PROGRAMRESOURCEPROP_LOCATION), "var_array"));
}
// .var_array_explicit_location
+ if (!(isGL45 && inBlockArray))
{
const ResourceDefinition::Node::SharedPtr layout (new ResourceDefinition::LayoutQualifier(output, glu::Layout(2)));
const ResourceDefinition::Node::SharedPtr arrayElem (new ResourceDefinition::ArrayElement(layout));
@@ -5632,6 +5652,7 @@
targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_PROGRAM_OUTPUT, PROGRAMRESOURCEPROP_LOCATION), "var"));
}
// .var_explicit_location
+ if (!(isGL45 && inBlockArray))
{
const ResourceDefinition::Node::SharedPtr layout (new ResourceDefinition::LayoutQualifier(output, glu::Layout(2)));
const ResourceDefinition::Node::SharedPtr variable (new ResourceDefinition::Variable(layout, glu::TYPE_FLOAT_VEC4));
@@ -5644,6 +5665,7 @@
targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_PROGRAM_OUTPUT, PROGRAMRESOURCEPROP_LOCATION), "var_array"));
}
// .var_array_explicit_location
+ if (!(isGL45 && inBlockArray))
{
const ResourceDefinition::Node::SharedPtr layout (new ResourceDefinition::LayoutQualifier(output, glu::Layout(1)));
const ResourceDefinition::Node::SharedPtr arrayElem (new ResourceDefinition::ArrayElement(layout));
@@ -5788,8 +5810,9 @@
}
}
-static void generateProgramInputTypeBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramInputTypeBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
+ DE_UNREF(isGL45);
const bool inDefaultBlock = parentStructure->getType() == ResourceDefinition::Node::TYPE_DEFAULT_BLOCK;
const ResourceDefinition::Node::SharedPtr input = (inDefaultBlock)
? (ResourceDefinition::Node::SharedPtr(new ResourceDefinition::StorageQualifier(parentStructure, glu::STORAGE_IN)))
@@ -5884,8 +5907,9 @@
DE_ASSERT(false);
}
-static void generateProgramOutputTypeBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask)
+static void generateProgramOutputTypeBlockContents (Context& context, const ResourceDefinition::Node::SharedPtr& parentStructure, tcu::TestCaseGroup* targetGroup, deUint32 presentShadersMask, bool isGL45)
{
+ DE_UNREF(isGL45);
const bool inDefaultBlock = parentStructure->getType() == ResourceDefinition::Node::TYPE_DEFAULT_BLOCK;
const ResourceDefinition::Node::SharedPtr output = (inDefaultBlock)
? (ResourceDefinition::Node::SharedPtr(new ResourceDefinition::StorageQualifier(parentStructure, glu::STORAGE_OUT)))
@@ -5992,12 +6016,16 @@
class ProgramInputTestGroup : public TestCaseGroup
{
public:
- ProgramInputTestGroup (Context& context);
+ ProgramInputTestGroup (Context& context, bool is_GL45);
void init (void);
+
+private:
+ bool m_isGL45;
};
-ProgramInputTestGroup::ProgramInputTestGroup (Context& context)
+ProgramInputTestGroup::ProgramInputTestGroup (Context& context, bool is_GL45)
: TestCaseGroup(context, "program_input", "Program input")
+ , m_isGL45(is_GL45)
{
}
@@ -6009,28 +6037,28 @@
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "resource_list", "Resource list");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, true, true, generateProgramInputResourceListBlockContents);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, true, true, m_isGL45, generateProgramInputResourceListBlockContents);
}
// .array_size
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "array_size", "Array size");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, generateProgramInputBasicBlockContents<PROGRAMRESOURCEPROP_ARRAY_SIZE>);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, m_isGL45, generateProgramInputBasicBlockContents<PROGRAMRESOURCEPROP_ARRAY_SIZE>);
}
// .location
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "location", "Location");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, generateProgramInputLocationBlockContents);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, m_isGL45, generateProgramInputLocationBlockContents);
}
// .name_length
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "name_length", "Name length");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, generateProgramInputBasicBlockContents<PROGRAMRESOURCEPROP_NAME_LENGTH>);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, m_isGL45, generateProgramInputBasicBlockContents<PROGRAMRESOURCEPROP_NAME_LENGTH>);
}
// .referenced_by
@@ -6044,26 +6072,30 @@
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "type", "Type");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, generateProgramInputTypeBlockContents);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, m_isGL45, generateProgramInputTypeBlockContents);
}
// .is_per_patch
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "is_per_patch", "Is per patch");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, generateProgramInputBasicBlockContents<PROGRAMRESOURCEPROP_IS_PER_PATCH>);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, true, m_isGL45, generateProgramInputBasicBlockContents<PROGRAMRESOURCEPROP_IS_PER_PATCH>);
}
}
class ProgramOutputTestGroup : public TestCaseGroup
{
public:
- ProgramOutputTestGroup (Context& context);
+ ProgramOutputTestGroup (Context& context, bool is_GL45);
void init (void);
+
+private:
+ bool m_isGL45;
};
-ProgramOutputTestGroup::ProgramOutputTestGroup (Context& context)
+ProgramOutputTestGroup::ProgramOutputTestGroup (Context& context, bool is_GL45)
: TestCaseGroup(context, "program_output", "Program output")
+ , m_isGL45(is_GL45)
{
}
@@ -6075,28 +6107,28 @@
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "resource_list", "Resource list");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, true, false, generateProgramOutputResourceListBlockContents);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, true, false, m_isGL45, generateProgramOutputResourceListBlockContents);
}
// .array_size
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "array_size", "Array size");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, generateProgramOutputBasicBlockContents<PROGRAMRESOURCEPROP_ARRAY_SIZE>);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, m_isGL45, generateProgramOutputBasicBlockContents<PROGRAMRESOURCEPROP_ARRAY_SIZE>);
}
// .location
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "location", "Location");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, generateProgramOutputLocationBlockContents);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, m_isGL45, generateProgramOutputLocationBlockContents);
}
// .name_length
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "name_length", "Name length");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, generateProgramOutputBasicBlockContents<PROGRAMRESOURCEPROP_NAME_LENGTH>);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, m_isGL45, generateProgramOutputBasicBlockContents<PROGRAMRESOURCEPROP_NAME_LENGTH>);
}
// .referenced_by
@@ -6110,14 +6142,14 @@
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "type", "Type");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, generateProgramOutputTypeBlockContents);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, m_isGL45, generateProgramOutputTypeBlockContents);
}
// .is_per_patch
{
tcu::TestCaseGroup* const blockGroup = new tcu::TestCaseGroup(m_testCtx, "is_per_patch", "Is per patch");
addChild(blockGroup);
- generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, generateProgramOutputBasicBlockContents<PROGRAMRESOURCEPROP_IS_PER_PATCH>);
+ generateProgramInputOutputShaderCaseBlocks(m_context, blockGroup, glslVersion, false, false, m_isGL45, generateProgramOutputBasicBlockContents<PROGRAMRESOURCEPROP_IS_PER_PATCH>);
}
}
@@ -7021,8 +7053,9 @@
} // anonymous
-ProgramInterfaceQueryTests::ProgramInterfaceQueryTests (Context& context)
+ProgramInterfaceQueryTests::ProgramInterfaceQueryTests (Context& context, bool is_GL45)
: TestCaseGroup(context, "program_interface_query", "Program interface query tests")
+ , m_isGL45 (is_GL45)
{
}
@@ -7056,10 +7089,10 @@
addChild(new AtomicCounterTestGroup(m_context));
// .program_input
- addChild(new ProgramInputTestGroup(m_context));
+ addChild(new ProgramInputTestGroup(m_context, m_isGL45));
// .program_output
- addChild(new ProgramOutputTestGroup(m_context));
+ addChild(new ProgramOutputTestGroup(m_context, m_isGL45));
// .transform_feedback_varying
addChild(new TransformFeedbackVaryingTestGroup(m_context));
diff --git a/modules/gles31/functional/es31fProgramInterfaceQueryTests.hpp b/modules/gles31/functional/es31fProgramInterfaceQueryTests.hpp
index 29621ed..ce38cc4 100644
--- a/modules/gles31/functional/es31fProgramInterfaceQueryTests.hpp
+++ b/modules/gles31/functional/es31fProgramInterfaceQueryTests.hpp
@@ -36,7 +36,7 @@
class ProgramInterfaceQueryTests : public TestCaseGroup
{
public:
- ProgramInterfaceQueryTests (Context& context);
+ ProgramInterfaceQueryTests (Context& context, bool is_GL45);
~ProgramInterfaceQueryTests (void);
void init (void);
@@ -44,6 +44,8 @@
private:
ProgramInterfaceQueryTests (const ProgramInterfaceQueryTests& other);
ProgramInterfaceQueryTests& operator= (const ProgramInterfaceQueryTests& other);
+
+ bool m_isGL45;
};
} // Functional
diff --git a/modules/gles31/functional/es31fSRGBDecodeTests.cpp b/modules/gles31/functional/es31fSRGBDecodeTests.cpp
index 9a6cdf4..6eb22a4 100644
--- a/modules/gles31/functional/es31fSRGBDecodeTests.cpp
+++ b/modules/gles31/functional/es31fSRGBDecodeTests.cpp
@@ -618,7 +618,8 @@
const int totalShaderStages = 2;
// default vertex shader used in all tests
- m_shaderVertex = "#version 310 es \n"
+ std::string ver(glu::isContextTypeGLCore(m_context.getRenderContext().getType()) ? "#version 450\n" : "#version 310 es\n");
+ m_shaderVertex = ver +
"layout (location = 0) in mediump vec3 aPosition; \n"
"layout (location = 1) in mediump vec2 aTexCoord; \n"
"out mediump vec2 vs_aTexCoord; \n"
@@ -789,7 +790,7 @@
// fragment shader cannot contain more outputs than the number of texture uniforms
DE_ASSERT( !(static_cast<int>(m_shaderFragmentParameters.outputTotal) > static_cast<int>(m_shaderFragmentParameters.uniformTotal)) ) ;
- source << "#version 310 es \n"
+ source << (glu::isContextTypeGLCore(m_context.getRenderContext().getType()) ? "#version 450\n" : "#version 310 es\n")
<< "in mediump vec2 vs_aTexCoord; \n";
for (int output = 0; output < m_shaderFragmentParameters.outputTotal; output++)
@@ -945,6 +946,8 @@
void SRGBTestCase::init (void)
{
+ const glw::Functions& gl = m_context.getRenderContext().getFunctions();
+
// extension requirements for test
if ( (glu::getInternalFormat(m_internalFormat) == GL_SRGB8_ALPHA8) && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_sRGB_decode") )
{
@@ -957,6 +960,11 @@
}
m_framebuffer = de::MovePtr<glu::Framebuffer>(new glu::Framebuffer(m_context.getRenderContext()));
+
+ if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
+ {
+ gl.enable(GL_FRAMEBUFFER_SRGB);
+ }
}
void SRGBTestCase::deinit (void)
@@ -971,6 +979,11 @@
}
m_renderBufferList.clear();
+ if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
+ {
+ gl.disable(GL_FRAMEBUFFER_SRGB);
+ }
+
for (std::size_t textureSourceIdx = 0; textureSourceIdx < m_textureSourceList.size(); textureSourceIdx++)
{
delete m_textureSourceList[textureSourceIdx];
diff --git a/modules/gles31/functional/es31fSampleShadingTests.cpp b/modules/gles31/functional/es31fSampleShadingTests.cpp
index 4a89947..313d1bb 100644
--- a/modules/gles31/functional/es31fSampleShadingTests.cpp
+++ b/modules/gles31/functional/es31fSampleShadingTests.cpp
@@ -47,6 +47,14 @@
namespace
{
+static bool checkSupport(Context& ctx)
+{
+ auto contextType = ctx.getRenderContext().getType();
+ return contextSupports(contextType, glu::ApiType::es(3, 2)) ||
+ contextSupports(contextType, glu::ApiType::core(4, 5)) ||
+ ctx.getContextInfo().isExtensionSupported("GL_OES_sample_shading");
+}
+
using namespace gls::StateQueryUtil;
class SampleShadingStateCase : public TestCase
@@ -69,7 +77,7 @@
void SampleShadingStateCase::init (void)
{
- if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_OES_sample_shading extension or a context version 3.2 or higher.");
}
@@ -120,7 +128,7 @@
void MinSampleShadingValueCase::init (void)
{
- if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_OES_sample_shading extension or a context version 3.2 or higher.");
}
@@ -187,7 +195,7 @@
void MinSampleShadingValueClampingCase::init (void)
{
- if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_OES_sample_shading extension or a context version 3.2 or higher.");
}
@@ -274,8 +282,7 @@
void SampleShadingRenderingCase::init (void)
{
// requirements
-
- if (!contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_OES_sample_shading extension or a context version 3.2 or higher.");
if (m_renderTarget == TARGET_DEFAULT && m_context.getRenderTarget().getNumSamples() <= 1)
throw tcu::NotSupportedError("Multisampled default framebuffer required");
diff --git a/modules/gles31/functional/es31fSampleVariableTests.cpp b/modules/gles31/functional/es31fSampleVariableTests.cpp
index 4bca9ef..c6dc33a 100644
--- a/modules/gles31/functional/es31fSampleVariableTests.cpp
+++ b/modules/gles31/functional/es31fSampleVariableTests.cpp
@@ -276,8 +276,9 @@
void MultisampleRenderCase::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_variables"))
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
+ if (!supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_variables"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_sample_variables extension or a context version 3.2 or higher.");
MultisampleShaderRenderUtil::MultisampleRenderCase::init();
@@ -920,9 +921,12 @@
void SamplePosCorrectnessCase::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
+
// requirements: per-invocation interpolation required
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") &&
+ if (!isES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") &&
!m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation or GL_OES_sample_shading extension or a context version 3.2 or higher.");
@@ -971,11 +975,14 @@
{
DE_UNREF(numTargetSamples);
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2));
+ const bool isGL45 = glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
+
std::ostringstream buf;
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
map<string, string> args;
- args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_EXTENSION"] = supportsES32 ? "" : m_useSampleQualifier ? "#extension GL_OES_shader_multisample_interpolation : require" : "";
+ args["GLSL_VERSION_DECL"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
+ args["GLSL_EXTENSION"] = (isES32 || isGL45) ? "" : m_useSampleQualifier ? "#extension GL_OES_shader_multisample_interpolation : require" : "";
buf << "${GLSL_VERSION_DECL}\n"
"${GLSL_EXTENSION}\n"
@@ -1078,9 +1085,10 @@
void SampleMaskBaseCase::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
// required extra extension
- if (m_runMode == RUN_PER_TWO_SAMPLES && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
+ if (m_runMode == RUN_PER_TWO_SAMPLES && !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_sample_shading extension or a context version 3.2 or higher.");
MultisampleRenderCase::init();
@@ -1208,10 +1216,11 @@
const bool multisampleTarget = (m_numRequestedSamples > 0) || (m_renderTarget == TARGET_DEFAULT && m_context.getRenderTarget().getNumSamples() > 1);
std::ostringstream buf;
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
map<string, string> args;
- args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_EXTENSION"] = supportsES32 ? "" : "#extension GL_OES_sample_variables : require";
+ args["GLSL_VERSION_DECL"] = supportsES32orGL45 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
+ args["GLSL_EXTENSION"] = supportsES32orGL45 ? "" : "#extension GL_OES_sample_variables : require";
// test supports only one sample mask word
if (numTargetSamples > 32)
@@ -1367,10 +1376,11 @@
DE_ASSERT(numTargetSamples != 0);
std::ostringstream buf;
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
map<string, string> args;
- args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_EXTENSION"] = supportsES32 ? "" : "#extension GL_OES_sample_variables : require";
+ args["GLSL_VERSION_DECL"] = supportsES32orGL45 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
+ args["GLSL_EXTENSION"] = supportsES32orGL45 ? "" : "#extension GL_OES_sample_variables : require";
// test supports only one sample mask word
if (numTargetSamples > 32)
@@ -1468,10 +1478,11 @@
DE_ASSERT(numTargetSamples != 0);
std::ostringstream buf;
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
map<string, string> args;
- args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_EXTENSION"] = supportsES32 ? "" : "#extension GL_OES_sample_variables : require";
+ args["GLSL_VERSION_DECL"] = supportsES32orGL45 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
+ args["GLSL_EXTENSION"] = supportsES32orGL45 ? "" : "#extension GL_OES_sample_variables : require";
// test supports only one sample mask word
if (numTargetSamples > 32)
@@ -1711,10 +1722,11 @@
DE_ASSERT(numTargetSamples != 0);
std::ostringstream buf;
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
map<string, string> args;
- args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_EXTENSION"] = supportsES32 ? "" : "#extension GL_OES_sample_variables : require";
+ args["GLSL_VERSION_DECL"] = supportsES32orGL45 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
+ args["GLSL_EXTENSION"] = supportsES32orGL45 ? "" : "#extension GL_OES_sample_variables : require";
// test supports only one sample mask word
if (numTargetSamples > 32)
@@ -2081,10 +2093,11 @@
DE_UNREF(numTargetSamples);
std::ostringstream buf;
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
map<string, string> args;
- args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
- args["GLSL_EXTENSION"] = supportsES32 ? "" : "#extension GL_OES_sample_variables : require";
+ args["GLSL_VERSION_DECL"] = supportsES32orGL45 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) : getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
+ args["GLSL_EXTENSION"] = supportsES32orGL45 ? "" : "#extension GL_OES_sample_variables : require";
if (m_testMode == TEST_DISCARD)
{
diff --git a/modules/gles31/functional/es31fSeparateShaderTests.cpp b/modules/gles31/functional/es31fSeparateShaderTests.cpp
index dea33ce..87379f7 100644
--- a/modules/gles31/functional/es31fSeparateShaderTests.cpp
+++ b/modules/gles31/functional/es31fSeparateShaderTests.cpp
@@ -1316,12 +1316,23 @@
Random rnd (seed > 0 ? seed : m_rnd.getUint32());
Rectangle viewport = randomViewport(renderCtx, rnd,
VIEWPORT_SIZE, VIEWPORT_SIZE);
+ deUint32 vao = 0;
+
+ if (!glu::isContextTypeES(renderCtx.getType()))
+ {
+ glGenVertexArrays(1, &vao);
+ glBindVertexArray(vao);
+ }
+
glClearColor(0.125f, 0.25f, 0.5f, 1.f);
setViewport(renderCtx, viewport);
glClear(GL_COLOR_BUFFER_BIT);
GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, 3));
readRectangle(renderCtx, viewport, dst);
log().writeMessage("// Drew a triangle");
+
+ if (vao)
+ glDeleteVertexArrays(1, &vao);
}
void SeparateShaderTest::testPipelineRendering (MovePtr<Pipeline>& pipeOut)
@@ -1622,7 +1633,7 @@
} // anonymous
-TestCaseGroup* createSeparateShaderTests (Context& ctx)
+TestCaseGroup* createCommonSeparateShaderTests (Context& ctx)
{
TestParams defaultParams;
int numIterations = 4;
@@ -1831,10 +1842,18 @@
1, params, &SeparateShaderTest::testPipelineQueryActive));
}
+ return group;
+}
+
+TestCaseGroup* createGLESSeparateShaderTests (Context& ctx)
+{
+ TestCaseGroup* group = createCommonSeparateShaderTests(ctx);
+
TestCaseGroup* interfaceMismatchGroup =
new TestCaseGroup(ctx, "validation", "Negative program pipeline interface matching");
group->addChild(interfaceMismatchGroup);
+
{
TestCaseGroup* es31Group = new TestCaseGroup(ctx, "es31", "GLSL ES 3.1 pipeline interface matching");
gls::ShaderLibrary shaderLibrary (ctx.getTestContext(), ctx.getRenderContext(), ctx.getContextInfo());
@@ -1858,8 +1877,8 @@
}
return group;
-}
+}
} // Functional
} // gles31
} // deqp
diff --git a/modules/gles31/functional/es31fSeparateShaderTests.hpp b/modules/gles31/functional/es31fSeparateShaderTests.hpp
index 4dde4cc..89ff470 100644
--- a/modules/gles31/functional/es31fSeparateShaderTests.hpp
+++ b/modules/gles31/functional/es31fSeparateShaderTests.hpp
@@ -32,7 +32,8 @@
namespace Functional
{
-TestCaseGroup* createSeparateShaderTests (Context& context);
+TestCaseGroup* createGLESSeparateShaderTests (Context& context);
+TestCaseGroup* createCommonSeparateShaderTests (Context& context);
} // Functional
} // gles31
diff --git a/modules/gles31/functional/es31fShaderBuiltinConstantTests.cpp b/modules/gles31/functional/es31fShaderBuiltinConstantTests.cpp
index fb54439..d1151b2 100644
--- a/modules/gles31/functional/es31fShaderBuiltinConstantTests.cpp
+++ b/modules/gles31/functional/es31fShaderBuiltinConstantTests.cpp
@@ -158,27 +158,37 @@
template<typename DataType>
void ShaderBuiltinConstantCase<DataType>::init (void)
{
- const bool supportsES32 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
+
+ if(!glu::isContextTypeES(m_context.getRenderContext().getType()))
+ {
+ if(m_varName == "gl_MaxVertexOutputVectors" || m_varName == "gl_MaxFragmentInputVectors")
+ {
+ std::string message = "The test requires a GLES context. The constant '" + m_varName + "' is not supported.";
+ TCU_THROW(NotSupportedError, message.c_str());
+ }
+ }
if (m_requiredExt == "GL_OES_sample_variables" || m_requiredExt == "GL_EXT_geometry_shader" || m_requiredExt == "GL_EXT_tessellation_shader")
{
- if(!supportsES32)
+ if(!supportsES32orGL45)
{
- const std::string message = "The test requires a 3.2 context or support for the extension " + m_requiredExt + ".";
+ const std::string message = "The test requires a GLES 3.2 or GL 4.5 context or support for the extension " + m_requiredExt + ".";
TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported(m_requiredExt.c_str()), message.c_str());
}
}
else if (!m_requiredExt.empty() && !m_context.getContextInfo().isExtensionSupported(m_requiredExt.c_str()))
throw tcu::NotSupportedError(m_requiredExt + " not supported");
- if (!supportsES32 && (m_varName == "gl_MaxTessControlImageUniforms" ||
+ if (!supportsES32orGL45 && (m_varName == "gl_MaxTessControlImageUniforms" ||
m_varName == "gl_MaxTessEvaluationImageUniforms" ||
m_varName == "gl_MaxTessControlAtomicCounters" ||
m_varName == "gl_MaxTessEvaluationAtomicCounters" ||
m_varName == "gl_MaxTessControlAtomicCounterBuffers" ||
m_varName == "gl_MaxTessEvaluationAtomicCounterBuffers"))
{
- std::string message = "The test requires a 3.2 context. The constant '" + m_varName + "' is not supported.";
+ std::string message = "The test requires a GLES 3.2 or GL 4.5 context. The constant '" + m_varName + "' is not supported.";
TCU_THROW(NotSupportedError, message.c_str());
}
}
@@ -191,15 +201,16 @@
{
using namespace gls::ShaderExecUtil;
- const bool supportsES32 = contextSupports(renderCtx.getType(), glu::ApiType::es(3, 2));
+ const bool supportsES32orGL45 = contextSupports(renderCtx.getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(renderCtx.getType(), glu::ApiType::core(4, 5));
ShaderSpec shaderSpec;
- shaderSpec.version = supportsES32 ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES;
+ shaderSpec.version = glu::getContextTypeGLSLVersion(renderCtx.getType());
shaderSpec.source = string("result = ") + varName + ";\n";
shaderSpec.outputs.push_back(Symbol("result", glu::VarType(dataType, glu::PRECISION_HIGHP)));
- if (!extName.empty() && !(supportsES32 && (extName == "GL_OES_sample_variables" || extName == "GL_EXT_geometry_shader" || extName == "GL_EXT_tessellation_shader")))
+ if (!extName.empty() && !(supportsES32orGL45 && (extName == "GL_OES_sample_variables" || extName == "GL_EXT_geometry_shader" || extName == "GL_EXT_tessellation_shader")))
shaderSpec.globalDeclarations = "#extension " + extName + " : require\n";
return createExecutor(renderCtx, shaderType, shaderSpec);
diff --git a/modules/gles31/functional/es31fShaderCommonFunctionTests.cpp b/modules/gles31/functional/es31fShaderCommonFunctionTests.cpp
index 21ee0f6..dd92e0a 100644
--- a/modules/gles31/functional/es31fShaderCommonFunctionTests.cpp
+++ b/modules/gles31/functional/es31fShaderCommonFunctionTests.cpp
@@ -265,7 +265,8 @@
{
DE_ASSERT(!m_executor);
- m_spec.version = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES;
+ glu::ContextType contextType = m_context.getRenderContext().getType();
+ m_spec.version = glu::getContextTypeGLSLVersion(contextType);
m_executor = createExecutor(m_context.getRenderContext(), m_shaderType, m_spec);
m_testCtx.getLog() << m_executor;
@@ -1939,8 +1940,9 @@
void init (void)
{
if (!glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2))
- && !m_context.getContextInfo().isExtensionSupported("GL_EXT_gpu_shader5"))
- throw tcu::NotSupportedError("GL_EXT_gpu_shader5 not supported");
+ && !m_context.getContextInfo().isExtensionSupported("GL_EXT_gpu_shader5")
+ && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)))
+ throw tcu::NotSupportedError("OpenGL ES 3.2, GL_EXT_gpu_shader5 not supported and OpenGL 4.5");
CommonFunctionCase::init();
}
diff --git a/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp b/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp
index 226b05a..0beeeec 100644
--- a/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp
+++ b/modules/gles31/functional/es31fShaderFramebufferFetchTests.cpp
@@ -542,6 +542,10 @@
0, 1, 2, 2, 3, 0,
};
+ GLuint vaoID;
+ m_gl.genVertexArrays(1, &vaoID);
+ m_gl.bindVertexArray(vaoID);
+
const GLuint coordLocation = m_gl.getAttribLocation(m_program->getProgram(), "a_position");
m_gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
@@ -559,6 +563,8 @@
m_gl.drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, DE_NULL);
GLU_EXPECT_NO_ERROR(m_gl.getError(), "render()");
+
+ m_gl.deleteVertexArrays(1, &vaoID);
}
// Test description:
diff --git a/modules/gles31/functional/es31fShaderHelperInvocationTests.cpp b/modules/gles31/functional/es31fShaderHelperInvocationTests.cpp
index a173d51..b51ca39 100644
--- a/modules/gles31/functional/es31fShaderHelperInvocationTests.cpp
+++ b/modules/gles31/functional/es31fShaderHelperInvocationTests.cpp
@@ -178,7 +178,7 @@
// Special state for certain primitives
if (primType == PRIMITIVETYPE_POINT || primType == PRIMITIVETYPE_WIDE_POINT)
{
- const Vec2 range = getRange(gl, GL_ALIASED_POINT_SIZE_RANGE);
+ const Vec2 range = getRange(gl, glu::isContextTypeES(renderCtx.getType()) ? GL_ALIASED_POINT_SIZE_RANGE : GL_SMOOTH_POINT_SIZE_RANGE);
const bool isWidePoint = primType == PRIMITIVETYPE_WIDE_POINT;
const float pointSize = isWidePoint ? de::min(rnd->getFloat(minPointSize, maxPointSize), range.y()) : 1.0f;
const int pointSizeLoc = gl.getUniformLocation(program, "u_pointSize");
diff --git a/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp b/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
index 0e51ab8..105b22c 100644
--- a/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
+++ b/modules/gles31/functional/es31fShaderImageLoadStoreTests.cpp
@@ -351,15 +351,22 @@
static const char* const s_texBufExtString = "GL_EXT_texture_buffer";
+static bool supportsES32orGL45(const RenderContext& renderContext)
+{
+ glu::ContextType contextType = renderContext.getType();
+ return glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(contextType, glu::ApiType::core(4, 5));
+}
+
static inline void checkTextureTypeExtensions (const glu::ContextInfo& contextInfo, TextureType type, const RenderContext& renderContext)
{
- if (type == TEXTURETYPE_BUFFER && !contextInfo.isExtensionSupported(s_texBufExtString) && !glu::contextSupports(renderContext.getType(), glu::ApiType::es(3, 2)))
+ if (type == TEXTURETYPE_BUFFER && !contextInfo.isExtensionSupported(s_texBufExtString) && !supportsES32orGL45(renderContext))
throw tcu::NotSupportedError("Test requires " + string(s_texBufExtString) + " extension");
}
static inline string textureTypeExtensionShaderRequires (TextureType type, const RenderContext& renderContext)
{
- if (!glu::contextSupports(renderContext.getType(), glu::ApiType::es(3, 2)) && (type == TEXTURETYPE_BUFFER))
+ if (!supportsES32orGL45(renderContext) && (type == TEXTURETYPE_BUFFER))
return "#extension " + string(s_texBufExtString) + " : require\n";
else
return "";
@@ -369,7 +376,7 @@
static inline string imageAtomicExtensionShaderRequires (const RenderContext& renderContext)
{
- if (!glu::contextSupports(renderContext.getType(), glu::ApiType::es(3, 2)))
+ if (!supportsES32orGL45(renderContext))
return "#extension " + string(s_imageAtomicExtString) + " : require\n";
else
return "";
@@ -1917,10 +1924,11 @@
void BinaryAtomicOperationCase::init (void)
{
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ const glu::RenderContext& renderContext = m_context.getRenderContext();
+ if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic") && !supportsES32orGL45(renderContext))
throw tcu::NotSupportedError("Test requires OES_shader_image_atomic extension");
- checkTextureTypeExtensions(m_context.getContextInfo(), m_imageType, m_context.getRenderContext());
+ checkTextureTypeExtensions(m_context.getContextInfo(), m_imageType, renderContext);
}
BinaryAtomicOperationCase::IterateResult BinaryAtomicOperationCase::iterate (void)
@@ -2162,10 +2170,11 @@
void AtomicCompSwapCase::init (void)
{
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ const glu::RenderContext& renderContext = m_context.getRenderContext();
+ if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic") && !supportsES32orGL45(renderContext))
throw tcu::NotSupportedError("Test requires OES_shader_image_atomic extension");
- checkTextureTypeExtensions(m_context.getContextInfo(), m_imageType, m_context.getRenderContext());
+ checkTextureTypeExtensions(m_context.getContextInfo(), m_imageType, renderContext);
}
class AtomicCompSwapCase::EndResultVerifier : public ImageLayerVerifier
@@ -2911,7 +2920,7 @@
if (m_context.getContextInfo().getInt(GL_MAX_FRAGMENT_IMAGE_UNIFORMS) == 0)
throw tcu::NotSupportedError("GL_MAX_FRAGMENT_IMAGE_UNIFORMS is zero");
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic") && !supportsES32orGL45(m_context.getRenderContext()))
throw tcu::NotSupportedError("Test requires OES_shader_image_atomic extension");
if (m_type == TESTTYPE_DEPTH &&
diff --git a/modules/gles31/functional/es31fShaderMultisampleInterpolationStateQueryTests.cpp b/modules/gles31/functional/es31fShaderMultisampleInterpolationStateQueryTests.cpp
index 4b8ca80..8303795 100644
--- a/modules/gles31/functional/es31fShaderMultisampleInterpolationStateQueryTests.cpp
+++ b/modules/gles31/functional/es31fShaderMultisampleInterpolationStateQueryTests.cpp
@@ -78,9 +78,11 @@
void InterpolationOffsetCase::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
+ if (!isES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
throw tcu::NotSupportedError("Test requires GL_OES_shader_multisample_interpolation extension");
}
@@ -126,9 +128,11 @@
void FragmentInterpolationOffsetBitsCase::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
+ if (!isES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
throw tcu::NotSupportedError("Test requires GL_OES_shader_multisample_interpolation extension");
}
diff --git a/modules/gles31/functional/es31fShaderMultisampleInterpolationTests.cpp b/modules/gles31/functional/es31fShaderMultisampleInterpolationTests.cpp
index 8875d12..15f21e1 100644
--- a/modules/gles31/functional/es31fShaderMultisampleInterpolationTests.cpp
+++ b/modules/gles31/functional/es31fShaderMultisampleInterpolationTests.cpp
@@ -50,16 +50,24 @@
static std::string specializeShader(const std::string& shaderSource, const glu::ContextType& contextType)
{
- const bool supportsES32 = glu::contextSupports(contextType, glu::ApiType::es(3, 2));
+ const bool isES32orGL45 = glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(contextType, glu::ApiType::core(4, 5));
std::map<std::string, std::string> args;
args["GLSL_VERSION_DECL"] = glu::getGLSLVersionDeclaration(glu::getContextTypeGLSLVersion(contextType));
- args["GLSL_EXT_SHADER_MULTISAMPLE_INTERPOLATION"] = supportsES32 ? "" : "#extension GL_OES_shader_multisample_interpolation : require\n";
- args["GLSL_EXT_SAMPLE_VARIABLES"] = supportsES32 ? "" : "#extension GL_OES_sample_variables : require\n";
+ args["GLSL_EXT_SHADER_MULTISAMPLE_INTERPOLATION"] = isES32orGL45 ? "" : "#extension GL_OES_shader_multisample_interpolation : require\n";
+ args["GLSL_EXT_SAMPLE_VARIABLES"] = isES32orGL45 ? "" : "#extension GL_OES_sample_variables : require\n";
return tcu::StringTemplate(shaderSource).specialize(args);
}
+static bool checkSupport(Context& ctx)
+{
+ auto ctxType = ctx.getRenderContext().getType();
+ return glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
+}
+
static bool verifyGreenImage (const tcu::Surface& image, tcu::TestLog& log)
{
bool error = false;
@@ -123,7 +131,7 @@
void MultisampleShadeCountRenderCase::init (void)
{
// requirements
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation extension");
MultisampleShaderRenderUtil::MultisampleRenderCase::init();
@@ -664,7 +672,7 @@
void SingleSampleInterpolateAtSampleCase::init (void)
{
// requirements
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation extension");
if (m_renderTarget == TARGET_DEFAULT && m_context.getRenderTarget().getNumSamples() > 1)
TCU_THROW(NotSupportedError, "Non-multisample framebuffer required");
@@ -775,7 +783,7 @@
void CentroidRenderCase::init (void)
{
// requirements
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation extension");
MultisampleShaderRenderUtil::MultisampleRenderCase::init();
@@ -954,9 +962,9 @@
void InterpolateAtSampleIDCase::init (void)
{
// requirements
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation extension");
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_sample_variables") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_variables"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_sample_variables extension");
// test purpose and expectations
@@ -1227,7 +1235,7 @@
void InterpolateAtOffsetCase::init (void)
{
// requirements
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation extension");
// test purpose and expectations
@@ -1358,9 +1366,9 @@
void InterpolateAtSamplePositionCase::init (void)
{
// requirements
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation extension");
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_sample_variables") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_sample_variables"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_sample_variables extension");
// test purpose and expectations
@@ -1478,9 +1486,20 @@
void NegativeCompileInterpolationCase::init (void)
{
- if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation") && !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context) && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
TCU_THROW(NotSupportedError, "Test requires GL_OES_shader_multisample_interpolation extension");
+ if(!glu::isContextTypeES(m_context.getRenderContext().getType()))
+ {
+ if(m_caseType == CASE_VEC4_IDENTITY_SWIZZLE
+ || m_caseType == CASE_VEC4_CROP_SWIZZLE
+ || m_caseType == CASE_VEC4_MIXED_SWIZZLE
+ || m_caseType == CASE_INTERPOLATE_IVEC4
+ || m_caseType == CASE_INTERPOLATE_UVEC4
+ || m_caseType == CASE_INTERPOLATE_STRUCT_MEMBER)
+ TCU_THROW(NotSupportedError, "Test requires a GLES context");
+ }
+
m_testCtx.getLog() << tcu::TestLog::Message << "Trying to compile illegal shader, expecting compile to fail." << tcu::TestLog::EndMessage;
}
diff --git a/modules/gles31/functional/es31fShaderStateQueryTests.cpp b/modules/gles31/functional/es31fShaderStateQueryTests.cpp
index a60724f..283637e 100644
--- a/modules/gles31/functional/es31fShaderStateQueryTests.cpp
+++ b/modules/gles31/functional/es31fShaderStateQueryTests.cpp
@@ -97,9 +97,11 @@
tcu::ResultCollector result (m_testCtx.getLog());
std::vector<TestTypeInfo> samplerTypes = getInfos();
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
- if (m_extension && !m_context.getContextInfo().isExtensionSupported(m_extension) && !supportsES32)
+ if (m_extension && !isES32orGL45 && !m_context.getContextInfo().isExtensionSupported(m_extension))
throw tcu::NotSupportedError("Test requires " + std::string(m_extension));
checkRequirements();
@@ -112,8 +114,8 @@
std::map<std::string, std::string> shaderArgs;
shaderArgs["DECLARATIONSTR"] = samplerTypes[typeNdx].declarationStr;
shaderArgs["ACCESSSTR"] = samplerTypes[typeNdx].accessStr;
- shaderArgs["EXTENSIONSTATEMENT"] = (m_extension && !supportsES32) ? (std::string() + "#extension " + m_extension + " : require\n") : ("");
- shaderArgs["VERSIONDECL"] = glu::getGLSLVersionDeclaration(glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType()));
+ shaderArgs["EXTENSIONSTATEMENT"] = (m_extension && !isES32orGL45) ? (std::string() + "#extension " + m_extension + " : require\n") : ("");
+ shaderArgs["VERSIONDECL"] = glu::getGLSLVersionDeclaration(glu::getContextTypeGLSLVersion(ctxType));
const std::string fragmentSource = tcu::StringTemplate(fragmentSourceTemplate).specialize(shaderArgs);
const std::string vertexSource = tcu::StringTemplate(vertexSourceTemplate).specialize(shaderArgs);
@@ -379,7 +381,9 @@
void ShaderLogCase::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
switch (m_shaderType)
{
@@ -389,13 +393,13 @@
break;
case glu::SHADERTYPE_GEOMETRY:
- if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader") && !supportsES32)
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader") && !isES32orGL45)
throw tcu::NotSupportedError("Test requires GL_EXT_geometry_shader extension or an OpenGL ES 3.2 or higher context.");
break;
case glu::SHADERTYPE_TESSELLATION_CONTROL:
case glu::SHADERTYPE_TESSELLATION_EVALUATION:
- if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader") && !supportsES32)
+ if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader") && !isES32orGL45)
throw tcu::NotSupportedError("Test requires GL_EXT_tessellation_shader extension or an OpenGL ES 3.2 or higher context.");
break;
diff --git a/modules/gles31/functional/es31fShaderTextureSizeTests.cpp b/modules/gles31/functional/es31fShaderTextureSizeTests.cpp
index 29786de..c76e10e 100644
--- a/modules/gles31/functional/es31fShaderTextureSizeTests.cpp
+++ b/modules/gles31/functional/es31fShaderTextureSizeTests.cpp
@@ -100,6 +100,7 @@
glw::GLuint m_texture;
glw::GLuint m_vbo;
+ glw::GLuint m_vao;
glu::ShaderProgram* m_shader;
std::vector<tcu::IVec3> m_iterations;
int m_iteration;
@@ -115,6 +116,7 @@
, m_isArrayType (m_type == TEXTURE_FLOAT_2D_ARRAY || m_type == TEXTURE_INT_2D_ARRAY || m_type == TEXTURE_UINT_2D_ARRAY)
, m_texture (0)
, m_vbo (0)
+ , m_vao (0)
, m_shader (DE_NULL)
, m_iteration (0)
, m_allIterationsPassed (true)
@@ -159,11 +161,13 @@
tcu::Vec4( 1.0f, -1.0f, 0.0f, 1.0f)
};
- const glw::Functions& gl = m_context.getRenderContext().getFunctions();
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ glu::RenderContext& rc = m_context.getRenderContext();
+ const glw::Functions& gl = rc.getFunctions();
+ const bool supportsES32orGL45 = glu::contextSupports(rc.getType(), glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(rc.getType(), glu::ApiType::core(4, 5));
// requirements
- if (m_isArrayType && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
+ if (m_isArrayType && !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
TCU_THROW(NotSupportedError, "Test requires OES_texture_storage_multisample_2d_array extension");
if (m_context.getRenderTarget().getWidth() < 1 || m_context.getRenderTarget().getHeight() < 1)
@@ -193,6 +197,9 @@
gl.bindBuffer(GL_ARRAY_BUFFER, m_vbo);
gl.bufferData(GL_ARRAY_BUFFER, sizeof(fullscreenQuad), fullscreenQuad, GL_STATIC_DRAW);
+ if (!glu::isContextTypeES(m_context.getRenderContext().getType()))
+ gl.genVertexArrays(1, &m_vao);
+
// gen iterations
m_testCtx.getLog()
@@ -244,6 +251,12 @@
m_vbo = 0;
}
+ if (m_vao)
+ {
+ m_context.getRenderContext().getFunctions().deleteVertexArrays(1, &m_vao);
+ m_vao = 0;
+ }
+
if (m_shader)
{
delete m_shader;
@@ -346,10 +359,11 @@
else
args["SIZETYPE"] = "ivec3";
- const glu::ContextType contextType = m_context.getRenderContext().getType();
- const bool supportsES32 = glu::contextSupports(contextType, glu::ApiType::es(3, 2));
+ const glu::ContextType contextType = m_context.getRenderContext().getType();
+ const bool supportsES32orGL45 = glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(contextType, glu::ApiType::core(4, 5));
- if (m_isArrayType && !supportsES32)
+ if (m_isArrayType && !supportsES32orGL45)
args["EXTENSION_STATEMENT"] = "#extension GL_OES_texture_storage_multisample_2d_array : require\n";
else
args["EXTENSION_STATEMENT"] = "";
@@ -439,6 +453,9 @@
gl.clear(GL_COLOR_BUFFER_BIT);
GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
+ if (m_vao)
+ gl.bindVertexArray(m_vao);
+
gl.bindBuffer(GL_ARRAY_BUFFER, m_vbo);
gl.vertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
gl.enableVertexAttribArray(positionLoc);
@@ -460,6 +477,8 @@
gl.disableVertexAttribArray(positionLoc);
gl.useProgram(0);
+ if (m_vao)
+ gl.bindVertexArray(0);
GLU_EXPECT_NO_ERROR(gl.getError(), "cleanup");
gl.finish();
diff --git a/modules/gles31/functional/es31fStencilTexturingTests.cpp b/modules/gles31/functional/es31fStencilTexturingTests.cpp
index c7c8646..c0a311f 100644
--- a/modules/gles31/functional/es31fStencilTexturingTests.cpp
+++ b/modules/gles31/functional/es31fStencilTexturingTests.cpp
@@ -491,8 +491,11 @@
{
if (format == GL_STENCIL_INDEX8)
{
- const char* reqExt = "GL_OES_texture_stencil8";
- if ((context.getRenderContext().getType().getAPI() != glu::ApiType::core(3,2)) && !context.getContextInfo().isExtensionSupported(reqExt))
+ const char* reqExt = "GL_OES_texture_stencil8";
+ glu::ContextType contextType = context.getRenderContext().getType();
+ if (!glu::contextSupports(contextType, glu::ApiType::es(3, 2)) &&
+ !glu::contextSupports(contextType, glu::ApiType::core(4, 5)) &&
+ !context.getContextInfo().isExtensionSupported(reqExt))
throw tcu::NotSupportedError(glu::getTextureFormatStr(format).toString() + " requires " + reqExt);
}
else
diff --git a/modules/gles31/functional/es31fSynchronizationTests.cpp b/modules/gles31/functional/es31fSynchronizationTests.cpp
index f46f9a2..2e0ba6e 100644
--- a/modules/gles31/functional/es31fSynchronizationTests.cpp
+++ b/modules/gles31/functional/es31fSynchronizationTests.cpp
@@ -49,6 +49,14 @@
namespace
{
+static bool checkSupport(Context& ctx)
+{
+ auto ctxType = ctx.getRenderContext().getType();
+ return contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ contextSupports(ctxType, glu::ApiType::core(4, 5)) ||
+ ctx.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic");
+}
+
static bool validateSortedAtomicRampAdditionValueChain (const std::vector<deUint32>& valueChain, deUint32 sumValue, int& invalidOperationNdx, deUint32& errorDelta, deUint32& errorExpected)
{
std::vector<deUint32> chainDelta(valueChain.size());
@@ -114,15 +122,14 @@
static std::string specializeShader(Context& context, const char* code)
{
- const glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(context.getRenderContext().getType());
- std::map<std::string, std::string> specializationMap;
+ auto ctxType = context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
+ const glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(ctxType);
- specializationMap["GLSL_VERSION_DECL"] = glu::getGLSLVersionDeclaration(glslVersion);
-
- if (glu::contextSupports(context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
- specializationMap["SHADER_IMAGE_ATOMIC_REQUIRE"] = "";
- else
- specializationMap["SHADER_IMAGE_ATOMIC_REQUIRE"] = "#extension GL_OES_shader_image_atomic : require";
+ std::map<std::string, std::string> specializationMap;
+ specializationMap["GLSL_VERSION_DECL"] = glu::getGLSLVersionDeclaration(glslVersion);
+ specializationMap["SHADER_IMAGE_ATOMIC_REQUIRE"] = isES32orGL45 ? "" : "#extension GL_OES_shader_image_atomic : require";
return tcu::StringTemplate(code).specialize(specializationMap);
}
@@ -204,11 +211,10 @@
void InterInvocationTestCase::init (void)
{
const glw::Functions& gl = m_context.getRenderContext().getFunctions();
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
// requirements
- if (m_useAtomic && m_storage == STORAGE_IMAGE && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic"))
+ if (m_useAtomic && m_storage == STORAGE_IMAGE && !checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_OES_shader_image_atomic extension");
// program
@@ -1154,11 +1160,10 @@
void InterCallTestCase::init (void)
{
int programFriendlyName = 0;
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
// requirements
- if (m_useAtomic && m_storage == STORAGE_IMAGE && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic"))
+ if (m_useAtomic && m_storage == STORAGE_IMAGE && !checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_OES_shader_image_atomic extension");
// generate resources and validate command list
@@ -2637,9 +2642,8 @@
{
const glw::Functions& gl = m_context.getRenderContext().getFunctions();
std::vector<deUint32> zeroData (m_workSize * m_workSize, 0);
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_OES_shader_image_atomic"))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_OES_shader_image_atomic");
// gen image
diff --git a/modules/gles31/functional/es31fTextureBufferTests.cpp b/modules/gles31/functional/es31fTextureBufferTests.cpp
index 1a88627..782781b 100644
--- a/modules/gles31/functional/es31fTextureBufferTests.cpp
+++ b/modules/gles31/functional/es31fTextureBufferTests.cpp
@@ -126,6 +126,15 @@
namespace
{
+static void checkSupport(Context& ctx)
+{
+ auto ctxType = ctx.getRenderContext().getType();
+ if (!glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) &&
+ !glu::contextSupports(ctxType, glu::ApiType::core(4, 5)) &&
+ !ctx.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
+ TCU_THROW(NotSupportedError, "GL_EXT_texture_buffer is not supported");
+}
+
using namespace gls::StateQueryUtil;
class LimitQueryCase : public TestCase
@@ -151,8 +160,7 @@
LimitQueryCase::IterateResult LimitQueryCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported");
+ checkSupport(m_context);
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -187,8 +195,7 @@
AlignmentQueryCase::IterateResult AlignmentQueryCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported");
+ checkSupport(m_context);
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -219,8 +226,7 @@
TextureBufferBindingQueryCase::IterateResult TextureBufferBindingQueryCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported");
+ checkSupport(m_context);
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -279,8 +285,7 @@
TextureBindingBufferQueryCase::IterateResult TextureBindingBufferQueryCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported");
+ checkSupport(m_context);
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -339,8 +344,7 @@
TextureBufferDataStoreQueryCase::IterateResult TextureBufferDataStoreQueryCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported");
+ checkSupport(m_context);
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -411,8 +415,7 @@
TextureBufferOffsetQueryCase::IterateResult TextureBufferOffsetQueryCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported");
+ checkSupport(m_context);
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
@@ -493,8 +496,7 @@
TextureBufferSizeQueryCase::IterateResult TextureBufferSizeQueryCase::iterate (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"), "GL_EXT_texture_buffer is not supported");
+ checkSupport(m_context);
glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: ");
diff --git a/modules/gles31/functional/es31fTextureFilteringTests.cpp b/modules/gles31/functional/es31fTextureFilteringTests.cpp
index 4717508..45b4e63 100644
--- a/modules/gles31/functional/es31fTextureFilteringTests.cpp
+++ b/modules/gles31/functional/es31fTextureFilteringTests.cpp
@@ -197,9 +197,11 @@
void TextureCubeArrayFilteringCase::init (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ auto ctxType = m_context.getRenderContext().getType();
+ const bool isES32orGL45 = glu::contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(ctxType, glu::ApiType::core(4, 5));
- if (!supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
+ if (!isES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
throw tcu::NotSupportedError("GL_EXT_texture_cube_map_array not supported");
if (m_internalFormat == GL_SR8_EXT && !(m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_sRGB_R8")))
@@ -207,6 +209,7 @@
try
{
+ const glw::Functions& gl = m_context.getRenderContext().getFunctions();
const tcu::TextureFormat texFmt = glu::mapGLInternalFormat(m_internalFormat);
const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFmt);
const tcu::Vec4 cScale = fmtInfo.valueMax-fmtInfo.valueMin;
@@ -214,6 +217,9 @@
const int numLevels = deLog2Floor32(m_size) + 1;
const int numLayers = m_depth / 6;
+ if (!isContextTypeES(ctxType))
+ gl.enable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+
// Create textures.
m_gradientTex = new glu::TextureCubeArray(m_context.getRenderContext(), m_internalFormat, m_size, m_depth);
m_gridTex = new glu::TextureCubeArray(m_context.getRenderContext(), m_internalFormat, m_size, m_depth);
@@ -319,6 +325,9 @@
m_renderer.clear();
m_cases.clear();
+
+ if (!isContextTypeES(m_context.getRenderContext().getType()))
+ m_context.getRenderContext().getFunctions().disable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
}
TextureCubeArrayFilteringCase::IterateResult TextureCubeArrayFilteringCase::iterate (void)
diff --git a/modules/gles31/functional/es31fTextureGatherTests.cpp b/modules/gles31/functional/es31fTextureGatherTests.cpp
index d096d4d..a202ce0 100644
--- a/modules/gles31/functional/es31fTextureGatherTests.cpp
+++ b/modules/gles31/functional/es31fTextureGatherTests.cpp
@@ -85,7 +85,8 @@
specializationMap["GLSL_VERSION_DECL"] = glu::getGLSLVersionDeclaration(glslVersion);
- if (glu::contextSupports(context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (glu::contextSupports(context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(context.getRenderContext().getType(), glu::ApiType::core(4, 5)))
specializationMap["GPU_SHADER5_REQUIRE"] = "";
else
specializationMap["GPU_SHADER5_REQUIRE"] = "#extension GL_EXT_gpu_shader5 : require";
@@ -1249,14 +1250,15 @@
void TextureGatherCase::init (void)
{
- TestLog& log = m_testCtx.getLog();
- const glu::RenderContext& renderCtx = m_context.getRenderContext();
- const glw::Functions& gl = renderCtx.getFunctions();
- const deUint32 texTypeGL = getGLTextureType(m_textureType);
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
+ TestLog& log = m_testCtx.getLog();
+ const glu::RenderContext& renderCtx = m_context.getRenderContext();
+ const glw::Functions& gl = renderCtx.getFunctions();
+ const deUint32 texTypeGL = getGLTextureType(m_textureType);
+ const bool supportsES32orGL45 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5));
// Check prerequisites.
- if (requireGpuShader5(m_gatherType) && !supportsES32 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_gpu_shader5"))
+ if (requireGpuShader5(m_gatherType) && !supportsES32orGL45 && !m_context.getContextInfo().isExtensionSupported("GL_EXT_gpu_shader5"))
throw tcu::NotSupportedError("GL_EXT_gpu_shader5 required");
// Log and check implementation offset limits, if appropriate.
@@ -1269,6 +1271,9 @@
TCU_CHECK_MSG(offsetRange[1] >= SPEC_MIN_MAX_OFFSET, ("GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET must be at least " + de::toString((int)SPEC_MIN_MAX_OFFSET)).c_str());
}
+ if (!isContextTypeES(m_context.getRenderContext().getType()))
+ gl.enable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+
// Create rbo and fbo.
m_colorBuffer = MovePtr<glu::Renderbuffer>(new glu::Renderbuffer(renderCtx));
@@ -1345,6 +1350,9 @@
void TextureGatherCase::deinit (void)
{
+ if (!isContextTypeES(m_context.getRenderContext().getType()))
+ m_context.getRenderContext().getFunctions().disable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+
m_program = MovePtr<ShaderProgram>(DE_NULL);
m_fbo = MovePtr<glu::Framebuffer>(DE_NULL);
m_colorBuffer = MovePtr<glu::Renderbuffer>(DE_NULL);
diff --git a/modules/gles31/functional/es31fTextureLevelStateQueryTests.cpp b/modules/gles31/functional/es31fTextureLevelStateQueryTests.cpp
index b7d9fcf..8ab46a8 100644
--- a/modules/gles31/functional/es31fTextureLevelStateQueryTests.cpp
+++ b/modules/gles31/functional/es31fTextureLevelStateQueryTests.cpp
@@ -111,7 +111,8 @@
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
case GL_TEXTURE_BUFFER:
case GL_TEXTURE_CUBE_MAP_ARRAY:
- return glu::contextSupports(contextType, glu::ApiType::es(3, 2));
+ return glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(contextType, glu::ApiType::core(4, 5));
default:
return false;
@@ -1491,6 +1492,14 @@
}
};
+static bool checkSupport(Context& ctx)
+{
+ auto ctxType = ctx.getRenderContext().getType();
+ return contextSupports(ctxType, glu::ApiType::es(3, 2)) ||
+ contextSupports(ctxType, glu::ApiType::core(4, 5)) ||
+ ctx.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer");
+}
+
class TextureLevelBufferDataStoreCase : public TextureLevelCase
{
public:
@@ -1502,8 +1511,7 @@
private:
void init (void)
{
- if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer") &&
- !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
TextureLevelCase::init();
}
@@ -1541,8 +1549,7 @@
private:
void init (void)
{
- if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer") &&
- !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
TextureLevelCase::init();
}
@@ -1582,8 +1589,7 @@
private:
void init (void)
{
- if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer") &&
- !glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
+ if (!checkSupport(m_context))
throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
TextureLevelCase::init();
}
diff --git a/modules/gles31/functional/es31fTextureSpecificationTests.cpp b/modules/gles31/functional/es31fTextureSpecificationTests.cpp
index f67b019..4b368cd 100644
--- a/modules/gles31/functional/es31fTextureSpecificationTests.cpp
+++ b/modules/gles31/functional/es31fTextureSpecificationTests.cpp
@@ -236,8 +236,10 @@
bool TextureCubeArraySpecCase::checkExtensionSupport (void)
{
- const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
- return supportsES32 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array");
+ glu::ContextType contextType = m_context.getRenderContext().getType();
+ const bool supportsES32orGL45 = glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
+ glu::contextSupports(contextType, glu::ApiType::core(4, 5));
+ return supportsES32orGL45 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array");
}
void TextureCubeArraySpecCase::verifyTexture (sglr::GLContext& gles3Context, sglr::ReferenceContext& refContext)
diff --git a/modules/gles31/functional/es31fVertexAttributeBindingStateQueryTests.cpp b/modules/gles31/functional/es31fVertexAttributeBindingStateQueryTests.cpp
index e06f5c1..b2b4a2c 100644
--- a/modules/gles31/functional/es31fVertexAttributeBindingStateQueryTests.cpp
+++ b/modules/gles31/functional/es31fVertexAttributeBindingStateQueryTests.cpp
@@ -601,15 +601,26 @@
void MixedVertexBindingOffsetCase::test (tcu::ResultCollector& result)
{
- glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
- glu::Buffer buffer (m_context.getRenderContext());
+ glu::RenderContext& renderContext = m_context.getRenderContext();
+ glu::CallLogWrapper gl (renderContext.getFunctions(), m_testCtx.getLog());
+ glu::Buffer buffer (renderContext);
+ deUint32 vao = 0;
gl.enableLogging(true);
+ if (!glu::isContextTypeES(renderContext.getType()))
+ {
+ gl.glGenVertexArrays(1, &vao);
+ gl.glBindVertexArray(vao);
+ }
+
gl.glBindBuffer(GL_ARRAY_BUFFER, *buffer);
gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, glu::BufferOffsetAsPointer(12));
verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_OFFSET, 1, 12, m_verifier);
+
+ if (vao)
+ gl.glDeleteVertexArrays(1, &vao);
}
class MixedVertexBindingStrideCase : public IndexedCase
@@ -626,11 +637,19 @@
void MixedVertexBindingStrideCase::test (tcu::ResultCollector& result)
{
- glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
- glu::Buffer buffer (m_context.getRenderContext());
+ glu::RenderContext& renderContext = m_context.getRenderContext();
+ glu::CallLogWrapper gl (renderContext.getFunctions(), m_testCtx.getLog());
+ glu::Buffer buffer (renderContext);
+ deUint32 vao = 0;
gl.enableLogging(true);
+ if (!glu::isContextTypeES(renderContext.getType()))
+ {
+ gl.glGenVertexArrays(1, &vao);
+ gl.glBindVertexArray(vao);
+ }
+
gl.glBindBuffer(GL_ARRAY_BUFFER, *buffer);
gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 12, 0);
verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_STRIDE, 1, 12, m_verifier);
@@ -638,6 +657,9 @@
// test effectiveStride
gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_STRIDE, 1, 16, m_verifier);
+
+ if (vao)
+ gl.glDeleteVertexArrays(1, &vao);
}
class MixedVertexBindingBufferCase : public IndexedCase
@@ -654,14 +676,25 @@
void MixedVertexBindingBufferCase::test (tcu::ResultCollector& result)
{
- glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
- glu::Buffer buffer (m_context.getRenderContext());
+ glu::RenderContext& renderContext = m_context.getRenderContext();
+ glu::CallLogWrapper gl (renderContext.getFunctions(), m_testCtx.getLog());
+ glu::Buffer buffer (renderContext);
+ deUint32 vao = 0;
gl.enableLogging(true);
+ if (!glu::isContextTypeES(renderContext.getType()))
+ {
+ gl.glGenVertexArrays(1, &vao);
+ gl.glBindVertexArray(vao);
+ }
+
gl.glBindBuffer(GL_ARRAY_BUFFER, *buffer);
gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_BUFFER, 1, *buffer, m_verifier);
+
+ if (vao)
+ gl.glDeleteVertexArrays(1, &vao);
}
} // anonymous
diff --git a/modules/gles31/tes31Context.cpp b/modules/gles31/tes31Context.cpp
index 438f2b8..af4a6a8 100644
--- a/modules/gles31/tes31Context.cpp
+++ b/modules/gles31/tes31Context.cpp
@@ -22,7 +22,6 @@
*//*--------------------------------------------------------------------*/
#include "tes31Context.hpp"
-#include "gluRenderContext.hpp"
#include "gluRenderConfig.hpp"
#include "gluFboRenderContext.hpp"
#include "gluContextInfo.hpp"
@@ -34,10 +33,11 @@
namespace gles31
{
-Context::Context (tcu::TestContext& testCtx)
+Context::Context (tcu::TestContext& testCtx, glu::ApiType apiType)
: m_testCtx (testCtx)
, m_renderCtx (DE_NULL)
, m_contextInfo (DE_NULL)
+ , m_apiType (apiType)
{
if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
createRenderContext();
@@ -61,14 +61,7 @@
try
{
- try
- {
- m_renderCtx = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 2));
- }
- catch (...)
- {
- m_renderCtx = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), glu::ApiType::es(3, 1));
- }
+ m_renderCtx = glu::createDefaultRenderContext(m_testCtx.getPlatform(), m_testCtx.getCommandLine(), m_apiType);
m_contextInfo = glu::ContextInfo::create(*m_renderCtx);
}
catch (...)
diff --git a/modules/gles31/tes31Context.hpp b/modules/gles31/tes31Context.hpp
index e09f9c5..1a91595 100644
--- a/modules/gles31/tes31Context.hpp
+++ b/modules/gles31/tes31Context.hpp
@@ -25,6 +25,7 @@
#include "tcuDefs.hpp"
#include "tcuTestContext.hpp"
+#include "gluRenderContext.hpp"
namespace glu
{
@@ -45,7 +46,7 @@
class Context
{
public:
- Context (tcu::TestContext& testCtx);
+ Context (tcu::TestContext& testCtx, glu::ApiType apiType = glu::ApiType::es(3,2));
~Context (void);
tcu::TestContext& getTestContext (void) { return m_testCtx; }
@@ -63,6 +64,7 @@
tcu::TestContext& m_testCtx;
glu::RenderContext* m_renderCtx;
glu::ContextInfo* m_contextInfo;
+ glu::ApiType m_apiType;
};
} // gles31
diff --git a/modules/gles31/tes31TestCaseWrapper.hpp b/modules/gles31/tes31TestCaseWrapper.hpp
new file mode 100644
index 0000000..03bbe44
--- /dev/null
+++ b/modules/gles31/tes31TestCaseWrapper.hpp
@@ -0,0 +1,112 @@
+#ifndef _TES31TESTCASEWRAPPER_HPP
+#define _TES31TESTCASEWRAPPER_HPP
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */ /*!
+ * \file
+ * \brief OpenGL ES 3.1 Test Package that runs on GL4.5 context
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuTestLog.hpp"
+#include "tes31Context.hpp"
+#include "tcuWaiverUtil.hpp"
+#include "gluStateReset.hpp"
+
+namespace deqp
+{
+namespace gles31
+{
+
+template <typename TEST_PACKAGE>
+class TestCaseWrapper : public tcu::TestCaseExecutor
+{
+public:
+ TestCaseWrapper (TEST_PACKAGE& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
+ ~TestCaseWrapper (void);
+
+ void init (tcu::TestCase* testCase, const std::string& path);
+ void deinit (tcu::TestCase* testCase);
+ tcu::TestNode::IterateResult iterate (tcu::TestCase* testCase);
+
+private:
+ TEST_PACKAGE& m_testPackage;
+ de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
+};
+
+template <typename TEST_PACKAGE>
+TestCaseWrapper<TEST_PACKAGE>::TestCaseWrapper (TEST_PACKAGE& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
+ : m_testPackage(package)
+ , m_waiverMechanism (waiverMechanism)
+{
+}
+
+template <typename TEST_PACKAGE>
+TestCaseWrapper<TEST_PACKAGE>::~TestCaseWrapper (void)
+{
+}
+
+template <typename TEST_PACKAGE>
+void TestCaseWrapper<TEST_PACKAGE>::init (tcu::TestCase* testCase, const std::string& path)
+{
+ if (m_waiverMechanism->isOnWaiverList(path))
+ throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
+
+ testCase->init();
+}
+
+template <typename TEST_PACKAGE>
+void TestCaseWrapper<TEST_PACKAGE>::deinit (tcu::TestCase* testCase)
+{
+ testCase->deinit();
+
+ DE_ASSERT(m_testPackage.getContext());
+ glu::resetState(m_testPackage.getContext()->getRenderContext(), m_testPackage.getContext()->getContextInfo());
+}
+
+template <typename TEST_PACKAGE>
+tcu::TestNode::IterateResult TestCaseWrapper<TEST_PACKAGE>::iterate (tcu::TestCase* testCase)
+{
+ tcu::TestContext& testCtx = m_testPackage.getContext()->getTestContext();
+ const tcu::TestCase::IterateResult result = testCase->iterate();
+
+ // Call implementation specific post-iterate routine (usually handles native events and swaps buffers)
+ try
+ {
+ m_testPackage.getContext()->getRenderContext().postIterate();
+ return result;
+ }
+ catch (const tcu::ResourceError& e)
+ {
+ testCtx.getLog() << e;
+ testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in context post-iteration routine");
+ testCtx.setTerminateAfter(true);
+ return tcu::TestNode::STOP;
+ }
+ catch (const std::exception& e)
+ {
+ testCtx.getLog() << e;
+ testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error in context post-iteration routine");
+ return tcu::TestNode::STOP;
+ }
+}
+
+} // gles31
+} // deqp
+
+#endif // _TES31TESTCASEWRAPPER_HPP
diff --git a/modules/gles31/tes31TestPackage.cpp b/modules/gles31/tes31TestPackage.cpp
index 40aa24e..d8c30fc 100644
--- a/modules/gles31/tes31TestPackage.cpp
+++ b/modules/gles31/tes31TestPackage.cpp
@@ -22,6 +22,7 @@
*//*--------------------------------------------------------------------*/
#include "tes31TestPackage.hpp"
+#include "tes31TestCaseWrapper.hpp"
#include "tes31InfoTests.hpp"
#include "es31fFunctionalTests.hpp"
#include "es31sStressTests.hpp"
@@ -38,73 +39,6 @@
namespace gles31
{
-class TestCaseWrapper : public tcu::TestCaseExecutor
-{
-public:
- TestCaseWrapper (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism);
- ~TestCaseWrapper (void);
-
- void init (tcu::TestCase* testCase, const std::string& path);
- void deinit (tcu::TestCase* testCase);
- tcu::TestNode::IterateResult iterate (tcu::TestCase* testCase);
-
-private:
- TestPackage& m_testPackage;
- de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
-};
-
-TestCaseWrapper::TestCaseWrapper (TestPackage& package, de::SharedPtr<tcu::WaiverUtil> waiverMechanism)
- : m_testPackage (package)
- , m_waiverMechanism (waiverMechanism)
-{
-}
-
-TestCaseWrapper::~TestCaseWrapper (void)
-{
-}
-
-void TestCaseWrapper::init (tcu::TestCase* testCase, const std::string& path)
-{
- if (m_waiverMechanism->isOnWaiverList(path))
- throw tcu::TestException("Waived test", QP_TEST_RESULT_WAIVER);
-
- testCase->init();
-}
-
-void TestCaseWrapper::deinit (tcu::TestCase* testCase)
-{
- testCase->deinit();
-
- DE_ASSERT(m_testPackage.getContext());
- glu::resetState(m_testPackage.getContext()->getRenderContext(), m_testPackage.getContext()->getContextInfo());
-}
-
-tcu::TestNode::IterateResult TestCaseWrapper::iterate (tcu::TestCase* testCase)
-{
- tcu::TestContext& testCtx = m_testPackage.getContext()->getTestContext();
- const tcu::TestCase::IterateResult result = testCase->iterate();
-
- // Call implementation specific post-iterate routine (usually handles native events and swaps buffers)
- try
- {
- m_testPackage.getContext()->getRenderContext().postIterate();
- return result;
- }
- catch (const tcu::ResourceError& e)
- {
- testCtx.getLog() << e;
- testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Resource error in context post-iteration routine");
- testCtx.setTerminateAfter(true);
- return tcu::TestNode::STOP;
- }
- catch (const std::exception& e)
- {
- testCtx.getLog() << e;
- testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error in context post-iteration routine");
- return tcu::TestNode::STOP;
- }
-}
-
TestPackage::TestPackage (tcu::TestContext& testCtx)
: tcu::TestPackage (testCtx, "dEQP-GLES31", "dEQP OpenGL ES 3.1 Tests")
, m_archive (testCtx.getRootArchive(), "gles31/")
@@ -125,7 +59,16 @@
try
{
// Create context
- m_context = new Context(m_testCtx);
+ // Some of the tests will test ES3.2 functionality if supported so try to create a 3.2 context
+ // first. If that doesn't work then create an ES3.1 context.
+ try
+ {
+ m_context = new Context(m_testCtx, glu::ApiType::es(3, 2));
+ }
+ catch (...)
+ {
+ m_context = new Context(m_testCtx, glu::ApiType::es(3, 1));
+ }
// Setup waiver mechanism
if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
@@ -140,9 +83,9 @@
}
// Add main test groups
- addChild(new InfoTests (*m_context));
- addChild(new Functional::FunctionalTests (*m_context));
- addChild(new Stress::StressTests (*m_context));
+ addChild(new InfoTests (*m_context));
+ addChild(new Functional::GLES31FunctionalTests (*m_context));
+ addChild(new Stress::StressTests (*m_context));
}
catch (...)
{
@@ -162,7 +105,7 @@
tcu::TestCaseExecutor* TestPackage::createExecutor (void) const
{
- return new TestCaseWrapper(const_cast<TestPackage&>(*this), m_waiverMechanism);
+ return new TestCaseWrapper<TestPackage>(const_cast<TestPackage&>(*this), m_waiverMechanism);
}
} // gles31
diff --git a/modules/gles31/tgl45TestPackage.cpp b/modules/gles31/tgl45TestPackage.cpp
new file mode 100644
index 0000000..72c0838
--- /dev/null
+++ b/modules/gles31/tgl45TestPackage.cpp
@@ -0,0 +1,102 @@
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program OpenGL ES 3.1 Module
+ * -------------------------------------------------
+ *
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 OpenGL ES 3.1 Test Package that runs on GL4.5 context
+ *//*--------------------------------------------------------------------*/
+
+#include "tgl45TestPackage.hpp"
+#include "tes31TestCaseWrapper.hpp"
+#include "tes31InfoTests.hpp"
+#include "es31fFunctionalTests.hpp"
+#include "es31sStressTests.hpp"
+#include "gluStateReset.hpp"
+#include "gluRenderContext.hpp"
+#include "gluContextInfo.hpp"
+#include "tcuTestLog.hpp"
+#include "tcuCommandLine.hpp"
+#include "tcuWaiverUtil.hpp"
+#include "glwEnums.hpp"
+
+namespace deqp
+{
+namespace gles31
+{
+
+TestPackageGL45::TestPackageGL45 (tcu::TestContext& testCtx)
+ : tcu::TestPackage (testCtx, "dEQP-GL45", "dEQP OpenGL ES 3.1 Tests On GL4.5 Context")
+ , m_archive (testCtx.getRootArchive(), "gles31/")
+ , m_context (DE_NULL)
+ , m_waiverMechanism (new tcu::WaiverUtil)
+{
+}
+
+TestPackageGL45::~TestPackageGL45 (void)
+{
+ // Destroy children first since destructors may access context.
+ TestNode::deinit();
+ delete m_context;
+}
+
+void TestPackageGL45::init (void)
+{
+ try
+ {
+ // Create context
+ m_context = new Context(m_testCtx, glu::ApiType::core(4, 5));
+
+ // Setup waiver mechanism
+ if (m_testCtx.getCommandLine().getRunMode() == tcu::RUNMODE_EXECUTE)
+ {
+ const glu::ContextInfo& contextInfo = m_context->getContextInfo();
+ std::string vendor = contextInfo.getString(GL_VENDOR);
+ std::string renderer = contextInfo.getString(GL_RENDERER);
+ const tcu::CommandLine& commandLine = m_context->getTestContext().getCommandLine();
+ tcu::SessionInfo sessionInfo (vendor, renderer, commandLine.getInitialCmdLine());
+ m_waiverMechanism->setup(commandLine.getWaiverFileName(), m_name, vendor, renderer, sessionInfo);
+ m_context->getTestContext().getLog().writeSessionInfo(sessionInfo.get());
+ }
+
+ // Add main test groups
+ addChild(new InfoTests (*m_context));
+ addChild(new Functional::GL45FunctionalTests (*m_context));
+ }
+ catch (...)
+ {
+ delete m_context;
+ m_context = DE_NULL;
+
+ throw;
+ }
+}
+
+void TestPackageGL45::deinit (void)
+{
+ TestNode::deinit();
+ delete m_context;
+ m_context = DE_NULL;
+}
+
+tcu::TestCaseExecutor* TestPackageGL45::createExecutor (void) const
+{
+ return new TestCaseWrapper<TestPackageGL45>(const_cast<TestPackageGL45&>(*this), m_waiverMechanism);
+}
+
+} // gles31
+} // deqp
diff --git a/modules/gles31/tgl45TestPackage.hpp b/modules/gles31/tgl45TestPackage.hpp
new file mode 100644
index 0000000..2641396
--- /dev/null
+++ b/modules/gles31/tgl45TestPackage.hpp
@@ -0,0 +1,65 @@
+#ifndef _TGL45TESTPACKAGE_HPP
+#define _TGL45TESTPACKAGE_HPP
+/*-------------------------------------------------------------------------
+ * OpenGL Conformance Test Suite
+ * -----------------------------
+ *
+ * Copyright (c) 2019 The Khronos Group Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */ /*!
+ * \file
+ * \brief OpenGL ES 3.1 Test Package that runs on GL4.5 context
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestPackage.hpp"
+#include "tes31Context.hpp"
+#include "tcuResource.hpp"
+#include "deSharedPtr.hpp"
+
+namespace tcu
+{
+ class WaiverUtil;
+};
+
+namespace deqp
+{
+namespace gles31
+{
+
+class TestPackageGL45 : public tcu::TestPackage
+{
+public:
+ TestPackageGL45 (tcu::TestContext& testCtx);
+ virtual ~TestPackageGL45 (void);
+
+ virtual void init (void);
+ virtual void deinit (void);
+
+ tcu::TestCaseExecutor* createExecutor (void) const;
+
+ tcu::Archive* getArchive (void) { return &m_archive; }
+ Context* getContext (void) { return m_context; }
+
+private:
+ tcu::ResourcePrefix m_archive;
+ Context* m_context;
+ de::SharedPtr<tcu::WaiverUtil> m_waiverMechanism;
+};
+
+} // gles31
+} // deqp
+
+#endif // _TGL45TESTPACKAGE_HPP
diff --git a/modules/glshared/glsBuiltinPrecisionTests.cpp b/modules/glshared/glsBuiltinPrecisionTests.cpp
index a46fc04..a1a9962 100644
--- a/modules/glshared/glsBuiltinPrecisionTests.cpp
+++ b/modules/glshared/glsBuiltinPrecisionTests.cpp
@@ -5063,7 +5063,8 @@
{
MovePtr<ContextInfo> info (ContextInfo::create(getRenderContext()));
- if (!m_extension.empty() && !info->isExtensionSupported(m_extension.c_str()))
+ if (!m_extension.empty() && !info->isExtensionSupported(m_extension.c_str()) &&
+ !glu::contextSupports(getRenderContext().getType(), glu::ApiType::core(4, 5)))
throw NotSupportedError("Unsupported extension: " + m_extension);
runTest();
diff --git a/modules/glshared/glsDrawTest.cpp b/modules/glshared/glsDrawTest.cpp
index b8cff9c..a026d49 100644
--- a/modules/glshared/glsDrawTest.cpp
+++ b/modules/glshared/glsDrawTest.cpp
@@ -3162,8 +3162,9 @@
spec.drawMethod == DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX ||
spec.drawMethod == DrawTestSpec::DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX)
{
- const bool supportsES32 = contextSupports(m_renderCtx.getType(), glu::ApiType::es(3, 2));
- TCU_CHECK_AND_THROW(NotSupportedError, supportsES32 || m_contextInfo->isExtensionSupported("GL_EXT_draw_elements_base_vertex"), "GL_EXT_draw_elements_base_vertex is not supported.");
+ const bool supportsES32orGL45 = contextSupports(m_renderCtx.getType(), glu::ApiType::es(3, 2)) ||
+ contextSupports(m_renderCtx.getType(), glu::ApiType::core(4, 5));
+ TCU_CHECK_AND_THROW(NotSupportedError, supportsES32orGL45 || m_contextInfo->isExtensionSupported("GL_EXT_draw_elements_base_vertex"), "GL_EXT_draw_elements_base_vertex is not supported.");
}
const bool drawStep = (m_iteration % 2) == 0;
diff --git a/modules/glshared/glsFboCompletenessTests.cpp b/modules/glshared/glsFboCompletenessTests.cpp
index fea80a6..856b991 100644
--- a/modules/glshared/glsFboCompletenessTests.cpp
+++ b/modules/glshared/glsFboCompletenessTests.cpp
@@ -267,7 +267,7 @@
},
{
"GL_EXT_texture_rg",
- (deUint32)(REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID),
+ (deUint32)(REQUIRED_RENDERABLE | COLOR_RENDERABLE | RENDERBUFFER_VALID | TEXTURE_VALID),
GLS_ARRAY_RANGE(s_extTextureRgRboFormats)
},
// These are not specified to be color-renderable, but the wording is
diff --git a/modules/glshared/glsShaderExecUtil.cpp b/modules/glshared/glsShaderExecUtil.cpp
index 16d8d03..ff6dccb 100644
--- a/modules/glshared/glsShaderExecUtil.cpp
+++ b/modules/glshared/glsShaderExecUtil.cpp
@@ -746,7 +746,8 @@
GeometryShaderExecutor* GeometryShaderExecutor::create (const glu::RenderContext& renderCtx, const ShaderSpec& shaderSpec)
{
- if (glu::glslVersionIsES(shaderSpec.version) && shaderSpec.version <= glu::GLSL_VERSION_310_ES)
+ if (glu::glslVersionIsES(shaderSpec.version) && shaderSpec.version <= glu::GLSL_VERSION_310_ES
+ && !contextSupports(renderCtx.getType(), glu::ApiType::core(4, 5)))
checkExtension(renderCtx, "GL_EXT_geometry_shader");
return new GeometryShaderExecutor(renderCtx, shaderSpec);
@@ -1257,7 +1258,8 @@
{
const int numBlockRequired = 2; // highest binding is always 1 (output) i.e. count == 2
- if (glu::glslVersionIsES(shaderSpec.version) && shaderSpec.version <= glu::GLSL_VERSION_310_ES)
+ if (glu::glslVersionIsES(shaderSpec.version) && shaderSpec.version <= glu::GLSL_VERSION_310_ES
+ && !contextSupports(renderCtx.getType(), glu::ApiType::core(4, 5)))
checkExtension(renderCtx, "GL_EXT_tessellation_shader");
if (stage == glu::SHADERTYPE_TESSELLATION_CONTROL)
diff --git a/modules/glshared/glsTextureStateQueryTests.cpp b/modules/glshared/glsTextureStateQueryTests.cpp
index d4b166b..6ac62ad 100644
--- a/modules/glshared/glsTextureStateQueryTests.cpp
+++ b/modules/glshared/glsTextureStateQueryTests.cpp
@@ -547,9 +547,60 @@
} // es32
+namespace gl45
+{
+
+static bool isCoreTextureTarget (glw::GLenum target)
+{
+ return es31::isCoreTextureTarget(target);
+}
+
+static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
+{
+ DE_UNREF(target);
+ return RequiredExtensions();
+}
+
+static bool isCoreTextureParam (glw::GLenum pname)
+{
+ return es31::isCoreTextureParam(pname);
+}
+
+static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
+{
+ DE_UNREF(pname);
+ return RequiredExtensions();
+}
+
+static bool isCoreQuery (QueryType query)
+{
+ return es31::isCoreQuery(query);
+}
+
+static RequiredExtensions getQueryExtension (QueryType query)
+{
+ DE_UNREF(query);
+ return RequiredExtensions();
+}
+
+static bool isCoreTester (TesterType tester)
+{
+ return es31::isCoreTester(tester);
+}
+
+static RequiredExtensions getTesterExtension (TesterType tester)
+{
+ DE_UNREF(tester);
+ return RequiredExtensions();
+}
+
+} // gl45
+
static bool isCoreTextureTarget (const glu::ContextType& contextType, glw::GLenum target)
{
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::isCoreTextureTarget(target);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::isCoreTextureTarget(target);
else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::isCoreTextureTarget(target);
@@ -564,7 +615,9 @@
static bool isCoreTextureParam (const glu::ContextType& contextType, glw::GLenum pname)
{
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::isCoreTextureParam(pname);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::isCoreTextureParam(pname);
else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::isCoreTextureParam(pname);
@@ -579,7 +632,9 @@
static bool isCoreQuery (const glu::ContextType& contextType, QueryType query)
{
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::isCoreQuery(query);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::isCoreQuery(query);
else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::isCoreQuery(query);
@@ -594,7 +649,9 @@
static bool isCoreTester (const glu::ContextType& contextType, TesterType tester)
{
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::isCoreTester(tester);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::isCoreTester(tester);
else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::isCoreTester(tester);
@@ -611,9 +668,11 @@
{
DE_ASSERT(!isCoreTextureTarget(contextType, target));
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::getTextureTargetExtension(target);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::getTextureTargetExtension(target);
- if (contextSupports(contextType, glu::ApiType::es(3,1)))
+ else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::getTextureTargetExtension(target);
else if (contextSupports(contextType, glu::ApiType::es(3,0)))
return es30::getTextureTargetExtension(target);
@@ -628,7 +687,9 @@
{
DE_ASSERT(!isCoreTextureParam(contextType, pname));
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::getTextureParamExtension(pname);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::getTextureParamExtension(pname);
else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::getTextureParamExtension(pname);
@@ -645,7 +706,9 @@
{
DE_ASSERT(!isCoreQuery(contextType, query));
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::getQueryExtension(query);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::getQueryExtension(query);
else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::getQueryExtension(query);
@@ -662,7 +725,9 @@
{
DE_ASSERT(!isCoreTester(contextType, tester));
- if (contextSupports(contextType, glu::ApiType::es(3,2)))
+ if (contextSupports(contextType, glu::ApiType::core(4,5)))
+ return gl45::getTesterExtension(tester);
+ else if (contextSupports(contextType, glu::ApiType::es(3,2)))
return es32::getTesterExtension(tester);
else if (contextSupports(contextType, glu::ApiType::es(3,1)))
return es31::getTesterExtension(tester);
diff --git a/modules/glshared/glsTextureTestUtil.cpp b/modules/glshared/glsTextureTestUtil.cpp
index 06a337f..50b3d57 100644
--- a/modules/glshared/glsTextureTestUtil.cpp
+++ b/modules/glshared/glsTextureTestUtil.cpp
@@ -142,7 +142,7 @@
params["FRAG_IN"] = "varying";
params["FRAG_COLOR"] = "gl_FragColor";
}
- else if (m_glslVersion == glu::GLSL_VERSION_300_ES || m_glslVersion == glu::GLSL_VERSION_310_ES || m_glslVersion == glu::GLSL_VERSION_320_ES || m_glslVersion == glu::GLSL_VERSION_330)
+ else if (m_glslVersion == glu::GLSL_VERSION_300_ES || m_glslVersion == glu::GLSL_VERSION_310_ES || m_glslVersion == glu::GLSL_VERSION_320_ES || m_glslVersion > glu::GLSL_VERSION_330)
{
const string version = glu::getGLSLVersionDeclaration(m_glslVersion);
const char* ext = DE_NULL;
@@ -180,7 +180,7 @@
const char* sampler = DE_NULL;
const char* lookup = DE_NULL;
- if (m_glslVersion == glu::GLSL_VERSION_300_ES || m_glslVersion == glu::GLSL_VERSION_310_ES || m_glslVersion == glu::GLSL_VERSION_320_ES || m_glslVersion == glu::GLSL_VERSION_330)
+ if (m_glslVersion == glu::GLSL_VERSION_300_ES || m_glslVersion == glu::GLSL_VERSION_310_ES || m_glslVersion == glu::GLSL_VERSION_320_ES || m_glslVersion > glu::GLSL_VERSION_330)
{
switch (program)
{
diff --git a/modules/glshared/glsUniformBlockCase.cpp b/modules/glshared/glsUniformBlockCase.cpp
index 6623215..1b48890 100644
--- a/modules/glshared/glsUniformBlockCase.cpp
+++ b/modules/glshared/glsUniformBlockCase.cpp
@@ -141,9 +141,9 @@
m_data.array.elementType = new VarType(elementType);
}
-VarType::VarType (const StructType* structPtr)
+VarType::VarType (const StructType* structPtr, deUint32 flags)
: m_type (TYPE_STRUCT)
- , m_flags (0)
+ , m_flags (flags)
{
m_data.structPtr = structPtr;
}
@@ -479,7 +479,8 @@
if (glu::isDataTypeMatrix(basicType))
{
// Array of vectors as specified in rules 5 & 7.
- bool isRowMajor = !!(layoutFlags & LAYOUT_ROW_MAJOR);
+ bool isRowMajor = !!(((type.getFlags() & (LAYOUT_ROW_MAJOR | LAYOUT_COLUMN_MAJOR) ? type.getFlags() : layoutFlags) & LAYOUT_ROW_MAJOR));
+
int vecSize = isRowMajor ? glu::getDataTypeMatrixNumColumns(basicType)
: glu::getDataTypeMatrixNumRows(basicType);
int numVecs = isRowMajor ? glu::getDataTypeMatrixNumRows(basicType)
@@ -529,7 +530,7 @@
{
// Array of matrices.
glu::DataType elemBasicType = elemType.getBasicType();
- bool isRowMajor = !!(layoutFlags & LAYOUT_ROW_MAJOR);
+ bool isRowMajor = !!(((elemType.getFlags() & (LAYOUT_ROW_MAJOR | LAYOUT_COLUMN_MAJOR) ? elemType.getFlags() : layoutFlags) & LAYOUT_ROW_MAJOR));
int vecSize = isRowMajor ? glu::getDataTypeMatrixNumColumns(elemBasicType)
: glu::getDataTypeMatrixNumRows(elemBasicType);
int numVecs = isRowMajor ? glu::getDataTypeMatrixNumRows(elemBasicType)
@@ -562,6 +563,11 @@
{
DE_ASSERT(type.isStructType());
+ // Override matrix packing layout flags in case the structure has them defined.
+ const deUint32 matrixLayoutMask = LAYOUT_ROW_MAJOR | LAYOUT_COLUMN_MAJOR;
+ if (type.getFlags() & matrixLayoutMask)
+ layoutFlags = (layoutFlags & (~matrixLayoutMask)) | (type.getFlags() & matrixLayoutMask);
+
for (StructType::ConstIterator memberIter = type.getStruct().begin(); memberIter != type.getStruct().end(); memberIter++)
computeStd140Layout(layout, curOffset, curBlockNdx, curPrefix + "." + memberIter->getName(), memberIter->getType(), layoutFlags);
@@ -866,6 +872,8 @@
if (curType->isBasicType())
{
+ if ((curType->getFlags() & LAYOUT_MASK) != 0)
+ src << "layout(" << LayoutFlagsFmt(curType->getFlags() & LAYOUT_MASK) << ") ";
if ((curType->getFlags() & PRECISION_MASK) != 0)
src << PrecisionFlagsFmt(curType->getFlags() & PRECISION_MASK) << " ";
src << glu::getDataTypeName(curType->getBasicType());
diff --git a/modules/glshared/glsUniformBlockCase.hpp b/modules/glshared/glsUniformBlockCase.hpp
index db47d79..1e3f685 100644
--- a/modules/glshared/glsUniformBlockCase.hpp
+++ b/modules/glshared/glsUniformBlockCase.hpp
@@ -75,7 +75,7 @@
VarType (const VarType& other);
VarType (glu::DataType basicType, deUint32 flags);
VarType (const VarType& elementType, int arraySize);
- explicit VarType (const StructType* structPtr);
+ explicit VarType (const StructType* structPtr, deUint32 flags = 0u);
~VarType (void);
bool isBasicType (void) const { return m_type == TYPE_BASIC; }
diff --git a/scripts/log/log_parser.py b/scripts/log/log_parser.py
index b77af3f..c25c235 100644
--- a/scripts/log/log_parser.py
+++ b/scripts/log/log_parser.py
@@ -21,6 +21,7 @@
#-------------------------------------------------------------------------
import shlex
+import sys
import xml.dom.minidom
class StatusCode:
@@ -73,7 +74,12 @@
return "%s:%d: %s" % (self.filename, self.line, self.message)
def splitContainerLine (line):
- return shlex.split(line)
+ if sys.version_info > (3, 0):
+ # In Python 3, shlex works better with unicode.
+ return shlex.split(line)
+ else:
+ # In Python 2, shlex works better with bytes, so encode and decode again upon return.
+ return [w.decode('utf-8') for w in shlex.split(line.encode('utf-8'))]
def getNodeText (node):
rc = []
@@ -131,7 +137,8 @@
self.filename = filename
def parseLine (self, line):
- text = line.decode('utf-8')
+ # Some test shaders contain invalid characters.
+ text = line.decode('utf-8', 'ignore')
if len(text) > 0 and text[0] == '#':
return self.parseContainerLine(line)
elif self.curResultText != None:
@@ -141,7 +148,8 @@
def parseContainerLine (self, line):
isTestCaseResult = False
- text = line.decode('utf-8')
+ # Some test shaders contain invalid characters.
+ text = line.decode('utf-8', 'ignore')
args = splitContainerLine(text)
if args[0] == "#sessionInfo":
if len(args) < 3:
diff --git a/targets/vulkan_headless/vulkan_headless.cmake b/targets/vulkan_headless/vulkan_headless.cmake
new file mode 100644
index 0000000..7b362a3
--- /dev/null
+++ b/targets/vulkan_headless/vulkan_headless.cmake
@@ -0,0 +1,5 @@
+message("*** Using Vulkan Headless target")
+
+set(DEQP_TARGET_NAME "Vulkan Headless")
+
+set(DEQP_USE_HEADLESS ON)